OpenTable Private Dining API
Find venues that offer private dining near a location, with contact and capacity details.
Overview
Directory search — no date or party size
This targets OpenTable's private-dining sub-site, so it is a directory search, not an availability search: there is no date, time, or party size. There is also no city-name search — resolve a place to coordinates first, e.g. with the Meta Coordinates Lookup endpoint (GET /v1/meta/coordinates-lookup).
The OpenTable Private Dining endpoint finds restaurants that offer private dining around a latitude/longitude. Each result carries the private-dining event contact (name, phone, email), the largest-space capacity, the number of spaces, and an instant-bookable flag — alongside cuisine, price band, rating, neighborhood, coordinates, and photos.
Endpoint URL
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| latitude | float | Required | Search-center latitude (-90 to 90). |
| longitude | float | Required | Search-center longitude (-180 to 180). |
| cuisine_ids | string[] (UUID) | Optional | OpenTable cuisine UUIDs. Discover them by calling once with with_facets=true. Repeatable for multiple cuisines. |
| instant_book | boolean | Optional | If true, return only instantly-bookable venues. |
| radius | integer | Optional | Search radius in miles (1-100). Default: 50 |
| min_capacity | integer | Optional | Only venues whose largest space seats at least this many (≥ 1). Applied by StayAPI — see the capacity note below. |
| metro_id | integer | Optional | OpenTable metro id; narrows the search to a metro area. |
| with_facets | boolean | Optional | If true, include facets.cuisines (name → cuisine_id → count). Default: false |
| limit | integer | Optional | Maximum restaurants to return (1-50). Default: 50 |
| offset | integer | Optional | Pagination offset (≥ 0). Default: 0 |
Discover cuisine IDs with facets
cuisine_ids are opaque OpenTable cuisine UUIDs (not the 1-4 price values). Call once with with_facets=true to get facets.cuisines — each entry maps a cuisine name to its cuisine_id and a count — then pass the UUIDs you want back as cuisine_ids.
Response Format
The response returns matching private-dining venues, plus counters describing the capacity filter and optional cuisine facets.
Response Structure
- success: Boolean indicating request success
- total: Match count — metro-wide when
min_capacityis omitted, or the count after the capacity filter when it is set - server_total: Metro-wide pre-filter total (non-null only when
min_capacityis set) - searched_count: Number of venues scanned for the capacity filter (≤ 250)
- capacity_filter_truncated:
trueif the metro exceeded the 250-venue scan cap - restaurants: Array of venue objects
- facets: Cuisine facets —
nullunlesswith_facets=true
Venue Object Fields
| Field | Type | Description |
|---|---|---|
| id | integer | OpenTable restaurant id. Stable. |
| name | string | Restaurant name |
| url | string | OpenTable private-dining profile URL |
| primary_cuisine | string | Primary cuisine, e.g. "Pan-Asian" |
| price_band | object | Price band: id (1-4), name (e.g. "$31 to $50"), currency_symbol |
| rating | float | Guest-review score (0-5). May be null. |
| review_count | integer | All-time text-review count. May be null. |
| neighborhood | string | Neighborhood name |
| coordinates | object | Restaurant latitude / longitude |
| photos | array | Ready-to-use CDN photo URLs |
| is_instant_bookable | boolean | Whether the venue is instantly bookable |
| space_count | integer | Number of private-dining spaces |
| private_dining | object | Private-dining details: contact, phone, email, largest_capacity (seats in the biggest space), description |
How the capacity filter works
OpenTable has no native capacity filter, so StayAPI applies min_capacity itself. It scans up to 250 venues, filters them, and reports server_total (metro-wide pre-filter total), searched_count (how many it scanned), and capacity_filter_truncated (true when the metro had more than 250 venues, so matches beyond the scanned window may exist). facets are metro-wide and are NOT recomputed against min_capacity — when both are set, facet counts will exceed total.
Error Responses
The API returns standard HTTP error codes with detailed messages following the RFC 7807 Problem Details format. Failures carry provider: "opentable" and product: "private-dining".
400 Bad Request
A cuisine_ids value is not a valid UUID (INVALID_CUISINE_ID).
{
"type": "https://api.stayapi.com/errors/invalid-cuisine-id",
"title": "Invalid Cuisine ID",
"status": 400,
"detail": "cuisine_ids must be valid UUIDs",
"provider": "opentable",
"product": "private-dining",
"error_code": "INVALID_CUISINE_ID"
}
422 Unprocessable Entity
A parameter is missing or out of range (e.g. bad coordinates, radius > 100, min_capacity < 1, limit > 50).
502 Bad Gateway
Upstream service error from OpenTable after retries (UPSTREAM_ERROR).
Usage Tips
Best Practices
- Geocode a place name to coordinates first — pair this with the Meta Coordinates Lookup endpoint
- Do a first call with
with_facets=trueto discover thecuisine_idUUIDs, then filter withcuisine_ids - When using
min_capacity, checkcapacity_filter_truncated— iftrue, widen the search or lower the threshold to catch matches beyond the 250-venue scan - Use
private_dining.largest_capacityandspace_countto match the venue to your event size
Rate Limiting
This endpoint is subject to your plan's rate limits. Each search counts as one API call regardless of the number of results returned.
Related Endpoints
OpenTable Restaurant Search
Find restaurants by location for a date, time, and party size
View Documentation →Meta Coordinates Lookup
Resolve a place name into latitude/longitude for the search
View Documentation →