# OpenTable Reviews Scraper 🍽️ (`shahidirfan/opentable-reviews-scraper`) Actor

Extract detailed reviews, ratings, and diner feedback from OpenTable restaurant listings. This actor is perfect for analyzing customer sentiment, monitoring brand reputation, and gathering dining insights across thousands of locations. Get the comprehensive data you need to understand the market.

- **URL**: https://apify.com/shahidirfan/opentable-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 55 total users, 16 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.49 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does OpenTable Reviews Scraper do?

OpenTable Reviews Scraper collects restaurant reviews, ratings, and diner feedback from OpenTable. Provide one or more restaurant profile URLs or metro search pages, and the Actor returns structured data including review text, star ratings, food/service/ambience/value scores, reviewer details, and restaurant replies.

### Why use OpenTable Reviews Scraper?

- **Structured review datasets** - Collect full review text, ratings, and reviewer context without manual copy-paste.
- **Automation-ready output** - Export results to JSON, CSV, Excel, XML, or connect to Google Sheets and other tools.
- **Reputation monitoring** - Track feedback for your own restaurants or competitors on a recurring schedule.
- **Market intelligence** - Analyze dining trends, popular cuisines, and rating patterns across metros and neighborhoods.

### What data can you extract from OpenTable?

| Field | Description |
|-------|-------------|
| `rating` | Overall star rating (1-5) |
| `text` | Full review text |
| `foodRating` | Food quality score (1-5) |
| `serviceRating` | Service quality score (1-5) |
| `ambienceRating` | Atmosphere score (1-5) |
| `valueRating` | Price-to-value score (1-5) |
| `noiseLevel` | Noise description (e.g. LOUD, MODERATE) |
| `restaurantName` | Restaurant name |
| `author` | Reviewer nickname |
| `date` | Review submission date |
| `visitDate` | Date the reviewer dined |
| `reviewerMetro` | Reviewer metro area |
| `reviewerIsVip` | VIP status indicator |
| `helpfulCount` | Number of helpful votes |
| `publicRestaurantReply` | Public reply from the restaurant |

### How to use OpenTable Reviews Scraper

1. Open the Actor on Apify Store.
2. Add one or more OpenTable URLs (restaurant profile pages or metro/search pages).
3. Set the maximum number of reviews to collect.
4. Optionally configure proxy settings for larger runs.
5. Run the Actor.
6. Download the dataset or connect it to your workflow.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | Array | No | Bestia example URL | List of OpenTable URLs including restaurant profile pages or metro/search pages to collect reviews from. |
| `results_wanted` | Integer | No | `20` | Maximum number of reviews to collect in one run. |
| `proxyConfiguration` | Object | No | Apify Proxy (Residential) | Proxy settings. Residential proxies are recommended for large-scale runs. |

### Output Data

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | String | Unique identifier for the review |
| `restaurantName` | String | Name of the restaurant |
| `restaurantId` | String | Internal OpenTable restaurant ID |
| `restaurantUrl` | String | URL of the restaurant profile |
| `rating` | Number | Overall star rating (1-5) |
| `text` | String | Full review content |
| `author` | String | Reviewer nickname |
| `date` | String | ISO timestamp of review submission |
| `visitDate` | String | Date the reviewer dined |
| `submittedDate` | String | ISO timestamp of submission |
| `foodRating` | Number | Food quality score (1-5) |
| `serviceRating` | Number | Service quality score (1-5) |
| `ambienceRating` | Number | Ambience score (1-5) |
| `valueRating` | Number | Value score (1-5) |
| `noiseLevel` | String | Noise description (LOUD, MODERATE, etc.) |
| `helpfulCount` | Number | Total helpfulness votes |
| `helpfulUp` | Number | Positive helpfulness votes |
| `helpfulDown` | Number | Negative helpfulness votes |
| `reviewType` | String | Review source type (e.g. OPENTABLEVERIFIED) |
| `fromPreviousConcept` | Boolean | Whether review is from a previous restaurant concept |
| `reviewerName` | String | Reviewer display name |
| `reviewerInitials` | String | Reviewer initials |
| `reviewerReviewCount` | Number | Number of approved reviews by this reviewer |
| `reviewerMetro` | String | Reviewer metro area |
| `reviewerMetroId` | Number | Reviewer metro ID |
| `reviewerIsVip` | Boolean | VIP status indicator |
| `reviewerProfileColor` | String | Profile color shown by OpenTable |
| `reviewerPhoto` | String | Reviewer profile photo URL |
| `publicRestaurantReply` | String | Public reply from the restaurant |
| `publicRestaurantReplyDate` | String | Date of restaurant reply |
| `photoUrls` | Array | Review photo URLs |

### Usage Examples

#### Basic Review Extraction

Collect the latest reviews from a single restaurant:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/r/bestia-los-angeles" }
  ],
  "results_wanted": 50
}
```

#### Batch Scraping from a Metro Search

Provide a metro or search URL to collect reviews from all restaurants in that area:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/metro/los-angeles-restaurants" }
  ],
  "results_wanted": 100
}
```

#### Competitive Monitoring

Compare reviews across multiple specific restaurants in one run:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/r/restaurant-a" },
    { "url": "https://www.opentable.com/r/restaurant-b" }
  ],
  "results_wanted": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Sample Output

```json
{
  "reviewId": "OT-96412-2110686937",
  "restaurantName": "Bestia",
  "restaurantId": "96412",
  "restaurantUrl": "https://www.opentable.com/r/bestia-los-angeles",
  "rating": 5,
  "text": "The food was incredible, especially the bone marrow and the cavatelli. Service was attentive and the atmosphere was lively.",
  "author": "FoodieLA",
  "date": "2023-11-20T10:45:00Z",
  "visitDate": "2023-11-18T19:30:00Z",
  "foodRating": 5,
  "serviceRating": 5,
  "ambienceRating": 4,
  "valueRating": 5,
  "noiseLevel": "LOUD",
  "helpfulCount": 12,
  "helpfulUp": 12,
  "helpfulDown": 0,
  "reviewType": "OPENTABLEVERIFIED",
  "fromPreviousConcept": false,
  "reviewerInitials": "F",
  "reviewerReviewCount": 34,
  "reviewerMetro": "Los Angeles",
  "reviewerMetroId": 6,
  "reviewerIsVip": true,
  "reviewerProfileColor": "PLUM"
}
```

### Tips for Best Results

- Use residential proxies for larger runs to maintain reliability.
- Start with a modest `results_wanted` value to confirm the URL works, then increase for broader collection.
- Use restaurant profile URLs (e.g. `opentable.com/r/restaurant-name`) for deep dives into a single brand.
- Use metro or search URLs (e.g. `opentable.com/metro/city-restaurants`) to collect reviews across multiple restaurants in an area.
- Check the dataset preview before scheduling larger runs to verify data quality.

### Integrations

- **Google Sheets** - Export review data for sentiment tagging and reporting.
- **Webhooks** - Trigger downstream workflows after each run completes.
- **Make or Zapier** - Connect results to no-code automations.
- **API** - Access datasets programmatically from your own systems.

#### Export Formats

- **JSON** - Ready for API consumption and developer workflows.
- **CSV** - Ideal for Excel and spreadsheet analysis.
- **Excel** - For clean business reporting.
- **XML** - For legacy system integrations.

### Frequently Asked Questions

#### Can I scrape reviews from any country?

Yes. The Actor supports OpenTable domains globally including the US, UK, Canada, Australia, Germany, France, Japan, and more.

#### Does it handle reviews in different languages?

The Actor collects review text as it appears on OpenTable. Reviews in Spanish, French, German, Japanese, or other languages are extracted in their original language.

#### How many reviews can I collect?

There is no hard limit. You can collect thousands of reviews in a single run. Residential proxies are recommended for large-scale collection.

#### Can I scrape reviews from metro or search pages?

Yes. Metro URLs, neighborhood pages, and search results are supported. The Actor finds restaurant links from these pages and collects reviews from each one.

#### Can I export the data to CSV or Excel?

Yes. Apify datasets can be downloaded in CSV, Excel, JSON, XML, and other supported formats from the Apify Console.

#### Can I run this Actor on a schedule?

Yes. You can schedule the Actor in Apify Console to refresh data hourly, daily, weekly, or at another interval.

#### Why are some fields missing in the output?

Some fields may be empty when the source page does not publish that information. For example, not all reviewers have a metro listed or a VIP badge. Check multiple results before assuming the Actor failed.

#### Is it legal to scrape OpenTable reviews?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, website terms, and privacy rules. Use the data responsibly.

### Related Actors

- [OpenTable Scraper](https://apify.com/shahidirfan/opentable-scraper) - Collect restaurant listings, cuisine types, price bands, and contact data from OpenTable.
- [Trip.com Hotel Reviews Scraper](https://apify.com/shahidirfan/trip-com-hotel-reviews-scraper) - Extract hotel reviews, ratings, and guest feedback from Trip.com.
- [Realtor Agents Scraper](https://apify.com/shahidirfan/realtor-agents-scraper) - Extract real estate agent profiles, contact details, and market data.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available sources. Users are responsible for using the data responsibly and complying with applicable laws and OpenTable's terms of service.

# Actor input Schema

## `startUrls` (type: `array`):

List of OpenTable URLs (Search results or specific Restaurant pages) to scrape reviews from.

## `results_wanted` (type: `integer`):

The maximum number of reviews to collect per run.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy for reliable scraping. Residential proxies are recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.opentable.com/r/bestia-los-angeles"
    }
  ],
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.opentable.com/r/bestia-los-angeles"
        }
    ],
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/opentable-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.opentable.com/r/bestia-los-angeles" }],
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/opentable-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.opentable.com/r/bestia-los-angeles"
    }
  ],
  "results_wanted": 20
}' |
apify call shahidirfan/opentable-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/opentable-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/g78C86R8gqFn49vXo/builds/v1GdrL5dFS4BqHFE8/openapi.json
