# Noon Scraper (`mina_safwat/noon-scraper`) Actor

Scrapes Noon product listings — price, discount, brand, seller and rating — across Egypt, the UAE and Saudi Arabia.

- **URL**: https://apify.com/mina_safwat/noon-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** E-commerce, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Noon Scraper do?

**Noon Scraper** collects product listings from [Noon](https://www.noon.com), one of
the largest online marketplaces in **Egypt, the UAE and Saudi Arabia**. Paste a Noon
search link and get every product's **price, discount, brand, seller, star rating
and photos** as a clean table, in English or Arabic.

Try it with the two prefilled searches: open the Actor, click **Start**, and the
results are ready in well under a minute. Because it runs on the Apify platform,
you also get API access, scheduled runs, integrations (Google Sheets, Make,
Zapier, webhooks), run monitoring and optional proxy rotation.

### Why scrape Noon?

- **Competitor price tracking**: see what rivals charge and how deeply they
  discount.
- **Price history**: run the same search on a schedule and watch prices move.
- **Cross-border comparison**: compare what the same product costs in Egypt,
  the UAE and Saudi Arabia, side by side in one dataset.
- **Seller research**: find which sellers dominate a category, and how
  shoppers rate them.
- **Assortment monitoring**: spot new products, brands and bestsellers as they
  appear in a category.

### How to scrape Noon products

1. Go to [noon.com](https://www.noon.com) and search for what you want.
2. Narrow the search with Noon's own filters, such as category, brand, price
   range, seller or sort order.
3. Copy the address from your browser's address bar.
4. Paste it into **Noon search links**. Add more links, one per line, if you
   like. Egyptian, Emirati and Saudi links can be mixed in one run.
5. Click **Start**, then download the results when the run finishes.

The Actor sends the link's path and filters to Noon unchanged, so category and
brand pages, multi-select filters (for example two brands at once), price,
seller and sort order are all kept. A category or brand page works without a search
term. If Noon does not recognise the category or brand in a link (a typo, for
example), the link is listed in `FAILED_INPUTS` instead of returning unfiltered results.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "search_urls": [
        "https://www.noon.com/egypt-en/search/?q=laptop",
        "https://www.noon.com/uae-en/search/?q=headphones"
    ],
    "max_results_per_search": 200
}
```

| Field | What it does |
|---|---|
| `search_urls` | Noon search links, one per line. Only Egypt (`egypt-en`, `egypt-ar`), UAE (`uae-en`, `uae-ar`) and Saudi Arabia (`saudi-en`, `saudi-ar`) storefronts are supported. |
| `max_results_per_search` | Stops after this many products per link. Default: 200. Noon returns 50 per page. |
| `proxy_configuration` | Optional; leave it empty. Noon serves the Actor directly, while Apify's residential proxies are refused by Noon, so turning them on makes runs fail. |

### Output

Each product becomes one row. Here is a real example, with its photo list
shortened:

```json
{
    "sku": "N53391647A",
    "name": "WH-CH520 Wireless Bluetooth On Ear With Mic For Phone Call Black",
    "brand": "Sony",
    "price": 139.35,
    "original_price": 199,
    "discount_percent": 30,
    "currency": "AED",
    "rating": 4.5,
    "review_count": 8186,
    "seller": "noon",
    "seller_rating": 3.8,
    "seller_rating_count": 189094,
    "seller_positive_percent": 73,
    "is_bestseller": false,
    "image": "https://f.nooncdn.com/p/pzsku/ZC517A2B815DED89E6D09Z/45/_/1780467372/37e2d1cb-73af-4c33-b72b-ad0afb251b70.jpg",
    "images": ["https://f.nooncdn.com/p/pzsku/ZC517A2B815DED89E6D09Z/45/_/1780467372/37e2d1cb-73af-4c33-b72b-ad0afb251b70.jpg"],
    "url": "https://www.noon.com/uae-en/wh-ch520-wireless-bluetooth-on-ear-with-mic-for-phone-call-black/N53391647A/p/?o=f628728a85c18b6c&nav_ctx=eyJucCI6dHJ1ZX0.GjCu0TvHKXjV9V1pC6XecQ",
    "country": "AE",
    "storefront": "uae-en",
    "position": 1,
    "search_url": "https://www.noon.com/uae-en/search/?q=headphones"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or
Excel.

### Data fields

| Field | Description |
|---|---|
| `sku` | Noon's product code. |
| `name` | Product title, in the language of the link. |
| `brand` | Brand name. When a listing carries only Noon's brand code, the name is looked up in Noon's brand filter, or the code (such as `hp`) is used. |
| `price` | The price shoppers pay now, in local currency. |
| `original_price` | The price before the discount. Only on discounted products. |
| `discount_percent` | How much is taken off, worked out from the two prices. Only on discounted products. |
| `currency` | `EGP`, `AED` or `SAR`, set by the storefront. |
| `rating` | The product's star rating. Only on products shoppers have reviewed. |
| `review_count` | Number of product ratings. Only on reviewed products. |
| `seller` | The seller behind the offer shown. |
| `seller_rating` | The seller's own rating, separate from the product rating. |
| `seller_rating_count` | Number of ratings the seller has received. |
| `seller_positive_percent` | Share of the seller's ratings that are positive. |
| `is_bestseller` | `true` when Noon shows its Bestseller badge on the product. |
| `image` | Main product photo. |
| `images` | All product photos. |
| `url` | Link to the product page. |
| `country` | ISO country code: `EG`, `AE` or `SA`. |
| `storefront` | The Noon storefront the product came from, such as `egypt-en`. |
| `position` | The product's place in the results of its search. |
| `search_url` | The search link the product came from. |

### How much does it cost to scrape Noon?

Noon Scraper uses **pay-per-event** pricing, so you pay only for results:

- **$0.0015 per product** saved to the dataset, which is **about $1.50 per
  1,000 results**.
- **$0.00005 per run start**.

For example, 200 products from one search cost about $0.30. Apify's free plan
includes $5 of monthly credit, which covers roughly 3,300 products. Searches
that return nothing are never charged as results. If you set a maximum cost
for a run, the Actor stops as soon as it is reached.

### Tips for scraping Noon

- **Filter on Noon first.** Category, brand, price and seller filters in the
  link shrink the result set before the Actor sees it, which saves money.
- **Set `max_results_per_search`** to what you really need. The order follows
  Noon's own sort, so the top results come first.
- **Use Arabic links** (`egypt-ar`, `uae-ar`, `saudi-ar`) to get product names
  in Arabic.
- **Schedule runs** to build a price history for a category.
- Promoted products that repeat across pages are removed, so each product
  appears only once per search.

### FAQ, disclaimers and support

**Why are `rating` and `review_count` sometimes empty?** Noon scores products
and sellers separately. Nearly every listing has a seller rating, but only
products that shoppers have reviewed have a product rating.

**What happens to links that return nothing?** They are not saved as rows, so
you are not charged for them. A link pasted twice is scraped once. Each one is listed with its reason in the
`FAILED_INPUTS` record of the run's key-value store, and the run's status
message gives the counts. A run fails only when Noon refuses every search.

**Which countries are supported?** Egypt, the UAE and Saudi Arabia. Links from
other storefronts are skipped and listed in `FAILED_INPUTS`.

**Is it legal to scrape Noon?** This Actor collects only publicly available
product and seller information, with no personal data. Noon's Terms of Use
restrict automated access, so you are responsible for making sure your use
complies with them and with the laws that apply to you. If in doubt, ask a
lawyer.

**Found a problem or need a custom solution?** Open an issue on the
**Issues** tab and we will look into it. Custom scrapers and data feeds are
available on request.

# Actor input Schema

## `search_urls` (type: `array`):

Search links, one per line. Search on Noon with whatever filters you want — category, brand, price range, seller, sort order — then copy the address bar. Every filter in the link is honoured, including category and brand pages, and the country is taken from the link too, so you can mix Egypt, the UAE and Saudi Arabia in one run. Only these three Noon countries are supported; any other link is skipped and listed in the FAILED_INPUTS record.

## `max_results_per_search` (type: `integer`):

Stops after this many products for each link. Noon returns 50 per page.

## `proxy_configuration` (type: `object`):

Leave this empty: Noon answers the Actor directly. Noon refuses Apify's residential proxies, so turning them on makes runs fail.

## Actor input object example

```json
{
  "search_urls": [
    "https://www.noon.com/egypt-en/search/?q=laptop",
    "https://www.noon.com/uae-en/search/?q=headphones"
  ],
  "max_results_per_search": 200,
  "proxy_configuration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "search_urls": [
        "https://www.noon.com/egypt-en/search/?q=laptop",
        "https://www.noon.com/uae-en/search/?q=headphones"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/noon-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "search_urls": [
        "https://www.noon.com/egypt-en/search/?q=laptop",
        "https://www.noon.com/uae-en/search/?q=headphones",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/noon-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "search_urls": [
    "https://www.noon.com/egypt-en/search/?q=laptop",
    "https://www.noon.com/uae-en/search/?q=headphones"
  ]
}' |
apify call mina_safwat/noon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/noon-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/46Wp9pfAIbsGuyLAs/builds/Gj0dWQDREhRt2RUgI/openapi.json
