# Noon Scraper: Products, Prices, Sellers, Stock (`automation_craft/noon-scraper`) Actor

Scrape noon.com searches, categories, brands, bestseller lists, links or SKUs for the UAE, Saudi Arabia, Egypt and four more stores, and noon Minutes at your delivery point. Get price, was price, discount, rating, seller, stock and every seller offer. No login; JSON, CSV or Excel; pay per product.

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

## Pricing

from $0.08 / 1,000 products

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: Products, Prices, Sellers, Stock

**Noon scraper** for noon.com, the Gulf's home grown marketplace: get every product of a noon search, category, brand page,
bestseller list or product link as clean rows with **price, was price, discount, rating, seller and seller rating, stock left, express
delivery, delivery estimate, best seller rank and bank offers**, for the **UAE, Saudi Arabia, Egypt, Kuwait, Qatar, Bahrain and Oman**,
in English or Arabic, and **noon Minutes** quick delivery searches at the delivery point you choose (UAE and Saudi Arabia, Egypt at
its one point: the dark store's price, pack size, stock and order limit). On request each product's page adds full specifications, model number, colour, description, variants and
**every seller's offer with its exact stock, warranty, return policy and delivery date**. No login, no cookies of yours, no API key. You pay per
product delivered; misses, repeats and filtered products are free.

Use it to check your own and other sellers' prices, buy box and stock on noon, to export a noon category to Excel, to follow best seller
ranks and deals on a schedule, or to feed a Gulf price comparison or price history sheet of your own.

### Quick start

1. Open the Actor's **Input** tab.
2. Type **Search words** (iphone 17, perfume, air fryer), pick **Categories** (smartphones, laptops, fragrance ...), name **Brands**
   (Apple, Samsung), paste **noon.com links** (a search, category, brand, bestseller or product page), or give **SKUs** (N70211556V).
   For noon Minutes, type **noon Minutes search words** (milk, eggs) and optionally a **delivery point** (latitude and longitude).
3. Pick the **Store** (UAE by default; Saudi Arabia, Egypt, Kuwait, Qatar, Bahrain, Oman) and the **Language** (English or Arabic).
   Links carry their own store.
4. Optionally set noon's own filters: price range, minimum rating, sellers, express or supermall delivery, deals, lowest price in 30
   days, new arrivals, delivery today, and any other filter of noon's panel such as "Colour: Black" or "Storage: 256 GB". Pick an order.
5. Set **Max products per search** (default 100) and turn on **Product details** for the full product page.
6. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API.

### What you get

#### Product rows (the Product event)

One row per noon product (SKU) and store. The fill column is measured on 781 product rows of the platform test runs of
2026-10-28 (matrix t6 on build 0.1.13: searches, categories, brand and bestseller pages, SKUs and links, all seven stores, English
and Arabic; the 12,000 row price band split is left out so one category does not weigh for all); a field noon shows only on some
products (a sale price, a best seller rank, a low stock note) is filled only there.

| Field | What it is | Example | Fill |
|---|---|---|---|
| `sku` | noon's product code | N70283855V | 100% |
| `name` | product name, in the run's language | Galaxy S26 Ultra Dual SIM Black 12GB RAM 256GB 5G - Middle East Versio | 100% |
| `brand` | brand as noon shows it | Samsung | 93% |
| `brandCode` | noon's brand code | samsung | 100% |
| `price` | what a buyer pays now | 406.09 | 100% |
| `wasPrice` | the struck price beside a sale price | 600.36 | 57% |
| `discountPercent` | discount, rounded | 32 | 57% |
| `currency` | AED, SAR, EGP, KWD, QAR, BHD or OMR | BHD | 100% |
| `priceUsd` | price in US dollars (pegged currencies only) | 1080.03 | 96% |
| `rating` | average rating out of 5 | 4.7 | 93% |
| `ratingCount` | number of ratings | 16867 | 93% |
| `seller` | seller of the offer noon shows first | Famous Store GT | 100% |
| `sellerRating` | the seller's rating | 4.8 | 96% |
| `sellerRatingCount` | ratings of the seller | 186 | 96% |
| `sellerPositivePercent` | positive seller ratings, percent | 91 | 96% |
| `isBuyable` | can be bought now | true | 100% |
| `stockLeft` | units left when noon shows a low stock note | 5 | 19% |
| `expressDelivery` | fulfilled by noon (Express) | true | 100% |
| `supermallDelivery` | supermall delivery within the hour | false | 100% |
| `freeDelivery` | free delivery | false | 100% |
| `deliveryEstimate` | noon's delivery text as served, with its bold tags | Get it by <b>3 - 4 Nov</b> | 88% |
| `deliveryEstimateText` | the same text without the tags | Get it by 3 - 4 Nov | 88% |
| `bestSellerRank` | best seller rank | 3 | 19% |
| `bestSellerCategory` | the category of that rank | Smartphones | 17% |
| `soldRecently` | units noon says sold recently ("6300+ sold recently"; on 2 percent of 805 rows of 2026-10-16, none of these 781) |  | 0% |
| `dealTag` | deal tag (Deal, Mega Deal ...) |  | 27% |
| `nudges` | noon's notes (Lowest price in a year ...) | #3 in Smartphones | 86% |
| `bankOffers` | bank and coupon offers with terms | {...} | 85% |
| `keySpecs` | key specifications from the listing | {...} | 64% |
| `image` | main image | https://f.nooncdn.com/p/pzsku/Z14441105AC6E5956EAB6Z/45/\_/17... | 100% |
| `images` | image gallery | (list of image links) | 100% |
| `video` | product video | https://a.nooncdn.com/cms/pages/20260305/43bd4882343620a486d... | 14% |
| `url` | product page | https://www.noon.com/bahrain-en/galaxy-s26-ultra-dual-sim-bl... | 100% |

`source` names the input that found the row (search words, a listing path, a SKU or a link), `page`, `position` and `totalResults`
place it in noon's results. With `includeRaw` the row also carries `raw`, the object noon sent, every key as noon names it.

Every text is delivered exactly as noon serves it (names, nudges, delivery texts, descriptions, specifications, reviews, warranty and
return texts), never rewritten; the two copies with noon's HTML tags removed are named as such (`deliveryEstimateText`,
`details.descriptionText`).

#### noon Minutes rows (the Product event)

noon Minutes is noon's quick delivery from dark stores in the UAE, Saudi Arabia and Egypt. Its stock and order limits are those of the
dark store that serves the delivery point, so a search there is read at the point you set (`deliveryLatitude`, `deliveryLongitude`;
left out, noon's own default point: Downtown Dubai in the UAE, Riyadh in Saudi Arabia; Egypt's noon Minutes serves one point in Cairo
and takes no other). Each item is one row, billed as a Product, with `channel`
`minutes` and its own fields:

Fill measured on the 360 noon Minutes rows of the platform test runs of 2026-10-28 (matrix t7m on build 0.1.14: milk, rice and bread
in Dubai, Abu Dhabi and Jeddah, English and Arabic):

| Field | What it is | Example | Fill |
|---|---|---|---|
| `sku`, `offerSku` | noon's product code, and the item as noon Minutes serves it | ZB66FEAC2410E49684126Z, ZB66FEAC2410E49684126Z-1 | 100% |
| `name`, `subtitle` | as served | Fresh Milk Full Fat | 100%, 1% |
| `brand`, `brandCode` | as served | Almarai, almarai | 89%, 92% |
| `price`, `listPrice` | what a buyer pays now, and noon's list price | 12.5, 13.5 | 100% |
| `wasPrice`, `discountPercent` | the struck price beside a sale, the discount noon shows | 13.5, 7 | 42%, 37% |
| `packSize` | the pack size shown | 2L | 90% |
| `isBuyable`, `availability`, `notBuyableReason` | in stock at that dark store | true | 100% |
| `maxOrderQuantity` | the most one order may hold (it differs from dark store to dark store) | 15 | 100% |
| `volume`, `weight` | noon's own logistics figures for the item, as served (noon states no unit; weight is 0 on some items) | 3318, 0.1 | 100% |
| `labels`, `offerText`, `offerQuantity` | noon's labels (Buy 2 for 1.60, Exclusive, Buy Again ...) and offer notes, as served | {...} | 99%, 1% |
| `isSponsored`, `sponsoredText` | a paid placement among the results, marked "Ad" by noon (2 of the 360) | false | 100% |
| `comboItems` | the items of a bundle (SKU, name, quantity, pack size, order limit, volume, weight) | \[...] | 9% |
| `categoryCode`, `sellerId`, `ageCheckRequired` | noon's category code, partner id, age check flag | milk | 90%, 100%, 100% |
| `image`, `images`, `imageKeys` | pictures | https://f.nooncdn.com/p/pzsku/... | 100% |
| `darkStore`, `deliveryPoint` | the dark store whose stock the row shows, and the point noon answered for | W00809697AE, {"lat": 24.47, "lng": 54.35} | 100% |
| `url` | the item's noon Minutes page | https://minutes.noon.com/uae-en/now-product/ZB66FEAC2410E49684126Z-1/ | 100% |

A point noon Minutes does not deliver to is answered by noon for its default point; the Actor compares the point noon answered for with
the one you set and delivers nothing from such a page (a free status row names both). noon Minutes orders by recommendation or by price
(both ways) and takes none of this Actor's filters, so a run that asks for one gets a free row for its noon Minutes searches. Its items
have no product detail add-on.

#### Product details (the Product detail event, optional)

With **Product details** on, the product page of each delivered row is read and nested in the row as `details`:

| Field | What it holds |
|---|---|
| `specifications`, `highlights`, `description`, `descriptionText` | every specification noon lists (name, code, value), the feature bullets, the long description as served and without tags |
| `modelNumber`, `modelName`, `colour`, `weight` | the specifications buyers ask for by name, read by noon's own codes (null when the page does not list them) |
| `breadcrumbs`, `breadcrumbTrail`, `categoryCode`, `categoryPaths` | where noon files the product: the names, and each level's name, path and link |
| `variantGroups` | the product's other versions (colour, size, storage ...) with their SKU, link and whether each is available |
| `variants[].offers[]` | **every seller's offer**: seller, seller code, seller rating and rating count, positive and "item as shown" percent, seller badges and years on noon, price, was price, discount, **exact stock**, stock warning, buyable, fulfilled by noon, supermall, warranty, extended warranty, returnable and return policy, delivery text, date, time slot and expiry, shipping fee note, bank offers, payment and cashback offers, installments, offer badges, add to cart and buy now state |
| `buyBox`, `offerCount`, `sellerCount`, `lowestOfferPrice`, `highestOfferPrice`, `stockTotal` | the offer noon shows first and the spread of all offers |
| `rating`, `ratingCount`, `reviews` | the rating summary and the up to five reviews on the page (rating, title, text, author, date) |
| `images`, `videos`, `frequentlyBoughtTogether`, `bestSellerList`, `newerModelSku`, `sizingGuide`, `shippingNotes` | media, the products noon bundles, the bestseller list of its category, a newer model when noon names one |

Measured on the 13 product pages of matrix t6 (air fryers, phones and a laptop; UAE and Saudi Arabia): `modelNumber` and `colour` 13 of
13, `modelName` 12, `weight` 2 (most pages list no weight), `breadcrumbTrail` 13, `description` 11, `reviews` 9. The row's price,
seller, stock, rating, brand and delivery flags are then the page's own (the page is newer than the listing; a value the page does not
carry is empty on the row, never the listing's older one). With **One row per seller offer**
also on, each offer is written as its own free `offer` row as well (buy box first, 30 a product at most), for buy box tracking in a
sheet.

#### Product lookup (SKUs and product links)

A SKU or a product link is looked up with its own search on noon (which answers that product alone), or read from its product page when
noon's search does not list it (an item not on sale). A product found that way is billed as a Product plus a Product lookup; a SKU noon
does not have gets a free `not_found` row.

#### Free rows

- one `coverage` row per search, category or link: what noon lists (`totalOnNoon`, noon's own figure, which moves from call to call),
  pages and rows read, products delivered, repeated or filtered out, the filters sent, whether the walk is
  complete and why it stopped; with **Filter options** also noon's filter lists for it (brands, sellers, colours, storage, delivery
  types ... with their codes);
- `status` rows: an input that cannot be used (field and position named; a setting this Actor does not have refuses the run, and then
  only the run's start fee is charged), a SKU or page noon does not have, a filter value noon does
  not list for a page (with the closest values it does list), a noon Minutes delivery point noon does not serve, a filter, order or page noon did not apply, a door noon refused, inputs
  not started because the run stopped;
- one `category_tree` row per store with **Category tree** on: noon's category menu (titles and links);
- one `summary` row at the end: counters, requests, the doors used, what was charged and confirmed.

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

You pay per event, on the Store's discount tiers:

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Product (per 1,000) | $0.106 | $0.097 | $0.088 | $0.076 |
| Product lookup (per 1,000, SKUs and product links only) | $0.60 | $0.55 | $0.50 | $0.45 |
| Product detail (per 1,000, only with Product details) | $0.80 | $0.80 | $0.70 | $0.70 |
| Actor start (once per run) | $0.006 | $0.006 | $0.006 | $0.006 |

Platinum and Diamond plans pay the Gold price. The Actor start event has no discount. The Store pricing card shows these same prices
per 1,000 events: "$0.076 / 1,000" on the Product row means one product costs less than a hundredth of a cent at Gold.

Examples at Gold: 1,000 products of a search cost $0.076 + $0.006 = $0.082; 1,000 products with their product pages $0.776 + $0.006;
100 SKUs $0.0526 + $0.006; 1,000 noon Minutes items $0.076 + $0.006. Repeated and filtered products, misses and refused pages are free.

### Input

| Setting | What it does |
|---|---|
| `searchTerms` | words to search, one search each |
| `minutesSearchTerms` | words to search on noon Minutes, one search each (the UAE, or Saudi Arabia or Egypt when `country` says so) |
| `deliveryLatitude`, `deliveryLongitude` | the noon Minutes delivery point in degrees (both or neither) |
| `startUrls` | noon Minutes search links (`minutes.noon.com/uae-en/search/?q=milk`), and noon.com links: search (`/uae-en/search/?q=...`), category or any listing page (`/uae-en/electronics-and-mobiles/.../smartphones/`), brand page (`/uae-en/dell/`), bestseller list (`/uae-en/best-sellers/smartphones/`), product page (`/uae-en/<name>/N70211556V/p/`), with noon's own filters and order in the link |
| `skus` | noon SKUs, looked up one by one |
| `categories` | a category of the picker, or a path below the store (`beauty-and-health/beauty/fragrance`) |
| `brands` | brand names; alone, each brand is read as its own list |
| `country`, `language` | the store and language of searchTerms, skus, categories and brands |
| `sellers`, `fulfilment`, `deals`, `lowestPriceIn`, `newArrivalsIn`, `deliveryToday`, `filters` | noon's own filters, matched against the lists noon shows for each search or category |
| `minPrice`, `maxPrice`, `minRating` | sent to noon and checked again on each row |
| `sort` | recommended, price_low_to_high, price_high_to_low, newest, rating |
| `maxItemsPerSearch`, `maxItems`, `maxPagesPerSearch`, `pageSize` | limits per search, in all, pages read, products per page |
| `splitLargeLists` | lists past noon's cap of 10,000 are read in price bands |
| `includeDetails`, `offerRows`, `includeFacets`, `includeCategoryTree`, `includeRaw`, `omitEmptyFields` | add-ons and output options |
| `maxConcurrency`, `requestTimeoutSecs`, `maxRequestRetries`, `requestDelaySecs`, `proxyConfiguration` | run settings (leave as they are) |

Example: the newest perfumes under 200 AED from noon Express, with their product pages, in Arabic:

```json
{
    "searchTerms": ["perfume"],
    "maxPrice": 200,
    "fulfilment": ["express"],
    "sort": "newest",
    "language": "ar",
    "includeDetails": true,
    "maxItemsPerSearch": 50
}
```

#### Filters: noon's own names

noon drops a filter it does not know without a word and then shows every product. So each search or category first reads its own filter
lists, sends only the brands, sellers and values noon lists there, and checks noon's answer on every page: a value noon does not list
gets a free row with the closest values it does list, and a page whose answer does not repeat what was sent is not delivered. Use the
names noon shows in its filter panel ("Colour: Black", "RAM Size: 12 GB"). Price, rating, brand, seller and express delivery are checked
again on every row. noon compares prices in whole units (20.50 passes a maximum of 20 on noon's side); the row check keeps the exact
bound.

#### Large lists

noon serves 50 pages of one list (10,000 products at 200 a page). Page 51 shows page 50 again, so the Actor stops there and the coverage
row says the list is not complete. Narrow it with a filter, or turn on **Split large lists**: the list is read again in price bands,
each band halved until it fits under the cap, every product delivered once, the bands listed on the coverage row.

#### How long a run takes

Measured on the platform at the default 256 MB: 1,400 noon Minutes items of one search in under a minute; 10,000 products of a category in about 7 minutes (a page of 200 products answers in 1 to
5 seconds); product pages take 8 to 13 seconds of noon's own time each, about 20 to 25 a minute with Product details on; SKUs are looked
up one search each at the pace noon allows one address, about 20 to 35 a minute (200 SKUs in 6 to 10 minutes). Set the run's timeout
to match long SKU lists. A SKU noon does not have costs a search and an 8 to 13 second product page that bill nothing: a list whose first SKUs are all unknown
stops after about 5 to 10 of them in a row (measured: 20 unknown SKUs gave 5 `not_found` rows, 4 `skipped` rows whose product page
was not read, and one free `skipped` row for the other 11, `work_allowance`, nothing charged but the run's start fee), so put SKUs you
know are live first, or split old lists. Leave **Delay between requests** at 0 unless you need a slower pace: its waits are run time too, and with
SKUs a delay above about 7 seconds costs more than a found SKU pays, so a long SKU list then stops early (`work_allowance`).

### Integrations

Run it from the Apify API, schedule it, or connect it to Make, Zapier, n8n, Google Sheets or a webhook. With the API:

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~noon-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["iphone 17"], "country": "saudi", "maxItemsPerSearch": 20}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('automation_craft/noon-scraper').call({ skus: ['N70211556V'], includeDetails: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/noon-scraper").call(run_input={"categories": ["smartphones"], "maxItemsPerSearch": 500})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

### What this Actor does NOT do

- **Reviews beyond the five on a product page.** noon's review list refuses every address this Actor can use (Akamai "Access Denied"
  to the run's own address, datacenter and residential UAE addresses, 9 of 9 on 2026-10-16); the product page carries the rating
  summary and up to five reviews, which Product details deliver. noon shows no star breakdown, helpful counts, verified purchase flags or
  review photos there.
- **noon Food** (restaurants): a separate service of restaurants and menus, not products.
- **noon Minutes beyond its searches**: its category and brand pages, its filters and its product pages (description, specifications,
  nutrition) are not read. The dark store follows the delivery point: noon ignores a dark store or zone code sent on its own (3 of 3
  each, 2026-10-28), so there is no dark store setting.
- **A discount order or reversed orders.** noon offers five orders; asked for a discount order it answers with its recommended one, and
  for rating or new arrivals in reverse with the usual direction.
- **Dollar prices for KWD and EGP.** The UAE dirham, Saudi riyal, Qatari riyal, Bahraini dinar and Omani rial are pegged to the US dollar,
  and their rows carry `priceUsd`; the Kuwaiti dinar and Egyptian pound are not pegged, so their dollar price would need a rate from
  another source.
- **Logged in data**: no seller dashboard, orders, carts or prices behind a login.
- **Monitoring between runs**: no memory from one run to the next, no "new products only" mode, no price, stock or seller change
  tracking and no alerts. Each run delivers what noon shows at that moment; schedule it on Apify and compare the runs in your own sheet
  (every row carries `scrapedAt`). Within one run a product is delivered once.
- **Price history before a run**: a row carries the price now, the was price and noon's own notes ("Lowest price in a year"), not a
  history; the `lowestPriceIn` filter uses noon's own lowest price marks.
- **Review translation.**

### FAQ

#### Does noon have an API?

noon's partner API is for its own sellers and needs a seller account. This Actor reads the public catalog any visitor sees, as rows,
for all seven stores, through the Apify API or a schedule.

#### How do I track noon prices?

Give the searches, categories or SKUs to follow and schedule the run on Apify (daily, hourly): each run delivers every product with its
price, was price, discount, seller and stock at that moment, and its `scrapedAt` time. Append the runs to a Google Sheet or a database
and compare them there; the Actor itself keeps nothing between runs.

#### Can I scrape noon Saudi Arabia (KSA)?

Yes. Set Store to Saudi Arabia, or paste a `/saudi-en/` or `/saudi-ar/` link: prices come in SAR from noon's Saudi store, in English or
Arabic, read through Apify residential addresses in the Gulf (noon's Saudi pages refuse other visitors).

#### Can I scrape noon Minutes grocery prices for my area?

Yes. Give `minutesSearchTerms` (milk, eggs, rice) and the delivery point's latitude and longitude: each row carries the price, pack
size, stock and order limit of the dark store that serves that point, with its code (`darkStore`). Run the same words at several points
to compare dark stores. Saudi Arabia's and Egypt's noon Minutes are read with `country` set to saudi or egypt.

#### How do I export noon products to Excel or CSV?

Run a search or category, then open the run's Storage tab and download the dataset as Excel or CSV (the Products view keeps the main
columns; turn on Leave out empty fields for a smaller file).

#### Why does this Actor run with limited permissions?

Least privilege: it reads and writes only its own run's storage (its dataset and key-value store). It cannot see your other actors,
datasets or settings.

### Changelog

See the Changelog tab: 0.1 (2026-10-28), the first release.

### More data tools by Automation Craft

- [Trendyol Scraper: Products, Prices, Reviews](https://apify.com/automation_craft/trendyol-scraper)
- [Flipkart Scraper: Products, Prices, Sellers](https://apify.com/automation_craft/flipkart-scraper)
- [AJIO Scraper: Fashion Search, Prices, Reviews](https://apify.com/automation_craft/ajio-scraper)
- [Myntra Scraper: Fashion Products, Prices, Sizes](https://apify.com/automation_craft/myntra-scraper)
- [Nykaa Scraper: Beauty Products, Prices, Reviews](https://apify.com/automation_craft/nykaa-scraper)
- [Amazon Product Scraper - Search, Best Sellers](https://apify.com/automation_craft/amazon-data-scraper)
- [Amazon Sponsored Products Scraper - Ads by Keyword](https://apify.com/automation_craft/amazon-sponsored-products-scraper)
- [Mercari US Scraper: Listings, Sold Prices](https://apify.com/automation_craft/mercari-us-scraper)
- [Google Trends API & Scraper: Trending Searches](https://apify.com/automation_craft/google-trends-scraper)

# Changelog

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

# Actor input Schema

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

Words to search on noon, one search per entry (iphone 17, perfume, air fryer). Each search delivers up to Max products per search, in the store and language set below.

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

Links copied from noon.com: a search page (https://www.noon.com/uae-en/search/?q=iphone), a category, brand or deal page (https://www.noon.com/uae-en/electronics-and-mobiles/mobiles-and-accessories/mobiles-20905/smartphones/), with the filters and order noon put in the link, or a product page (https://www.noon.com/uae-en/iphone-17-256gb-white/N70211556V/p/). A noon Minutes search link (https://minutes.noon.com/uae-en/search/?q=milk) is read at the delivery point set below. Each link carries its own store and language (uae-en, saudi-ar ...). Tracking parts such as utm_source are ignored. Through the API, give each link as a text (an object {"url": "..."} is read too).

## `skus` (type: `array`):

noon SKUs: the code before /p/ in a product link (N70211556V). Each is looked up with its own search on noon; a SKU noon does not have gets a free status row.

## `categories` (type: `array`):

Whole category pages to read: pick from the list, or type a category path below the store (the part after noon.com/uae-en/ in a category link, as in electronics-and-mobiles/computers-and-accessories/laptops).

## `brands` (type: `array`):

Brand names or codes as noon lists them (Apple, Samsung, adidas). With searches, categories or links they filter those lists; alone, each brand is read as its own list of products. A brand noon does not list for a page gets a free row naming the closest ones it does list.

## `minutesSearchTerms` (type: `array`):

Words to search on noon Minutes, noon's quick delivery from dark stores (milk, eggs, bread), one search per entry, in the UAE, or in Saudi Arabia or Egypt when Store says so. Each product is billed as a Product and carries the dark store's price, pack size, the most a buyer may order, weight, volume and bundle items. Set the delivery point below; noon Minutes rows have no product page add-on.

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

The noon store of Search words, SKUs, Categories and Brands (default UAE). Links carry their own store.

## `language` (type: `string`):

The language of the names, nudges and delivery texts noon answers with (default English).

## `deliveryLatitude` (type: `number`):

In degrees, for example 24.47 (Abu Dhabi). With the longitude it decides which dark store's stock noon Minutes shows. Left out: noon's own default point (Downtown Dubai, Riyadh in Saudi Arabia; Egypt serves one point in Cairo only). A point noon Minutes does not deliver to gets a free status row.

## `deliveryLongitude` (type: `number`):

In degrees, for example 54.35 (Abu Dhabi). Goes with the latitude.

## `sellers` (type: `array`):

Seller (store) names or codes as noon lists them in the Seller filter of a page (noon, Emax, iNeo Electronics). Only products sold by these sellers are delivered.

## `fulfilment` (type: `array`):

noon's own delivery filter: express, supermall or global. Express and supermall are checked again on each row.

## `deals` (type: `array`):

noon's deal tags as it lists them for a page (Deal, Mega Deal, Flash Sale).

## `lowestPriceIn` (type: `string`):

Only products noon marks as at their lowest price in a year, 30 days or 7 days.

## `newArrivalsIn` (type: `string`):

Only products noon lists as new in the last 7, 30 or 60 days.

## `deliveryToday` (type: `boolean`):

Only products noon can deliver today.

## `filters` (type: `array`):

Any other filter noon lists for a page, written "<filter name>: <value>" as noon shows them (Colour: Black, Storage: 256 GB, RAM Size: 12 GB). The same name twice means either value.

## `minPrice` (type: `number`):

In the store's currency (AED, SAR, EGP ...), two decimals at most. Sent to noon and checked again on each row.

## `maxPrice` (type: `number`):

In the store's currency, two decimals at most. Sent to noon and checked again on each row.

## `minRating` (type: `string`):

Only products rated this or more (noon's own rating filter, checked again on each row).

## `sort` (type: `string`):

noon's own orders. Default: recommended, or the order in the link.

## `maxItemsPerSearch` (type: `integer`):

The most products each search, category, brand or listing link delivers (default 100). noon serves at most 10,000 products of one list (50 pages of 200); up to 100,000 with Split large lists.

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

The most products the whole run delivers (left out: no limit beyond the per search one).

## `maxPagesPerSearch` (type: `integer`):

The most result pages read per search, category, brand or listing link (noon serves 50).

## `pageSize` (type: `string`):

How many products each result page asks noon for (default: the fewest of 50, 100, 150 or 200 that covers Max products per search; 50 on the Saudi store, whose pages come through residential addresses).

## `splitLargeLists` (type: `boolean`):

A list that reaches noon's cap of 50 pages is read again in price bands (noon's own price filter), each band halved until it fits, every product delivered once. For whole category exports past 10,000 products.

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

Reads each delivered product's page (a Product detail each): full specifications, description, highlights, variants with their availability, every seller's offer with exact stock, warranty, return policy and delivery date, bank offers and up to five reviews.

## `offerRows` (type: `boolean`):

With Product details: also writes one free row per seller offer (buy box first), for buy box and seller tracking.

## `includeFacets` (type: `boolean`):

Adds noon's filter options for each search or list (brands, sellers, colours, storage, delivery types and more, with their codes) to its coverage row. Free.

## `includeCategoryTree` (type: `boolean`):

Adds one free row per store with noon's category menu (titles and links), read from the first page of the run. Not available for the Saudi store.

## `includeRaw` (type: `boolean`):

Adds the object noon sent for each product to its row (field raw), every key as noon names it.

## `omitEmptyFields` (type: `boolean`):

Writes product rows without their empty fields (null, empty text, empty lists), for smaller CSV and JSON files. Row type, SKU and store always stay.

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

Product pages read at once (1 to 4, default 4).

## `requestTimeoutSecs` (type: `integer`):

How long one request may take (default 30 s; product pages take 8 to 13 s on noon).

## `maxRequestRetries` (type: `integer`):

Attempts per request (default 3).

## `requestDelaySecs` (type: `integer`):

The least time between two requests to noon (default 0: the Actor's own pace of about 3 a second). The waits are run time too: with SKUs or product links, a delay above about 7 seconds costs more than a found SKU pays, and a long list then stops early (stopped by work_allowance, the rest not charged).

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

Leave as is: the Actor picks its own doors (the run's own address and Apify datacenter addresses for noon's pages, Apify residential addresses in Saudi Arabia and the UAE for the Saudi store). Your own proxy links are used for every request when you give them.

## Actor input object example

```json
{
  "searchTerms": [
    "iphone 17"
  ],
  "country": "uae",
  "deliveryToday": false,
  "maxItemsPerSearch": 10,
  "splitLargeLists": false,
  "includeDetails": false,
  "offerRows": false,
  "includeFacets": false,
  "includeCategoryTree": false,
  "includeRaw": false,
  "omitEmptyFields": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (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 = {
    "searchTerms": [
        "iphone 17"
    ],
    "country": "uae",
    "maxItemsPerSearch": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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 = {
    "searchTerms": ["iphone 17"],
    "country": "uae",
    "maxItemsPerSearch": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/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 '{
  "searchTerms": [
    "iphone 17"
  ],
  "country": "uae",
  "maxItemsPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/noon-scraper --silent --output-dataset

```

## MCP server setup

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