# noon API scraper — the Gulf marketplace (noon.com) for the UAE, Egypt, Kuwait, Oman, Qatar and Bahrain: search products, browse categories, read the full product record and every seller's offer, in local currency, English or Arabic. No account, no browser.

> Search noon.com by keyword in one Gulf country and get the matching products: noon product id, title, brand, image, the price the shopper pays with the struck-through price and discount, any coupon code, rating and review count, the seller and its rating, noon Express / Supermall flags, delivery estimate and noon's own key specs. Filter by price, brand, minimum rating and delivery programme; sort by popularity, price or rating.
> ReefAPI engine `noon` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/noon/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /noon/v1/search — 1 credit
Search noon.com by keyword in one Gulf country and get the matching products: noon product id, title, brand, image, the price the shopper pays with the struck-through price and discount, any coupon code, rating and review count, the seller and its rating, noon Express / Supermall flags, delivery estimate and noon's own key specs. Filter by price, brand, minimum rating and delivery programme; sort by popularity, price or rating.

**Parameters:**
- `query` (string, required) — What to look for on noon.
- `country` (enum, optional, default "ae") — noon storefront. Prices come back in that country's currency and product ids are shared across storefronts, but price, stock and sellers differ per country. Saudi Arabia is not available. [one of: ae, eg, kw, om, qa, bh]
- `language` (enum, optional, default "en") — Language of titles, specs and descriptions. Prices and ids are the same in both. [one of: en, ar]
- `page` (integer, optional, default 1) — Result page, 1-based. `total_pages` says how many exist; a page past the end returns an empty list, not an error.
- `limit` (integer, optional, default 50) — Products per page, 1-100 (noon's own default is 50).
- `sort` (enum, optional, default "popular") — Order of results. Only orderings noon honours are accepted; anything else is rejected rather than silently ignored. [one of: popular, price_asc, price_desc, rating]
- `price_min` (number, optional) — Lowest price, in the country's currency.
- `price_max` (number, optional) — Highest price, in the country's currency.
- `brand` (string, optional) — noon brand code, lowercase with underscores (apple, samsung, new_balance). Every result row returns it as `brand_code`.
- `min_rating` (number, optional) — Only products rated at least this (1-5).
- `fulfillment` (enum, optional) — Restrict to one noon delivery programme. [one of: express, supermall]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** results[]{product_id, offer_code, title, brand, brand_code, url, image, images[], price (number — what the shopper pays; noon's sale price when one is set), price_before_discount (the struck-through price, null when none), discount_percent, currency, coupon{code, title, detail, terms[]} (a code the shopper must enter — NOT subtracted from price), rating, review_count, rating_scale (5), seller{id, name, rating, rating_count, rating_scale, positive_rating_percent}, fulfilled_by_noon, supermall, marketplace_seller, free_delivery_eligible, buyable, low_stock_quantity, estimated_delivery, supermall_offer{offer_code, price, price_before_discount, discount_percent, delivery}, best_seller_rank, badges[], deal_tag, key_specs{name: value}, colour_variant_count}, count, total_results, total_pages, page, sort_applied{by, dir}, filters_applied, breadcrumbs[]{name, code}, country, currency, language, query

**Example request body:**
```json
{
  "query": "iphone",
  "country": "ae"
}
```

### POST /noon/v1/category/products — 1 credit
Browse one noon category (by its path) in one Gulf country: the same product rows, filters, sorts and paging as `search`, plus the category breadcrumb.

**Parameters:**
- `category` (string, required) — noon category path — the part of a noon category URL after the country segment (https://www.noon.com/uae-en/electronics-and-mobiles/… → electronics-and-mobiles/…). A full category URL is accepted. `breadcrumbs[].code` on a listing returns these.
- `country` (enum, optional, default "ae") — noon storefront. Prices come back in that country's currency and product ids are shared across storefronts, but price, stock and sellers differ per country. Saudi Arabia is not available. [one of: ae, eg, kw, om, qa, bh]
- `language` (enum, optional, default "en") — Language of titles, specs and descriptions. Prices and ids are the same in both. [one of: en, ar]
- `page` (integer, optional, default 1) — Result page, 1-based. `total_pages` says how many exist; a page past the end returns an empty list, not an error.
- `limit` (integer, optional, default 50) — Products per page, 1-100 (noon's own default is 50).
- `sort` (enum, optional, default "popular") — Order of results. Only orderings noon honours are accepted; anything else is rejected rather than silently ignored. [one of: popular, price_asc, price_desc, rating]
- `price_min` (number, optional) — Lowest price, in the country's currency.
- `price_max` (number, optional) — Highest price, in the country's currency.
- `brand` (string, optional) — noon brand code, lowercase with underscores (apple, samsung, new_balance). Every result row returns it as `brand_code`.
- `min_rating` (number, optional) — Only products rated at least this (1-5).
- `fulfillment` (enum, optional) — Restrict to one noon delivery programme. [one of: express, supermall]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** results[]{product_id, offer_code, title, brand, brand_code, url, image, images[], price (number — what the shopper pays; noon's sale price when one is set), price_before_discount (the struck-through price, null when none), discount_percent, currency, coupon{code, title, detail, terms[]} (a code the shopper must enter — NOT subtracted from price), rating, review_count, rating_scale (5), seller{id, name, rating, rating_count, rating_scale, positive_rating_percent}, fulfilled_by_noon, supermall, marketplace_seller, free_delivery_eligible, buyable, low_stock_quantity, estimated_delivery, supermall_offer{offer_code, price, price_before_discount, discount_percent, delivery}, best_seller_rank, badges[], deal_tag, key_specs{name: value}, colour_variant_count}, count, total_results, total_pages, page, sort_applied{by, dir}, filters_applied, breadcrumbs[]{name, code}, country, currency, language, category

### POST /noon/v1/product/detail — 1 credit
The full noon product record by `product_id` (or product URL) in one Gulf country: title, brand, description and bullet points, image gallery, model and model number, the buy-box price with struck-through price, discount and coupon, the cheapest and dearest seller price, availability, rating with review count and scale, a sample of reviews, the category breadcrumb, the full specification table, size variants, colour variants, and every seller's offer.

**Parameters:**
- `product_id` (string, required) — noon product id (the code before /p/ in a product URL, e.g. N70211545V or Z21880EA663D8910F1026Z). A full noon product URL is accepted and its country is used when `country` is not given.
- `country` (enum, optional, default "ae") — noon storefront. Prices come back in that country's currency and product ids are shared across storefronts, but price, stock and sellers differ per country. Saudi Arabia is not available. [one of: ae, eg, kw, om, qa, bh]
- `language` (enum, optional, default "en") — Language of titles, specs and descriptions. Prices and ids are the same in both. [one of: en, ar]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** product{product_id, title, brand, brand_code, url, description, feature_bullets[], images[], model, model_number, color, gtin (null — noon publishes none), price (number — noon's buy-box offer), price_before_discount, discount_percent, price_min, price_max (cheapest / dearest buyable offer across sellers and sizes), currency, coupon, availability (in_stock|out_of_stock), featured_offer_code, featured_seller, offer_count, seller_count, rating, review_count, rating_scale, reviews_sample[]{rating, title, body, date, author}, breadcrumbs[]{name, url}, category, specifications[]{code, name, value}, variants[]{variant_sku, variant (e.g. a shoe size), available, offer_count, price_min}, colour_variants[]{group, options[]{name, product_id, available, url, image}}, offers[] (as in product/offers), country, language}

**Example request body:**
```json
{
  "product_id": "N70211545V",
  "country": "kw"
}
```

### POST /noon/v1/product/offers — 1 credit
Every seller's offer for one noon product in one Gulf country, cheapest first: the seller with its id, name and rating, the price paid with struck-through price and discount, coupon, stock, size variant, noon Express / marketplace flags, delivery estimate and date, warranty and return policy, and which offer holds noon's buy box.

**Parameters:**
- `product_id` (string, required) — noon product id (the code before /p/ in a product URL, e.g. N70211545V or Z21880EA663D8910F1026Z). A full noon product URL is accepted and its country is used when `country` is not given.
- `country` (enum, optional, default "ae") — noon storefront. Prices come back in that country's currency and product ids are shared across storefronts, but price, stock and sellers differ per country. Saudi Arabia is not available. [one of: ae, eg, kw, om, qa, bh]
- `language` (enum, optional, default "en") — Language of titles, specs and descriptions. Prices and ids are the same in both. [one of: en, ar]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** product{product_id, title, brand, url, currency, price (buy-box), price_min, price_max, offer_count, seller_count, availability} + offers[]{position, offer_code, variant_sku, variant, seller{id, name, rating, rating_count, rating_scale, positive_rating_percent}, price, price_before_discount, discount_percent, currency, coupon, buyable, stock (as noon reports it; never seen above 10), stock_is_display_cap, fulfilled_by_noon, marketplace_seller, free_delivery_eligible, estimated_delivery, estimated_delivery_date, warranty, returnable, return_policy, featured} + count

**Example request body:**
```json
{
  "product_id": "N70211545V"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=noon
- Human docs page: https://reefapi.com/docs/noon
- Overview page: https://reefapi.com/noon-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
