Tony Wang4 min readHow to Scrape OpenTable Restaurant & Reservation Data in 2026 (API & Python)
Scrape OpenTable restaurant search, profiles, menus, reviews, and live timeslots in 2026 — DIY, no-code, or a structured API — with the legal basics.
The fastest way to scrape OpenTable restaurant and reservation data in 2026 is to call a structured API that returns normalized JSON — restaurant profiles, menus, diner reviews, and live bookable timeslots — instead of reverse-engineering OpenTable's internal booking flow. This guide covers all three approaches, what each returns, where each breaks, and the legal basics.
Why scrape OpenTable?
OpenTable centralizes restaurant discovery, menus, reviews, and live availability, which makes it useful for:
- Reservation availability monitoring — track when a hard-to-book restaurant opens up a table.
- Restaurant & hospitality market research — cuisine, price band, and location coverage across a metro.
- Review & sentiment analysis — per-category diner ratings (food, service, ambience, value, noise).
- Menu & pricing benchmarking — compare dishes and prices across restaurants.
Is it legal to scrape OpenTable?
Option 1: DIY in Python (and why it breaks)
OpenTable's restaurant pages and live availability widget are backed by an internal booking API, so a DIY scraper is really reverse-engineering that flow:
import requests
# OpenTable's live-availability widget calls an internal booking API,
# not a documented public endpoint
resp = requests.get("https://www.opentable.com/s?term=dinner&latitude=37.7749&longitude=-122.4194")
It demos and then breaks:
- No official public API. OpenTable doesn't publish a developer API for third-party search or availability access, so there's no documented endpoint or key — you're replicating the consumer site's and app's private calls.
- Real-time availability is the hard part. Timeslots change as tables get booked and released, so a scraped snapshot is stale within minutes — you need to re-poll on a tight schedule, which is exactly the load pattern anti-bot systems flag.
- Anti-bot defenses. Repeated automated requests to the search and availability endpoints draw rate limits and blocks, requiring realistic headers, proxies, and constant upkeep.
- Drifting internal schema. The private booking API's response shape changes without notice and breaks replicated queries.
Option 2: No-code tools
Marketplace "OpenTable scraper" actors export CSV/JSON and suit one-off pulls, but they're awkward in an in-product pipeline — especially for anything tracking live availability — and inherit the same internal-API fragility.
Option 3: A structured OpenTable API
For repeatable workflows, a OpenTable scraping API returns normalized JSON with no internal booking flow to maintain. Search by term, location, date/time, and party size — with live availability inline:
curl "https://api.crawlora.net/api/v1/opentable/search?term=dinner&latitude=37.7749&longitude=-122.4194&party_size=2" \
-H "x-api-key: $CRAWLORA_API_KEY"
Then resolve a restaurant id and pull its profile, menu, and reviews in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/opentable"
results = requests.get(f"{base}/search", headers=h,
params={"term": "dinner", "latitude": 37.7749, "longitude": -122.4194}).json()["data"]["results"]
rid = results[0]["id"]
restaurant = requests.get(f"{base}/restaurant", headers=h,
params={"restaurant_id": rid, "party_size": 2}).json()["data"]
menus = requests.get(f"{base}/restaurant/menus", headers=h,
params={"restaurant_id": rid}).json()["data"]["menus"]
reviews = requests.get(f"{base}/restaurant/reviews", headers=h,
params={"restaurant_id": rid, "page": 1}).json()["data"]["reviews"]
A restaurant profile response is normalized JSON you can store directly (real fields):
{
"code": 200,
"msg": "OK",
"data": {
"id": "131459",
"name": "El Gaucho Argentinian Steakhouse - Hai Ba Trung",
"city": "Ho Chi Minh city",
"dining_style": "Casual Dining",
"cuisines": [{ "id": "029cd931-...", "name": "Steak" }],
"timeslots": [{ "date_time": "2026-08-04T19:00", "available": true, "price_amount": null, "token": "..." }]
}
}
Reviews come back with per-category ratings, not just an overall score:
{ "id": "OT-131459-908-...", "reservation_date": "2026-05-29T13:45", "author": "kim", "text": "Australian beef, top notch.", "recommended": true, "statistics": { "overall_rating": 5.0, "food": 5.0, "service": 5.0, "ambience": 5.0, "value": 4.0, "noise": 3.0 } }
Store one row per restaurant (or per timeslot check, for availability monitoring) and re-poll on a schedule that matches how fast availability actually changes.
What you can collect
Public fields: restaurant search results with inline live availability (id, name, location, cuisines, timeslots); restaurant profile (location, hours, price band, dining style, dress code, features, review summary); real-time bookable timeslots (date/time, availability, party-size-scoped price); menus (sections, items, prices); and diner reviews with per-category ratings (overall, food, service, ambience, value, noise).
Limitations and common challenges
- No official developer API. Third-party search and availability access means scraping OpenTable's internal booking flow, which a structured API handles behind one key.
- Availability is a moving target. Timeslots reflect a point in time — for monitoring "does a table open up," poll on a schedule rather than trusting a single pull.
- Reviews are personal data. Author names, review text, and metro location are personal under GDPR/CCPA — collect public, factual fields with a lawful basis.
- Anti-bot on repeated polling. Frequent automated requests to the same restaurant draw rate limits — a structured API absorbs this behind the key.
Where this gets used
- Reservation availability monitoring — alert when a fully-booked restaurant has a cancellation. See the travel & hospitality research use case.
- Restaurant market research — cuisine density, price bands, and coverage across a metro.
- Review & reputation monitoring — per-category diner sentiment over time. See the review & reputation monitoring use case.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search endpoint in the Playground, check the schema in the API docs, and review pricing. See also how to scrape Yelp for local business ratings, how to scrape TripAdvisor for travel and venue reviews, mobile app APIs explained for how this data actually flows, and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does OpenTable have an official API?
No public developer API for third-party search or availability access. Collecting OpenTable's restaurant, menu, review, and timeslot data means scraping — which a structured API handles behind one key, returning normalized JSON with no internal booking flow to maintain.
How fresh is the availability data?
Timeslots reflect a point in time and change as tables get booked and released. For monitoring use cases ("alert when a table opens up"), poll on a schedule that matches how fast availability actually changes rather than trusting a single snapshot.
How do I address an OpenTable restaurant?
Restaurants are addressed by a numeric OpenTable id, returned by the search endpoint alongside the same location and live-availability fields as the restaurant-detail endpoint.
What OpenTable data can I collect?
Public fields: restaurant search with inline live availability; restaurant profile (location, hours, price band, dining style, features, review summary); real-time bookable timeslots; menus (sections, items, prices); and diner reviews with per-category ratings (food, service, ambience, value, noise).
Are OpenTable reviews personal data?
Yes. Author names, review text, and metro location are personal data under GDPR/CCPA — collect only public, factual fields with a lawful basis and don't republish reviewer identities.
How often can I refresh?
Re-poll on a schedule within your plan and responsible-use limits — tighter for live-availability monitoring, lighter for review/sentiment tracking.