OpenTable APIopentable.ca ↗
Search restaurants, check real-time table availability, and retrieve menus, reviews, and curated dining lists across Canadian metro areas via the OpenTable Canada API.
What is the OpenTable API?
The OpenTable Canada API exposes 5 endpoints covering restaurant search, real-time slot availability, detailed profiles, and curated metro-level dining lists. The search_restaurants endpoint accepts a free-text term alongside party size and date/time filters, returning paginated restaurant listings with cuisine, price band, neighborhood, coordinates, and photos. The get_restaurant_availability endpoint returns time-specific booking slots with seating type and experience details for one or more restaurant IDs simultaneously.
curl -X GET 'https://api.parse.bot/scraper/f956bcfe-cab2-4cec-a73e-37b56c6835cf/search_restaurants?term=Toronto&covers=2&date_time=2026-07-15T19%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, browse curated picks, get details."""
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=5):
print(restaurant.name, restaurant.primary_cuisine, restaurant.rating)
# Browse curated top restaurants for a city using the City enum
top = client.restaurants.top(city=City.TORONTO)
if top.module_lists:
for module in top.module_lists[:2]:
print(module.module_key, module.id)
# Fetch full restaurant details by slug
detail = client.restaurant_details.get(slug="general-public-toronto")
print(detail.name, detail.dining_style, detail.hours_of_operation)
# 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 / restaurants.top / 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
Search and Discovery
The search_restaurants endpoint accepts a required term parameter (city, neighborhood, cuisine type, or restaurant name) plus optional covers (party size) and date_time (ISO 8601 format) inputs. Each result object includes restaurantId, name, primaryCuisine, neighborhood, priceBand, statistics, coordinates, address, and photo URLs. The total field gives the count of all matching restaurants, though only the first page is returned per request.
The get_top_restaurants endpoint takes a city string and returns curated module_lists organized into named categories such as "top booked" or "premium marketplace", plus metro-level FAQ data and a best_restaurants_by_category array. The get_metro_areas endpoint requires no inputs and returns every supported Canadian metro with metroId, restaurantCount, sub-region (macros) details, and canonical URLs — useful for building location pickers.
Restaurant Profiles and Availability
The get_restaurant_details endpoint takes a slug (the path segment after /r/ in an OpenTable URL) and returns a restaurantProfile object containing description, dining style, operating hours, address, contact info, gallery photos, menu data, editorial list memberships, private dining info, and aggregated reviews. An availability object with the current state and an attribution token is included alongside restaurant-specific FAQs.
For real-time booking slots, get_restaurant_availability accepts a date (YYYY-MM-DD), time (HH:MM), optional party_size, and a comma-separated list of restaurant_ids. The response contains one entry per restaurant with restaurantAvailabilityToken, and availabilityDays listing individual time slots with offsets from the requested time, seating type, and experience metadata. Restaurant IDs can be obtained from search_restaurants results.
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 dining concierge app that queries
search_restaurantsby cuisine and neighborhood then shows open slots viaget_restaurant_availability. - Aggregate curated lists from
get_top_restaurantsto populate a "best of Toronto" or "best of Vancouver" editorial feature. - Display full restaurant profiles — menus, gallery photos, hours, and reviews — sourced from
get_restaurant_detailsin a travel itinerary tool. - Populate a city selector using
get_metro_areasto enumerate all supported Canadian metros and their restaurant counts. - Monitor real-time availability across multiple restaurant IDs to surface last-minute openings for a specific date and party size.
- Extract price band, cuisine, and neighborhood data from
search_restaurantsto build a filterable restaurant directory for a specific city. - Surface FAQ content and editorial metadata from
get_restaurant_detailsto enrich restaurant landing pages with structured dining context.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. 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 and how specific are the time slots?+
restaurantAvailabilityToken and availabilityDays. Within each day, individual slots include a time offset relative to your requested time, along with seating type and experience details. You can query multiple restaurants in one call by passing a comma-separated list of IDs in restaurant_ids.Does `search_restaurants` return all matching results or just the first page?+
total field in the response indicates how many restaurants matched the query overall. Pagination across additional pages is not currently exposed. You can fork this API on Parse and revise it to add offset or page-based pagination endpoints.Is reservation booking or cancellation supported?+
Are all Canadian cities covered, or only major metros?+
get_metro_areas, which lists each supported market with its metroId and restaurantCount. Smaller markets not represented in OpenTable Canada's listings will not appear in search or curated results.