OpenTable Scraper — Ratings, Reviews & Cuisine
Pricing
from $5.00 / 1,000 restaurant scrapeds
OpenTable Scraper — Ratings, Reviews & Cuisine
Scrape OpenTable restaurants by city, cuisine or name. Returns rating, review count, price band, address, phone, coordinates and top review.
Pricing
from $5.00 / 1,000 restaurant scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
What is OpenTable Scraper — Ratings, Reviews & Cuisine?
OpenTable Scraper extracts OpenTable restaurant search results into a dataset, one row per restaurant, from a city, cuisine, neighborhood or restaurant name. Each row returns the restaurant name, cuisine, dining style, price band, overall rating, review count, recent reservation count, full address, phone, coordinates, a highlighted top review, dining features such as outdoor seating and takeout, photos, description and the OpenTable profile URL. Restaurant-tech sales teams, hospitality market researchers, local-guide publishers and AI agents use it to map a city's dining scene with no OpenTable login.
Why teams use this OpenTable scraper
- Search the way diners do.
searchTermsacceptsMiami,Italian, Chicago,SoHo, New Yorkor a name such asCarbone. - Popularity signals.
overallRating,reviewCountandrecentReservationCountshow which restaurants are busy right now. - Price and style.
priceBand,priceRangeanddiningStylesegment casual spots from fine dining. - Map-ready rows.
latitude,longitude,addressLine1,city,stateandpostCodecome on every row. - Feature flags.
hasOutdoorSeating,hasBar,hasTakeoutandmaxPartySizeanswer practical diner questions. - Automatic paging. Results paginate until
maxRestaurantsper search term.
Best fit and related Actors
Best fit for restaurant discovery and market mapping on OpenTable: every Italian restaurant in Chicago, the top-rated spots in a neighborhood, or a contact list of restaurants that take online reservations. The Actor works from search and city listing pages and returns one profile-level record per restaurant.
- For full review threads with reviewer ratings and dates, use Tripadvisor Reviews Scraper on the same restaurants.
- When you want restaurants that are listed on Yelp as well, continue with Yelp Scraper All-in-One and match on name and address.
Example workflow: from a cuisine and city to a sales territory
A restaurant-software sales rep starts with searchTerms set to ["Italian, Chicago", "Steakhouse, Chicago"] and maxRestaurants set to 200. The dataset returns each restaurant's name, neighborhood, phone, priceBand, overallRating and recentReservationCount. They sort by recentReservationCount to find the busiest dining rooms, plot latitude and longitude to split the city into territories, and export each territory's list to the CRM. A monthly schedule with the same input shows which restaurants are gaining momentum.
How to scrape OpenTable
- Enter one or more Search terms, such as
MiamiorItalian, Chicago, or paste OpenTable search URLs in Start URLs. - Set Max restaurants (per term / URL), and optionally Party size, Reservation date and Reservation time.
- Click Start, then export the dataset as JSON, CSV or Excel, or read it through the API.
Input
{"searchTerms": ["Italian, Chicago", "Steakhouse, Austin"],"maxRestaurants": 200,"partySize": 2}
With a reservation context:
{"searchTerms": ["SoHo, New York"],"maxRestaurants": 50,"partySize": 4,"reservationDate": "2026-12-12","reservationTime": "19:30"}
| Field | Type | What it controls |
|---|---|---|
searchTerms | array | City, cuisine plus city, neighborhood or restaurant name, one per entry. |
startUrls | array | OpenTable search or listing URLs such as https://www.opentable.com/s/?term=miami. |
maxRestaurants | integer | Unique restaurants per search term or URL. Default 50. |
partySize | integer | Number of diners, from 1 to 20. Default 2. |
reservationDate | string | Optional YYYY-MM-DD date that shapes OpenTable's availability-aware ranking. |
reservationTime | string | Optional HH:mm time, used with a date. Default 19:00. |
proxyConfiguration | object | Apify Residential proxy in the US by default. |
Output
One dataset row per restaurant.
| Field | What it contains |
|---|---|
restaurantId, name, profileUrl | OpenTable ID, name and profile URL |
primaryCuisine, diningStyle | Cuisine and dining style |
priceBand, priceRange, currency | Price band text, numeric tier and currency symbol |
overallRating, reviewCount | Average rating and number of reviews |
recentReservationCount | Recent bookings count shown on OpenTable |
neighborhood, addressLine1, city, state, postCode | Location |
latitude, longitude | Coordinates |
phone | Restaurant phone |
topReview | Highlighted review snippet |
hasBar, hasOutdoorSeating, hasCounter, hasHighTop, hasTakeout | Dining features |
maxPartySize, inPremiumMarketplace | Largest bookable party and marketplace flag |
awards, offers | Awards and special offers when the restaurant lists them |
photoUrls, description | Photo links and the restaurant's own description |
searchTerm, resultPosition, scrapedAt | The search, rank within it, and collection time |
{"restaurantId": 1021789,"name": "Posto 31","profileUrl": "https://www.opentable.com/r/posto-31-la-grange-park","primaryCuisine": "Italian","diningStyle": "Casual Dining","priceBand": "$31 to $50","priceRange": 3,"currency": "$","overallRating": 4.8,"reviewCount": 1814,"recentReservationCount": 15,"neighborhood": "La Grange","addressLine1": "1017 E 31st St","city": "La Grange Park","state": "IL","postCode": "60526","latitude": 41.8347758,"longitude": -87.8630124,"phone": "7084697233","topReview": "It was a lovely evening to sit out at the patio. Our food was amazing. Our server was helpful and friendly.","hasBar": false,"hasOutdoorSeating": true,"hasCounter": false,"hasHighTop": false,"maxPartySize": 6,"hasTakeout": true,"inPremiumMarketplace": false,"awards": [],"offers": [],"photoUrls": ["https://resizer.otstatic.com/v4/photos/25754670-1?width=640&height=360"],"description": "Posto 31 strives for the harmony among quality-driven food, professional service, nuanced craft cocktails and the comfort of a neighborhood gathering place.","searchTerm": "Italian, Chicago","resultPosition": 1,"scrapedAt": "2026-10-01T12:39:54.996Z"}
Pricing
This Actor uses Pay per event plus Apify platform usage. You pay one Restaurant scraped event for each unique restaurant returned and one Actor Start event per run. Platform usage, including residential proxy traffic, is billed separately by Apify. maxRestaurants caps the events for each search term.
Worked example in words: two search terms capped at fifty restaurants each, with no overlap, cost one hundred Restaurant scraped events plus one Actor Start event, plus platform usage. Check the live Pricing tab on this page for current event prices.
API example
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~opentable-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["Miami"], "maxRestaurants": 100}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("khadinakbar/opentable-scraper").call(run_input={"searchTerms": ["San Francisco"],"maxRestaurants": 150,})for r in client.dataset(run["defaultDatasetId"]).iterate_items():print(r["name"], r["primaryCuisine"], r["overallRating"], r["neighborhood"])
Use with AI agents (MCP)
Connect the Actor to Claude, ChatGPT, Cursor or any MCP client through Apify MCP and ask:
Find the 30 highest-rated Italian restaurants in Chicago on OpenTable with outdoor seating. Return name, neighborhood, price band, rating, phone and profile link.
The agent sends Italian, Chicago in searchTerms, reads rows from the dataset, filters on hasOutdoorSeating, and sorts by overallRating. Each row keeps profileUrl, resultPosition and scrapedAt for citation, and maxRestaurants sets the cost scope up front.
Best results
| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| A whole metro | Search by city and raise maxRestaurants | A full dining-scene dataset |
| A specific cuisine | Use Cuisine, City, for example Sushi, Seattle | Focused, relevant rows |
| One known restaurant | Search its name and city, for example Carbone, New York | Its profile-level record |
| Markets outside the US | Search by the local city name and set the proxy country to match | Local OpenTable results |
| Date-specific planning | Add reservationDate and partySize | Ranking shaped by availability for that booking |
| Momentum tracking | Schedule monthly and compare recentReservationCount | Restaurants gaining or losing bookings |
Builder's note
I built this Actor on OpenTable's own embedded search data with plain HTTP, so runs stay light while each row carries more than a listing card shows, such as reservation counts and dining features. I designed the input around one search box because that is how people already look for restaurants: a city, a cuisine, a neighborhood or a name. I found that recentReservationCount is the most useful signal for sales and market work, so it sits next to rating and review count on every row.
FAQ
Can I get restaurant emails?
OpenTable lists phone numbers and addresses on these pages. Email addresses are outside what OpenTable publishes here.
Can I scrape one specific restaurant?
Yes. Put its name and city in searchTerms and it is returned as a record.
Do party size and date filter the results?
They shape OpenTable's availability-aware ranking and keep every restaurant in the results.
Which countries are covered?
Any OpenTable market. Search by the local city name and set the proxy country to match the region.
Responsible use
This Actor collects publicly available restaurant information from OpenTable search pages. Use the data in line with OpenTable's terms of service and applicable laws such as the GDPR and CCPA, and only for legitimate purposes. OpenTable is a trademark of its owner; this independent Actor is not affiliated with or endorsed by OpenTable.