OpenTable Restaurant Scraper
Pricing
from $3.00 / 1,000 dataset items
OpenTable Restaurant Scraper
Scrape OpenTable restaurants by city, neighborhood or ZIP — including the phone numbers, websites and opening hours listing scrapers miss. Plus cuisines, price bands, GPS, full rating breakdowns, reviews and live reservation times as JSON. Pay only for the results you get.
Pricing
from $3.00 / 1,000 dataset items
Rating
0.0
(0)
Developer
axly
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Turn any city, neighborhood or ZIP code into a clean, structured list of OpenTable restaurants — with the phone numbers, websites and opening hours that listing scrapers leave out.
Give it a location, get back one row per restaurant: contact details, address and GPS, cuisines, price band, the full rating breakdown, current promotions, and optionally diner reviews and live reservation times. No browser and no login required.
Who it's for
| You are | You get |
|---|---|
| A lead-gen or sales agency | Phone number and website for every restaurant in a market — a lead list you can dial or import into a CRM the same day. |
| A hospitality or market analyst | Cuisine mix, price bands, sub-ratings (food/service/ambience/value/noise), review distributions and reservations booked in the last 24 hours, across a whole metro. |
| A PropTech / location-intelligence developer | A stable JSON schema with coordinates and OpenTable metro and neighborhood ids, ready to join against your own data. |
| A restaurant operator | Your competitive set's ratings, prices, promotions and how much availability they still have tonight. |
What you get — output fields
| Field | Type | Description |
|---|---|---|
restaurantId | string | OpenTable restaurant id |
name | string | Restaurant name |
url | string | OpenTable profile URL |
description | string | Restaurant's own description |
phone / phoneFormatted | string | Phone number, raw and as displayed |
website | string | Restaurant's own website |
address, crossStreet, city, state, postalCode, country, countryCode | string | Full address |
latitude / longitude | number | GPS coordinates |
neighborhood, neighborhoodId, metroId | string | OpenTable area ids |
cuisines / primaryCuisine | array / string | Cuisine tags |
priceBand / priceBandId | string | Price band, e.g. $31 to $50 |
diningStyle, dressCode, executiveChef | string | Venue profile |
hours | string | Opening hours |
parkingInfo, publicTransit, paymentOptions, accessibility | string / array | Practical details |
rating, reviewCount | number / integer | Overall score and rating volume |
ratingFood, ratingService, ratingAmbience, ratingValue, ratingNoise | number | Sub-ratings |
ratingDistribution | object | Number of ratings per star value |
recommendPercent | integer | Share of diners who recommend it |
reviewSummary | string | OpenTable's summary of recent reviews |
reservationsLastDay | integer | Reservations booked in the last 24 hours — a live demand signal |
popularDishes | array | Most-reviewed dishes |
offers | array | Current promotions and prix-fixe menus |
photoUrl, photosCount | string / integer | Profile photo and photo count |
hasMenu, isTakeoutEnabled | boolean | Feature flags |
maxPartySize, maxAdvanceDays | integer | Booking limits |
availableTimes, availableSlotCount, isAvailable | array / integer / boolean | Bookable reservation times |
reviews | array | Diner reviews: text, sub-ratings, dined and posted dates |
searchLocation, scrapedAt | string | Provenance |
Contact fields (phone, website, hours, dressCode, diningStyle,
executiveChef, parkingInfo, paymentOptions, accessibility,
popularDishes, offers) come from the full profile — keep Include full
profile enabled to receive them.
High-value use cases
- Build a restaurant lead list for a whole city. Search a metro, keep full profiles on, export to CSV — every row has a phone number and website ready for outreach.
- Benchmark a competitive set. Pull every Italian restaurant in the band in your neighborhood and compare ratings, sub-ratings and price.$31 to $50
- Track demand over time. Schedule a daily run and log
reservationsLastDayandavailableSlotCountto see which venues are filling up. - Mine review sentiment. Set reviews per restaurant and feed the text plus sub-ratings into your own sentiment or topic model.
- Enrich a POI dataset. Join on coordinates or postal code to add cuisine, price band and ratings to your own venue database.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
location | string | — | City, neighborhood or ZIP, e.g. Chicago, Soho, London, 94110 |
searchTerm | string | — | Optional keyword, e.g. sushi |
maxItems | integer | 50 | Maximum restaurants to return |
includeDetails | boolean | true | Fetch full profiles — required for phone, website and hours |
reviewsPerRestaurant | integer | 0 | Reviews to attach per restaurant |
reviewsSortBy | enum | newestReview | newestReview, highestRating, lowestRating |
includeAvailability | boolean | false | Attach bookable reservation times |
fullDayAvailability | boolean | false | Whole service day instead of times near the reservation time |
reservationDate | string | today | YYYY-MM-DD |
reservationTime | string | 19:00 | 24-hour HH:MM |
partySize | integer | 2 | Diners, used for the availability check |
cuisines | array | — | Cuisine names, e.g. ["Italian", "Steakhouse"] |
priceBands | array | — | 2 ($30 and under), 3 ($31 to $50), 4 ($50 and over) |
sort | enum | best | best, distance, rating |
latitude / longitude | string | — | Exact search centre; skips location lookup |
proxyConfiguration | object | Apify Proxy on | Leave enabled — see the FAQ |
Example input
{"location": "Chicago","searchTerm": "italian","maxItems": 100,"includeDetails": true,"priceBands": ["3", "4"],"sort": "rating","reviewsPerRestaurant": 5}
Example output
{"restaurantId": "1161631","name": "Rose Mary","url": "https://www.opentable.com/restaurant/profile/1161631","phone": "8722603921","phoneFormatted": "(872) 260-3921","website": "https://www.rosemarychicago.com/","address": "932 W Fulton Market","city": "Chicago","state": "IL","postalCode": "60607","country": "United States","latitude": 41.8865,"longitude": -87.6512,"neighborhood": "West Loop","cuisines": ["Italian", "Croatian", "Mediterranean"],"primaryCuisine": "Italian","priceBand": "$31 to $50","diningStyle": "Casual Elegant","dressCode": "Casual Dress","hours": "Daily 5:00 pm–10:00 pm","rating": 4.8,"reviewCount": 4131,"ratingFood": 4.8,"ratingService": 4.8,"ratingAmbience": 4.7,"reservationsLastDay": 61,"availableTimes": ["2026-09-12T18:45", "2026-09-12T19:00"],"isAvailable": true,"scrapedAt": "2026-09-02T12:00:00Z"}
Scheduling, webhooks and integrations
- Schedule a run daily or hourly from the Apify Console to build a time series of ratings, promotions and availability.
- Webhooks fire on
ACTOR.RUN.SUCCEEDEDso your system can pull the new dataset immediately. - Export to JSON, CSV, Excel, XML or RSS, or push straight into Google Sheets, Zapier, Make, Airbyte, S3 or your own API via the Apify API.
- Resume-safe: progress is checkpointed after every row, so an interrupted run continues where it stopped instead of re-charging you for duplicates.
Use it from an AI assistant (MCP)
This Actor can be called by Claude, ChatGPT or any MCP-compatible agent through the Apify MCP server, so an assistant can answer questions like "find the ten highest-rated Italian restaurants in Chicago with their phone numbers" by running it directly. You can also call it from code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("axlymxp/opentable-restaurant-scraper").call(run_input={"location": "Chicago", "maxItems": 25, "includeDetails": True})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["name"], row["phoneFormatted"], row["website"])
FAQ
Do I get phone numbers for every restaurant? Almost always, as long as Include full profile is on. A small number of venues do not publish a phone number or website on OpenTable; those fields come back empty rather than guessed.
How many restaurants can I get for one location?
As many as OpenTable lists there — typically several hundred per metro. Set
maxItems to the number you want; the Actor paginates automatically.
Does it work outside the US?
Yes. Locations, currencies and price bands are returned as OpenTable serves them
locally (for example £25 and under for London).
How fresh is the data? Every run is live. Ratings, promotions and availability reflect OpenTable at the moment the run executes.
Do I need a proxy?
Yes, and it is on by default — nothing to configure. OpenTable silently drops
requests for the full restaurant profile coming from datacenter IP ranges, so
turning the proxy off means empty phone, website and hours fields.
What happens if a single restaurant fails? It is logged and skipped — the run continues and still returns every other row.
Is this legal? The Actor collects publicly available information only. You are responsible for using the output in line with OpenTable's terms and applicable law, including data-protection rules where personal data (such as reviewer names in review text) is involved.
Something looks wrong — how fast do you respond? Open an issue on the Actor's Issues tab. Bug reports are typically answered within a day.