OpenTable Restaurant Menu API
Get every structured menu OpenTable publishes for one restaurant ID.
Overview
Authentication
Send your StayAPI key in the X-API-Key request header. The endpoint is available through the authenticated playground and uses the same request credits as the other OpenTable endpoints.
Pass the stable restaurant_id returned by Restaurant Search or URL to Restaurant ID. The response preserves menu metadata, currency, sections, items, descriptions, price strings, and size or portion variations.
Endpoint URL
Query Parameter
| Parameter | Type | Required | Description |
|---|---|---|---|
| restaurant_id | integer | Required | Positive OpenTable restaurant ID greater than zero, such as 12526. |
There are no optional query parameters, defaults, pagination, sorting, locale, or currency overrides.
Response Fields
| Field | Description |
|---|---|
| success | True for a successful menu fetch, including a restaurant with no structured menu. |
| restaurant_id, restaurant_name | OpenTable identity. The name may be null when OpenTable does not publish it. |
| source_url | OpenTable restaurant profile URL fetched for this ID. |
| external_menu_url | Restaurant-supplied menu link when OpenTable provides one, otherwise null. |
| shows_third_party_menu | Whether OpenTable advertises a third-party menu. May be null. |
| menu_count, section_count | Aggregate numbers of menus and nested sections. |
| item_count, variation_count | Top-level dishes and nested size or portion choices, counted separately. |
| menus | Every structured menu OpenTable publishes for the restaurant. |
| Object | Fields |
|---|---|
| menu | name, description, currency_code, sections |
| section | name, description, items |
| item | name, description, price, variations |
| variation | name, price |
Prices remain strings
OpenTable can publish numeric prices, null, or nonnumeric values such as MKT. Keep item and variation prices as strings and read currency_code from each menu.
Empty Menus and Limitations
No structured menu is still HTTP 200
A valid restaurant without a structured OpenTable menu returns menus: [] with menu_count, section_count, item_count, and variation_count set to zero.
Structured OpenTable data only
The nested menus array reflects the structured data OpenTable publishes. A restaurant-supplied menu link is returned separately in external_menu_url when available.
Nullable upstream fields stay nullable
Names, descriptions, prices, currency codes, external links, and the third-party-menu flag can be null when OpenTable omits them.
Error Responses
Errors use RFC 7807 Problem Details with application/problem+json, provider: "opentable", and product: "menu".
404 Restaurant not found
RESTAURANT_NOT_FOUND when OpenTable has no restaurant with that ID.
422 Validation error
Returned when restaurant_id is missing, zero, negative, or not an integer.
502 Upstream error
UPSTREAM_ERROR when OpenTable fails or returns an invalid profile.
500 Internal error
INTERNAL_ERROR for an unexpected server error.
Related Workflow
URL to Restaurant ID
Resolve a public OpenTable profile URL before requesting its menus.
View Documentation →Restaurant Search
Find restaurants and carry each result's stable ID into the menu endpoint.
View Documentation →Restaurant Details
Combine menu data with cuisine, hours, address, photos, and restaurant features.
View Documentation →Restaurant Reviews
Pair published menus with paginated guest feedback for the same restaurant ID.
View Documentation →