# OpenTable Restaurants & Reviews Scraper (`fetch_cat/opentable-restaurants-reviews-scraper`) Actor

Export public OpenTable restaurant profiles, ratings, and diner reviews for reputation monitoring, hospitality analytics, local SEO, and competitive research.

- **URL**: https://apify.com/fetch\_cat/opentable-restaurants-reviews-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Travel, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 87.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.22 / 1,000 result saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## OpenTable Reviews — Restaurants & API Scraper

Use this OpenTable reviews scraper and API to export public restaurant data for reputation monitoring, local SEO research, hospitality analytics, and competitive tracking. Provide restaurant IDs, profile URLs, or an OpenTable search URL and receive normalized, deduplicated records.

### Input example

```json
{
  "restaurantIds": ["1204381", "404046"],
  "maxReviewsPerRestaurant": 20,
  "maxItems": 40,
  "failOnBlocked": true
}
```

### Output example

```json
{
  "recordType": "review",
  "restaurantId": "1204381",
  "restaurantUrl": "https://www.opentable.com/restaurant/profile/1204381",
  "restaurantName": null,
  "reviewId": "OT-1204381-example",
  "reviewText": "Great food and attentive service.",
  "reviewRating": 5,
  "reviewType": "OPENTABLEVERIFIED",
  "reviewTags": ["Good for special occasions"],
  "helpfulCount": 3,
  "helpfulDownCount": 1,
  "helpfulScore": 2,
  "restaurantReplyText": "Thank you for dining with us.",
  "photoCount": 1,
  "page": 1,
  "scrapedAt": "2026-08-15T10:00:00.000Z"
}
```

### Input settings

| Field | Description |
|---|---|
| `restaurantUrls` | Public OpenTable restaurant profile URLs. |
| `restaurantIds` | Numeric OpenTable restaurant IDs. This is the most reliable option when you already know the IDs. |
| `searchUrl` | Public OpenTable search-results URL used to discover restaurant profiles. |
| `maxReviewsPerRestaurant` | Maximum reviews collected for each restaurant. Set to `0` for profile-only collection. |
| `maxItems` | Maximum total dataset rows across all targets. |
| `failOnBlocked` | Fail clearly when no valid rows can be produced instead of returning an empty successful run. |
| `proxyConfiguration` | Optional Apify proxy configuration. The default uses US residential proxy access. |

At least one of `restaurantUrls`, `restaurantIds`, or `searchUrl` is required.

### Output fields

The default dataset contains restaurant and review rows joined by `restaurantId`.

| Group | Fields |
|---|---|
| Identity | `recordType`, `restaurantId`, `restaurantUrl`, `restaurantName`, `scrapedAt` |
| Restaurant rating | `rating`, `reviewCount`, `priceRange` |
| Restaurant details | `cuisines`, `description`, `phone`, `website`, `imageUrl` |
| Location | `address`, `city`, `state`, `postalCode`, `country`, `neighborhood`, `latitude`, `longitude` |
| Review | `reviewId`, `reviewText`, `reviewRating`, `foodRating`, `serviceRating`, `ambienceRating`, `valueRating`, `noiseLevel`, `dinedDate`, `submittedDate`, `reviewType`, `reviewTags`, `helpfulCount`, `helpfulDownCount`, `helpfulScore`, `restaurantReplyText`, `photoUrls`, `photoCount`, `page` |
| Reviewer | `reviewerName`, `reviewerInitials`, `reviewerLocation`, `reviewerReviewCount`, `reviewerIsVip` |

Optional source fields are returned as `null` when OpenTable does not publish them for a record.

### Input recipes

#### Monitor two restaurants

```json
{"restaurantIds":["1204381","404046"],"maxReviewsPerRestaurant":25,"maxItems":50}
```

#### Collect a profile without reviews

```json
{"restaurantUrls":[{"url":"https://www.opentable.com/r/bestia-los-angeles"}],"maxReviewsPerRestaurant":0,"maxItems":1}
```

### Pricing

The Actor uses pay-per-event pricing: a small run-start event plus charges only for valid restaurant and review rows saved. See the [live Pricing tab](https://apify.com/fetch_cat/opentable-restaurants-reviews-scraper/pricing) for exact current event prices before each run.

### Tips and limits

- Use numeric restaurant IDs for dependable recurring review monitoring.
- Keep `maxItems` low for the first run, then increase it after checking the output.
- Public source availability varies by restaurant and region; some optional profile fields may be absent.
- The Actor does not access reservations, diner accounts, private booking details, or login-only data.
- If OpenTable denies all requested public pages, the default behavior is an explicit failed run rather than misleading empty output.

### Who is it for?

- Restaurant operators tracking guest sentiment and service trends.
- Hospitality analytics teams comparing public ratings and review volume.
- Local SEO teams collecting structured location and reputation signals.
- Reputation-monitoring vendors feeding recurring public review exports into dashboards.

### API usage

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~opentable-restaurants-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"restaurantIds":["1204381"],"maxReviewsPerRestaurant":10,"maxItems":10}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/opentable-restaurants-reviews-scraper').call({
  restaurantIds: ['1204381'], maxReviewsPerRestaurant: 10, maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/opentable-restaurants-reviews-scraper').call(run_input={
    'restaurantIds': ['1204381'], 'maxReviewsPerRestaurant': 10, 'maxItems': 10,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

Use the returned dataset through client libraries, webhooks, Google Sheets, n8n, or other Apify integrations.

### MCP and AI agents

Add the Apify MCP server from the command line:

```bash
claude mcp add --transport http apify https://mcp.apify.com/?tools=fetch_cat/opentable-restaurants-reviews-scraper
```

Or add it to an MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/opentable-restaurants-reviews-scraper"
    }
  }
}
```

Example prompts: “Export the 20 newest reviews for restaurant 1204381” or “Compare the ratings and recurring review themes for these OpenTable restaurant IDs.”

### FAQ

#### How can I export public OpenTable restaurant reviews?

Supply one or more `restaurantIds` or `restaurantUrls`, set a total `maxItems` cap, and download the resulting dataset as JSON, CSV, Excel, or another supported format.

#### How can I monitor OpenTable ratings and reviews through an API?

Schedule the Actor or call its API regularly with the same restaurant IDs. Store the normalized review IDs, ratings, text, and timestamps to detect new feedback and rating changes.

#### Can I send OpenTable restaurant data to Google Sheets, n8n, or an AI agent?

Yes. Connect the Actor dataset through an Apify integration, webhook, API client, or MCP server to feed Google Sheets, n8n workflows, and AI agents.

#### Does the Actor remove duplicate reviews?

Yes. Reviews are deduplicated by their public `reviewId` within each restaurant run.

#### Is this an official OpenTable API?

No. This Actor exports information visible on public OpenTable surfaces and is not affiliated with OpenTable.

#### Is scraping legal?

You are responsible for your use case, applicable laws, and website terms. Collect only public data and handle personal information responsibly.

### Related Actors

- [Google Maps Reviews Scraper](https://apify.com/<ANNA_APIFY_USERNAME>/google-maps-reviews-scraper)
- [Booking Reviews Scraper](https://apify.com/<ANNA_APIFY_USERNAME>/booking-reviews-scraper)
- [Tripadvisor Reviews Scraper](https://apify.com/<ANNA_APIFY_USERNAME>/tripadvisor-reviews-scraper)
- [Yelp Reviews Scraper](https://apify.com/<ANNA_APIFY_USERNAME>/yelp-reviews-scraper)
- [Google Maps Scraper](https://apify.com/<ANNA_APIFY_USERNAME>/google-maps-scraper)

### Support

Open an issue from the Actor's Apify Store page with a reproducible public target, expected result, and run ID. Do not include credentials or private customer data.

# Actor input Schema

## `restaurantUrls` (type: `array`):

Public OpenTable restaurant profile URLs.

## `restaurantIds` (type: `array`):

Optional numeric OpenTable restaurant IDs, useful when profile URLs are unavailable.

## `searchUrl` (type: `string`):

Optional public OpenTable search results URL from which to discover restaurants.

## `maxReviewsPerRestaurant` (type: `integer`):

Set to 0 for restaurant profiles only.

## `maxItems` (type: `integer`):

Global limit across restaurant and review rows.

## `failOnBlocked` (type: `boolean`):

Fail instead of reporting a misleading successful empty run.

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

Residential proxy is recommended for reliable OpenTable access.

## Actor input object example

```json
{
  "restaurantIds": [
    "1204381"
  ],
  "maxReviewsPerRestaurant": 10,
  "maxItems": 20,
  "failOnBlocked": true,
  "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 = {
    "restaurantIds": [
        "1204381"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/opentable-restaurants-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 = { "restaurantIds": ["1204381"] }

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

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

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

```

## CLI example

```bash
echo '{
  "restaurantIds": [
    "1204381"
  ]
}' |
apify call fetch_cat/opentable-restaurants-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/opentable-restaurants-reviews-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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