Deliveroo APIdeliveroo.co.uk ↗
Search Deliveroo UK restaurants by keyword and postcode, and fetch full menu data including item names, descriptions, prices, and images.
What is the Deliveroo API?
The Deliveroo UK API gives developers access to 2 endpoints covering restaurant discovery and menu retrieval. Use search_restaurants to find restaurants by keyword and UK postcode, returning names, URLs, images, ratings, distances, and estimated delivery times. Use get_restaurant_menu to pull structured menu data from any Deliveroo restaurant URL, including item names, descriptions, prices, and restaurant-level metadata.
curl -X GET 'https://api.parse.bot/scraper/03208dc2-5ba7-43bd-bf9d-d8b089fc4234/search_restaurants?query=pizza&postcode=EC4R+3TE' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace deliveroo-co-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Deliveroo UK API Client
Search restaurants and extract menus from Deliveroo UK.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any
class ParseClient:
"""Client for interacting with the Deliveroo UK Parse API."""
def __init__(self, api_key: str | None = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, uses PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "03208dc2-5ba7-43bd-bf9d-d8b089fc4234"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params: Any) -> dict:
"""
Make a request to the Parse API.
Args:
endpoint: API endpoint name
method: HTTP method (GET or POST)
**params: Query/body parameters
Returns:
API response as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_restaurants(self, query: str, postcode: str) -> dict:
"""
Search for restaurants by keyword and postcode.
Args:
query: Search keyword (e.g., pizza, burger, sushi)
postcode: UK postcode to search near (e.g., EC4R 3TE)
Returns:
Dictionary containing array of restaurants with details
"""
return self._call("search_restaurants", method="GET", query=query, postcode=postcode)
def get_restaurant_menu(self, url: str) -> dict:
"""
Get the menu for a restaurant by its Deliveroo URL.
Args:
url: Full Deliveroo restaurant menu URL
Returns:
Dictionary containing restaurant info and menu items
"""
return self._call("get_restaurant_menu", method="GET", url=url)
if __name__ == "__main__":
# Initialize the API client
client = ParseClient()
# Workflow: Search for restaurants, analyze top results, get their menus
print("=" * 70)
print("🍕 Deliveroo Restaurant Discovery & Menu Analyzer")
print("=" * 70)
# Parameters for search
postcode = "EC4R 3TE" # Central London
search_query = "pizza"
print(f"\n🔍 Searching for '{search_query}' restaurants near {postcode}...\n")
try:
# Step 1: Search for restaurants
search_response = client.search_restaurants(query=search_query, postcode=postcode)
if search_response.get("status") != "success":
print("❌ Search failed")
exit(1)
restaurants = search_response.get("data", {}).get("restaurants", [])
print(f"✅ Found {len(restaurants)} restaurants\n")
if not restaurants:
print("No restaurants found. Try a different search or postcode.")
exit(0)
# Step 2: Analyze top 3 restaurants and get their menus
for idx, restaurant in enumerate(restaurants[:3], 1):
name = restaurant.get("name", "Unknown")
url = restaurant.get("url", "")
details = restaurant.get("details", "")
image = restaurant.get("image", "")
print(f"\n{'─' * 70}")
print(f"📍 Restaurant #{idx}: {name}")
print(f" Details: {details}")
if not url:
print(" ⚠️ No URL available for this restaurant")
continue
# Step 3: Get full menu for this restaurant
print(f" 📋 Fetching menu details...")
menu_response = client.get_restaurant_menu(url=url)
if menu_response.get("status") != "success":
print(f" ❌ Could not fetch menu")
continue
restaurant_info = menu_response.get("data", {}).get("restaurant", {})
menu_items = menu_response.get("data", {}).get("menu_items", [])
# Display restaurant details
rating = restaurant_info.get("rating", "N/A")
review_count = restaurant_info.get("review_count", "0")
address = restaurant_info.get("address", "N/A")
print(f" ⭐ Rating: {rating} ({review_count} reviews)")
print(f" 📮 Address: {address}")
print(f" 🍖 Menu items: {len(menu_items)} total")
# Display sample menu items with prices
print(f"\n Sample menu items:")
for item in menu_items[:5]:
item_name = item.get("name", "Unknown")
price = item.get("price")
description = item.get("description", "")
price_str = f"£{price}" if price else "Price N/A"
desc_str = f" - {description}" if description else ""
print(f" • {item_name}: {price_str}{desc_str}")
if len(menu_items) > 5:
print(f" ... and {len(menu_items) - 5} more items")
print(f"\n{'=' * 70}")
print("✨ Analysis complete!")
print("=" * 70)
except requests.exceptions.HTTPError as e:
print(f"❌ API Error: {e.response.status_code} - {e.response.text}")
except Exception as e:
print(f"❌ Error: {e}")Search for restaurants by keyword and postcode. Returns a list of restaurants matching the search query near the given postcode, with details including name, menu URL, image, and a description with rating, distance, and delivery time.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword (e.g. pizza, burger, sushi) |
| postcoderequired | string | UK postcode to search near (e.g. EC4R 3TE) |
{
"type": "object",
"fields": {
"restaurants": "array of objects with name, url, image, and details"
},
"sample": {
"data": {
"restaurants": [
{
"url": "https://deliveroo.co.uk/menu/London/fitzrovia/german-doner-kabab-and-grill-68-cleveland-street",
"name": "Pizza Toppers",
"image": "https://rs-menus-api.roocdn.com/images/e1438da0-407c-4069-bba2-79c91a58397f/image.jpeg?width={w}&height={h}&auto=webp&format=jpg&fit=crop{&quality}",
"details": "Item Cheese and tomato pizza from Pizza Toppers. Priced at £20.95. 2.2 mi. Delivers at 40. Rated 4.3 from 15 reviews. Free delivery."
}
]
},
"status": "success"
}
}About the Deliveroo API
Restaurant Search
The search_restaurants endpoint accepts a query string (e.g. "pizza", "sushi") and a UK postcode (e.g. "EC4R 3TE"). It returns an array of matching restaurants, each with a name, a url pointing to that restaurant's Deliveroo menu page, an image URL, and a details field that bundles rating, distance from the postcode, and estimated delivery time as a descriptive string.
Menu Data
The get_restaurant_menu endpoint takes a full Deliveroo menu URL as its only required input. It returns two top-level objects. The restaurant object includes the restaurant's id, name, rating, review_count, address, and image. The menu_items array contains individual dishes, each with an id, name, description, price, and image. Note that prices are not guaranteed to be present for every item — some listings may return a null or absent price field.
Coverage and Scope
This API covers Deliveroo's UK platform (deliveroo.co.uk). Search results are geographically anchored to the provided postcode, so results will vary by location. Menu data reflects what is publicly visible on a restaurant's Deliveroo listing page without requiring a logged-in session.
The Deliveroo API is a managed, monitored endpoint for deliveroo.co.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when deliveroo.co.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official deliveroo.co.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate restaurant listings near a postcode for a local food discovery app
- Compare menu prices across competing restaurants for a given cuisine type
- Build a meal-planning tool that indexes dish descriptions and images from Deliveroo menus
- Monitor menu changes over time by periodically fetching menu data for a set of restaurant URLs
- Enrich a food delivery analytics dashboard with delivery time estimates and ratings from search results
- Generate structured datasets of UK restaurant menus for research or competitive analysis
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Deliveroo have an official public developer API?+
What does the `details` field in search results actually contain?+
details field in each search_restaurants result is a descriptive string that combines the restaurant's rating, its distance from the supplied postcode, and an estimated delivery time. It is returned as a single text value rather than separate structured fields.Are prices always available in menu responses?+
get_restaurant_menu endpoint returns a price field for each item in menu_items, but the endpoint description notes that prices may not be available for all items. Some items may return a null or missing price depending on how the restaurant has configured its listing.