OpenTable Reviews Scraper avatar

OpenTable Reviews Scraper

Pricing

$0.01 / 1,000 diner reviews

Go to Apify Store
OpenTable Reviews Scraper

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é

Maxime Dupré

Maintained by Community

Actor 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.

📄 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

  1. Choose how to find restaurants: URLs, slugs, keywords and area, coordinates, or listing page URLs.
  2. Fill in the fields for that choice. Other choice fields are ignored.
  3. Set shared filters and collection limits if needed.
  4. 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.

FieldTypeWhat it does
findBystringRequired. Choose urls, slugs, keywords, coordinates, or listings.
restaurantUrlsarray of objectsOpenTable restaurant profile URLs for urls.
restaurantUrls[].urlstringOne restaurant profile URL.
restaurantSlugsarray of stringsProfile slugs for slugs, such as le-bernardin-new-york.
keywordsarray of stringsDining keywords for keywords, such as sushi or brunch.
areastringCity, neighborhood, or address for the keyword search.
coordinatesarray of objectsLatitude and longitude pairs for nearby discovery.
coordinates[].latitudenumberRequired in each pair. Decimal latitude from -90 to 90.
coordinates[].longitudenumberRequired in each pair. Decimal longitude from -180 to 180.
listingUrlsarray of objectsOpenTable metro, neighborhood, or search-page URLs for listings.
listingUrls[].urlstringOne listing page URL.
sortstringReview order within each restaurant: newest, highestRated, or lowestRated. Default: newest.
minimumRatingsobjectMinimum accepted ratings from 1 to 5. Leave each rating empty to allow any value.
minimumRatings.overallintegerMinimum overall rating. Reviews missing this rating do not match.
minimumRatings.foodintegerMinimum food rating. Reviews missing this rating do not match.
minimumRatings.serviceintegerMinimum service rating. Reviews missing this rating do not match.
minimumRatings.ambienceintegerMinimum ambience rating. Reviews missing this rating do not match.
minimumRatings.valueintegerMinimum value rating. Reviews missing this rating do not match.
diningDateFromstringKeep dining dates on or after this date, in YYYY-MM-DD form.
diningDateTostringKeep dining dates on or before this date, in YYYY-MM-DD form.
cuisinesarray of stringsKeep restaurants in these cuisines. Empty allows all cuisines.
neighborhoodsarray of stringsKeep restaurants in these neighborhoods. Empty allows all neighborhoods.
vipOnlybooleanKeep only reviews from diners marked VIP by OpenTable. Default: false.
photosOnlybooleanKeep only reviews with diner photos. Default: false.
maxItemsintegerStop after this many matching reviews across all restaurants. Leave empty to return all available matches until the source is exhausted.
maxReviewsPerRestaurantintegerStop after this many matching reviews per restaurant. Leave empty to return all available matches until the source is exhausted.
maxRestaurantsintegerLimit matching restaurants found through keywords, coordinates, or listing pages. Leave empty to find all available matches until the source is exhausted.
monitoringobjectFind new, edited, or reappearing reviews across runs. Leave empty for regular collection.
monitoring.trackingNamestringRequired when monitoring is used. Reuse this history name on later runs. Use a different name for a different restaurant set.
monitoring.includeUnchangedbooleanAlso save reviews that have not changed since the last run.
monitoring.trackDisappearancesbooleanReport previously seen reviews that are now missing. Confirm disappearance only after complete coverage of the tracked restaurants.
continueRunIdstringApify 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.

FieldTypeWhat it does
reviewIdstringSource review ID for linking review history.
textstringFull review text in its original language.
overallRatingnumberDiner's overall rating, from 1 to 5.
ratingsobjectOther ratings given by the diner.
ratings.foodnumberDiner's food rating.
ratings.servicenumberDiner's service rating.
ratings.ambiencenumberDiner's ambience rating.
ratings.valuenumberDiner's value rating.
ratings.noisestringSource noise rating or label.
diningDatestringDining date shown by OpenTable.
submittedAtstringReview submission date or time shown by OpenTable.
dinerobjectPublic diner details.
diner.namestringPublic diner name.
diner.locationstringPublic diner location.
diner.reviewCountintegerDiner review total reported by OpenTable.
diner.isVipbooleanWhether OpenTable marks the diner VIP.
diner.imageUrlstringDiner profile image link.
verificationTypestringReview verification type supplied by OpenTable.
previousRestaurantConceptstringPrevious restaurant concept named by the source.
helpfulnessobjectVotes about whether the review was helpful.
helpfulness.positiveintegerPositive helpfulness votes.
helpfulness.negativeintegerNegative helpfulness votes.
repliesarray of objectsPublic restaurant replies when available.
replies[].textstringFull reply text.
replies[].datestringReply date or time shown by OpenTable.
photoUrlsarray of stringsLinks to diner review photos.
tagsarray of stringsReview tags supplied by OpenTable.
restaurantobjectRestaurant linked to the review.
restaurant.idstringSource restaurant ID.
restaurant.namestringRestaurant name.
restaurant.urlstringRestaurant profile link.
restaurant.cuisinesarray of stringsRestaurant cuisines.
restaurant.locationobjectRestaurant location.
restaurant.location.addressstringStreet address.
restaurant.location.citystringCity name.
restaurant.location.neighborhoodstringNeighborhood name.
restaurant.location.regionstringState or region.
restaurant.location.countrystringCountry name.
restaurant.location.latitudenumberLatitude in decimal degrees.
restaurant.location.longitudenumberLongitude in decimal degrees.
restaurant.priceCategorystringRestaurant price category.
restaurant.currencystringSource currency code or label.
restaurant.imageUrlstringRestaurant image link.
restaurant.ratingsobjectRestaurant-wide ratings reported by OpenTable.
restaurant.ratings.foodnumberRestaurant-wide food rating.
restaurant.ratings.servicenumberRestaurant-wide service rating.
restaurant.ratings.ambiencenumberRestaurant-wide ambience rating.
restaurant.ratings.valuenumberRestaurant-wide value rating.
restaurant.ratings.overallnumberRestaurant-wide overall rating.
restaurant.ratings.noisestringRestaurant-wide noise rating or label.
restaurant.reviewCountintegerRestaurant-wide review total.
restaurant.ratingDistributionobjectRestaurant-wide star totals.
restaurant.ratingDistribution.oneStarintegerNumber of 1-star ratings.
restaurant.ratingDistribution.twoStarsintegerNumber of 2-star ratings.
restaurant.ratingDistribution.threeStarsintegerNumber of 3-star ratings.
restaurant.ratingDistribution.fourStarsintegerNumber of 4-star ratings.
restaurant.ratingDistribution.fiveStarsintegerNumber 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 🫡

Made with ❤️ by Maxime Dupré