# noon Scraper — UAE, Saudi & Egypt Product Prices (`logiover/noon-product-scraper`) Actor

Scrape noon.com product listings across the UAE, Saudi and Egypt marketplaces. Extract price, discount, brand, seller and seller rating, ratings, bestseller rank and specs for price monitoring and market research. No API key.

- **URL**: https://apify.com/logiover/noon-product-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, AI, Agents
- **Features:** Limited permissions
- **Stats:** 11 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## noon Scraper — UAE, Saudi & Egypt Product Prices, Sellers & Ratings

Track what the Gulf's biggest home-grown marketplace is actually charging: live prices, discounts, sellers and seller ratings from noon.com across three national catalogues.

### What does the noon Scraper do?

This Actor collects live product data from **noon.com**, the largest marketplace built in the Middle East. It reads the same public catalog service noon's own storefront calls, returning fifty complete products per request as structured JSON — no browser, no brittle CSS selectors.

The important detail is that noon is not one shop but three: the UAE, Saudi and Egyptian marketplaces carry different assortments, different sellers and different prices, and the site selects between them by request header rather than by URL. This Actor sets that header explicitly, so the marketplace is a normal input field instead of an accident of which proxy IP you happened to get. Search any keyword in any of the three markets and get back the product name, brand, current price, the pre-discount price where one exists, the computed discount percentage, the seller, the seller's rating and positive-feedback score, product ratings, bestseller rank, key specifications and stock status.

### Who is it for?

- **Brands and distributors** monitoring how their products are priced and by whom across the Gulf.
- **Marketplace sellers** benchmarking competitors on price, rating and fulfilment method.
- **Pricing and repricing teams** feeding live competitor prices into their models.
- **Market researchers** measuring assortment depth and price levels in the UAE, Saudi and Egypt.
- **Procurement teams** finding the cheapest legitimate seller for a category.

### Use cases

- Track a product category's price distribution in the UAE, then compare the same query in Saudi and Egypt.
- Find every seller offering your brand and check who is undercutting your RRP.
- Measure how deep discounts run in a category — the Actor separates the pre-discount price from the price actually charged.
- Build a bestseller watchlist by pulling the rank labels noon assigns within categories.
- Monitor whether "fulfilled by noon" listings systematically price above or below marketplace sellers.

### Why use this noon Scraper?

- **Keyless and login-free** — no account, no API key, no cookies.
- **Three marketplaces from one Actor** — UAE (AED), Saudi (SAR) and Egypt (EGP), each with its own catalogue and currency.
- **Honest pricing** — noon quotes a reference price and a sale price; this Actor reports what the buyer pays as `price`, keeps the reference as `originalPrice`, and computes the discount rather than silently reporting the higher number.
- **Seller intelligence included** — seller name, rating, rating count and positive-feedback percentage on every row.
- **Bulk by design** — 50 products per request, roughly 2,000 per search term.
- **Export anywhere** — JSON, CSV, Excel, Google Sheets — and pay per result.

### What data can you extract?

One row per product offer. Fields noon does not publish for a given item come back as `null`.

| Field | Type | Description |
|---|---|---|
| `sku` | string | noon SKU |
| `catalogSku` | string | Catalogue SKU including the offer suffix |
| `name` | string | Full product name |
| `brand` | string | Brand |
| `url` | string | Direct link to the product page |
| `price` | number | Price the buyer pays today |
| `originalPrice` | number | Pre-discount reference price, when the item is discounted |
| `discountPercent` | number | Computed discount, one decimal place |
| `currency` | string | `AED`, `SAR` or `EGP` |
| `marketplace` | string | `uae`, `saudi` or `egypt` |
| `promotionText` | string | Promotion banner, e.g. "Extra 15% off with Rakbank Credit Cards" |
| `offerCode` | string | noon's internal offer identifier |
| `sellerName` | string | Store selling the item |
| `sellerRating` | number | Seller's partner rating |
| `sellerRatingCount` | number | Number of seller ratings |
| `sellerPositivePercent` | number | Positive-feedback percentage |
| `rating` | number | Product rating |
| `ratingCount` | number | Number of product ratings |
| `isBestseller` | boolean | Bestseller flag |
| `bestsellerRank` | string | Rank label, e.g. "#35" |
| `categoryRankText` | string | Full rank sentence, e.g. "#35 in Notebook Laptops" |
| `specifications` | string | Key specs, pipe-separated |
| `isBuyable` | boolean | Whether the offer can be added to cart |
| `isFulfilledByNoon` | boolean | Fulfilled by noon rather than the seller |
| `isFreeDelivery` | boolean | Free-delivery eligibility |
| `imageUrl` | string | Main product image |
| `imageCount` | number | Number of images |
| `searchKeyword` | string | The keyword that produced this row |
| `scrapedAt` | string | ISO 8601 collection timestamp |

#### Sample output

```json
{
  "sku": "N70215854V",
  "name": "Vivobook 14 X1404ZA Slim Laptop With 14-Inch FHD Display, Core i3-1215U/8GB RAM/128GB SSD/Windows 11 Home",
  "brand": "ASUS",
  "url": "https://www.noon.com/uae-en/vivobook-14-x1404za-slim-laptop.../N70215854V/p/",
  "price": 1449,
  "originalPrice": 1529,
  "discountPercent": 5.2,
  "currency": "AED",
  "marketplace": "uae",
  "promotionText": "Extra 15% off",
  "sellerName": "MARVELOUS COMPUTERS TRADING LLC",
  "sellerRating": 4.1,
  "sellerRatingCount": 62,
  "sellerPositivePercent": 78,
  "rating": 5,
  "ratingCount": 3,
  "isBestseller": false,
  "specifications": "RAM Size: 8 GB | Internal Memory: 128 GB | Number of Cores: 10-Core | Operating System: Windows",
  "isBuyable": true,
  "isFulfilledByNoon": true,
  "isFreeDelivery": true,
  "searchKeyword": "laptop",
  "scrapedAt": "2026-08-13T17:33:11.402Z"
}
```

### How to use the noon Scraper

#### Option A — search one marketplace

The standard shape: a keyword plus a market.

```json
{
  "keyword": "laptop",
  "marketplace": "uae",
  "sortBy": "relevance",
  "maxResults": 1000,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AE" }
}
```

1. Enter a **Search keyword** — a category word like *laptop*, a brand like *Samsung*, or a specific model.
2. Pick the **Marketplace** — UAE, Saudi or Egypt.
3. Optionally change **Sort by** to price ascending to find the cheap end of a category.
4. Set **Max results** and run.

#### Option B — compare the same query across countries

Run the Actor three times with the same keyword and different marketplaces, then join on `sku`. Because the SKU is shared across noon's catalogues, this gives you a country-by-country price comparison for identical products.

```json
{
  "keyword": "iphone 15",
  "marketplace": "saudi",
  "sortBy": "price_asc",
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "SA" }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keyword` | string | `laptop` | What to search for. Required — noon's catalogue is searched, not browsed. |
| `marketplace` | string | `uae` | `uae`, `saudi` or `egypt`. Sets catalogue, currency and seller pool. |
| `sortBy` | string | `relevance` | `relevance`, `price_asc`, `price_desc`, `newest` or `popularity`. |
| `maxResults` | integer | `500` | How many products to collect. |
| `proxyConfiguration` | object | Residential / AE | Residential proxies pinned to the selected market. |

### Tips for best results

- **The marketplace field, not the proxy, decides the catalogue.** The Actor sets noon's own market headers, so results stay correct even if your proxy exits elsewhere — but keeping the proxy country aligned is still the most reliable combination.
- **`price` is what the buyer pays.** If you need the crossed-out number, read `originalPrice`; if it is `null`, the item simply is not discounted.
- **Search broad, filter later.** One general keyword such as *laptop* returns around 2,000 products; several narrow keywords cover a category more completely than one broad one.
- **Use `price_asc` to map the cheap end** of a category, and `price_desc` for the premium end — the middle is where relevance sorting is strongest.
- **`isFulfilledByNoon` matters for price comparisons.** Marketplace sellers and noon's own fulfilment price differently; mixing them hides the pattern.
- **Join across markets on `sku`** to compare AED, SAR and EGP prices for the same product.
- **Seller ratings are a filter, not decoration** — `sellerPositivePercent` under about 70 usually signals a seller worth excluding from a price benchmark.
- **Watch `promotionText`** — bank-card discounts are common in the Gulf and are not reflected in the listed price.
- **Zero rows?** The keyword genuinely matched nothing in that market. Egypt's catalogue is the smallest of the three; try the UAE to confirm.

### Integrations

- **Google Sheets** — drop each run into a pricing sheet your commercial team already reads.
- **Slack** — alert a channel when a competitor's price crosses a threshold.
- **Zapier / Make** — route rows into a repricing tool or a BI pipeline.
- **Webhooks** — get the dataset id the moment a run completes.
- **Schedules** — daily runs turn this into a price-history feed.

### API usage

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~noon-product-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"laptop","marketplace":"uae","maxResults":200}'
```

**Node.js**

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('logiover/noon-product-scraper').call({
    keyword: 'air fryer',
    marketplace: 'saudi',
    sortBy: 'price_asc',
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'products');
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")

run = client.actor("logiover/noon-product-scraper").call(run_input={
    "keyword": "perfume",
    "marketplace": "egypt",
    "maxResults": 500,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["brand"], item["price"], item["currency"], item["sellerName"])
```

### 🤖 AI Agents, MCP & RAG Integration

Expose this Actor through Apify's MCP server (`https://mcp.apify.com`) and an assistant can answer live pricing questions about the Gulf market instead of guessing.

> *"Use the noon scraper to pull 200 air fryers from the UAE and Saudi marketplaces, then tell me which products are cheaper in Saudi and by how much."*

Connect this Actor directly to **Apify AI**, **Claude Desktop**, **Cursor**, **VS Code**, **Windsurf**, **LangChain**, or **LlamaIndex** via the official **Apify MCP Server** — no custom wrapper code needed:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=logiover/noon-product-scraper"
    }
  }
}
```

- **Schema-typed inputs & outputs:** Clean JSON records with explicit `.actor/input_schema.json` and `.actor/output_schema.json` definitions so LLM agents infer parameters and parse fields accurately without HTML noise.
- **Bounded & predictable runs:** Built-in volume caps and pay-per-result budget guards prevent runaway agent tool loops.
- **RAG & automation ready:** Stream run datasets straight into vector stores, n8n, Make, Zapier, or webhook pipelines.

### FAQ

#### Do I need a noon account or API key?

No. The Actor reads the public catalog service that serves noon's own storefront. There is nothing to register.

#### Which countries does noon cover?

noon operates marketplaces in the United Arab Emirates, Saudi Arabia and Egypt. All three are supported, each with its own assortment, seller pool and currency.

#### Why do the same search terms return different products per country?

Because they are genuinely different catalogues. Sellers list per market, and Saudi or Egyptian assortments are typically narrower than the UAE's. The result counts in the run log make this visible.

#### How many products can one run return?

Roughly 2,000 per search term — noon's own pagination limit. Use several keywords to cover a category more fully.

#### What is the difference between `price` and `originalPrice`?

`price` is what a buyer pays today. `originalPrice` is the crossed-out reference price and is only present when the item is discounted. Reporting the reference price as the selling price would overstate every discounted item, so this Actor keeps them apart and adds `discountPercent`.

#### Why are some fields null?

Bestseller ranks exist only for products that hold one, and product ratings only appear once an item has reviews. A `null` means "not published", never "zero".

#### Does it work for category browsing rather than search?

The Actor is search-driven, which mirrors how noon's catalogue is actually queryable without an account. A category is best covered with a handful of representative keywords.

#### Can I export to CSV or Excel?

Yes — JSON, CSV, Excel, XML and RSS from the run's Storage tab or through the API.

#### How fresh is the data?

Every run hits the live catalogue. `scrapedAt` timestamps each row, so a price history built from scheduled runs is precisely dated.

#### Is scraping noon legal?

The Actor collects only publicly visible product information — the same data any visitor sees. See the legal note below.

#### How often is the Actor updated?

It is monitored and maintained. It reads a structured service rather than page markup, so storefront redesigns do not break it.

### 💬 Support, Issues & Reviews

- **Bug reports & target-site changes:** Hit an unexpected empty result or selector change? [Open a ticket in the Issues tab](https://apify.com/logiover/noon-product-scraper/issues) with your **Run ID** or sample input — we actively monitor issues and ship fixes fast.
- **Feature & field requests:** Need an additional data attribute or filter? [Request it in the Issues tab](https://apify.com/logiover/noon-product-scraper/issues).
- **Enjoying this Actor?** If it saved you engineering time, please consider leaving an honest [review on Apify Store](https://apify.com/logiover/noon-product-scraper/reviews) or bookmarking [logiover/noon-product-scraper](https://apify.com/logiover/noon-product-scraper) — organic developer feedback helps others discover reliable tools and keeps maintenance prioritized.

### Is it legal to scrape noon.com?

This Actor collects publicly available information only — product listings, prices and seller names that noon publishes openly to every visitor, with no login and no paywall. Collecting public data is broadly lawful in most jurisdictions, but you are responsible for what you do with it.

Review noon's Terms of Service before large-scale or commercial collection. Seller names are usually company names rather than personal data, but treat any individual trader's name accordingly under the GDPR or applicable UAE, Saudi and Egyptian data-protection law. This is not legal advice.

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by noon; noon and all other trademarks mentioned here are the property of their respective owners.

### Related scrapers

- **[Lazada Scraper](https://apify.com/logiover/lazada-scraper)** — Southeast Asian marketplace catalogue.
- **[Rozetka Product Scraper](https://apify.com/logiover/rozetka-product-scraper)** — Ukraine's largest online retailer.
- **[Falabella Product Scraper](https://apify.com/logiover/falabella-product-scraper)** — Chilean and Colombian retail pricing.

***

\*Maintained: last verified 2026-11-14 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).

### How much noon data can you extract in one run?

A single run returned **970 products** in 66 seconds on the example input. That is roughly **881 products a minute**. Widen the search — more queries, more pages, a broader location — and the same run goes deeper.

There is no hard ceiling built into this Actor. What bounds a run is the result limit you set, the breadth of the input you give it, and how much noon itself publishes. Because billing is per result, a wider run costs proportionally more and a narrow one costs almost nothing — so it is worth starting small and scaling once the output looks right.

### 📝 Changelog

#### 2026-11-14

- Verified live production health run (2026-11-14): extracted **35** structured records in **3.8s** with valid schema output.
- Hardened internal proxy stall fallback and pay-per-event dataset instance budget protection.

#### 2026-11-11

- Added reliable terminal run status telemetry and structured Apify AI / MCP Server (`mcp.apify.com`) tool configuration.
- Added direct Issues & Reviews support links and refreshed live maintenance verification.

#### 2026-11-01

- Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
- README refreshed: 1 link to retired Actors removed; independence disclaimer added.

#### 2026-10-15

- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
- Runs with a short timeout (API and AI-agent calls) now finish inside it with what they collected, instead of being cut off.
- Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.
- The prefilled example for `maxResults` is now 250 (was 100).
- The default used when the field is left out for `maxResults` is now 5,000 (was 500).

#### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 29 columns returned, 85.6% of cells populated.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.

#### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

#### 2026-08-13

- Initial release. Reads noon's public catalog service across the UAE, Saudi and Egypt marketplaces: 29 fields including honest discount handling, seller ratings, specs and bestseller ranks.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/noon-product-scraper/changelog.md

# Actor input Schema

## `keyword` (type: `string`):

What to search for on noon — e.g. 'laptop', 'iphone 15', 'perfume', 'air fryer'. Required: noon's catalogue is searched, not browsed.

## `marketplace` (type: `string`):

noon runs a separate catalogue, currency and seller pool per country. Pick the market you sell or buy in.

## `sortBy` (type: `string`):

Relevance mirrors noon's default ranking. Price sorts are useful for finding the cheapest or premium end of a category.

## `maxResults` (type: `integer`):

How many products to collect. noon returns roughly 2,000 products per search term; use several keywords to build a wider catalogue.

## `proxyConfiguration` (type: `object`):

Residential proxies pinned to the selected market are used by default. The marketplace itself is set by request headers, so results stay correct either way.

## Actor input object example

```json
{
  "keyword": "laptop",
  "marketplace": "uae",
  "sortBy": "relevance",
  "maxResults": 250,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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 = {
    "keyword": "laptop",
    "marketplace": "uae",
    "sortBy": "relevance",
    "maxResults": 250,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/noon-product-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 = {
    "keyword": "laptop",
    "marketplace": "uae",
    "sortBy": "relevance",
    "maxResults": 250,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/noon-product-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 '{
  "keyword": "laptop",
  "marketplace": "uae",
  "sortBy": "relevance",
  "maxResults": 250,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}' |
apify call logiover/noon-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/noon-product-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/t0D6ucrcJwD8BJebc/builds/1K0lcn0IjVyDhqbDW/openapi.json
