# OpenTable Scraper (`shahidirfan/opentable-scraper`) Actor

Extract comprehensive restaurant data from OpenTable, including menus, user reviews, ratings, and location details. Ideal for market research and dining analytics. For seamless extraction and to avoid IP blocking, using residential proxies is highly advised.

- **URL**: https://apify.com/shahidirfan/opentable-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 53 total users, 5 monthly users, 95.2% 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 and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Restaurants Scraper do?

OpenTable Restaurants Scraper collects structured restaurant listing data from OpenTable, the online restaurant reservation platform. Paste an OpenTable metro page, search URL, or restaurant profile URL and get back a clean dataset with restaurant names, cuisine types, price bands, ratings, review counts, addresses, phone numbers, photos, and dining features. The actor handles pagination automatically and works across OpenTable domains in the US, UK, Canada, Australia, France, Germany, Spain, Italy, Japan, and other countries.

### Why use OpenTable Restaurants Scraper?

- **Structured restaurant dataset** - Collect 40+ data fields from OpenTable listings without manual copy-paste or browser automation.
- **Multi-format exports** - Download results as JSON, CSV, Excel, or XML through Apify datasets.
- **Automation-ready** - Schedule runs, send data via webhooks, or connect to Google Sheets, Airtable, Make, and Zapier.
- **Flexible input sources** - Start from any OpenTable URL type: metro pages, search results, neighborhood pages, cuisine filters, or direct restaurant profiles.

### What data can you extract from OpenTable?

| Field | Description |
|-------|-------------|
| `name` | Restaurant name |
| `url` | OpenTable restaurant profile URL |
| `cuisine` | Primary cuisine type |
| `price` | Price band label |
| `rating` | Overall customer rating |
| `reviewCount` | All-time text review count |
| `recentReservationCount` | Recent reservation activity count |
| `address` | Full street address |
| `phoneNumber` | Restaurant phone number |
| `neighborhood` | Neighborhood or area name |
| `description` | Restaurant description text |
| `latitude` / `longitude` | Restaurant coordinates |
| `profileImage` | Main restaurant photo URL |
| `galleryImages` | Additional photo URLs |
| `hasTakeout` | Takeout availability flag |
| `hasPrivateDining` | Private dining availability flag |
| `deliveryPartners` | Delivery partner names |
| `awards` | Restaurant award names |

### How to use OpenTable Restaurants Scraper

1. Open the Actor on Apify Store.
2. Enter one or more OpenTable URLs in the input field. You can use metro pages, search URLs, or restaurant profile URLs.
3. Set the maximum number of restaurants to collect and the page limit.
4. Run the Actor.
5. Download the dataset or connect it to your workflow through Apify integrations.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | Array | No | Las Vegas metro URL | One or more OpenTable URLs to scrape. Search URLs support full pagination. |
| `results_wanted` | Integer | No | `20` | Maximum number of restaurant listings to collect per run. |
| `max_pages` | Integer | No | `3` | Maximum number of search result pages to fetch. Each page can contain up to 50 restaurants. |
| `proxyConfiguration` | Object | No | Apify Proxy Residential | Proxy settings. Residential proxies are recommended for larger runs. |

### Usage Examples

#### Metro Page Collection

Start from an OpenTable metro page to collect restaurants in a city:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/metro/las-vegas-restaurants" }
  ],
  "results_wanted": 50,
  "max_pages": 5
}
```

#### Multiple Search URLs

Collect restaurants from multiple cities or filtered searches in one run:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/s?metroId=10&term=Las%20Vegas" },
    { "url": "https://www.opentable.com/s?metroId=511&term=New%20York" }
  ],
  "results_wanted": 100,
  "max_pages": 3
}
```

#### Single Restaurant Profile

Extract data from a specific OpenTable restaurant page:

```json
{
  "startUrls": [
    { "url": "https://www.opentable.com/r/tao-asian-bistro-las-vegas" }
  ],
  "results_wanted": 1
}
```

### Sample Output

```json
{
  "restaurantId": 5056,
  "name": "TAO Asian Bistro - Las Vegas",
  "url": "https://www.opentable.com/r/tao-asian-bistro-las-vegas",
  "price": "$50 and over",
  "cuisine": "Contemporary Asian",
  "neighborhood": "The Venetian and Palazzo",
  "rating": 4.6,
  "reviewCount": 13898,
  "recentReservationCount": 196,
  "description": "TAO Asian Bistro invites you into a world of bold Pan-Asian flavors and captivating ambiance.",
  "address": "3377 S. Las Vegas Blvd., Suite 2025, Las Vegas, NV, 89109",
  "phoneNumber": "+7023888338",
  "latitude": 36.1215,
  "longitude": -115.1726,
  "profileImage": "https://resizer.otstatic.com/v3/photos/29631200-1?width=320&height=180&webp=true",
  "hasTakeout": true,
  "hasPrivateDining": true,
  "sourceUrl": "https://www.opentable.com/metro/las-vegas-restaurants",
  "sourceType": "locationLanding",
  "scraped_at": "2026-07-28T10:30:00.000Z"
}
```

### Tips for Best Results

- Use OpenTable search URLs or metro pages for broad city-level collection. Search URLs provide the cleanest pagination.
- Start with a small `results_wanted` value for testing before scheduling larger runs.
- Increase `max_pages` when you need more restaurants. Each page returns up to 50 results.
- Use Apify Proxy with residential proxies for consistent results, especially with large datasets.
- Some fields may be missing when the restaurant does not publish that information on its OpenTable profile.
- Restaurant profile URLs work well for single-record extraction but do not support pagination.

### Integrations

- **Google Sheets** - Export restaurant data to spreadsheets for analysis and filtering.
- **Airtable** - Build searchable restaurant directories from your datasets.
- **Webhooks** - Send new restaurant data to your own systems after each run.
- **Make and Zapier** - Connect restaurant data to no-code automation workflows.
- **API** - Access datasets programmatically through the Apify API from your applications.

#### Export Formats

- **JSON** - For developers and data applications.
- **CSV** - For spreadsheets and lead lists.
- **Excel** - For business reporting and dashboards.
- **XML** - For system imports and integrations.

### Frequently Asked Questions

#### Can I scrape OpenTable restaurants in different countries?

Yes. The Actor works with OpenTable domains including opentable.com, opentable.co.uk, opentable.ca, opentable.com.au, opentable.fr, opentable.de, opentable.es, opentable.it, opentable.jp, opentable.com.mx, and others. Use the correct domain URL for the country you need.

#### Can I collect restaurant reviews?

No. This Actor collects restaurant listings with ratings, review counts, and highlighted review snippets. It does not extract full individual review text.

#### How many restaurants can I collect in one run?

You can set `results_wanted` up to 10,000 and `max_pages` up to 200. Each search page returns up to 50 restaurants. For larger collections, use multiple search URLs across different cities or filters.

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

OpenTable restaurants may not publish every field. Empty values are removed from each record to keep the dataset compact. Common missing fields include descriptions, phone numbers, and photos.

#### Can I use filtered OpenTable search URLs?

Yes. Any OpenTable search URL works as input, including URLs with cuisine filters, neighborhood filters, price filters, or datetime parameters.

#### Does this Actor work without a browser?

Yes. The Actor collects data directly from OpenTable pages using standard HTTP requests. No browser is required.

#### Is it legal to scrape OpenTable?

Scraping publicly available restaurant data from OpenTable for legitimate research and analysis purposes can be legal, but you are responsible for complying with applicable laws, OpenTable's terms of service, and data privacy regulations.

### Related Actors

- [Expedia Hotels Scraper](https://apify.com/shahidirfan/expedia-hotels-scraper) - Extract hotel listings, prices, ratings, and property details from Expedia.
- [Propertyfinder Scraper](https://apify.com/shahidirfan/propertyfinder-scraper) - Collect real estate listings with pricing, specifications, and agent details from Propertyfinder.ae.

### 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 OpenTable restaurant pages. Users are responsible for using the data responsibly and complying with OpenTable's terms of service and applicable laws.

# Actor input Schema

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

OpenTable URL to scrape. Search URLs paginate best; metro and location pages are converted to listing URLs when possible.

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

Maximum number of restaurant listings to collect.

## `max_pages` (type: `integer`):

Maximum number of listing pages to fetch. OpenTable search pages usually contain up to 50 restaurants each.

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

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

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.opentable.com/metro/las-vegas-restaurants"
    }
  ],
  "results_wanted": 20,
  "max_pages": 3,
  "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/metro/las-vegas-restaurants"
        }
    ],
    "results_wanted": 20,
    "max_pages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/opentable-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/metro/las-vegas-restaurants" }],
    "results_wanted": 20,
    "max_pages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/opentable-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/metro/las-vegas-restaurants"
    }
  ],
  "results_wanted": 20,
  "max_pages": 3
}' |
apify call shahidirfan/opentable-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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