Deliveroo Scraper - Restaurants and Menu Prices
Pricing
from $2.20 / 1,000 results
Deliveroo Scraper - Restaurants and Menu Prices
Extract Deliveroo restaurant listings, menu prices, and restaurant links from city, cuisine, brand, and zone pages. Choose a country site or submit URLs. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
12
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Deliveroo Scraper
Extract Deliveroo restaurant listings, menu prices, and restaurant links from city, cuisine, brand, and zone pages into rows you can export.
- Discover restaurants serving a delivery location.
- Collect restaurant details and optional, separately billed menu-item rows.
- Keep restaurant identity, menu prices, and delivery-location context in separate fields.
- Submit several Deliveroo URLs in one run.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus the start fee.
What does Deliveroo Scraper do?
Deliveroo Scraper collects publicly reachable restaurant and menu information. Use it for menu comparisons, restaurant discovery, or repeated price checks. It is unofficial and is not affiliated with Deliveroo. It does not place orders or access private customer accounts.
- Location search:
restaurantsuses a city, neighborhood, and delivery geohash. - Menu:
menureturns a restaurant row.includeMenuItemsadds individual menu-item rows; it is off by default and each added row costs the same as a restaurant row. - Page discovery:
cities,cuisines,brands, andzonesfind restaurant links associated with the supplied page or slug. - Multiple URLs:
startUrlsaccepts a list of Deliveroo links.
The input accepts market codes uk, ie, fr, be, it, es, nl, ae, kw, sg, and hk. These are selectable country sites, not a guarantee that every market or page currently returns data. Check a small input before relying on a market.
What data can you extract from Deliveroo?
Each row represents one entity. Restaurant listings, menu headers, and restaurant links found on discovery pages use rowType: "restaurant". Optional menu items use rowType: "menuItem". Available fields depend on the page.
Restaurant rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type. | restaurant |
id | Row identifier; combine with the row type for deduplication. | 445581 |
name | Restaurant display name. | Example Restaurant |
url | Deliveroo restaurant link. | https://deliveroo.co.uk/menu/london/islington/cay-tre |
market | Country-site code. | uk |
drnId | Deliveroo resource identifier, when supplied. | 445581 |
eta | Displayed delivery-time text. | 20–35 min |
distance | Displayed distance text. | 0.8 miles |
searchGeohash | Delivery query location, not restaurant coordinates. | gcpvjmebpbm2 |
address | Merchant address, when a detail page supplies it. | null |
geo | Merchant latitude and longitude, when supplied. | null |
detailEnriched | Whether additional restaurant details were obtained. | true |
leadAbsences | Reasons contact or address fields are empty. | {} |
scrapedAt | Row timestamp. | 2026-10-24T10:00:00+00:00 |
Menu-item rows
| Field | Description | Example |
|---|---|---|
rowType | Entity type. | menuItem |
id | Item identity including restaurant context when available. | 445581:item-1 |
name | Menu-item name. | Vegetable noodles |
description | Item description, when supplied. | Noodles with vegetables |
categoryName | Menu section. | Main dishes |
priceFormatted | Display price, including currency formatting. | £8.50 |
priceFractional | Price in fractional currency units. | 850 |
available | Availability flag supplied by the menu. | true |
restaurantId | Parent restaurant identifier. | 445581 |
restaurantName | Parent restaurant name. | Example Restaurant |
restaurantUrl | Parent restaurant link; not a product-specific link. | https://deliveroo.co.uk/menu/london/islington/cay-tre |
restaurantMarket | Parent restaurant's country site. | uk |
Menu-item rows also carry available parent address and location context. Merchant contact fields are not guaranteed. A delivery search point is never evidence of a restaurant's own coordinates.
How to scrape Deliveroo
- Open Deliveroo Scraper in Apify Console.
- Choose a target below and enter its URL or location fields.
- Set
maxResultsto 3 for a small first run. - Click Start and inspect the resulting rows and run messages.
- Download the dataset or read it through the API.
Empty input starts the London, Islington example from the form, limited to 3 rows. This example is billed normally. In auto mode, a filled target selects its matching mode. When targets compete, the priority is startUrls, menuUrl, restaurantSlug, brandSlug, zoneSlug, cuisineSlug, then location fields. Clear unrelated prefilled targets when choosing a different location-based mode.
Restaurants near a location
Fill citySlug, neighborhoodSlug, and geohash. Use the location values from a Deliveroo restaurant-list URL. A city alone selects city-page discovery rather than restaurants serving a precise address.
Restaurant menu
Fill menuUrl, or supply restaurantSlug with the correct city and neighborhood. Turn on includeMenuItems for prices. The restaurant row uses part of the same row limit as its menu items.
Cities
Fill citySlug alone. This discovers restaurant links from the city page and its available zone links; it is not a complete city restaurant census.
Cuisines
Fill cuisineSlug and preferably citySlug. Short cuisine names such as burger can resolve to burgers-takeaway. If the city is omitted, the input uses London; supply a matching city for another market.
Brands
Fill brandSlug from the relevant Deliveroo page. Results are restaurant links associated with that brand, not a guaranteed complete branch directory.
Zones
Fill zoneSlug from Deliveroo. Zone names identify delivery areas and are not interchangeable with arbitrary postal addresses.
Start URLs
Fill startUrls with restaurant-list, menu, city, cuisine, brand, or zone links. Each URL has its own row limit. Repeated entities can be deduplicated, so the final total can be smaller than the sum of the limits.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | auto, or one of the seven modes above. | auto |
startUrls | A list of Deliveroo page URLs. | Empty |
menuUrl | One full Deliveroo menu URL. | Empty |
restaurantSlug | Restaurant identifier from its URL, not a display name. | Empty |
citySlug | City identifier such as london. | Form prefill: london |
neighborhoodSlug | Neighborhood identifier such as islington. | Form prefill: islington |
geohash | Delivery-location code from the restaurant-list URL. | Form prefill: gcpvjmebpbm2 |
cuisineSlug | Cuisine identifier, such as burger. | Empty in form |
brandSlug | Brand identifier, such as pizza-express. | Empty |
zoneSlug | Zone identifier, such as soho. | Empty |
market | Country-site code. | uk |
locale | Alternative name for the market setting; gb maps to uk. | Empty |
maxResults | Maximum rows per location or URL, from 1 to 500. | 70; form prefill: 3 |
includeMenuItems | Add separately billed item rows from menu pages. | false |
maxMenuItemsPerRestaurant | Item-row ceiling for one restaurant, from 0 to 200. | 25 |
enrichDetails | Add available address and merchant details to restaurant rows. | true |
proxyCountry | Optional two-letter country setting; normally leave unset. | Derived from market |
Automatic example:
{}
Restaurants:
{"mode": "restaurants","citySlug": "london","neighborhoodSlug": "islington","geohash": "gcpvjmebpbm2","maxResults": 3}
Menu:
{"menuUrl": "https://deliveroo.co.uk/menu/london/islington/cay-tre","includeMenuItems": true,"maxResults": 5}
Cities:
{"mode": "cities", "citySlug": "london", "maxResults": 3}
Cuisines:
{"cuisineSlug": "burger", "citySlug": "london", "maxResults": 3}
Brands:
{"brandSlug": "pizza-express", "maxResults": 3}
Zones:
{"zoneSlug": "soho", "maxResults": 3}
Start URLs:
{"startUrls": ["https://deliveroo.co.uk/cities/london/"],"maxResults": 3}
maxItems and limit are accepted aliases for maxResults. Unknown fields do not fail input resolution: close misspellings are corrected when recognized, and remaining unknown fields are ignored with a note. Invalid target inputs stop before collecting or charging rows, with a message such as INVALID_INPUT: startUrls — use Deliveroo links. The start fee can still apply.
The Actor writes INPUT_REPORT to the default key-value store before checking the resolved input. It records the chosen mode, example values filled, corrections, and ignored fields. Check it when the selected mode differs from what you intended.
Output example
Illustrative menu-item row; names, identifiers, and prices below are examples, not a live quotation:
{"rowType": "menuItem","id": "445581:item-1","itemType": "menu_item","name": "Vegetable noodles","title": "Vegetable noodles","description": "Noodles with vegetables","categoryName": "Main dishes","priceFormatted": "£8.50","priceFractional": 850,"available": true,"restaurantId": "445581","restaurantName": "Example Restaurant","restaurantUrl": "https://deliveroo.co.uk/menu/london/islington/cay-tre","restaurantMarket": "uk","scrapedAt": "2026-10-24T10:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. JSON preserves nested address and merchant fields most directly.
Why use this Deliveroo scraper?
- Row-based billing: the result charge applies to rows written to the dataset, not pages attempted. The start fee is separate.
- Inspect partial results: returned partial results can be delivered with warnings. Rows already written remain in the dataset; stopping before delivery can leave no rows.
- Traceable input:
INPUT_REPORTexplains how the request was understood, and failure summaries provide a reason. - Explicit missing values: unavailable contact details stay empty, with reasons where supplied.
- Several inputs: submit multiple URLs instead of starting a separate run for each.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Deliveroo?
The Actor uses pay-per-event pricing. Platform usage is included in these prices.
| Apify plan | Start event per GB, minimum one | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
The default memory is 1024 MB, so the start fee is $0.005. Menu-item and restaurant rows have the same price. Detail enrichment does not have a separate event charge.
maxResultsapplies to each location or URL. It defaults to 70; larger requests are collected in parts of 70, up to the input maximum of 500.- Parent restaurant and menu-item rows share that limit. With
maxResults: 5, a menu can deliver one restaurant row and at most four item rows. - The Free Apify plan is limited to 200 rows per run and 10 runs of this Actor. These limits are set by the publisher.
- The whole run is also capped by Maximum cost per run, set with
maxTotalChargeUsdin the API run options, not inside the Actor input.
Example: 3 delivered rows on the Free plan at 1024 MB cost 3 × $0.003 + $0.005 = $0.014. Five delivered rows, including menu items, cost $0.020. The row limit is a maximum, not a promise that enough matching restaurants exist.
What happens when the run timeout is too short
Some Deliveroo collections, such as several startUrls, a menu with includeMenuItems: true, or a large maxResults, can take longer than the run timeout you chose. In that case the run does not fail. It ends early with the status message "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." and shows as ABORTED for a while.
When the results are ready, the same run starts again by itself, reports "Resumed: delivering N rows.", writes the rows to the same dataset and finishes as SUCCEEDED. Rows that were already delivered are skipped, so no row is delivered or charged twice. You do not need to start another run.
- This can happen at most 3 times per run. To avoid it, keep the default timeout of 3600 seconds.
- The synchronous API endpoints (
run-sync,run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset while the run is paused. For larger jobs, start the run asynchronously and read the dataset after the run reaches SUCCEEDED, or use a webhook on the "succeeded" event.
Use with AI agents and the API
Apify MCP server
In Claude, ChatGPT, Cursor, VS Code, or another client supporting remote MCP servers, add:
https://mcp.apify.com?tools=lentic_clockss/deliveroo-scraper
Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and provides run and dataset IDs; the agent reads rows with get-dataset-items.
For a client without remote MCP support, run npx @apify/actors-mcp-server --tools lentic_clockss/deliveroo-scraper with APIFY_TOKEN set.
Example prompt: "Find up to three Deliveroo restaurants in London, Islington using geohash gcpvjmebpbm2. Return their names, links, and delivery-time text."
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/deliveroo-scraper").call(run_input={"mode": "cities", "citySlug": "london", "maxResults": 3})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/deliveroo-scraper').call({mode: 'cities', citySlug: 'london', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~deliveroo-scraper/runs using an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After the run finishes, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json using its dataset ID.
Integrations
Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook through the Actor's Integrations tab. Use Apify Schedules for repeated menu checks.
FAQ
Is it legal to scrape Deliveroo?
This Actor targets publicly reachable data. You are responsible for complying with Deliveroo's terms and applicable data-protection law. Public availability does not remove those obligations; processing personal data requires a lawful basis.
Why did my run end as ABORTED?
An aborted run has been stopped, for example by a user or an API cancellation. Check the status message and log for the actual reason. Inspect the dataset for rows already delivered; do not assume unfinished collection will produce rows or restart automatically.
How many results can I get?
Set maxResults from 1 to 500 per location or URL. The overall charge cap, Free-plan limits, available matches, and deduplication can reduce the delivered total. Menu-item rows count toward the same limit as restaurant rows.
Why are some fields empty?
Fields vary by market and page. Restaurant-list pages do not necessarily include addresses, and menu details do not necessarily expose merchant contact information. Inspect leadAbsences and detailEnriched; empty values are not proof that a business has no phone or email.
Is this an official Deliveroo API?
No. This is an independent scraper, not a Deliveroo product or ordering API.
Why do I need a geohash?
The restaurants mode uses a delivery location. citySlug and neighborhoodSlug identify the area; geohash identifies the query point. Use cities for broader discovery without a delivery point.
Can I collect grocery or alcohol listings?
There is no separately validated grocery or alcohol mode. A compatible Deliveroo URL may return shop listings, but coverage and field completeness should be checked with a small run.
What records explain the run?
The default key-value store contains INPUT_REPORT for resolution, INPUT_ECHO for processed settings, and RUN_SUMMARY for counts and warnings. Failures can also write ERROR_SUMMARY.
Limitations
- Market choices do not establish live availability or equal coverage across countries. Non-UK merchant contact coverage has not been established.
- Some France URL shapes in the earlier research returned no restaurant data. Use current Deliveroo links rather than changing a UK URL's domain.
- Menus can be unavailable, incomplete, or changed since collection. Results are snapshots, not ordering guarantees.
- Menu-item links point to the restaurant, not individual product pages.
- Phone numbers, email addresses, named contacts, and merchant websites were absent from the examined UK public pages; they are not promised output.
- Discovery pages can return fewer restaurant links than location searches. Brand and zone results are not complete directories.
- A stopped run preserves delivered rows, but cannot guarantee delivery of work still in progress.
Related scrapers
More food delivery and grocery scrapers from the same publisher:
- Grab Scraper
- iFood Scraper
- PedidosYa Scraper
- Uber Eats Scraper
- Foodora Scraper
- Foodpanda Scraper
- DoorDash Scraper
- Rappi Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.