OpenTable API endpoint
Returns a restaurant's profile (location, cuisines, hours, price band, review summary) plus real-time bookable timeslots for the given date/time and party size.
/opentable/restaurantQuery parameters:
restaurant_id (required) — OpenTable restaurant id.date_time (optional) — reservation date/time, YYYY-MM-DDTHH:MM local format; defaults to now.party_size (optional, default 2).Response includes location fields (line1, line2, city, state, postal_code, country, latitude, longitude), description, dining_style, dress_code, hours, cuisines[], features[], price_band, reviews (aggregate rating summary), and timeslots[] (live bookable slots for the requested date/time and party size, each with date_time, available, type, points, price_amount, token).
| Field | Filled in, of 3 checked | Values in the sample |
|---|---|---|
| id | 3 | |
| name | 3 | “Argentinean” and 2 other values |
| primary | 3 | true in 1 of 3 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| restaurant_id | string | Yes | OpenTable restaurant id | 131459 | |
| date_time | string | No | now | Reservation date/time, RFC3339-minute local format; defaults to now | 2026-08-04T19:00 |
| party_size | integer | No | Party size, default 2 | 2 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/opentable/restaurant?restaurant_id=131459" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"id": "131459",
"name": "El Gaucho Argentinian Steakhouse - Hai Ba Trung",
"line1": "74/1-74/1A Hai Ba Trung",
"city": "Ho Chi Minh city",
"country": "Vietnam",
"dining_style": "Casual Dining",
"cuisines": [
{
"id": "029cd931-4a83-4572-b87a-2b0ce7abcb1e",
"name": "Steakhouse",
"primary": true
}
],
"price_band": {
"band": "3",
"label": "$31 to $50"
},
"reviews": {
"count": 13,
"overall_rating": 5,
"review_count": 17
},
"availability_date_time": "2026-08-04T19:00",
"timeslots": [
{
"date_time": "2026-08-04T19:00",
"available": true,
"type": "Standard",
"points": 100
}
]
}
}Request schema
No body schema
Response schema
#/definitions/opentable.restaurantResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | opentable.RestaurantResponse | No | ||||
| data.availability_date_time | string | No | AvailabilityDateTime echoes the DateTime the Timeslots below were computed for (either the caller's or the now-default GetRestaurant applies -- see its doc comment). | |||
| data.city | string | No | ||||
| data.country | string | No | ||||
| data.country_code | string | No | ||||
| data.cuisines | array | No | ||||
| data.cuisines[].id | string | No | ||||
| data.cuisines[].name | string | No | Steakhouse | |||
| data.cuisines[].primary | boolean | No | ||||
| data.currency_code | string | No | ||||
| data.description | string | No | ||||
| data.dining_style | string | No | ||||
| data.dress_code | string | No | ||||
| data.email | string | No | ||||
| data.features | array | No | ||||
| data.hours | string | No | ||||
| data.id | string | No | ||||
| data.latitude | number | No | ||||
| data.line1 | string | No | ||||
| data.line2 | string | No | ||||
| data.longitude | number | No | ||||
| data.max_advance_days | integer | No | ||||
| data.max_party_size | integer | No | ||||
| data.name | string | No | ||||
| data.phone_number | string | No | ||||
| data.photos_count | integer | No | ||||
| data.postal_code | string | No | ||||
| data.price_band | opentable.PriceBand | No | ||||
| data.price_band.band | string | No | 3 | |||
| data.price_band.label | string | No | $31 to $50 | |||
| data.reviews | opentable.ReviewSummary | No | ||||
| data.reviews.ambience | number | No | ||||
| data.reviews.count | integer | No | ||||
| data.reviews.food | number | No | ||||
| data.reviews.noise | number | No | ||||
| data.reviews.overall_rating | number | No | 4.8 | |||
| data.reviews.review_count | integer | No | ||||
| data.reviews.service | number | No | ||||
| data.reviews.value | number | No | ||||
| data.state | string | No | ||||
| data.timeslots | array | No | ||||
| data.timeslots[].available | boolean | No | ||||
| data.timeslots[].date_time | string | No | 2026-08-03T19:00 | |||
| data.timeslots[].points | integer | No | ||||
| data.timeslots[].price_amount | integer | No | ||||
| data.timeslots[].redemption_tier | string | No | ||||
| data.timeslots[].token | string | No | Token is the upstream booking token for this slot. It is opaque and only meaningful back to OpenTable's own booking flow -- this service does not implement booking, only discovery. | |||
| data.timeslots[].type | string | No | Standard | |||
| data.website | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/opentable/restaurant?restaurant_id=131459" \
-H "x-api-key: $CRAWLORA_API_KEY"