OpenTable Restaurants, Ratings & Reviews Scraper avatar

OpenTable Restaurants, Ratings & Reviews Scraper

Pricing

from $5.00 / 1,000 restaurant scrapeds

Go to Apify Store
OpenTable Restaurants, Ratings & Reviews Scraper

OpenTable Restaurants, Ratings & Reviews Scraper

Scrape OpenTable restaurants in any city. Export profiles, ratings, reviews, cuisines, prices, hours, and coordinates as structured JSON. MCP-ready.

Pricing

from $5.00 / 1,000 restaurant scrapeds

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Scrape OpenTable restaurants in any city. Export profiles, ratings, reviews, menus, cuisine, price, hours, and coordinates as structured JSON, CSV, or Excel. MCP-ready for AI agents.

Features

  • Search by city, cuisine, neighborhood, or restaurant name — paginate through all OpenTable search results
  • Scrape by direct URL — paste any OpenTable restaurant profile URL
  • Full restaurant profiles — name, description, overall rating, review counts, cuisines, price tier, address, coordinates, neighborhood, metro, phone, website, hours, dining style, dress code, parking, executive chef, features (bar, counter, outdoor, high-top, max party size), private dining, takeout, delivery, payment options, gallery photos
  • Optional reviews extraction — collect individual reviews with full text, diner profiles (name, initials, location, VIP status, review count), dined/submitted dates, and helpfulness votes
  • Browser-based anti-bot bypass — uses Playwright with Chromium + response interception to capture OpenTable's API responses with correct TLS fingerprints, defeating Akamai protection
  • MCP-ready — optimized for Claude, ChatGPT, Cursor, and other AI agents with semantic field names and structured output

Use Cases

  • Competitive analysis and benchmarking of nearby restaurants (ratings, amenities, price band)
  • Market-entry research and city-level restaurant coverage studies
  • Restaurant scoring, ranking, and neighborhood food-density analysis
  • Review monitoring and sentiment analysis
  • Sourcing acquisition or M&A targets using reservation counts and review velocity
  • Enriching travel apps, directories, and restaurant profile databases with geocoordinates
  • Building city guides, affiliate booking pages, and editorial "best of" lists
  • Generating prospect lists and CRM enrichment for sales outreach
  • Training recommendation models and AI prototypes on real restaurant attributes

Input

The actor supports two input modes (can be combined):

Search Terms

Provide city names, neighborhoods, cuisines, or restaurant names:

{
"searchTerms": ["New York", "Italian Chicago", "sushi San Francisco"],
"maxResults": 500,
"includeReviews": false
}

Direct URLs

Provide specific OpenTable restaurant URLs:

{
"startUrls": [
{ "url": "https://www.opentable.com/r/le-bernardin-new-york" },
{ "url": "https://www.opentable.com/restaurant/profile/100" }
],
"includeReviews": true,
"maxReviewsPerRestaurant": 50
}

All Input Fields

FieldTypeDefaultDescription
searchTermsarray["New York"]City, neighborhood, cuisine, or restaurant names to search
startUrlsarray[]Direct OpenTable restaurant URLs
maxResultsinteger100Max restaurant records to return
priceBandsarray[]Filter by price tier (1-4)
sortBystringweb_conversionSort order: web_conversion (featured) or distance
includeReviewsbooleanfalseAlso scrape individual reviews
maxReviewsPerRestaurantinteger50Max reviews per restaurant
proxyConfigurationobjectApify ProxyProxy routing (residential recommended)

Output

Each record contains:

FieldTypeDescription
namestringRestaurant name
urlstringOpenTable profile URL
restaurantIdnumberOpenTable internal ID
descriptionstringRestaurant description
ratingnumberOverall rating (1-5)
reviewCountnumberRecent review count
totalReviewCountnumberTotal reviews
primaryCuisinestringPrimary cuisine
cuisinesstring[]All cuisine tags
priceTiernumberPrice band (1-4)
priceRangestringPrice label
addressobjectFull postal address
latitudenumberGeocode
longitudenumberGeocode
neighborhoodstringNeighborhood
metrostringMetro area
phoneNumberstringContact phone
websitestringRestaurant website
hoursOfOperationstringHours text
diningStylestringDining style
dressCodestringDress code
parkingInfostringParking details
executiveChefstringChef name
imageUrlstringCover photo URL
featuresobjectBar, counter, outdoor, highTop, maxPartySize
hasPrivateDiningbooleanPrivate dining available
hasTakeoutbooleanTakeout available
paymentOptionsstring[]Accepted payments
photoUrlsstring[]Gallery photos
reviewsarrayIndividual reviews (if enabled)
scrapedAtstringISO timestamp
sourceUrlstringSource URL

Review Object (when includeReviews is true)

FieldTypeDescription
reviewIdstringUnique review ID
textstringFull review text
dinedDatestringDine-in date (ISO)
submittedDatestringSubmission date (ISO)
ratingOverallnumberOverall rating
reviewerNamestringDiner nickname
reviewerInitialsstringDiner initials
reviewerLocationstringDiner city
reviewerIsVipbooleanVIP status
reviewerApprovedReviewCountnumberDiner's total reviews
reviewHelpfulUpnumberHelpful up-votes
reviewHelpfulDownnumberHelpful down-votes

Pricing

This actor uses Pay-Per-Event pricing:

EventPriceDescription
Restaurant scraped$0.005Per restaurant record returned
Review scraped$0.001Per review returned (only when includeReviews is enabled)
Actor start$0.00005Per run start (memory-based)

Example costs:

  • 100 restaurants, no reviews: ~$0.50
  • 100 restaurants with 50 reviews each (5,000 reviews): ~$5.50 ($0.50 + $5.00)
  • 1,000 restaurants, no reviews: ~$5.00

How It Works

The actor uses a 3-layer extraction strategy to maximize reliability against OpenTable's Akamai protection:

  1. Response interception (primary) — Playwright's page.on('response') captures OpenTable's own API JSON responses with correct TLS fingerprints and auth headers
  2. Embedded JSON extraction (fallback) — parses window.__NEXT_DATA__ and <script type="application/json"> SSR hydration data
  3. DOM parsing (last resort) — multi-selector fallback extraction from rendered HTML

Technical Details

  • Crawler: PlaywrightCrawler with Chromium launcher
  • Anti-bot: Browser-based with response interception, randomized viewports, random delays, session pooling
  • Proxy: Apify Proxy (datacenter default, residential recommended for blocked regions)
  • Language: TypeScript
  • Output: Structured JSON dataset (exportable as CSV, Excel, JSON, XML via Apify Console)

Export Scraped Data

Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools via the Apify platform. Results can be downloaded as JSON, CSV, Excel, or XML from the Apify Console.

API Usage

# Run via API
curl -X POST "https://api.apify.com/v2/acts/USERNAME~opentable-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["New York"], "maxResults": 100}'
// Run via JavaScript SDK
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('USERNAME/opentable-scraper').call({
searchTerms: ['New York'],
maxResults: 100
});
const dataset = await client.dataset(run.defaultDatasetId);
const items = await dataset.listItems();

Limitations

  • OpenTable uses Akamai protection — residential proxies may be required for some regions
  • Free users are limited to 10 results per run
  • Review extraction adds significant time per restaurant
  • Some fields may be null if OpenTable doesn't provide them for a given restaurant

Support

If you encounter issues, please report them on the Issues tab in the Apify Console.