OpenTable Reviews Scraper
Pricing
$0.01 / 1,000 diner reviews
OpenTable Reviews Scraper
Collect public OpenTable diner reviews with full text, ratings, and restaurant details. Use restaurant links or discover venues by area, then export the feedback for review and research.
Pricing
$0.01 / 1,000 diner reviews
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
21 days ago
Last modified
Share
🍽️ Study OpenTable diner feedback in one dataset
Restaurant teams, researchers, and analysts can collect public OpenTable reviews with full text, ratings, and restaurant details. Save diner feedback as structured data to study complaints, compare dining experiences, and track review changes without copying each page by hand.
- Collect feedback from chosen venues with OpenTable Restaurant Reviews.
- Find reviews from venues in an area with OpenTable Reviews Scraper.
- Study negative dining feedback with OpenTable Reviews Complaints.
- Download feedback for your own reports with Export OpenTable Reviews.
- Find new or changed feedback across runs with OpenTable Review Monitoring.
📄 Full review text with dining context
Each saved row is one public diner review. It includes the review ID, full text, overall rating, and restaurant name. Other source details can include food, service, ambience, value, and noise ratings; dining and submission dates; public diner details; helpfulness votes; replies; photos; and tags.
Restaurant details can include cuisines, location, price category, images, review totals, and restaurant-wide ratings. Optional details may be missing when OpenTable does not provide them. Review text stays in its original language.
▶️ Choose restaurants and collect their reviews
- Choose how to find restaurants: URLs, slugs, keywords and area, coordinates, or listing page URLs.
- Fill in the fields for that choice. Other choice fields are ignored.
- Set shared filters and collection limits if needed.
- Start the run and open Diner reviews in the output to view or download the data.
The first eligible occurrence of a review is saved as it is found. Later matches for the same source review are skipped, even if it is found through another keyword or submitted URL. A saved row is not updated to add later matches.
For later runs, use the same monitoring tracking name to find new, edited, or reappearing reviews. To continue an interrupted collection, enter its Apify run ID; reviews already saved by that collection are skipped.
⚙️ Input
Choose one way to find restaurants. Shared filters apply to every choice.
| Field | Type | What it does |
|---|---|---|
findBy | string | Required. Choose urls, slugs, keywords, coordinates, or listings. |
restaurantUrls | array of objects | OpenTable restaurant profile URLs for urls. |
restaurantUrls[].url | string | One restaurant profile URL. |
restaurantSlugs | array of strings | Profile slugs for slugs, such as le-bernardin-new-york. |
keywords | array of strings | Dining keywords for keywords, such as sushi or brunch. |
area | string | City, neighborhood, or address for the keyword search. |
coordinates | array of objects | Latitude and longitude pairs for nearby discovery. |
coordinates[].latitude | number | Required in each pair. Decimal latitude from -90 to 90. |
coordinates[].longitude | number | Required in each pair. Decimal longitude from -180 to 180. |
listingUrls | array of objects | OpenTable metro, neighborhood, or search-page URLs for listings. |
listingUrls[].url | string | One listing page URL. |
sort | string | Review order within each restaurant: newest, highestRated, or lowestRated. Default: newest. |
minimumRatings | object | Minimum accepted ratings from 1 to 5. Leave each rating empty to allow any value. |
minimumRatings.overall | integer | Minimum overall rating. Reviews missing this rating do not match. |
minimumRatings.food | integer | Minimum food rating. Reviews missing this rating do not match. |
minimumRatings.service | integer | Minimum service rating. Reviews missing this rating do not match. |
minimumRatings.ambience | integer | Minimum ambience rating. Reviews missing this rating do not match. |
minimumRatings.value | integer | Minimum value rating. Reviews missing this rating do not match. |
diningDateFrom | string | Keep dining dates on or after this date, in YYYY-MM-DD form. |
diningDateTo | string | Keep dining dates on or before this date, in YYYY-MM-DD form. |
cuisines | array of strings | Keep restaurants in these cuisines. Empty allows all cuisines. |
neighborhoods | array of strings | Keep restaurants in these neighborhoods. Empty allows all neighborhoods. |
vipOnly | boolean | Keep only reviews from diners marked VIP by OpenTable. Default: false. |
photosOnly | boolean | Keep only reviews with diner photos. Default: false. |
maxItems | integer | Stop after this many matching reviews across all restaurants. Leave empty to return all available matches until the source is exhausted. |
maxReviewsPerRestaurant | integer | Stop after this many matching reviews per restaurant. Leave empty to return all available matches until the source is exhausted. |
maxRestaurants | integer | Limit matching restaurants found through keywords, coordinates, or listing pages. Leave empty to find all available matches until the source is exhausted. |
monitoring | object | Find new, edited, or reappearing reviews across runs. Leave empty for regular collection. |
monitoring.trackingName | string | Required when monitoring is used. Reuse this history name on later runs. Use a different name for a different restaurant set. |
monitoring.includeUnchanged | boolean | Also save reviews that have not changed since the last run. |
monitoring.trackDisappearances | boolean | Report previously seen reviews that are now missing. Confirm disappearance only after complete coverage of the tracked restaurants. |
continueRunId | string | Apify run ID of an interrupted collection to continue. Empty starts a new collection. |
All three collection limits accept positive integers and have no fixed upper bound. Other limits still apply when one limit is left empty.
Example input
This is the public input from the successful default-input run.
{"findBy": "urls","restaurantUrls": [{"url": "https://www.opentable.com/r/la-grande-boucherie-new-york"}],"sort": "newest","vipOnly": false,"photosOnly": false,"maxItems": 20}
🧾 Output
Open Diner reviews to view the default dataset. Each row has the same review shape. reviewId, text, overallRating, and restaurant are required; other details may be absent.
| Field | Type | What it does |
|---|---|---|
reviewId | string | Source review ID for linking review history. |
text | string | Full review text in its original language. |
overallRating | number | Diner's overall rating, from 1 to 5. |
ratings | object | Other ratings given by the diner. |
ratings.food | number | Diner's food rating. |
ratings.service | number | Diner's service rating. |
ratings.ambience | number | Diner's ambience rating. |
ratings.value | number | Diner's value rating. |
ratings.noise | string | Source noise rating or label. |
diningDate | string | Dining date shown by OpenTable. |
submittedAt | string | Review submission date or time shown by OpenTable. |
diner | object | Public diner details. |
diner.name | string | Public diner name. |
diner.location | string | Public diner location. |
diner.reviewCount | integer | Diner review total reported by OpenTable. |
diner.isVip | boolean | Whether OpenTable marks the diner VIP. |
diner.imageUrl | string | Diner profile image link. |
verificationType | string | Review verification type supplied by OpenTable. |
previousRestaurantConcept | string | Previous restaurant concept named by the source. |
helpfulness | object | Votes about whether the review was helpful. |
helpfulness.positive | integer | Positive helpfulness votes. |
helpfulness.negative | integer | Negative helpfulness votes. |
replies | array of objects | Public restaurant replies when available. |
replies[].text | string | Full reply text. |
replies[].date | string | Reply date or time shown by OpenTable. |
photoUrls | array of strings | Links to diner review photos. |
tags | array of strings | Review tags supplied by OpenTable. |
restaurant | object | Restaurant linked to the review. |
restaurant.id | string | Source restaurant ID. |
restaurant.name | string | Restaurant name. |
restaurant.url | string | Restaurant profile link. |
restaurant.cuisines | array of strings | Restaurant cuisines. |
restaurant.location | object | Restaurant location. |
restaurant.location.address | string | Street address. |
restaurant.location.city | string | City name. |
restaurant.location.neighborhood | string | Neighborhood name. |
restaurant.location.region | string | State or region. |
restaurant.location.country | string | Country name. |
restaurant.location.latitude | number | Latitude in decimal degrees. |
restaurant.location.longitude | number | Longitude in decimal degrees. |
restaurant.priceCategory | string | Restaurant price category. |
restaurant.currency | string | Source currency code or label. |
restaurant.imageUrl | string | Restaurant image link. |
restaurant.ratings | object | Restaurant-wide ratings reported by OpenTable. |
restaurant.ratings.food | number | Restaurant-wide food rating. |
restaurant.ratings.service | number | Restaurant-wide service rating. |
restaurant.ratings.ambience | number | Restaurant-wide ambience rating. |
restaurant.ratings.value | number | Restaurant-wide value rating. |
restaurant.ratings.overall | number | Restaurant-wide overall rating. |
restaurant.ratings.noise | string | Restaurant-wide noise rating or label. |
restaurant.reviewCount | integer | Restaurant-wide review total. |
restaurant.ratingDistribution | object | Restaurant-wide star totals. |
restaurant.ratingDistribution.oneStar | integer | Number of 1-star ratings. |
restaurant.ratingDistribution.twoStars | integer | Number of 2-star ratings. |
restaurant.ratingDistribution.threeStars | integer | Number of 3-star ratings. |
restaurant.ratingDistribution.fourStars | integer | Number of 4-star ratings. |
restaurant.ratingDistribution.fiveStars | integer | Number of 5-star ratings. |
Example review
This complete row comes from a successful run of the current beta build.
{"reviewId": "OT-267284-87-220064325612","text": "Great food and very friendly staff. Food was ready on time and perfectly served.","overallRating": 5,"restaurant": {"id": "267284","name": "Dosa House","url": "https://www.opentable.com/r/dosa-house-wollongong","cuisines": ["Indian"],"location": {"address": "49 Harbour St","city": "Wollongong","neighborhood": "Wollongong","region": "AU-NSW","country": "Australia","latitude": -34.4286045,"longitude": 150.9024568},"priceCategory": "$40 and under","currency": "$","imageUrl": "https://resizer.otstatic.com/v3/photos/78726502-3","ratings": {"food": 3.7,"service": 3,"ambience": 3.3,"value": 3.7,"overall": 3.7,"noise": "3"},"reviewCount": 3,"ratingDistribution": {"oneStar": 1,"twoStars": 0,"threeStars": 0,"fourStars": 0,"fiveStars": 2}},"ratings": {"food": 5,"service": 5,"ambience": 5,"value": 5,"noise": "ENERGETIC"},"diningDate": "2025-12-09T19:00:00+11:00","submittedAt": "2025-12-11T23:28:59Z","diner": {"name": "Kashif","location": "New South Wales","reviewCount": 1},"verificationType": "OPENTABLEVERIFIED","helpfulness": {"positive": 0,"negative": 0}}
💳 Pricing
The Diner review event charges for each public diner review collected and saved to your dataset. Work that saves no review does not trigger this event. See the Actor's pricing panel for the current price.
🔌 Integrations
Use Apify dataset exports to download reviews as JSON or CSV. You can also start runs and read datasets through the Apify API, or use Apify schedules for recurring collection.
Video guide
❓ FAQ
When is a missing review confirmed as disappeared?
Only after complete coverage of the tracked restaurants. Turn on monitoring.trackDisappearances and reuse the same tracking name. A run stopped by a limit may not give that complete coverage.
How do I collect reviews that have not changed?
Set monitoring.includeUnchanged to true. Use the same tracking name for the same restaurant set. Leave monitoring empty for a regular collection.
How do I continue an interrupted collection?
Set continueRunId to the interrupted Apify run ID. Reviews already saved by that collection are skipped.
Why are some details missing?
OpenTable may not expose every optional field. A review can still be saved when photos, replies, diner details, or extra restaurant details are unavailable.
Does review order apply across all restaurants?
No. sort chooses the order within each restaurant. It does not sort the full dataset across restaurants.
Can I collect all available matching reviews?
Leave maxItems and maxReviewsPerRestaurant empty to return all available matches until the source is exhausted. For discovery, also leave maxRestaurants empty to find all available matching restaurants until the source is exhausted. Coverage depends on what OpenTable publicly exposes.
How can I study OpenTable reviews complaints?
Choose lowestRated to read lower-rated reviews first, then use the review text in your own analysis. The Actor does not create sentiment scores or summaries. Minimum rating filters keep ratings at or above the chosen value; they are not maximum rating filters.
Can this leave a review on OpenTable without a reservation?
No. This Actor reads public reviews. It does not submit or edit reviews, book tables, or manage restaurant accounts.
Do I need an OpenTable login?
No buyer-supplied OpenTable login is required. Private and login-only content is outside this Actor's scope.
📝 Changelog
v0.0 (03-10-2026)
- Initial release.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Related Actors
- Yelp Business Review Scraper: Collect full-text Yelp reviews to study feedback from another restaurant review source.
- OpenTable + Resy Scraper: Collect restaurant profiles from both sources and check available Resy reservation context.
- Yelp Scraper: Review Reputation Monitor: Track Yelp feedback themes and changes for restaurant locations.
- NYC + Chicago Restaurant Inspections Scraper: Add public inspection outcomes and violations to restaurant research.
- Swiggy Dineout Restaurants Scraper: Compare public restaurant listings, cuisines, prices, and dining offers on Dineout.
Made with ❤️ by Maxime Dupré