OpenTable APIopentable.ca ↗
Search Canadian restaurants, check real-time table availability, and retrieve menus, reviews, and curated dining lists via the OpenTable Canada API.
What is the OpenTable API?
This API exposes 6 endpoints covering OpenTable Canada's restaurant data, from full-text search to real-time slot availability. Use search_restaurants to query by city, cuisine, party size, and date, receiving back restaurant IDs, coordinates, price bands, and ratings. Other endpoints cover curated metro-level lists, per-restaurant profiles with menus and gallery photos, live booking slots, and today's booking counts.
curl -X GET 'https://api.parse.bot/scraper/f956bcfe-cab2-4cec-a73e-37b56c6835cf/search_restaurants?term=Toronto&covers=2&date_time=2026-08-29T19%3A00%3A00' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace opentable-ca-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: OpenTable SDK — search restaurants, get booking counts, browse metros."""
from parse_apis.OpenTable_Scraper_API import OpenTable, City, RestaurantNotFound
client = OpenTable()
# Search for restaurants in Toronto — limit caps total items fetched
for restaurant in client.restaurants.search(term="Italian Toronto", limit=3):
print(restaurant.name, restaurant.restaurant_id, restaurant.primary_cuisine)
# Get the "Booked N times today" stat for a restaurant by slug
booking = client.booking_counts.get(slug="general-public-toronto")
print(booking.name, booking.booked_today, booking.booked_today_text)
# Can also look up by restaurant_id from search results
first = client.restaurants.search(term="Toronto", limit=1).first()
if first:
count = client.booking_counts.get(restaurant_id=first.restaurant_id)
print(count.name, count.slug, count.booked_today)
# List available metro areas
for metro in client.metro_areas.list(limit=3):
print(metro.name, metro.top_location_link)
# Typed error handling — catch when a slug doesn't exist
try:
client.restaurant_details.get(slug="nonexistent-restaurant-xyz-999")
except RestaurantNotFound as exc:
print(f"Not found: {exc.slug}")
print("exercised: restaurants.search / booking_counts.get / metro_areas.list / restaurant_details.get")
Full-text search for restaurants by location, keyword, date, and party size. Returns restaurant listings with name, cuisine, rating, price band, neighborhood, address, coordinates, and photos. Results are server-paginated but this endpoint returns the first page. Each restaurant carries a restaurantId usable for availability lookups and a slug (from the profile URL) for detail fetches.
| Param | Type | Description |
|---|---|---|
| termrequired | string | Search term — a city name, neighborhood, cuisine, or restaurant name. |
| covers | integer | Number of people in the party. |
| date_time | string | Preferred date and time in ISO format (e.g., 2026-06-20T19:00:00). Omitting returns results for the current time. |
{
"type": "object",
"fields": {
"meta": "object with page metadata",
"term": "string echoing the search term",
"total": "integer total count of matching restaurants or null",
"restaurants": "array of restaurant objects with restaurantId, name, primaryCuisine, neighborhood, statistics, priceBand, coordinates, address, photos, diningStyle, description"
}
}About the OpenTable API
Restaurant Search and Discovery
The search_restaurants endpoint accepts a required term (city, neighborhood, cuisine, or restaurant name) alongside optional covers and date_time parameters. It returns an array of restaurant objects containing restaurantId, name, primaryCuisine, neighborhood, priceBand, coordinates, address, and statistics. The total field gives the overall match count. The restaurantId values returned here are the keys you need for availability lookups.
Restaurant Details and Metro Listings
get_restaurant_details takes a slug — the URL path segment after /r/ — and returns the full restaurant profile: description, dining style, operating hours, menus, gallery photos, editorial list memberships, private dining info, and a bundled availability state object. get_top_restaurants takes a city name and returns module_lists organized by category (top booked, premium marketplace, mealtime), along with metro-level FAQ data. get_metro_areas requires no parameters and returns the full list of supported Canadian metro areas with their topLocationLink and landmarkLinks, useful for seeding calls to get_top_restaurants.
Real-Time Availability and Booking Signals
get_restaurant_availability is the core booking-readiness endpoint. It requires date (YYYY-MM-DD), time (HH:MM), and a comma-separated restaurant_ids string. The response contains per-restaurant availabilityDays arrays with individual time slots, restaurantAvailabilityToken values, seating types, and experience information. get_booking_count accepts a slug, restaurant_id, or restaurant name and returns booked_today (integer) and booked_today_text (the raw label string), giving a demand signal without requiring a full availability call.
The OpenTable API is a managed, monitored endpoint for opentable.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when opentable.ca changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official opentable.ca API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a restaurant-finder app that filters by cuisine, party size, and date using
search_restaurantsresults includingpriceBandandneighborhood. - Display live table availability across multiple Toronto or Vancouver restaurants by batching IDs into
get_restaurant_availability. - Aggregate curated dining lists per Canadian city using
get_top_restaurantsmodule categories like top booked and premium marketplace. - Power a restaurant profile page with menus, gallery photos, and hours pulled from
get_restaurant_details. - Track demand signals for specific restaurants by polling
get_booking_countand recordingbooked_todayover time. - Seed a metro-aware search UI by first calling
get_metro_areasto enumerate supported Canadian regions, then querying top restaurants per metro. - Compare price bands and ratings across neighborhood restaurants using
statisticsandpriceBandfields fromsearch_restaurants.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does OpenTable have an official developer API?+
What does `get_restaurant_availability` return for each time slot?+
availabilityDays array. Each day entry contains time slots with offset values relative to the requested time, a restaurantAvailabilityToken for use in booking flows, seating type identifiers, and associated experience information. Party size affects which slots are returned.Does `search_restaurants` return results beyond the first page?+
total count and page metadata in the meta object. Subsequent pages are not currently exposed through this endpoint. You can fork the API on Parse and revise it to add an offset or page parameter to retrieve deeper result sets.Is waitlist or reservation completion data available?+
How do I find a restaurant's slug for use with `get_restaurant_details`?+
search_restaurants. They correspond to the path segment after /r/ in any OpenTable Canada restaurant URL — for example, general-public-toronto. You can also pass a slug directly to get_booking_count instead of a numeric ID.