MenuPages APImenupages.com ↗
Access full restaurant menus from MenuPages: categories, items, prices, modifier groups, and restaurant metadata. Search by name or location.
What is the MenuPages API?
The MenuPages API covers 4 endpoints that return structured menu data from the MenuPages (Grubhub-powered) restaurant directory. Use get_menu to retrieve a complete restaurant menu — including every category, item price in cents and dollars, and modifier groups with min/max selection rules — or search_restaurants to look up Grubhub restaurant IDs by name and location before fetching menu details.
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'
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 Grubhub restaurant_id and returns the full menu organized into category objects, each carrying an id, name, item_count, and a nested items array. Every item includes its price (both amount_cents and amount_dollars), a popular boolean, available status, an optional image_url, free-text description, and a modifiers array of customization groups. Restaurant-level metadata (name, street address, city, state, zip, phone, cuisines array, logo URL, latitude, longitude) is returned in the same response alongside total_items and total_categories counts.
Item-Level Detail and Modifiers
get_menu_item lets you fetch a single item by its item_id (obtainable from get_menu's categories[*].items[*].id path) without pulling the entire menu. The response adds a tags array and a category string showing which menu section the item belongs to. Each entry in the modifiers array includes id, name, required, min_selections, and max_selections, plus an options array — giving you the full customization tree needed to programmatically construct an order form.
Searching and Bulk Fetching
search_restaurants matches against the MenuPages directory by partial restaurant name and/or location (city name or street address). It returns each match with a restaurant_id, name, address, and city, plus a total_results count — at least one of the two parameters is required. For pipeline use cases, get_menus_bulk accepts a JSON array of {name, location} objects, resolves each to a restaurant ID via search, and returns a results array keyed by input query. Each result carries a status field (success, not_found, or error) and the full menu payload for successful matches, letting you hydrate multiple restaurant menus in a single call.
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 restaurant menu comparison tool by fetching
get_menufor multiple venues and comparing item prices and category structures. - Populate an ordering interface with modifier groups from
get_menu_item, respectingmin_selectionsandmax_selectionsconstraints. - Geocode restaurant locations using
latitudeandlongitudefields fromget_menuto plot outlets on a map. - Identify popular menu items using the
popularboolean flag for featured-dish displays or recommendation engines. - Resolve restaurant names to Grubhub IDs in batch using
search_restaurantsbefore ingesting menus programmatically. - Audit menu availability at scale with
get_menus_bulkto check which items areavailable: falseacross a chain's locations. - Aggregate cuisine-type data from the
cuisinesarray returned byget_menuto build neighborhood food-category indexes.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does MenuPages have an official developer API?+
What does `get_menu_item` return that `get_menu` does not?+
get_menu_item returns the same core fields as items inside get_menu (price, description, image_url, popular, available, modifiers) but also includes a tags array and a category string indicating which section of the menu the item belongs to. Use it when you need a single item's full detail without downloading the entire menu payload.Does the API return user reviews or ratings for menu items?+
Are hours of operation or real-time availability returned?+
available boolean on each item reflects whether a specific item is currently available, but restaurant hours of operation are not a returned field in any endpoint. You can fork the API on Parse and revise it to add an hours endpoint to surface that data.How does `search_restaurants` handle ambiguous name matches?+
search_restaurants performs a case-insensitive substring match against the MenuPages directory for both the name and location parameters. When a name is common, the response will include multiple matches each with their own restaurant_id, address, and city. You then pass the correct restaurant_id to get_menu or get_menu_item to narrow to the intended restaurant.