# Talabat Scraper — Restaurants, Menus, Prices (`memo23/talabat-scraper`) Actor

Scrape Talabat restaurants across 9 MENA countries: UAE, Saudi, Kuwait, Qatar & more. Search any keyword and get ratings, GPS, payment methods, full menus with prices, plus complete choice trees (sizes, add-ons, extras) per item. No proxy needed. Export as JSON, CSV or Excel.

- **URL**: https://apify.com/memo23/talabat-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Travel, AI
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.10 / 1,000 result (restaurant)s

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?

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

## Talabat Scraper — Restaurants, Full Menus & Prices (9 MENA Countries)

Turn Talabat.com into structured restaurant data: search any keyword or restaurant name across the UAE, Saudi Arabia, Kuwait, Bahrain, Oman, Qatar, Jordan, Egypt and Iraq, and get back clean JSON rows with ratings, GPS coordinates, payment methods, delivery details, complete menus with prices — and even the full customization tree (sizes, add-ons, extras) for every menu item.

No proxies, no browser, no login. One row per restaurant, menu nested inline.

### Why Use This Scraper?

- **Country-wide search** — one query like `"pizza"` or `"mcdonalds"` sweeps an entire country, up to 1,000 restaurants per query.
- **Full menus with prices** — every item's name, description, price, discounted old price, image and menu section.
- **Choice trees nobody else gives you cleanly** — sizes, add-ons, extras with per-option prices and selection rules (min/max, mandatory, single vs multi-select).
- **GPS + payments included** — latitude/longitude, accepted payment methods, cash/card flags, delivery fee and minimum order.
- **Direct restaurant targeting** — paste slugs or full Talabat URLs to skip search entirely.
- **Fast and proxy-free** — Talabat serves plain HTTP; runs cost nothing extra in proxy bandwidth.

### Overview

This actor scrapes public restaurant listings from [Talabat](https://www.talabat.com), the leading food-delivery platform in the Middle East (a Delivery Hero company). It's built for market researchers, food-tech analysts, restaurant chains benchmarking competitors, and developers feeding menu data into apps or LLM pipelines.

Each dataset row is one restaurant. Restaurant-level fields (name, cuisine, rating, GPS, payments, delivery) are always present; `menu_items` is added when you enable menu scraping, and each menu item gains a `choice_sections` array when you enable choice scraping.

### Supported Inputs

| Input type | Example | Notes |
|---|---|---|
| Search query | `pizza`, `mcdonalds`, `sushi` | Searched country-wide in the selected country |
| Restaurant slug | `blue-fig` | The last segment of a Talabat restaurant URL; uses the selected country |
| Full restaurant URL | `https://www.talabat.com/jordan/blue-fig` | Country is auto-detected from the URL |
| Menu-page URL | `https://www.talabat.com/uae/restaurant/626019/zaatar-w-zeit` | Slug + country auto-extracted |

Copy-paste starter input:

```json
{
    "queries": ["pizza"],
    "country": "uae",
    "maxResults": 20,
    "scrapeMenu": true
}
```

**Not supported:** grocery / pharmacy / flowers verticals (restaurants only), talabat mart stores, and order/checkout data (requires login).

### Use Cases

| Who | What they do with it |
|---|---|
| Market researchers | Map cuisine coverage, pricing and ratings across MENA cities |
| Restaurant chains | Benchmark competitor menus, prices and delivery fees per country |
| Food-tech startups | Seed menu databases with real items, prices and customizations |
| Data & AI teams | Feed structured menu + choice data into recommendation or LLM apps |
| Agencies | Build market-entry reports for F\&B brands expanding into the Gulf |

### How It Works

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

1. Each search query is sent to Talabat's vendor search API for the selected country, paginated up to your `maxResults`.
2. Every discovered restaurant's branch page is fetched once — it carries the full vendor record: GPS, payments, delivery fee, rating.
3. With **Scrape full menu** on, the same fetch yields the complete menu (items, prices, sections) at no extra HTTP cost.
4. With **Scrape menu choices** on, each customizable item's choice tree (sizes, add-ons, extras) is fetched with rate-limit-aware pacing.
5. One row per restaurant is pushed to the dataset — export as JSON, CSV or Excel.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | `[]` | Search terms; each returns up to `maxResults` restaurants |
| `restaurantSlugs` | array | `[]` | Slugs or full Talabat URLs to scrape directly |
| `country` | string | `"uae"` | One of `uae`, `sa`, `kw`, `bh`, `om`, `qa`, `jo`, `eg`, `iq` |
| `maxResults` | integer | `20` | Max restaurants per query (1–1000) |
| `scrapeMenu` | boolean | `false` | Include `menu_items` in each row |
| `scrapeMenuChoices` | boolean | `false` | Also fetch per-item choice trees; implies `scrapeMenu` |
| `maxItems` | integer | — | Hard cap on total restaurants across all queries + slugs |
| `maxConcurrency` | integer | `10` | Parallel restaurant fetches |
| `proxy` | object | none | Optional; not needed for Talabat |

**Search 100 pizza places in Saudi Arabia with menus:**

```json
{
    "queries": ["pizza"],
    "country": "sa",
    "maxResults": 100,
    "scrapeMenu": true
}
```

**Scrape two specific restaurants with full choice trees:**

```json
{
    "restaurantSlugs": [
        "https://www.talabat.com/jordan/blue-fig",
        "https://www.talabat.com/uae/restaurant/626019/zaatar-w-zeit"
    ],
    "scrapeMenu": true,
    "scrapeMenuChoices": true
}
```

### Output Overview

One row per restaurant. Restaurant-level fields are always filled from the live branch page; `menu_items` appears when menu scraping is on; each item with `has_choices: true` carries `choice_sections` when choice scraping is on. Prices are in the country's local currency (see the `currency` field).

### Output Samples

Restaurant row (menu trimmed — a real run returned 143 items for this restaurant):

```json
{
    "name": "Zaatar W Zeit",
    "slug": "zaatar-w-zeit",
    "cuisine": "Arabic, Wraps, Breakfast, Lebanese",
    "rating": 4.2,
    "total_ratings": 1000,
    "logo": "https://images.deliveryhero.io/image/talabat/restaurants/Zaatar_W_Zeit_Logo_EN_636322586934078481.jpg?width=180",
    "latitude": 25.2086335,
    "longitude": 55.2724548,
    "accepts_cash": true,
    "accepts_card": true,
    "payment_methods": ["visa", "mastercard", "cash"],
    "delivery_fee": 0,
    "minimum_order_amount": 0,
    "branch_id": 626019,
    "branch_name": "Zaatar w Zeit, Sheikh Zayed Road, Jumeirah 1",
    "chain_id": 7614,
    "country": "uae",
    "currency": "AED",
    "url": "https://www.talabat.com/uae/zaatar-w-zeit",
    "menu_items": [
        {
            "id": 2242804246,
            "name": "Mighty Kafta",
            "description": "Kebab mix with cheese, tomatoes and mayo on top. Served as a flatbread or wrapped",
            "price": 36,
            "old_price": null,
            "image": "https://images.deliveryhero.io/image/talabat/MenuItems/19D7169A6A5F0D087E3CFED9FE54F5D6",
            "category": "Picks for you",
            "has_choices": true,
            "choice_sections": [
                {
                    "section_name": "Choice of Dough",
                    "selection_string": "Choose up to 1 items",
                    "min_quantity": 0,
                    "max_quantity": 1,
                    "is_single_selection": false,
                    "is_mandatory": false,
                    "options": [
                        { "id": 2401564449, "name": "High Protein Dough", "price": 6, "old_price": null, "is_discounted": false, "has_sub_choices": false },
                        { "id": 2401564450, "name": "Multi Cereal Dough", "price": 4, "old_price": null, "is_discounted": false, "has_sub_choices": false }
                    ]
                }
            ]
        }
    ],
    "scraped_at": "2026-07-22T21:40:06.184Z"
}
```

### Key Output Fields

**Identity** — `name`, `slug`, `branch_id`, `branch_name`, `branch_slug`, `chain_id`, `url`, `country`, `currency`

**Quality signals** — `rating`, `total_ratings`, `cuisine`, `most_selling_items`

**Location & logistics** — `latitude`, `longitude`, `delivery_fee`, `minimum_order_amount`, `avg_delivery_time`

**Payments** — `accepts_cash`, `accepts_card`, `payment_methods`

**Menu (optional)** — `menu_items[]` with `name`, `description`, `price`, `old_price` (pre-discount), `image`, `category`, `has_choices`

**Choices (optional)** — `choice_sections[]` per item: `section_name`, `min_quantity`/`max_quantity`, `is_mandatory`, `is_single_selection`, and `options[]` with per-option `name` and `price`

### FAQ

#### Which countries are supported?

UAE, Saudi Arabia, Kuwait, Bahrain, Oman, Qatar, Jordan and Egypt work fully. Iraq is accepted as an input but Talabat has moved its Iraqi storefront to a separate app, so results there are typically empty.

#### How many restaurants can one query return?

Up to 1,000 per query (set `maxResults`). A broad term like "pizza" in the UAE has over 1,100 matches; niche terms return fewer. Search is country-wide but relevance-ranked from the country's main metro area.

#### Are menu prices always available?

Yes for restaurants that are live on Talabat. Restaurants that are temporarily closed or delisted still produce a restaurant-level row (from search data), just without `menu_items` — the actor logs a warning when that happens.

#### Do I get the discounted and the original price?

Yes — `price` is the current price and `old_price` is the pre-discount price when an item is on offer (otherwise `null`).

#### What exactly is in a choice tree?

Everything the customer sees in the customization popup: each section ("Size", "Add-ons", "Your choice of..."), its selection rules (min/max quantity, mandatory or not, single vs multi-select), and every option with its own price.

#### Does it scrape reviews or order data?

No. Talabat does not expose individual review text publicly, and anything behind the login (orders, addresses, checkout) is out of scope. You get `rating` and `total_ratings` per restaurant.

#### Do I need a proxy?

No. Talabat serves direct requests without blocking. Choice-tree fetches are rate-limited per IP, so the actor paces them automatically — very large choice-heavy runs are slower but complete.

#### Can I scrape groceries or pharmacies on Talabat?

Not with this actor — it targets the restaurant vertical only.

### Support

Found a bug or have a feature request? Open an issue on the actor's [Issues tab](https://apify.com/memo23/talabat-scraper/issues) or email me at muhameddidovic@gmail.com.

### Additional Services

Need a custom export shape, another Talabat vertical, scheduled monitoring, or menu-diff alerts? I do tailored work — drop me a line at muhameddidovic@gmail.com.

### Explore More Scrapers

If you found this useful, you might also like:

- [**Uber Eats Full Menu & Reviews Scraper**](https://apify.com/memo23/uber-eats-scraper) — the same menu-depth approach for Uber Eats.
- [**Yelp Leads & Business Scraper**](https://apify.com/memo23/yelp-scraper) — restaurant leads with emails and unlimited reviews.
- [**TripAdvisor Reviews Scraper**](https://apify.com/memo23/tripadvisor-scraper) — hotel & restaurant reviews at $0.45/1k.

Full list at [apify.com/memo23](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/talabat-scraper`).

**Purpose:** scrapes Talabat.com (MENA food delivery) restaurants by search query or slug — one row per restaurant with ratings, GPS, payments, and optional full menu + per-item choice trees.

**Minimal input:**

```json
{ "queries": ["pizza"], "country": "uae", "maxResults": 5, "scrapeMenu": true }
```

**Output:** one dataset row per restaurant — `name`, `slug`, `cuisine`, `rating`, `total_ratings`, `latitude`, `longitude`, `accepts_cash`, `accepts_card`, `payment_methods[]`, `delivery_fee`, `minimum_order_amount`, `branch_id`, `branch_name`, `chain_id`, `country`, `currency`, `url`, `most_selling_items[]`, `menu_items[] {name, description, price, old_price, image, category, has_choices, choice_sections[] {section_name, min_quantity, max_quantity, is_mandatory, options[] {name, price}}}`, `scraped_at`.

**Behaviors an agent should know:**

- Always set `maxResults` (and optionally `maxItems`); a broad query can match 1,000+ restaurants.
- `restaurantSlugs` accepts bare slugs or full talabat.com URLs; full URLs override `country`.
- `scrapeMenuChoices: true` implies menu scraping and adds one paced HTTP call per customizable item — choice-heavy runs take longer.
- Billing: one result event per restaurant row; choice-tree fetches are billed as a separate `menu-choices-fetched` event, never charged when disabled.
- Countries: `uae`, `sa`, `kw`, `bh`, `om`, `qa`, `jo`, `eg` return data; `iq` is accepted but usually empty (separate Iraqi storefront).

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Talabat Holding plc, Delivery Hero SE, or any of their subsidiaries. All trademarks mentioned are the property of their respective owners.

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

***

### SEO Keywords

talabat scraper, talabat restaurant scraper, talabat menu scraper, talabat data extraction, talabat api, scrape talabat, food delivery scraper, restaurant menu scraper, menu price data, MENA restaurant data, UAE restaurant scraper, Saudi Arabia food delivery data, Kuwait restaurant data, Qatar restaurant scraper, Egypt food delivery scraper, delivery hero data, restaurant market research, competitor menu analysis, food tech dataset, restaurant GPS data

# Actor input Schema

## `queries` (type: `array`):

Search terms to find restaurants (e.g. 'pizza', 'mcdonalds', 'sushi'). Each query returns up to Max Results restaurants. Leave empty if you only want to scrape specific restaurants via Restaurant Slugs.

## `restaurantSlugs` (type: `array`):

Scrape specific restaurants directly, skipping search. Accepts bare slugs ('blue-fig' — the last segment of a Talabat restaurant URL) or full URLs (https://www.talabat.com/jordan/blue-fig). Bare slugs use the Country selected below; full URLs carry their own country.

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

Talabat country storefront to search. Site-style slugs (ksa, kuwait, jordan...) are accepted too.

## `maxResults` (type: `integer`):

Maximum number of restaurants to return per search query.

## `scrapeMenu` (type: `boolean`):

If enabled, each result includes a 'menu\_items' array with every menu item's name, description, price, discounted old price, image, and menu section.

## `scrapeMenuChoices` (type: `boolean`):

If enabled, fetches the full choice tree for every customizable menu item: choice sections (e.g. 'Size', 'Add-ons'), individual options with prices, and selection rules (min/max, single vs multi-select, mandatory). Automatically enables Scrape Full Menu. Adds one HTTP call per customizable item and is billed as a separate event, so customers who don't need choices aren't charged for them.

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

Hard cap on the total number of restaurants collected across all queries and slugs. Use this to limit billing.

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

Maximum number of restaurant pages processed in parallel.

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

Talabat.com serves direct requests without blocking, so no proxy is used by default — runs are faster and there's no proxy bill. Configure one here only if your use case requires it.

## Actor input object example

```json
{
  "queries": [
    "pizza"
  ],
  "restaurantSlugs": [],
  "country": "uae",
  "maxResults": 20,
  "scrapeMenu": false,
  "scrapeMenuChoices": false,
  "maxItems": 100,
  "maxConcurrency": 10,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "pizza"
    ],
    "maxItems": 100
};

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

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

```

## MCP server setup

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