Wire it up. See the schema.
- 50 free requests on signup
- Every endpoint included
- No credit card required
- Same schema as paid
A quick demo might save your team weeks of engineering work.
Resources
Free Tools
Resolve restaurant IDs, then pull profile details, structured menus with prices, search results, guest reviews, availability, and private dining venues as clean JSON.
curl "https://api.stayapi.com/v1/opentable/restaurant/url-to-id" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "url=https://www.opentable.com/r/the-ivy-victoria-brasserie-london-2"
curl "https://api.stayapi.com/v1/opentable/restaurants/404046" \ -G \ -H "x-api-key: $STAYAPI_KEY"
curl "https://api.stayapi.com/v1/opentable/restaurant/menu" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "restaurant_id=12526"
curl "https://api.stayapi.com/v1/opentable/search" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "latitude=34.0634" \ -d "longitude=-118.2806" \ -d "date=2026-07-30" \ -d "time=19:00" \ -d "party_size=2" \ -d "prices=[2, 3]"
curl "https://api.stayapi.com/v1/opentable/private-dining" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "latitude=32.8959" \ -d "longitude=-97.0671" \ -d "min_capacity=100" \ -d "with_facets=true"
curl "https://api.stayapi.com/v1/opentable/restaurant/reviews" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "restaurant_id=404046" \ -d "sort=newest" \ -d "page=1" \ -d "page_size=25"
curl "https://api.stayapi.com/v1/opentable/restaurants/404046/availability" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "date=2026-07-30" \ -d "time=19:00" \ -d "party_size=2"
curl "https://api.stayapi.com/v1/opentable/restaurants/404046/availability/slots" \ -G \ -H "x-api-key: $STAYAPI_KEY" \ -d "date=2026-07-30" \ -d "preferred_time=19:00" \ -d "party_size=2"
{
"success": true,
"restaurant_id": 180654,
"name": "The Ivy Victoria Brasserie",
"country": "United Kingdom",
"macro": "South West London",
"neighborhood": "Victoria"
}
{
"success": true,
"restaurant": {
"id": 404046,
"name": "Le Petit Saint Honoré",
"url": "https://www.opentable.com/r/le-petit-saint-honore-paris",
"primary_cuisine": "French",
"cuisines": [
"French",
"Traditional French"
],
"dining_style": "Casual Dining",
"price_band": {
"id": 2,
"name": "€30 and under",
"currency_symbol": "€"
},
"rating": 4.4,
"ratings": {
"food": 4.4,
"service": 4.4,
"ambience": 4.5,
"value": 4.3
},
"review_count": 201,
"address": {
"line1": "158 Rue Saint-Honoré",
"city": "Paris",
"postal_code": "75001",
"country": "France"
},
"contact": {
"phone": "01 42 60 08 06"
},
"hours": "Daily 9:00 am–12:00 am",
"photo_count": 47,
"neighborhood": {
"id": 16454,
"name": "Châtelet"
}
}
}
{
"success": true,
"restaurant_id": 12526,
"restaurant_name": "Takami Sushi & Robata Restaurant",
"source_url": "https://www.opentable.com/restaurant/profile/12526",
"external_menu_url": "http://www.takamisushi.com/dinnermenu.pdf",
"shows_third_party_menu": true,
"menu_count": 2,
"section_count": 35,
"item_count": 222,
"variation_count": 123,
"menus": [
{
"name": "Lunch",
"description": null,
"currency_code": "USD",
"sections": [
{
"name": "Hot Appetizer",
"description": null,
"items": [
{
"name": "Miso Soup",
"description": "White miso broth with tofu, green onion, and seaweed",
"price": "7.00",
"variations": []
},
{
"name": "Bluefin Tuna (Hon-Maguro)*",
"description": null,
"price": null,
"variations": [
{
"name": "2pcs",
"price": "11.00"
},
{
"name": "4pcs",
"price": "20.00"
}
]
}
]
}
]
}
]
}
{
"success": true,
"total": 250,
"restaurants": [
{
"id": 67720,
"name": "Perch LA",
"url": "https://www.opentable.com/perch",
"primary_cuisine": "French American",
"dining_style": "Casual Elegant",
"price_band": {
"id": 3,
"name": "$31 to $50",
"currency_symbol": "$"
},
"rating": 4.5,
"review_count": 12360,
"neighborhood": "Downtown",
"phone": "(213) 802-1770",
"has_private_dining": true
}
]
}
{
"success": true,
"total": 117,
"server_total": 178,
"restaurants": [
{
"id": 1331095,
"name": "Soy Cowboy",
"primary_cuisine": "Pan-Asian",
"price_band": {
"id": 3,
"name": "$31 to $50",
"currency_symbol": "$"
},
"rating": 4.6,
"neighborhood": "Arlington",
"is_instant_bookable": true,
"space_count": 4,
"private_dining": {
"contact": "The Sales Event Manager",
"phone": "(713) 804-3317",
"email": "events@example.com",
"largest_capacity": 200
}
}
]
}
{
"success": true,
"restaurant_id": 404046,
"total_count": 80,
"page": 1,
"page_size": 25,
"total_pages": 4,
"has_more": true,
"sort": "newest",
"reviews": [
{
"id": "OT-404046-3819-180028644728",
"text": "Enjoyed our meal very much.",
"ratings": {
"overall": 5,
"food": 5,
"service": 5,
"ambience": 5,
"value": 4,
"noise": "moderate"
},
"reviewer": {
"name": "Nancy",
"location": "Calgary",
"review_count": 11
},
"dined_at": "2026-07-02T18:30:00+02:00",
"verified": true
}
]
}
{
"success": true,
"available": true
}
{
"success": true,
"slots": [
"18:30",
"18:45",
"19:00",
"19:15",
"19:30"
]
}
Trusted by hospitality teams at
OpenTable has no public data API for the restaurant profiles, listings, guest reviews, reservation availability, and private dining venues that product and research teams actually need. Building it yourself means source-specific HTTP and GraphQL transport, proxy routing, and parsers that must keep pace with upstream changes.
StayAPI is that layer, run for you. Start with a full OpenTable restaurant URL and resolve its numeric ID, fetch its complete profile and structured menus with item prices, search by coordinates, get reviews, check one exact date and time, request nearby bookable slots, or ask for private dining contacts. No browser session or OpenTable availability token is exposed to callers.
x-api-key in, JSON out. URL-to-ID, restaurant details, structured menus, search, reviews, availability, nearby slots, and private dining behind one base URL.
Fetching, parsing, proxy rotation, and source uptime are ours. You consume normalized dining JSON and never handle OpenTable availability tokens.
Every call hits OpenTable live, so menu items, prices, cuisine, ratings, and private dining contacts are current to the request, not a stale nightly snapshot.
Each returns normalized JSON in the same shape. Click any endpoint for parameters, an example response, and a live playground.
The same endpoints, pointed at different jobs. These are the ones we see most.
Accept an OpenTable profile URL or power a dining search by location and date, then carry the stable restaurant ID into profile, menu, review, and availability calls.
Normalize lunch, dinner, drinks, and tasting menus into one nested shape while preserving string prices such as MKT and size or portion variations.
Surface venues that host private events near a place, ranked by largest space capacity, with the event contact name, phone, and email ready to reach out.
Benchmark restaurants on cuisine, pricing, amenities, rating, and review volume, then analyze newest, highest-rated, or lowest-rated guest feedback in a consistent schema.
Give an agent live restaurant details, menus, reviews, and availability so it can answer dining questions with current fields instead of stale embeddings.
The same endpoints are exposed as MCP tools. Connect Claude, Cursor, or Claude Code, ask in plain English, and the agent calls the tool and answers from live OpenTable data.
Flat monthly plans, every endpoint included on every plan. 1 request = 1 credit. No per-endpoint multipliers, no surprise overages.
Wire it up. See the schema.
Kick the tires in production.
Small prod workloads and growing apps.
Daily pulls in production.
Above 100k / month, annual terms, white-glove onboarding.
Every plan ships every endpoint. Same uptime, same schema, same response time.
Don't see your question? Email us at info@stayapi.com.
OpenTable runs partner and affiliate programs for restaurants and connectivity, but there is no open public API for pulling restaurant listings, cuisine, ratings, or private dining venues. StayAPI gives you that data over plain REST with a key you get in 30 seconds.
Call /v1/opentable/search with a latitude, longitude, date, and time. You get matching restaurants with cuisine, price band, rating, address, phone, photos, and feature flags as JSON. See the restaurant search endpoint docs.
Call /v1/opentable/restaurant/url-to-id with the full OpenTable /r/{slug} profile URL. StayAPI returns the numeric restaurant_id, name, country, macro area, and neighborhood without browser emulation. See the URL-to-ID endpoint docs.
Call /v1/opentable/restaurants/{restaurant_id} with the numeric ID from search or URL-to-ID. The normalized response includes cuisine, pricing, ratings, address, coordinates, contact details, hours, photos, policies, dining areas, and feature flags. See the restaurant details endpoint docs.
Yes. Resolve the public restaurant URL with /v1/opentable/restaurant/url-to-id, then pass the returned ID to /v1/opentable/restaurant/menu. The response keeps menus, sections, items, descriptions, currency codes, string prices, and variations nested as OpenTable publishes them. See the restaurant menu endpoint docs.
Yes. /v1/opentable/private-dining returns venues that host private events near your coordinates, each with the event contact name, phone, email, largest space capacity, and an instant book flag. Filter by min_capacity to match your party. See the private dining endpoint docs.
Yes. Call /v1/opentable/restaurant/reviews with a restaurant_id. Results default to newest first; use sort=highest or sort=lowest to order by rating. Each page contains up to 25 reviews. See the restaurant reviews endpoint docs.
Call /v1/opentable/restaurants/{restaurant_id}/availability with a reservation date, exact time, and party_size. The response is {"success":true,"available":true} or the same object with available set to false. To offer alternatives, use the nearby availability slots endpoint.
Yes. Connect the StayAPI MCP server and use the OpenTable tools for URL resolution, restaurant details, menus, reviews, availability, search, and private dining. The menu tool takes the same numeric restaurant ID as the REST endpoint. See the MCP setup and tool reference.
You get 50 free requests on signup, every endpoint included, no credit card. After that it is flat monthly plans starting at $49. One request equals one credit, with no per-endpoint multipliers.
Both end with live OpenTable data in your stack. The fast path is on the left.
50 free requests after sign up. Fastest way to see if the schema fits.
Start free15 minutes. Volume + endpoint mix. Walk out with a quote.
Book a demo