# Noon Product Scraper — UAE, KSA, Egypt & GCC (`memo23/noon-scraper`) Actor

Scrape noon.com products — title, brand, list and sale price, seller, stock, rating, specs and image gallery. Keywords, category listings, product URLs or SKUs. UAE, Saudi Arabia, Egypt and the GCC, English or Arabic. Optional buy-box, reviews and food. Pay per result. JSON or CSV out.

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

## Pricing

from $0.80 / 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?

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 Product Scraper — UAE, KSA, Egypt & GCC

Scrape **noon.com** product catalogs into structured rows: price, sale price, seller, stock, rating, specs, images and buy-box offers. Paste a keyword, a search URL, a category URL, a product URL, or a bare SKU. JSON or CSV out.

![How the Noon Product Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-noon.png)

### Why use this scraper?

- **Keywords and URLs in one actor** — search, category and product pages, plus bare SKUs like `N70211466V`.
- **Country from the URL** — `/saudi-en/` is SAR, `/egypt-en/` is EGP, `/uae-en/` is AED. A Country field covers keywords that have no locale.
- **Listing fields without a second hop** — sku, title, brand, price, seller, rating and images come from noon's catalog API.
- **Optional buy-box** — turn on Scrape product detail for description, 20+ specs, variants and every seller on the offer.
- **One row per product** — you pay per result, not per page.

### Overview

noon.com is the main English-language marketplace across the UAE, Saudi Arabia, Egypt and the rest of the GCC. This scraper is for **price monitoring, seller / buy-box tracking, catalog research and MENA e-commerce intelligence**.

It talks to noon's public catalog API (`/_svc/catalog/api/v3`) with a Firefox TLS fingerprint. No login, no browser, no app token.

### Supported inputs

| Input | Example | Status |
|---|---|---|
| Keyword | `iphone`, `stroller` | Works |
| Search URL | `https://www.noon.com/uae-en/search?q=iphone` | Works |
| Category URL | `https://www.noon.com/saudi-en/strollers/` | Works |
| Product URL | `https://www.noon.com/uae-en/{slug}/N70211466V/p/` | Works |
| Bare SKU | `N70211466V` | Works |
| food.noon.com restaurants / menus | — | Not supported |
| Reviews | — | Not supported (separate lane) |
| Seller-only monitoring by ASIN | — | Not supported as a dedicated mode; buy-box sellers appear when Scrape product detail is on |

A URL's locale always overrides the Country field.

### Use cases

| Team | What they build |
|---|---|
| **Price intelligence** | Daily UAE / KSA / Egypt price and sale-price feeds |
| **Marketplace sellers** | Buy-box and competing-offer snapshots on their SKUs |
| **Catalog / sourcing** | Category crawls with brand, specs and seller |
| **Agencies** | Client dashboards for noon vs Temu / 1688 / Amazon |

### How it works

1. Classify each keyword and URL (search / category / product).
2. Call noon's catalog API with `x-locale` set to the marketplace (`en-ae`, `en-sa`, `en-eg`, …).
3. Paginate search and category results (50 products per page) up to Max items.
4. Optionally fetch `/{sku}/p` for description, specs and every buy-box offer.
5. Push one dataset row per product.

### Input configuration

| Field | What it does | Default |
|---|---|---|
| `searchQueries` | Keywords to search. Each is paginated to Max items. | — |
| `startUrls` | Search, category or product URLs, or a bare SKU. | — |
| `country` | Marketplace for keywords and bare SKUs: `uae`, `saudi`, `egypt`, `bahrain`, `qatar`, `kuwait`, `oman`. | `uae` |
| `scrapeDetails` | Fetch description, specs, variants and buy-box offers. One extra request per product. | `false` |
| `maxItems` | Hard cap across the whole run. Free-tier runs are capped at 100. | `100` |
| `maxConcurrency` | Parallel detail fetches when `scrapeDetails` is on. | `8` |
| `proxy` | Optional. Direct Firefox works from most networks; use residential if you see empty or challenged responses. | off |

Keyword search in the UAE:

```json
{
    "searchQueries": ["iphone"],
    "country": "uae",
    "maxItems": 50
}
```

Category URL in Saudi Arabia:

```json
{
    "startUrls": ["https://www.noon.com/saudi-en/strollers/"],
    "maxItems": 100
}
```

Product URLs with buy-box:

```json
{
    "startUrls": [
        "https://www.noon.com/uae-en/iphone-17-pro-max-256-gb-esim-only-deep-blue-5g-with-facetime-international-version/N70211466V/p/"
    ],
    "scrapeDetails": true
}
```

### Output overview

One JSON object per product. Listing runs include price, seller and rating. Detail runs add `description`, `specifications`, `offers` (every buy-box seller) and `variantSkus`.

### Output samples

Listing row (keyword `iphone`, UAE):

```json
{
    "sku": "N70211466V",
    "title": "iPhone 17 Pro Max 256 GB (eSIM only) Deep Blue 5G With FaceTime - International Version",
    "brand": "Apple",
    "price": 5099,
    "salePrice": 4649,
    "currency": "AED",
    "storeName": "callmate",
    "productRating": 4.5,
    "country": "uae",
    "productUrl": "https://www.noon.com/uae-en/iphone-17-pro-max-256-gb-esim-only-deep-blue-5g-with-facetime-international-version/N70211466V/p/"
}
```

Detail extras on the same SKU: 27 specifications, 8 buy-box offers (callmate, Royal Deals, Tech Bay, …), warranty `1 year manufacturer warranty`, category `Smartphones`.

### Key output fields

**Identity** — `sku`, `catalogSku`, `title`, `brand`, `brandCode`, `productUrl`, `country`, `currency`

**Price & availability** — `price`, `salePrice`, `isBuyable`, `stock`, `isBestseller`, `flags`

**Seller** — `storeName`, `partnerCode`, `sellerRating`, `sellerRatingCount`

**Ratings** — `productRating`, `productRatingCount`

**Media** — `image`, `images`

**Detail (when enabled)** — `description`, `featureBullets`, `specifications`, `category`, `breadcrumbs`, `warranty`, `estimatedDelivery`, `offers`, `variantSkus`

**Provenance** — `sourceQuery`, `scrapedAt`

### FAQ

**Which countries work?** UAE, Saudi Arabia, Egypt, Bahrain, Qatar, Kuwait and Oman. Locale in the URL wins. Keywords use the Country field.

**Does it scrape reviews?** No. Ratings and rating counts are included; review text is not.

**Does it scrape food.noon.com?** No.

**Why is `salePrice` sometimes null?** noon only sets it when the product is on sale. Use `salePrice ?? price` as the live price.

**Do I need a proxy?** Not for the catalog API from a normal residential or home IP with Firefox fingerprinting. If Akamai starts challenging you, turn on residential proxies.

**What is a SKU?** The id in the product URL, e.g. `N70211466V` or `ZD6DC57735DD5A1C8E9E8Z`.

### Support

Open an issue on the [actor page](https://apify.com/memo23/noon-scraper/issues/open), or email `thewebscrapingguy@gmail.com`.

### Additional services

Custom fields, scheduled monitors, or a private noon + Temu + 1688 bundle — same email.

### Explore more scrapers

- [1688 Wholesale Scraper](https://apify.com/memo23/1688-wholesale-scraper)
- [Temu Scraper](https://apify.com/memo23/temu-scraper)
- [Alibaba Scraper](https://apify.com/memo23/alibaba-scraper)

### 🤖 For AI Agents & LLM Apps

**Purpose:** scrape noon.com products (UAE / KSA / Egypt / GCC) into one row per SKU.

**Minimal input:**

```json
{ "searchQueries": ["iphone"], "country": "uae", "maxItems": 20 }
```

**Useful fields:** `sku`, `title`, `brand`, `price`, `salePrice`, `currency`, `storeName`, `productRating`, `productUrl`, `country`, `offers` (only when `scrapeDetails: true`).

**Billing:** one dataset row per product. Detail mode costs an extra HTTP request per SKU, not an extra row.

**Behavior:** empty searches succeed with zero rows and say so. Unknown hosts in `startUrls` are skipped. Free-tier runs cap at 100 items.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Noon AD Holdings Ltd or noon.com. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available noon.com catalog pages and the public catalog API — no authenticated endpoints, paid features, or content behind a noon login. Users are responsible for ensuring their use complies with noon.com's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

noon scraper, noon.com scraper, scrape noon, noon product scraper, noon UAE scraper, noon KSA scraper, noon Egypt scraper, noon buy box scraper, noon seller scraper, MENA ecommerce scraper, UAE price monitoring, Saudi marketplace data, Egypt product catalog, noon SKU scraper, Apify noon

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on noon.com. Each becomes a catalog search (50 products per page) and is paginated up to your Max items limit. Example: `iphone`.

## `startUrls` (type: `array`):

Direct noon.com URLs. Accepts search pages (`https://www.noon.com/uae-en/search?q=iphone`), category pages (`https://www.noon.com/saudi-en/strollers/`), product pages (`…/{sku}/p/`), or a bare SKU such as `N70211466V`. The locale in the URL picks the marketplace.

## `country` (type: `string`):

Marketplace used for keywords and bare SKUs that have no country in the URL. A URL's own locale (`/saudi-en/…`, `/egypt-en/…`) always overrides this. Values: uae (AED), saudi (SAR), egypt (EGP), bahrain, qatar, kuwait, oman.

## `scrapeDetails` (type: `boolean`):

When enabled, each product's detail API is fetched to add the long description, specification list, variants and every buy-box seller (price, stock, warranty, delivery). Adds one HTTP request per product — slower and costlier — so leave off if the search-level fields are enough.

## `maxItems` (type: `integer`):

Hard cap on the number of products returned across all keywords and URLs. One search page yields about 50 products. Free-tier runs are capped at 100.

## `maxConcurrency` (type: `integer`):

Maximum number of product detail requests in parallel (only relevant when "Scrape product detail" is on).

## `proxy` (type: `object`):

Optional. noon.com answers the catalog API from this network without a proxy when the client uses a Firefox TLS fingerprint. Turn on residential proxies only if you start seeing empty or challenged responses.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "startUrls": [],
  "country": "uae",
  "scrapeDetails": false,
  "maxItems": 100,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

Dataset of noon.com products with price, sale price, seller, stock, rating, specifications, images and buy-box offers when detail scraping is on.

# 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 = {
    "searchQueries": [
        "iphone"
    ],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["iphone"],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "searchQueries": [
    "iphone"
  ],
  "startUrls": []
}' |
apify call memo23/noon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/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/hqVJqZGCaauVJcamD/builds/69qbfd009juNconnJ/openapi.json
