# 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
- **Stats:** 2 total users, 1 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# 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"])
```

### Use with AI agents (MCP)

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."*

### 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.

### 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.

### Related scrapers

- **[eBay Scraper](https://apify.com/logiover/ebay-scraper)** — global marketplace listings and prices.
- **[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.

# 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": 100,
  "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": 100,
    "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": 100,
    "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": 100,
  "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/6QHOlIdpqz2pivKcB/openapi.json
