# Deliveroo Menu Items Scraper (`axlymxp/deliveroo-menu-items-scraper`) Actor

Scrape Deliveroo menus as one row per dish or product in 7 countries: price, discount, category, calories, dietary tags and stock, plus restaurant. Search a dish across an area or pull full supermarket catalogues. Pay only per item.

- **URL**: https://apify.com/axlymxp/deliveroo-menu-items-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce, Business, Marketing
- **Stats:** 1 total users, 0 monthly users, 95.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Deliveroo Menu Items Scraper — Dish Prices & Grocery Products

Turn Deliveroo menus into a flat price list: **one row per dish or product**, with
price, discounted price, category, description, calories, dietary tags,
availability and popularity, plus the restaurant it comes from. Use restaurant
URLs, whole areas, or **search a dish across a location** ("margherita",
"pad thai") and get only the matching items from the best-matching restaurants.

Works in **7 Deliveroo markets**: United Kingdom, Ireland, France, Italy,
Belgium, United Arab Emirates and Kuwait, including supermarkets and convenience
stores on Deliveroo (Co-op, Asda, Sainsbury's, Gopuff and more). No
browser, no login, no proxy.

### Who uses this

| You are… | You use it to… |
|---|---|
| A restaurant group or food brand | Benchmark your dish prices against every competitor in your zone |
| An FMCG or grocery analyst | Track product prices and availability at supermarkets and convenience stores |
| A delivery or pricing consultant | Build "price of a burger across London" style studies |
| A researcher | Analyse food prices, calories and dietary options at scale |

### What you get (output fields)

| Field | Example | Notes |
|---|---|---|
| `name` | Veggie & Tofu or Vegan | Dish or product |
| `description` | Stir fried rice noodles, egg, tofu… | |
| `category` | Pad Thai Noodles | Menu section |
| `price` / `price_minor` | £10.00 / 1000 | Also in minor units (pence/cents/fils) |
| `price_discounted`, `percentage_discounted`, `offer_text` | … | When on offer |
| `energy_kcal`, `unit_info` | 803 / "500 g" | When the restaurant provides them |
| `dietary_tags` | \["Vegan"] | |
| `available` | true | False when sold out |
| `popular`, `highly_rated` | false | Deliveroo badges |
| `image` | https://… | |
| `restaurant_name`, `restaurant_url`, `restaurant_address` | Pad Thai - Mercato Metropolitano | |
| `restaurant_rating` / `restaurant_rating_count` | 4.4 / "500+" | |
| `query`, `search_rank` | pad thai / 1 | Dish search rows |
| `is_hidden_item` | false | True for meal-deal components (optional) |

### Use cases

1. **Dish price study.** Search "margherita pizza" in five London areas and
   compare the price distribution.
2. **Competitor menu tracking.** Schedule your competitors' restaurant URLs
   weekly and diff names and prices.
3. **Grocery price monitoring.** Pass supermarket pages (thousands of products
   each) and track prices and stock.
4. **Menu engineering.** Compare category structure, price points and "popular"
   items across the best-rated restaurants in an area.

### Input

| Parameter | What it does | Default |
|---|---|---|
| **Deliveroo URLs** (`startUrls`) | Restaurant pages give the full menu; area pages give the menus of the first restaurants there | one example restaurant |
| **Dish search keywords** (`searchQueries`) | Finds matching items across a location (every word must appear in the name, description or category) | — |
| **Locations** (`locations`) | Area URL, `city/area` (e.g. `london/soho`) or `lat,lon`, for dish search | — |
| **Market** (`market`) | Country for `city/area` and coordinates | uk |
| **Only items containing** (`itemKeywords`) | Keep only items containing any of these words; you pay only for kept rows | — |
| **Only items in stock** | Skip sold-out items | off |
| **Include meal-deal components** | Also output items that only appear inside deals and option lists | off |
| **Restaurants per area** | For area URLs | 20 |
| **Restaurants per dish search** | Top-ranked restaurants to read, up to 50 | 20 |
| **Max items in total** (`maxItems`) | Stop after this many rows | 1000 |

#### Example inputs

A dish across two areas:

```json
{
  "searchQueries": ["pad thai"],
  "locations": ["london/soho", "london/shoreditch"],
  "maxRestaurantsPerSearch": 30,
  "maxItems": 2000
}
```

Burger prices at every restaurant of an area:

```json
{
  "startUrls": [{ "url": "https://deliveroo.co.uk/restaurants/bristol/clifton" }],
  "maxRestaurantsPerArea": 50,
  "itemKeywords": ["burger"],
  "onlyAvailableItems": true
}
```

#### Example output

```json
{
  "market": "uk",
  "source": "search",
  "query": "pad thai",
  "search_rank": 1,
  "item_id": "1117872091",
  "name": "Veggie & Tofu or Vegan",
  "description": "Stir fried rice noodles, egg, tofu and seasonal vegetables with pad thai house special mild spicy sauce…",
  "category": "Pad Thai Noodles",
  "price": "£10.00",
  "price_minor": 1000,
  "currency": "GBP",
  "available": true,
  "popular": false,
  "dietary_tags": [],
  "restaurant_name": "Pad Thai - Mercato Metropolitano",
  "restaurant_url": "https://deliveroo.co.uk/menu/London/borough/pad-thai-mercato-metropolitano",
  "restaurant_address": "42 Newington Causeway, London, SE16DR",
  "scraped_at": "2026-10-01T03:04:17Z"
}
```

### Scheduling, webhooks and integrations

Schedule runs in Apify Console, export as CSV or Excel, or push results to Google
Sheets, BigQuery, S3, Make or Zapier with integrations and webhooks.

### Use it from AI assistants (MCP)

Available as a tool through the [Apify MCP server](https://mcp.apify.com): ask
*"What does a margherita pizza cost on Deliveroo in Soho?"* and get live rows back.

### Related Actors

- **Deliveroo Scraper**: restaurants with ratings, fees, ETAs, offers and keyword search.
- **Deliveroo Reviews Scraper**: customer reviews with date filters.

### FAQ

**How is dish search different from the Deliveroo search box?** Deliveroo's
search ranks restaurants; this Actor then reads each restaurant's full menu and
keeps only items that really contain your words. So you get complete item data
(category, description, availability), not just a preview.

**How big can a menu be?** Restaurants usually list 30–200 items; supermarkets
can list 8,000+ products. Set "Max items in total" to control the run size.

**Are prices live?** Yes, as currently listed on Deliveroo, including discounted
prices when an item is on offer.

**Do I need a proxy or a Deliveroo account?** No.

**Is it legal?** The Actor reads publicly visible menu and price information and
never logs in. You are responsible for using the data in line with Deliveroo's
terms and the laws that apply to you.

# Actor input Schema

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

Restaurant pages (https://deliveroo.co.uk/menu/<city>/<area>/<name>) give that full menu or shop catalogue. Area pages (https://deliveroo.co.uk/restaurants/<city>/<area>) give the full menus of the first restaurants there (see 'Restaurants per area'). Supported: deliveroo.co.uk, .ie, .fr, .it, .be, .ae, .com.kw.

## `searchQueries` (type: `array`):

Optional. Find dishes across a whole location, like the Deliveroo app's search box: Deliveroo's search picks the best-matching restaurants, then their full menus are read and only items whose name, description or category contains every word of the keyword are kept (e.g. 'pad thai', 'margherita'). Needs Locations, or uses the area URLs above.

## `locations` (type: `array`):

Where to search: an area URL, 'city/area' slugs as in Deliveroo URLs (e.g. 'london/soho'), or 'latitude,longitude'. Uses the Market below.

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

Country for 'city/area' and coordinate locations. Deliveroo URLs carry their own market.

## `itemKeywords` (type: `array`):

Optional. Keep only items whose name, description or category contains one of these words (case-insensitive). Filtering happens before billing: you pay only for kept rows.

## `onlyAvailableItems` (type: `boolean`):

Skip items the restaurant has marked sold out.

## `includeHiddenItems` (type: `boolean`):

Also output priced items that only appear inside meal deals or option lists (not listed on the menu itself). Marked is_hidden_item = true.

## `maxRestaurantsPerArea` (type: `integer`):

For area URLs: how many restaurants' menus to take (orderable ones first, in Deliveroo's listing order).

## `maxRestaurantsPerSearch` (type: `integer`):

For dish search: how many of Deliveroo's top-ranked restaurants to read menus from (up to ~50).

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

Stop the run after this many item rows. Supermarkets can list 8,000+ products.

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

Not needed: Deliveroo's API works without a proxy. Only set this if you see repeated errors.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://deliveroo.co.uk/menu/bristol/st-andrew's/miss-millies-fries-chicken-gloucester-road"
    }
  ],
  "searchQueries": [
    "margherita pizza",
    "pad thai"
  ],
  "locations": [
    "london/soho",
    "53.3438,-6.2546"
  ],
  "market": "uk",
  "itemKeywords": [
    "burger",
    "vegan"
  ],
  "onlyAvailableItems": false,
  "includeHiddenItems": false,
  "maxRestaurantsPerArea": 20,
  "maxRestaurantsPerSearch": 20,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://deliveroo.co.uk/menu/bristol/st-andrew's/miss-millies-fries-chicken-gloucester-road"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/deliveroo-menu-items-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 = { "startUrls": [{ "url": "https://deliveroo.co.uk/menu/bristol/st-andrew's/miss-millies-fries-chicken-gloucester-road" }] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/deliveroo-menu-items-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 '{
  "startUrls": [
    {
      "url": "https://deliveroo.co.uk/menu/bristol/st-andrew'\''s/miss-millies-fries-chicken-gloucester-road"
    }
  ]
}' |
apify call axlymxp/deliveroo-menu-items-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/deliveroo-menu-items-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/6PbCeM2mIJHlUP2kb/builds/ffQ1befMpFpSFap62/openapi.json
