Grubhub API endpoint
Returns one restaurant's full menu grouped into categories. Every item carries a base price, a delivery price and a pickup price, which genuinely differ, plus a min and max price bounding items whose price varies with the options chosen. Items also carry a description, a popularity flag, availability, tags and an image. Amounts are given both in minor units (cents) and as a decimal value.
/grubhub/restaurant/menuEvery item carries three prices — a base price, a delivery_price and a pickup_price — which genuinely differ, plus min_price and max_price bounding items whose price varies with the options chosen. All are exposed rather than collapsed so a caller is never silently shown the wrong channel's price.
Query parameters:
restaurant_id (required) — Grubhub's numeric restaurant id, e.g. 6238960.include_unavailable (optional, default false) — include items the restaurant currently has unavailable.Response includes restaurant_id, name, categories[], item_count, source_url, and fetched_at. Each category has category_id, name, available, and items[]. Each item has item_id, name, description, price, delivery_price, pickup_price, min_price, max_price, popular, available, tags[], and image_url.
Money fields carry amount (minor units, i.e. cents), value (decimal), and currency.
| Field | Filled in, of 3 checked | Values in the sample |
|---|---|---|
| category_id | 3 | |
| name | 3 | “Burgers” and 2 other values |
| available | 3 | true in 3 of 3 |
| items | 3 | median 8 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| restaurant_id | string | Yes | Grubhub's numeric restaurant id, from /grubhub/search | 6238960 | |
| include_unavailable | boolean | No | Include items the restaurant currently has unavailable (default false) | true | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/grubhub/restaurant/menu?restaurant_id=6238960&include_unavailable=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurant_id": "6238960",
"name": "7th Street Burger Financial District",
"categories": [
{
"category_id": "275127198073",
"name": "Burgers",
"available": true,
"items": [
{
"item_id": "275127198449",
"name": "Cheeseburger",
"description": "Single patty, 100% fresh beef burger served with American cheese, grilled onions, pickles and house sauce on a Martin's potato bun",
"price": {
"amount": 799,
"value": 7.99,
"currency": "USD"
},
"delivery_price": {
"amount": 799,
"value": 7.99,
"currency": "USD"
},
"pickup_price": {
"amount": 799,
"value": 7.99,
"currency": "USD"
},
"min_price": {
"amount": 799,
"value": 7.99,
"currency": "USD"
},
"max_price": {
"amount": 1255,
"value": 12.55,
"currency": "USD"
},
"popular": true,
"available": true,
"image_url": "https://media-cdn.grubhub.com/image/upload/qclsurtvn6jc5ijvjjcl"
}
]
}
],
"item_count": 21,
"source_url": "https://api-gtm.grubhub.com/restaurants/6238960",
"fetched_at": "2026-08-31T14:20:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/grubhub.menuResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | grubhub.MenuResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].available | boolean | No | true | |||
| data.categories[].category_id | string | No | 275127198073 | |||
| data.categories[].items | array | No | ||||
| data.categories[].items[].available | boolean | No | true | |||
| data.categories[].items[].delivery_price | grubhub.Money | No | ||||
| data.categories[].items[].delivery_price.amount | integer | No | 399 | |||
| data.categories[].items[].delivery_price.currency | string | No | USD | |||
| data.categories[].items[].delivery_price.value | number | No | 3.99 | |||
| data.categories[].items[].description | string | No | ||||
| data.categories[].items[].image_url | string | No | ||||
| data.categories[].items[].item_id | string | No | 275127198449 | |||
| data.categories[].items[].max_price | grubhub.Money | No | ||||
| data.categories[].items[].max_price.amount | integer | No | 399 | |||
| data.categories[].items[].max_price.currency | string | No | USD | |||
| data.categories[].items[].max_price.value | number | No | 3.99 | |||
| data.categories[].items[].min_price | object | No | MinPrice/MaxPrice bound an item whose price varies by the options chosen; they equal Price for a fixed-price item. | |||
| data.categories[].items[].min_price.amount | integer | No | 399 | |||
| data.categories[].items[].min_price.currency | string | No | USD | |||
| data.categories[].items[].min_price.value | number | No | 3.99 | |||
| data.categories[].items[].name | string | No | Cheeseburger | |||
| data.categories[].items[].pickup_price | grubhub.Money | No | ||||
| data.categories[].items[].pickup_price.amount | integer | No | 399 | |||
| data.categories[].items[].pickup_price.currency | string | No | USD | |||
| data.categories[].items[].pickup_price.value | number | No | 3.99 | |||
| data.categories[].items[].popular | boolean | No | true | |||
| data.categories[].items[].price | grubhub.Money | No | ||||
| data.categories[].items[].price.amount | integer | No | 399 | |||
| data.categories[].items[].price.currency | string | No | USD | |||
| data.categories[].items[].price.value | number | No | 3.99 | |||
| data.categories[].items[].tags | array | No | ||||
| data.categories[].name | string | No | Burgers | |||
| data.fetched_at | string | No | ||||
| data.item_count | integer | No | 8 | |||
| data.name | string | No | ||||
| data.restaurant_id | string | No | 6238960 | |||
| data.source_url | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/grubhub/restaurant/menu?restaurant_id=6238960&include_unavailable=true" \
-H "x-api-key: $CRAWLORA_API_KEY"