MenuPages APImenupages.com ↗
Retrieve full restaurant menus from MenuPages via API. Get categories, items, prices, and modifier groups including customization options for any restaurant.
What is the MenuPages API?
The MenuPages API gives developers structured access to restaurant menu data across 2 endpoints. Use get_menu to pull a complete menu organized by category — including item counts, prices, and modifier groups — or use get_menu_item to fetch granular details for a single item, including availability status, popularity flag, image URL, and all customization options. Both endpoints return data powered by the Grubhub restaurant network.
curl -X GET 'https://api.parse.bot/scraper/55cbca2b-9d74-4752-9abd-feb18551c984/get_menu?restaurant_id=337444' \ -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 menupages-com-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.
from parse_apis.menupages_restaurant_menu_api import MenuPages, Menu, MenuItem, Category, Price, ItemNotFound
client = MenuPages()
# Fetch the full menu for a restaurant
restaurant = client.restaurant(id="337444")
menu = restaurant.menu()
print(menu.restaurant.name, menu.restaurant.phone)
print(menu.total_categories, menu.total_items)
for category in menu.categories:
print(category.name, category.item_count)
for item in category.items:
print(item.name, item.price.amount_dollars, item.available)
# Get detailed info for a specific menu item with modifiers
item = client.menuitems.get(item_id="23493433", restaurant_id="337444")
print(item.name, item.description, item.category)
print(item.price.amount_cents, item.price.currency)
for modifier in item.modifiers:
print(modifier.name, modifier.required, modifier.min_selections, modifier.max_selections)
for option in modifier.options:
print(option.name, option.price.amount_dollars, option.available)
Retrieve the full menu for a restaurant including all categories, items, prices, and modifier/customization options. Returns restaurant metadata (name, address, phone, cuisines, coordinates) alongside the complete menu structure organized by category. Each category contains its items with pricing, availability, popularity flags, images, and nested modifier groups. A single request fetches the entire menu; no pagination needed.
| Param | Type | Description |
|---|---|---|
| restaurant_id | string | Grubhub restaurant ID. |
{
"type": "object",
"fields": {
"categories": "array of category objects each containing id, name, item_count, and items array with full item details",
"restaurant": "object containing id, name, address (street/city/state/zip), phone, cuisines array, logo_url, latitude, longitude",
"total_items": "integer count of all menu items across categories",
"total_categories": "integer count of menu categories"
},
"sample": {
"data": {
"categories": [
{
"id": "2019114",
"name": "Ceviches",
"items": [
{
"id": "23493433",
"name": "Ceviche de Aji Amarillo or Traditional",
"tags": [],
"price": {
"currency": "USD",
"amount_cents": 1111,
"amount_dollars": 11.11
},
"popular": false,
"category": "Ceviches",
"available": true,
"image_url": "https://media-cdn.grubhub.com/image/upload/awcahxog0wciotht6auf.jpg",
"modifiers": [
{
"id": "8977941",
"name": "Choose a style",
"options": [
{
"id": "1344127647",
"name": "Ceviche Traditional",
"price": {
"currency": "USD",
"amount_cents": 0,
"amount_dollars": 0
},
"default": false,
"available": true
}
],
"required": true,
"max_selections": 1,
"min_selections": 1
}
],
"description": "White fish, cancha, choclo, sweet potato in your choice of leche de tigre: traditional or aji amarillo."
}
],
"item_count": 5
}
],
"restaurant": {
"id": "337444",
"name": "1111 Peruvian Bistro",
"phone": "7866159633",
"address": {
"zip": "33130-5401",
"city": "Miami",
"state": "FL",
"street": "1111 SW 1st Ave Ste 106"
},
"cuisines": [
"Asian",
"Dinner",
"Latin American"
],
"latitude": "25.763151",
"logo_url": "https://res.cloudinary.com/grubhub/image/upload/v1471360634/ss03fqzrj78bckxgz8uv.png",
"longitude": "-80.194576"
},
"total_items": 47,
"total_categories": 9
},
"status": "success"
}
}About the MenuPages API
What the API Returns
The get_menu endpoint accepts a restaurant_id (Grubhub restaurant ID) and returns the full menu structure for that restaurant. The response includes a restaurant object with name, street address, city, state, zip, phone, cuisine tags, logo URL, latitude, and longitude. The categories array contains each menu section with its id, name, item_count, and a nested items array. Summary counts (total_items, total_categories) let you size the dataset before iterating.
Item-Level Detail
get_menu_item takes an item_id (found at categories[*].items[*].id in the get_menu response) and the same optional restaurant_id. It returns the item's name, description, price (as both amount_cents and amount_dollars with a currency field), available boolean, popular boolean, image_url, and tags array. The modifiers array is the key addition here: each modifier group carries id, name, min_selections, max_selections, required, and an options array — exactly what you need to reconstruct an ordering interface or build a modifier-aware price calculator.
Coverage and Data Shape
MenuPages is powered by Grubhub's restaurant catalog, so coverage skews toward US metro areas with Grubhub delivery presence. The restaurant object includes coordinates (latitude, longitude), making it straightforward to combine menu data with geo-filtering in your own application. The cuisines array on the restaurant object allows downstream categorization without additional lookups.
The MenuPages API is a managed, monitored endpoint for menupages.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when menupages.com 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 menupages.com 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?+
- Build a menu comparison tool using
price.amount_dollarsacross multiple restaurants sharing a cuisine type. - Reconstruct a delivery ordering UI by consuming
modifiersgroups withmin_selections,max_selections, andrequiredflags. - Populate a restaurant catalog with structured address, phone, and coordinate data from the
restaurantobject. - Flag popular items in a recommendation widget using the
popularboolean fromget_menu_item. - Detect out-of-stock or unavailable items in near-real-time using the
availablefield per item. - Calculate full order totals including modifiers by iterating
modifiers[*].optionsfor each selected item. - Geocode-enrich a restaurant database by extracting
latitudeandlongitudefrom theget_menurestaurant object.
| 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 MenuPages have an official developer API?+
What does the `modifiers` array in `get_menu_item` actually contain?+
modifiers represents one customization group (e.g., "Choose a size" or "Add toppings"). It includes the group name, a required boolean, min_selections and max_selections integers that define selection rules, and an options array listing each choice. This is sufficient to render a fully interactive modifier UI or validate order configurations server-side.Can I search for restaurants by name, location, or cuisine rather than by a known restaurant ID?+
restaurant_id as their primary lookup key, so they are designed for menu retrieval once you have an ID. You can fork this API on Parse and revise it to add a restaurant search endpoint that resolves names or locations to IDs.Does the API return reviews, ratings, or delivery fees for a restaurant?+
How fresh is the menu data, and is pagination supported for large menus?+
get_menu response returns all categories and items in a single call with no pagination; very large menus are returned in full.