# Noon Food Restaurant & Menu Scraper (`drramerets/noon-food-scraper`) Actor

Scrape Noon Food restaurants in every UAE delivery zone: full menus with item prices and discounts, ratings, delivery fees and preparation times. Paid promo placements are identified separately from the organic listing.

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

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Food Restaurant & Menu Scraper — UAE

Every restaurant on Noon Food, in every delivery zone of the Emirates, with the whole menu
— dish by dish, price by price.

### What you get

A table with one row per dish: the restaurant it belongs to, the dish name and
description, its price, the price before the discount, whether it is sold out, and the
photo. Each row also carries the restaurant's own numbers — rating and how many people
rated it, delivery fee, delivery time, minimum order, typical price for one, the zone and
the city it delivers to, and where it stood in that zone's listing.

Promoted placements are marked. Noon Food does not label a paid restaurant anywhere in its
listing, so the paid picture has to be reconstructed — and it is: you see which
restaurants were promoted in a zone, including the ones that appear only as a promo and
never in the ordinary list.

Dishes are told apart from add-ons, and this matters more than it sounds. **About 85% of
what a restaurant publishes is not a dish** but a choice inside one — "without tomato",
"sea salt", "honey oat bread", "medium fries". Many of them carry a price, and a good
number share their names with real dishes, so no filter you write yourself will separate
them reliably. Every row says which it is, in plain words: `dish` or `add_on`. Dishes come
first in the file.

The per-restaurant averages count dishes only. That is the number you compare chains by,
and counting the side sauces into it drags it down by a third — on one restaurant from 38
to 26.

Prices are stated as the customer pays them. Noon reports a zero price for two different
things: add-ons that genuinely cost nothing, and dishes whose real price sits in another
field. Both look the same when you read them directly, so each row carries the price that
actually applies.

### What you can do with it

- Compare what the same dish costs across restaurants, or across zones of the same city.
- Watch a competitor's menu and prices over time — put it on a schedule and the result
  becomes a price history.
- Find who pays for promotion in your zone and how often.
- See which dishes go out of stock, and where discounts are actually running.
- Pull an Arabic and an English run and put them side by side: prices and codes match,
  only the text changes.

### How to use it

Name the cities you care about, or leave it empty for all of them. Narrow it further by
zone or by cuisine if you want. Say how many restaurants to collect, and press Start.

Two things worth knowing before you do:

- Menus are heavy. One restaurant brings about 400 rows into the table, and a large one
  several thousand, so a hundred restaurants make a file of tens of thousands of rows. If
  you only need ratings, fees and delivery times, switch menus off — it is much faster and
  gives one row per restaurant.
- By default you get a row per dish, which is what you want for sorting and pivots. If you
  feed the result into your own code, switch the layout to one row per restaurant and the
  menu comes grouped inside it, along with the category tree and the discount list.

### Good to know

- Restaurants are listed by delivery zone. One that serves several overlapping zones is
  collected once, against the zone it was first seen in.
- The cuisine filter is applied to what the restaurant actually says it serves. Promoted
  banners do not declare a cuisine at all, so with a cuisine filter on they are kept until
  their menu is read and can be judged properly.
- A restaurant whose menu could not be read still gets a row, with the reason in it. It
  does not disappear from your file.
- United Arab Emirates only — that is the only market Noon Food serves.

### What it costs

**$0.09 per restaurant** with its full menu, whatever the size of that menu — a coffee
shop with eighty items and a pizza chain with two thousand cost the same. With menus
switched off it is **$0.02 per restaurant**. Nothing is charged per row, so you are not
billed for the add-ons that make up most of a menu.

A hundred restaurants with everything they serve is $9.

On top of that Apify bills your account for what the run consumes on the platform —
computing time and data transfer. This actor is built to keep that small: in our own
measurements a hundred restaurants came to roughly **$0.50**.

### Support

Questions, a field you need that is not here, or another marketplace — write to
**admin@noonseller.ae** or visit **[noonseller.ae](https://noonseller.ae)**.

*This is an independent tool. It is not affiliated with, endorsed by, or connected to
noon.com or Noon Food.*

### Related actors

- **Noon.com Product & Ads Scraper** — products from the main marketplace, with paid
  placements marked.
- **Noon.com Reviews Scraper** — what buyers write, with dates and translations.
- **Noon.com Seller & Buy Box Monitor** — every seller of a product and who wins the sale.

# Actor input Schema

## `cities` (type: `array`):

Which cities to cover, one per line — Dubai, Abu Dhabi, Al Ain and so on. Leave empty for all of them. If a name matches nothing, the run tells you which cities exist instead of quietly returning less.

## `zones` (type: `array`):

Narrow it down to particular zones, one per line — Downtown, Dubai Marina, Al Barsha. Leave empty for every zone in the cities above. Names that match nothing are reported back to you.

## `cuisines` (type: `array`):

Keep only restaurants serving these, one per line — coffee, burgers, sushi, arabic. Matched as whole words, so "tea" does not pull in "steak".

## `includeMenus` (type: `boolean`):

Collect every dish with its price, discount, description and photo. Switching this off gives you the restaurants alone — faster, and enough if you only need ratings, fees and delivery times.

## `maxOutlets` (type: `integer`):

How many restaurants to collect at most. With menus on, one restaurant brings about 400 rows, so 100 restaurants make a file of roughly 40,000 rows.

## `outputFormat` (type: `string`):

One row per menu item — a restaurant with a 300-dish menu becomes 300 rows, and that is what you want for comparing prices and building pivots. One row per restaurant keeps the menu grouped inside the row, together with the category tree and the discount list; a spreadsheet cannot really open that, but code can.

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

Arabic returns restaurant and dish names in Arabic. Prices and restaurant codes are the same in both, so Arabic and English runs can be compared side by side.

## `useApifyProxy` (type: `boolean`):

Leave switched on. Without it Noon Food will not serve data and the run comes back empty.

## Actor input object example

```json
{
  "cities": [
    "Dubai"
  ],
  "includeMenus": true,
  "maxOutlets": 100,
  "outputFormat": "flat",
  "language": "en",
  "useApifyProxy": true
}
```

# Actor output Schema

## `restaurants` (type: `string`):

One row per menu item with its restaurant: price, discount, category, delivery fee, rating and delivery zone.

# 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 = {
    "cities": [
        "Dubai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("drramerets/noon-food-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 = { "cities": ["Dubai"] }

# Run the Actor and wait for it to finish
run = client.actor("drramerets/noon-food-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cities": [
    "Dubai"
  ]
}' |
apify call drramerets/noon-food-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=drramerets/noon-food-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ehMlHfNNtNniEKaOW/builds/ZxkkfQ221V84j0bEb/openapi.json
