OpenTable Restaurant Scraper avatar

OpenTable Restaurant Scraper

Pricing

from $3.00 / 1,000 dataset items

Go to Apify Store
OpenTable Restaurant Scraper

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

axly

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 areYou get
A lead-gen or sales agencyPhone 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 analystCuisine 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 developerA stable JSON schema with coordinates and OpenTable metro and neighborhood ids, ready to join against your own data.
A restaurant operatorYour competitive set's ratings, prices, promotions and how much availability they still have tonight.

What you get — output fields

FieldTypeDescription
restaurantIdstringOpenTable restaurant id
namestringRestaurant name
urlstringOpenTable profile URL
descriptionstringRestaurant's own description
phone / phoneFormattedstringPhone number, raw and as displayed
websitestringRestaurant's own website
address, crossStreet, city, state, postalCode, country, countryCodestringFull address
latitude / longitudenumberGPS coordinates
neighborhood, neighborhoodId, metroIdstringOpenTable area ids
cuisines / primaryCuisinearray / stringCuisine tags
priceBand / priceBandIdstringPrice band, e.g. $31 to $50
diningStyle, dressCode, executiveChefstringVenue profile
hoursstringOpening hours
parkingInfo, publicTransit, paymentOptions, accessibilitystring / arrayPractical details
rating, reviewCountnumber / integerOverall score and rating volume
ratingFood, ratingService, ratingAmbience, ratingValue, ratingNoisenumberSub-ratings
ratingDistributionobjectNumber of ratings per star value
recommendPercentintegerShare of diners who recommend it
reviewSummarystringOpenTable's summary of recent reviews
reservationsLastDayintegerReservations booked in the last 24 hours — a live demand signal
popularDishesarrayMost-reviewed dishes
offersarrayCurrent promotions and prix-fixe menus
photoUrl, photosCountstring / integerProfile photo and photo count
hasMenu, isTakeoutEnabledbooleanFeature flags
maxPartySize, maxAdvanceDaysintegerBooking limits
availableTimes, availableSlotCount, isAvailablearray / integer / booleanBookable reservation times
reviewsarrayDiner reviews: text, sub-ratings, dined and posted dates
searchLocation, scrapedAtstringProvenance

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

  1. 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.
  2. Benchmark a competitive set. Pull every Italian restaurant in the
    $31 to $50
    band in your neighborhood and compare ratings, sub-ratings and price.
  3. Track demand over time. Schedule a daily run and log reservationsLastDay and availableSlotCount to see which venues are filling up.
  4. Mine review sentiment. Set reviews per restaurant and feed the text plus sub-ratings into your own sentiment or topic model.
  5. Enrich a POI dataset. Join on coordinates or postal code to add cuisine, price band and ratings to your own venue database.

Input parameters

ParameterTypeDefaultDescription
locationstringCity, neighborhood or ZIP, e.g. Chicago, Soho, London, 94110
searchTermstringOptional keyword, e.g. sushi
maxItemsinteger50Maximum restaurants to return
includeDetailsbooleantrueFetch full profiles — required for phone, website and hours
reviewsPerRestaurantinteger0Reviews to attach per restaurant
reviewsSortByenumnewestReviewnewestReview, highestRating, lowestRating
includeAvailabilitybooleanfalseAttach bookable reservation times
fullDayAvailabilitybooleanfalseWhole service day instead of times near the reservation time
reservationDatestringtodayYYYY-MM-DD
reservationTimestring19:0024-hour HH:MM
partySizeinteger2Diners, used for the availability check
cuisinesarrayCuisine names, e.g. ["Italian", "Steakhouse"]
priceBandsarray2 ($30 and under), 3 ($31 to $50), 4 ($50 and over)
sortenumbestbest, distance, rating
latitude / longitudestringExact search centre; skips location lookup
proxyConfigurationobjectApify Proxy onLeave 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.SUCCEEDED so 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 ApifyClient
client = 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.