Deliveroo Scraper | Menu Data | 12 Markets
Pricing
from $4.20 / 1,000 results
Deliveroo Scraper | Menu Data | 12 Markets
Extract Deliveroo restaurant menus, item prices and delivery fees across 12 country markets for restaurant menu price monitoring, competitor price tracking and food delivery market research. One row per menu item.
Pricing
from $4.20 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
Deliveroo Scraper — Restaurant Menu Data, Prices & Delivery Fees Across 12 Markets
The Deliveroo Scraper extracts Deliveroo restaurants and their complete menus — 35 fields, one dataset row per menu item — across 12 country markets (deliveroo.co.uk, .fr, .ie, .it, .nl, .be, .com.au, .sg, .ae, .qa, .kw, .hk), built for restaurant menu price monitoring and food delivery market research. It calls the same consumer GraphQL endpoint the Deliveroo web app uses over plain HTTP: no browser, no HTML parsing, no anti-bot API.
Main Use Cases: Restaurant Menu Price Monitoring, Food Delivery Market Research & Competitor Price Tracking
- Restaurant menu price monitoring — every dish arrives with
price,priceValue,discountedPrice,discountedPriceValue,offerText,availableandinStock, so scheduled runs diff cleanly onitemIdto catch price changes, promotions and sell-outs. - Restaurant competitor price tracking / track competitor menu prices — restaurant facts (
restaurantName,restaurantId,category,rating,deliveryFee) repeat on every row, so side-by-side price tables across chains and branches are aGROUP BYaway. - Food delivery market research —
cuisines,rating,ratingCount,branchType,city,areaandcountry(ISO code) structure samples by market and cuisine across all 12 Deliveroo countries. - Food delivery price comparison & delivery fee comparison —
deliveryFee,minimumOrder,deliveryTime,distanceandavailableDeliveryTimeper restaurant for cross-city and cross-platform fee benchmarking. - Restaurant data enrichment — menu items, prices and delivery details keyed by
restaurantSlug/restaurantUrl/restaurantIdto enrich CRM, BI or analytics records. - Deliveroo UK, UAE, Singapore and Australia restaurant data — pass the market's own URLs (
deliveroo.co.uk,.ae,.sg,.com.au, …) and every row carries that market'scountryISO code.
How The Deliveroo Scraper Works
Deliveroo's /menu/… HTML pages sit behind Cloudflare + PerimeterX and return 403 "Just a moment…" to datacenter IPs, so this actor never loads the website. It POSTs plain JSON to https://api.deliveroo.com/consumer/menus/graphql/ with the web app's own client headers — two operations per restaurant (get_menu_meta for the profile, get_menu_page for the header plus the complete menu) — then flattens the menu's UI layout blocks into one dataset row per menu item. Sitemap discovery of restaurant URLs is plain HTTP too.
Input Parameters
No field is marked required in the input schema; the run's targets come from startUrls. There is no market/country input — the market is selected by the domain of each URL you pass (the actor sends the matching X-Roo-Country ISO header on every request).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | array | No | — (UI prefills 3 example UK URLs) | Restaurant page URLs (https://deliveroo.co.uk/menu/{city}/{area}/{restaurant}) and/or Deliveroo sitemap URLs (e.g. https://deliveroo.co.uk/en/sitemap-menu-landing-pages-1.xml) used to discover restaurant URLs. The URL domain selects one of the 12 supported markets: deliveroo.co.uk, .fr, .ie, .it, .nl, .be, .com.au, .sg, .ae, .qa, .kw, .hk. |
maxRestaurants | integer | No | 25 | Maximum restaurants to scrape, min 1 / max 1000. Each restaurant yields one dataset row per menu item. Free users are capped at 10 restaurants per run. |
deliveryLat | number | No | — | Optional delivery latitude used for delivery fee / minimum order / distance calculations. Leave empty to use each restaurant's own address (one extra API call per restaurant). |
deliveryLon | number | No | — | Optional delivery longitude used for delivery fee / minimum order / distance calculations. Leave empty to use each restaurant's own address. |
proxy | object | No | { "useApifyProxy": false } | Standard Apify proxy picker. Turn it on if Deliveroo starts rate-limiting your IP. |
Output Fields
35 dataset fields — one row per menu item, with the restaurant's facts repeated on every row. The default table view Menu Items shows restaurantName, itemName, category, price, available, rating, deliveryFee, deliveryTime.
| Group | Fields |
|---|---|
| Restaurant | restaurantName, restaurantId, restaurantSlug, restaurantUrl, address, city, area, country, branchType |
| Rating | rating (number), ratingCount (number) |
| Cuisines | cuisines (array) |
| Delivery | deliveryTime, deliveryFee, minimumOrder, distance, openingStatus, deliversToLocation (boolean), availableDeliveryTime, menuDisabled (boolean) |
| Menu item | itemId, itemName, itemDescription, category, price, priceValue (number), priceCurrency, discountedPrice, discountedPriceValue (number), available (boolean), dietaryTags (array), offerText, popular (boolean), inStock (number) |
| Meta | scrapedAt |
Paired fields: price is the formatted string ("£4.20"), priceValue the number (4.2); same for discountedPrice / discountedPriceValue. country is the ISO code of the market, availableDeliveryTime is the next available delivery time, scrapedAt is the run timestamp.
Example Input And Output
Direct restaurant URLs with delivery coordinates priced:
{"startUrls": [{ "url": "https://deliveroo.co.uk/menu/london/enfield/prezzo-enfield" },{ "url": "https://deliveroo.co.uk/menu/sheffield/london-road/the-hong-kong-cafe-sheffield" }],"maxRestaurants": 25,"deliveryLat": 51.6564,"deliveryLon": -0.0823}
Sitemap-driven discovery (10,000 restaurant URLs per sitemap file):
{"startUrls": [{ "url": "https://deliveroo.co.uk/en/sitemap-menu-landing-pages-1.xml" }],"maxRestaurants": 100}
One dataset row (real output shape):
{"restaurantName": "Prezzo Italian - Pasta & Pizza - Enfield","address": "The Coach House, London, EN26LU","rating": 4.5,"ratingCount": 500,"cuisines": ["Italian", "Pizza", "Pasta"],"deliveryFee": "£1.99","minimumOrder": "£10.00","deliveryTime": "ASAP","category": "Starters","itemName": "Garlic Bread","itemDescription": "Toasted ciabatta with garlic butter and parsley","price": "£4.20","priceValue": 4.2,"priceCurrency": "GBP","available": true,"dietaryTags": ["Vegetarian"]}
Build Deliveroo Menu Data Without Official API Access
The Deliveroo website itself is not scrapeable from a datacenter IP: every /menu/… HTML page is served behind Cloudflare + PerimeterX and returns a 403 "Just a moment…". Rendering those pages in a browser would be expensive and fragile — so this actor does not touch the website at all. Instead it calls the same consumer GraphQL endpoint the Deliveroo web app uses:
POST https://api.deliveroo.com/consumer/menus/graphql/
Two operations return everything the dataset needs:
get_menu_meta(options)— restaurant profile (name, address, coordinates, category list) using an uname lookup (restaurant_id= the slug from the URL, pluscity_uname/neighborhood_unamefrom the URL path).get_menu_page(options)— the restaurant header (rating + review count, cuisine tags, delivery fee, minimum order, distance, opening hours) and the complete menu.
The endpoint is protected by a light WAF check rather than by Cloudflare, and it accepts a plain JSON POST as long as the request carries the web app's own client headers — this is the whole bypass:
User-Agent: <browser UA> (deliveroo/consumer-web-app; browser)X-Roo-Client: consumer-web-appX-Roo-Platform: webX-Roo-Country: <iso>X-Roo-Guid / X-Roo-Session-Guid / X-Roo-Sticky-Guid: <uuids>Origin / Referer: <market origin>
Menu layout note. get_menu_page exposes the menu as UI layout blocks (ui_layout_groups → ui_layouts → ui_blocks) rather than as a flat item list. Each UIMenuItemCard.properties (or UITallMenuItemCard) is one menu item, and its block sits inside the layout whose header is the category name. The union of those block ids matches meta.categories[].item_ids exactly (verified: 102/102 ids, 83 unique items for a McDonald's branch), so nothing is missed — including the "Popular" carousel, which just repeats items that also appear in categories.
No browser, no HTML parsing, no anti-bot API is required. Sitemap discovery (sitemap-menu-landing-pages-*.xml, 10,000 restaurant URLs per file) is plain HTTP as well.
Request budget & safety limits
maxRestaurantscaps the run; the internal request budget ismaxRestaurants × 2 + sitemap fetches(hard ceiling 2,000).maxConcurrency = 2,maxRequestRetries = 3, 60 s per-request timeout.- Free accounts (
APIFY_USER_IS_PAYING!= 1) are limited to 10 restaurants per run.
Known limitations
deliveryTimeis whatever Deliveroo publishes for the restaurant at request time: a time range when the API returns one, otherwise thenext_available_delivery_time(e.g."ASAP"). The exact minute-range ETA is only rendered by the website for a validated postal address, so it is oftenASAP.- Closed restaurants return their status as
openingStatus(e.g."Closes at 10:45") and may havedeliversToLocation: false. - Restaurant lookup is by slug + city/area from the URL. If a slug is ambiguous across two cities, pass the full
…/menu/{city}/{area}/{slug}URL — the city and area are always sent with the lookup.
Run Deliveroo Scraper From The Apify API, Console Or Schedule
Start runs from the Console or through the API:
curl -X POST "https://api.apify.com/v2/acts/n1z2QMh8CPrGMsxnK/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://deliveroo.co.uk/menu/london/enfield/prezzo-enfield"}],"maxRestaurants":25}'
Then poll GET /v2/actor-runs/<runId> and read rows from GET /v2/datasets/<datasetId>/items?format=json. The dataset UI exports JSON, CSV, Excel; Google Sheets via Zapier / Make.
Pay-per-event billing:
| Event | Price |
|---|---|
result | $0.0045 per result (dataset row) |
Actor Start | $0.00005 per run |
Runtime profile: 256 MB memory (512 MB max) — plain HTTP GraphQL, no browser. maxRestaurants is the main cost lever: a run's request budget is maxRestaurants × 2 + sitemap fetches.
Integrations & Automation
- Apify API — start, poll and read results programmatically (curl example above).
- Webhooks — fire on
actor.succeeded/actor.failedto push rows into a warehouse, Google Sheets or Slack. - Zapier / Make — turn a new dataset item into a price-alert email or a CRM record without code.
- Schedules — run daily (e.g. cron
0 6 * * *) for restaurant menu price monitoring or weekly for a food delivery market research digest; keepmaxRestaurantsstable so dataset diffs stay meaningful.
Related Actors
- thirdwatch/deliveroo-scraper
- memo23/deliveroo-scraper
- parseforge/deliveroo-restaurants-scraper
- studio-amba/deliveroo-scraper
- axlymxp/deliveroo-menu-items-scraper
FAQ
Does Deliveroo have a public API for menu data?
No public menu API for general use — the official Deliveroo API is restricted to restaurant/retail partners, so there is nothing an analyst or developer can sign up for to pull menus and prices. This actor instead calls the same consumer GraphQL endpoint the public Deliveroo web app uses (POST https://api.deliveroo.com/consumer/menus/graphql/): no partner contract, no API key, no login.
Why use this actor instead of the official API?
Because there is no official public menu API to use — the partner-restricted one is unavailable for market research, price monitoring or enrichment workflows. This actor needs no credentials and no browser: two plain-HTTP GraphQL operations per restaurant (get_menu_meta, get_menu_page), 256 MB of memory, no Cloudflare/PerimeterX 403, and output is flat one-row-per-menu-item data with restaurant facts repeated on every row — ready for diffing and joins.
Is it legal to scrape Deliveroo menu data?
The actor only touches publicly visible restaurant and menu data served to anonymous visitors — no login, no account credentials, no personal data. Whether and how you may use the resulting dataset at scale is your responsibility: review Deliveroo's Terms of Service and applicable data-protection law before commercial redistribution (see the disclaimer below).
How do I monitor competitor restaurant menu prices?
Pass the competitors' …/menu/{city}/{area}/{slug} URLs (or a market sitemap URL with maxRestaurants) as startUrls, schedule the run daily or weekly, then diff datasets on restaurantId + itemId + priceValue + discountedPriceValue + available + offerText. Because restaurant facts repeat on every menu-item row, rows drop straight into a competitor price table.
How do I get restaurant menu data for market research?
Feed one or more Deliveroo sitemap URLs (sitemap-menu-landing-pages-*.xml, 10,000 restaurant URLs per file) as startUrls, cap with maxRestaurants, and export JSON/CSV/Excel from the Apify dataset. Rows carry cuisines, rating, ratingCount, deliveryFee, minimumOrder, distance, plus per-item prices, categories and dietaryTags — the raw material for food delivery market research, restaurant pricing strategy and ghost kitchen market research, structured by city, area and country.
Which countries does Deliveroo operate in?
Twelve markets, all supported by this actor: deliveroo.co.uk (United Kingdom), deliveroo.fr (France), deliveroo.ie (Ireland), deliveroo.it (Italy), deliveroo.nl (Netherlands), deliveroo.be (Belgium), deliveroo.com.au (Australia), deliveroo.sg (Singapore), deliveroo.ae (UAE), deliveroo.qa (Qatar), deliveroo.kw (Kuwait) and deliveroo.hk (Hong Kong). The market follows the domain of your startUrls; each row carries the matching country ISO code.
Can I scrape a whole city of Deliveroo restaurants at once?
Yes — pass as many of that city's …/menu/{city}/{area}/{slug} URLs as you have (or a sitemap URL for URL discovery) and set maxRestaurants (up to 1000). Budget maxRestaurants × 2 GraphQL requests plus sitemap fetches (hard ceiling 2,000); free accounts are limited to 10 restaurants per run. For a whole-market sweep, start from a sitemap file and raise maxRestaurants.
What are the alternatives to this actor?
For cross-platform food delivery data, scrape Uber Eats, Just Eat and DoorDash alongside Deliveroo (useful for a Deliveroo vs Uber Eats vs Just Eat price comparison — join rows on city, cuisine and dish). For Deliveroo specifically, Store alternatives include thirdwatch/deliveroo-scraper, memo23/deliveroo-scraper, parseforge/deliveroo-restaurants-scraper, studio-amba/deliveroo-scraper and axlymxp/deliveroo-menu-items-scraper (see Related Actors).
SEO Keywords
deliveroo scraper, deliveroo api, deliveroo restaurant data, deliveroo menu data, food delivery api, menu scraping api, restaurant menu data, restaurant menu scraping, restaurant menu price monitoring, restaurant competitor price tracking, track competitor menu prices, food delivery market research, food delivery price monitoring, ghost kitchen market research, food delivery market, deliveroo vs uber eats vs just eat, restaurant pricing strategy, compare delivery prices, food delivery price comparison, delivery fee comparison, restaurant data enrichment, deliveroo data scraping uk, deliveroo uae data, singapore food delivery data, deliveroo australia data
For AI Agents & LLM Apps
Purpose: scrape Deliveroo restaurants and their complete menus into 35-field dataset rows (one row per menu item) from menu or sitemap URLs across 12 markets, via Deliveroo's consumer GraphQL endpoint over plain HTTP — no browser.
Minimal input:
{ "startUrls": [{ "url": "https://deliveroo.co.uk/menu/london/enfield/prezzo-enfield" }] }
Variant — sitemap discovery:
{ "startUrls": [{ "url": "https://deliveroo.co.uk/en/sitemap-menu-landing-pages-1.xml" }], "maxRestaurants": 100 }
Output fields: restaurantName, restaurantId, restaurantSlug, restaurantUrl, address, city, area, country, branchType, rating, ratingCount, cuisines, deliveryTime, deliveryFee, minimumOrder, distance, openingStatus, deliversToLocation, availableDeliveryTime, menuDisabled, itemId, itemName, itemDescription, category, price, priceValue, priceCurrency, discountedPrice, discountedPriceValue, available, dietaryTags, offerText, popular, inStock, scrapedAt.
Behaviors an agent should know:
- There is no market input: the market is the domain of
startUrls—deliveroo.co.uk,.fr,.ie,.it,.nl,.be,.com.au,.sg,.ae,.qa,.kw,.hk— and the matchingX-Roo-CountryISO header is sent per request. startUrlsaccepts a mix of restaurant page URLs and sitemap URLs in one array; with no URLs there are no targets.maxRestaurantsdefaults to25(min 1, max 1000); free accounts (APIFY_USER_IS_PAYING!= 1) are hard-capped at 10 restaurants per run regardless of input.- Restaurant lookup is slug + city/area from the URL — pass the full
…/menu/{city}/{area}/{slug}URL when a slug is ambiguous across cities. deliveryLat/deliveryLonare optional; when unset, each restaurant's own address is used (one extra API call per restaurant).- Request budget =
maxRestaurants × 2 + sitemap fetches(hard ceiling 2,000);maxConcurrency2,maxRequestRetries3, 60 s per-request timeout. - Every row repeats the restaurant's facts;
deliveryTimeis often"ASAP"; closed restaurants may showopeningStatusanddeliversToLocation: false. - Proxy is off by default (
useApifyProxy: false); enable only if Deliveroo rate-limits the IP.
Billing: pay-per-event — result $0.0045 per result + Actor Start $0.00005 per run.
Legal & Compliance Disclaimer
This Actor is an independent project and is not affiliated with, endorsed by or sponsored by Deliveroo or its operators.
It accesses only publicly available restaurant and menu data through the same unauthenticated consumer GraphQL endpoint the public Deliveroo web app calls — no login, no account credentials, no login bypass, and no personal data of Deliveroo users is collected.
You are responsible for complying with Deliveroo's Terms of Service and applicable data-protection law (including UK/EU GDPR where relevant) before commercial redistribution or large-scale reuse; respect rate limits and local rules. The output contains restaurant and menu data only — no personal contact details.