# Noon Product Data Scraper (`fetchfinch/noon-product-scraper`) Actor

Collect structured Noon product data for price monitoring, product research, competitor analysis, and catalog building. Start with a category, search, product URL, or SKU and get prices, discounts, ratings, sellers, availability, images, descriptions, specifications, and source links.

- **URL**: https://apify.com/fetchfinch/noon-product-scraper.md
- **Developed by:** [Fetch Finch](https://apify.com/fetchfinch) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 product 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 Product Data Scraper

### Collect Noon product listings, prices, offers, and details for research and monitoring

![No Noon API key required](https://img.shields.io/badge/No%20Noon%20API%20key-required-43A047)
![Pricing](https://img.shields.io/badge/Pricing-Pay%20per%20event-5C6BC0)
![Markets](https://img.shields.io/badge/Markets-UAE%20%7C%20Saudi%20%7C%20Egypt-00897B)
![Exports](https://img.shields.io/badge/Exports-JSON%20%7C%20CSV%20%7C%20Excel-F39C12)
![Public tasks](https://img.shields.io/badge/Public%20tasks-3%20ready--to--run-00A98F)

Collect clean, structured product data from [Noon](https://www.noon.com/) for price monitoring, ecommerce research, catalog building, deal tracking, and competitor analysis. Start with a category, deal page, collection, search term, product URL, or SKU and receive one dataset item per unique product.

### Public task examples

Use a ready-made configuration or open the Actor and create your own:

| Example | Use case |
| --- | --- |
| [Track UAE Pressure Cooker Prices](https://apify.com/fetchfinch/noon-product-scraper/examples/noon-uae-pressure-cooker-catalog) | Collect a category snapshot with prices, ratings, sellers, availability, and promotions. |
| [Compare UAE Milk Prices](https://apify.com/fetchfinch/noon-product-scraper/examples/noon-uae-grocery-milk-prices) | Search grocery products and enrich the results with descriptions and specifications. |
| [Monitor a Noon Product](https://apify.com/fetchfinch/noon-product-scraper/examples/noon-product-price-monitoring) | Look up a SKU and export detailed product, seller, offer, and availability data. |

See [all public examples](https://apify.com/fetchfinch/noon-product-scraper/examples).

### What you can collect

- **Catalog listings** from category, deal, collection, and other public listing pages.
- **Keyword results** for one or more searches such as `milk`, `wireless headphones`, or `perfume`.
- **Product details** from Noon product URLs or SKUs.
- **Market data** for UAE (AED), Saudi Arabia (SAR), and Egypt (EGP).
- **Price signals** including current price, original price, discount, currency, discount codes, and promotion text.
- **Seller and merchandising data** including seller ratings, review counts, badges, best-seller ranks, stock signals, and delivery nudges.
- **Rich details** including descriptions, specifications, and image galleries when `includeDetails` is enabled.

### Quick start

#### Collect a category

Paste a public Noon category or listing URL into `startUrl`:

```json
{
  "startUrl": "https://www.noon.com/uae-en/home-and-kitchen/kitchen-and-dining/cookware/pressure-cookers-and-accessories/pressure-cookers/",
  "market": "uae",
  "maxProducts": 50,
  "maxPages": 3,
  "includeDetails": false
}
```

#### Search for products

Leave `startUrl` empty and provide one or more search terms:

```json
{
  "searchTerms": ["wireless headphones", "bluetooth earbuds"],
  "market": "uae",
  "maxProducts": 50,
  "maxPages": 2,
  "includeDetails": true
}
```

#### Fetch product details

Use product URLs or Noon SKUs for direct lookups:

```json
{
  "productIds": ["N12278276A"],
  "market": "uae",
  "includeDetails": true
}
```

When a run finishes, open the dataset to download the results or connect it to an integration, webhook, schedule, or API workflow.

### Input parameters

| Parameter | Description |
| --- | --- |
| `startUrl` | Public Noon category, deal, collection, or listing URL. The Actor follows pagination until it reaches the configured limits. |
| `searchTerms` | Up to 10 product searches. Use this instead of `startUrl` for keyword discovery. |
| `productUrls` | Noon product page URLs for direct detail lookups. |
| `productIds` | Noon product SKUs such as `N12278276A` for direct detail lookups. |
| `market` | `uae`, `saudi`, or `egypt`; controls canonical URLs and currency labels. |
| `maxProducts` | Maximum unique products saved in the run. Default: `20`; maximum: `1000`. |
| `maxPages` | Maximum result pages per listing or search term. Default: `10`; maximum: `50`. |
| `includeDetails` | Fetch descriptions, specifications, seller data, and complete image galleries for listing or search results. |
| `requestDelayMs` | Delay before requests. Default: `300` milliseconds. |
| `maxRetries` | Retries for transient errors and HTTP 408, 429, and 5xx responses. Default: `2`. |
| `proxyConfiguration` | Optional Apify proxy settings for larger or recurring runs. Choose a country matching `market` when using residential proxies. |
| `proxyUrls` | Optional external HTTP or SOCKS proxy URLs. Use this instead of `proxyConfiguration`, not both. |

Provide at least one of `startUrl`, `searchTerms`, `productUrls`, or `productIds`. If you submit an empty input, the default run searches Noon for `milk`.

### Output dataset

The Actor saves one record per unique SKU. Fields are included when Noon provides the corresponding value.

| Group | Fields |
| --- | --- |
| Product | `title`, `url`, `image`, `images`, `brand`, `sku`, `catalogSku`, `offerCode`, `skuConfig` |
| Pricing | `currentPrice`, `originalPrice`, `discount`, `currency`, `discountCode`, `discountTagTitle`, `discountTagDetail`, `discountTagTerms` |
| Availability | `isBuyable`, `stockMinimumQuantity`, `flags` |
| Ratings | `rating`, `reviewsCount`, `isBestseller`, `bestSellerRank` |
| Seller | `seller`, `storeName`, `sellerPositiveRating`, `sellerRating`, `sellerRatingsCount` |
| Merchandising | `productBadges`, `dealTagText`, `dealTag`, `groups`, `nudges`, `isCollectionEligible`, `show3d` |
| Details | `description`, `specifications` |
| Provenance | `sourceUrl`, `sourcePage`, `sourceQuery`, `market`, `scrapedAt` |

Download datasets as JSON, CSV, Excel, XML, JSONL, or other formats supported by Apify. Dataset records can also be consumed through the Apify API, webhooks, Google Sheets, Airtable, Make, Zapier, and other integrations.

### Pricing

The Actor uses pay-per-event pricing. You pay for products saved to the default dataset:

| Apify plan tier | Price per result | Approximate price per 1,000 results |
| --- | ---: | ---: |
| Free | $0.00090 | $0.90 |
| Bronze | $0.00085 | $0.85 |
| Silver | $0.00080 | $0.80 |
| Gold and above | $0.00075 | $0.75 |

A small Actor-start charge also applies. See the [pricing tab](https://apify.com/fetchfinch/noon-product-scraper/pricing) for the current rates and Apify platform usage details.

### Proxy and reliability

Normal runs can be started directly from the Actor or a public task. For high-volume, scheduled, or frequently repeated collections, enable Apify residential proxies and select a country that matches the `market` input. Use `requestDelayMs` and `maxRetries` to control request pacing and transient failures.

If Noon returns a 403 or 429, reduce the run size, add a delay, or retry with a matching residential proxy. A proxy is most useful for larger recurring collections; small runs may work without one.

### Tips for better results

- Start with 20–50 products and one or two pages to confirm the target catalog.
- Increase `maxProducts` and `maxPages` gradually for larger snapshots.
- Enable `includeDetails` when descriptions and specifications are important; it makes one additional product request per result.
- Use a schedule to create recurring price and availability snapshots.
- Keep `market` and proxy country aligned when collecting Saudi or Egypt data.
- Products are de-duplicated by SKU within each run.

### Frequently asked questions

#### Does it support Noon search pages?

Yes. Use `searchTerms` for keyword discovery and optionally enable `includeDetails` for enriched product records.

#### Can I scrape deal and collection pages?

Yes. Use the public Noon URL as `startUrl` when it contains product listings.

#### Can I fetch one product?

Yes. Provide a product URL in `productUrls` or a SKU in `productIds`.

#### Does it handle pagination?

Yes. The Actor continues through listing or search pages until it reaches `maxProducts`, `maxPages`, or the end of the available results.

#### Are duplicate products removed?

Yes. Each unique SKU is saved once per run.

#### What if Noon does not provide a field?

That field is omitted or returned empty. Availability of discounts, seller metrics, badges, and ratings varies by product and market.

#### Do I need the Noon sitemap?

No. Provide the catalog or search URL you want to collect. Sitemap crawling is not required for normal runs.

### Support

Use the [Issues tab](https://console.apify.com/actors/RChd792tR8r3xDI4o#/issues) for bug reports and feature requests. Include the input mode, market, and run URL when reporting a failed run.

### Responsible use

This Actor is intended for legitimate collection of publicly available product information. You are responsible for following Noon’s terms, applicable laws, privacy requirements, and your organization’s data policies.

# Actor input Schema

## `startUrl` (type: `string`):

Public Noon category, deal, collection, or listing URL. The Actor paginates this listing directly through Noon’s JSON endpoint.

## `searchTerms` (type: `array`):

Product queries to search, such as milk, iPhone, or perfume. Search pages use Noon’s catalog endpoint directly.

## `productUrls` (type: `array`):

Optional Noon product page URLs. The product SKU is read from the URL and resolved with the JSON product endpoint.

## `productIds` (type: `array`):

Optional Noon product SKUs, for example N12278277A. Offer codes are not product SKUs.

## `market` (type: `string`):

Sets canonical product URLs and currency labels. Noon selects API market data by request IP, so pair this with a proxy in the same country for Saudi Arabia or Egypt.

## `maxProducts` (type: `integer`):

Maximum unique products to save across the listing, searches, and direct product IDs.

## `maxPages` (type: `integer`):

Maximum number of result pages to fetch from the listing URL or each search term. Noon currently returns up to 50 products per page.

## `includeDetails` (type: `boolean`):

Make one additional HTTP request per product to collect description, specifications, seller, and all images.

## `requestDelayMs` (type: `integer`):

Delay before each request to reduce request rate. Retries use additional backoff.

## `maxRetries` (type: `integer`):

Retry transient network errors and HTTP 408, 429, and 5xx responses.

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

Optional Apify proxy configuration. If Noon returns 403 or 429, enable residential proxies and select a country matching Market.

## `proxyUrls` (type: `array`):

Optional list of external HTTP or SOCKS proxy URLs. Credentials are part of the run input; keep runs private. Use either these URLs or Apify Proxy, not both.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "market": "uae",
  "maxProducts": 20,
  "maxPages": 10,
  "includeDetails": false,
  "requestDelayMs": 300,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One record for each unique Noon product returned by a search or direct SKU lookup.

## `summary` (type: `string`):

Search and detail request counts and product totals.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchfinch/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("fetchfinch/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 '{}' |
apify call fetchfinch/noon-product-scraper --silent --output-dataset

```

## MCP server setup

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