Vercel APIevals-opendining.vercel.app ↗
Access OpenDining restaurant listings, full menus with plant-based labelling, and reservation form fields via 3 structured JSON endpoints.
What is the Vercel API?
The OpenDining API exposes 3 endpoints covering restaurant listings, detailed menus, and reservation form structure from the OpenDining platform. list_restaurants returns all 20 listed restaurants in a single call — each with a detail URL, booking URL, location, cuisine, price range, and menu data. Endpoints return structured JSON including per-dish plant-based labelling and per-restaurant review scores across Overall, Food, Service, and Ambience dimensions.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/676f5edc-f9b4-4c65-8ad9-974c0afd6671/list_restaurants' \ -H 'X-API-Key: $PARSE_API_KEY'
Returns every restaurant on the OpenDining home listing in one call (no pagination; the site lists a fixed set, 20 at build time) with its detail page URL, booking page URL (booking_url, the site's reservation page for that restaurant), location, cuisine, price range, review count and full menu grouped by section. The site publishes no dietary attribute, so vegetarian_labeled_count is a grounded text count: the number of menu items whose name or description explicitly says vegan, vegetarian, veggie or plant-based; each menu item carries the same flag as vegetarian_labeled. Items that are plausibly vegetarian but not labelled (e.g. a salad) are not counted. One round trip.
No input parameters required.
{
"type": "object",
"fields": {
"total": "number of restaurants returned",
"restaurants": "array of restaurant summaries, each with restaurant_id, detail_url, booking_url (that restaurant's reservation page), menu (array of {section, items[]}), menu_item_count and vegetarian_labeled_count"
},
"sample": {
"data": {
"total": 20,
"restaurants": [
{
"menu": [
{
"items": [
{
"name": "Truffle Soup",
"price": 15,
"description": "black truffle, cream",
"vegetarian_labeled": false
}
],
"section": "starters"
}
],
"name": "The Royal Dine",
"location": "Mission District",
"food_type": "French",
"image_url": "https://evals-opendining.vercel.app/images/restaurants/royal.jpg",
"adjectives": [
"luxurious",
"romantic",
"elegant"
],
"detail_url": "https://evals-opendining.vercel.app/r/e83c1c2b-9f5b-4a7c-bd54-b165a86a0f3d",
"booking_url": "https://evals-opendining.vercel.app/booking?index=e83c1c2b-9f5b-4a7c-bd54-b165a86a0f3d",
"description": "An upscale dining establishment offering a lavish experience with gourmet cuisine and a majestic ambiance.",
"price_range": "$$25 to $50",
"review_count": 20,
"restaurant_id": "e83c1c2b-9f5b-4a7c-bd54-b165a86a0f3d",
"menu_item_count": 9,
"vegetarian_labeled_count": 0
}
]
},
"status": "success"
}
}About the Vercel API
Restaurant Listings and Menu Data
list_restaurants returns all restaurants available on the OpenDining home listing in one call with no pagination. Each record includes restaurant_id, detail_url, booking_url, location, cuisine type, price range, review count, and a full menu array. The menu is structured by section/course, with each dish exposing name, price, description, and a vegetarian_labeled boolean flag. list_restaurants is the right starting point for building a browsable index or filtering by cuisine and price range.
Individual Restaurant Detail
get_restaurant accepts a restaurant_id (a UUID sourced from list_restaurants) and returns the complete detail record for that restaurant. Beyond the summary fields, the response adds reviews (an array of per-review score records covering Overall, Food, Service, and Ambience), interior_images (absolute image URLs), menu_item_count, and vegetarian_labeled_count — an integer count of menu items whose text explicitly mentions vegan, vegetarian, veggie, or plant-based. This makes it straightforward to compare plant-friendly options across restaurants without scanning item descriptions manually.
Reservation Form Structure
get_booking_form returns the structure of OpenDining's site-wide reservation form — the same fields appear on every restaurant's booking page. The response includes diner_fields (phone, email, occasion, special_request — each with a required flag and, for phone, a default_count value), reservation_options (party size labels, half-hour time slot labels, and occasion options), submit_label, terms_text, and payment_required (always false — the booking page collects no payment or deposit). This endpoint is useful for building front-end booking flows or validating form completeness against the live site's requirements.
The Vercel API is a managed, monitored endpoint for evals-opendining.vercel.app — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when evals-opendining.vercel.app 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 evals-opendining.vercel.app 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 discovery interface filtered by cuisine, price range, and plant-based menu item count.
- Generate a plant-friendly dining guide by querying
vegetarian_labeled_countandvegetarian_labeleditem flags across all restaurants. - Aggregate and display per-restaurant review scores (Overall, Food, Service, Ambience) for side-by-side comparison.
- Replicate or embed OpenDining's reservation form fields in a third-party booking UI using
get_booking_formfield definitions. - Build a menu browser that groups dishes by section and highlights price ranges across multiple restaurants.
- Display restaurant interior images alongside menu data by combining
interior_imagesfromget_restaurantwith dish listings. - Validate a custom booking form against the live site's required fields and occasion options using
diner_fieldsandreservation_options.
| 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 OpenDining have an official developer API?+
What does `get_restaurant` return that `list_restaurants` does not?+
get_restaurant adds several fields not present in the listing response: reviews (an array of score records for Overall, Food, Service, and Ambience), interior_images (absolute URLs of restaurant photos), menu_item_count, and vegetarian_labeled_count. The menu structure and booking/detail URLs are the same in both endpoints.Does the API cover real-time reservation availability or confirmed booking submission?+
How many restaurants does the API cover, and can I paginate for more?+
list_restaurants returns the fixed set of restaurants on the OpenDining listing — 20 at build time — in a single call. There is no pagination parameter because the source lists a fixed number of restaurants. If the site adds more restaurants, the API will reflect that count on the next data refresh.Does the API expose user review text or only numerical scores?+
get_restaurant returns per-review score records (Overall, Food, Service, Ambience) without free-text review content. The API covers structured numeric scores. You can fork it on Parse and revise to add review text extraction if that field becomes available.