# OpenTable Availability Tracker (`axlymxp/opentable-availability-tracker`) Actor

Check real OpenTable reservation availability for any restaurant, date, time and party size. Returns every bookable timeslot, booking window, party-size limits and current offers as structured JSON. Schedule it to catch tables opening up. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/opentable-availability-tracker.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** Travel, Automation, Lead generation
- **Stats:** 3 total users, 2 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 dataset items

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/actors/running/actors-in-store.md#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 Availability Tracker

Check **real reservation availability** on OpenTable for any restaurant, date,
time and party size — and get back every bookable timeslot, not just a yes/no.

Point it at a list of restaurants (ids, OpenTable URLs or plain names) or at a
whole city, pick your dates and party sizes, and each run returns one row per
restaurant × date × party size with the full slot list, booking window,
party-size limits and current offers. No browser and no login required.

### Who it's for

| You are                              | You get                                                                                                                    |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| **Chasing a hard-to-book table**     | Schedule a run every 15 minutes with *Only rows with availability* on, and let a webhook ping you the moment a slot opens. |
| **A concierge or travel service**    | Availability for a whole shortlist of restaurants across a client's trip dates in a single run.                            |
| **A hospitality analyst**            | Slot counts over time as a direct occupancy and demand proxy across a market.                                              |
| **A travel or dining app developer** | A clean JSON availability feed you can poll on a schedule instead of automating a browser.                                 |

### What you get — output fields

| Field                                               | Type             | Description                                                                                          |
| --------------------------------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------- |
| `restaurantId`                                      | string           | OpenTable restaurant id                                                                              |
| `name`, `url`                                       | string           | Restaurant name and profile URL                                                                      |
| `address`, `city`, `state`, `postalCode`, `country` | string           | Location                                                                                             |
| `latitude` / `longitude`                            | number           | GPS coordinates                                                                                      |
| `neighborhood`                                      | string           | OpenTable neighborhood                                                                               |
| `cuisine` / `cuisines`                              | string / array   | Cuisine tags                                                                                         |
| `priceBand`                                         | string           | Price band, e.g. `$31 to $50`                                                                        |
| `phone`                                             | string           | Restaurant phone number                                                                              |
| `rating`, `reviewCount`                             | number / integer | Overall score and rating volume                                                                      |
| `date`                                              | string           | Date checked                                                                                         |
| `requestedTime`                                     | string           | Reference time used                                                                                  |
| `partySize`                                         | integer          | Party size checked                                                                                   |
| `isAvailable`                                       | boolean          | Whether anything is bookable                                                                         |
| `availableSlotCount`                                | integer          | Number of bookable slots                                                                             |
| `availableTimes`                                    | array            | Bookable times as `HH:MM`                                                                            |
| `earliestTime` / `latestTime`                       | string           | First and last bookable time                                                                         |
| `slots`                                             | array            | Full slot objects: time, table type, loyalty points, price, offer ids, dining area and booking token |
| `minPartySize`, `maxPartySize`, `maxDaysInAdvance`  | integer          | Booking limits                                                                                       |
| `noAvailabilityReasons`, `dateMessages`             | array            | Why nothing is bookable, when applicable                                                             |
| `bookingWindowStart` / `bookingWindowEnd`           | string           | Current booking window                                                                               |
| `hasPrivateDining`                                  | boolean          | Bookable private dining spaces exist                                                                 |
| `suggestedTimes`                                    | array            | Alternatives OpenTable suggests when the date is full                                                |
| `offers`                                            | array            | Promotions and prix-fixe menus                                                                       |
| `checkedAt`                                         | string           | UTC timestamp of the check                                                                           |

### High-value use cases

1. **Catch a cancellation.** Track one restaurant, one date, *Only rows with
   availability* on, scheduled every 15 minutes — a webhook fires the moment a
   table appears, and empty checks cost you nothing in results.
2. **Plan a trip.** Track 20 restaurants across five nights and two party sizes
   in one run, then sort the dataset by `availableSlotCount`.
3. **Measure demand in a market.** Track the top 50 restaurants in a city nightly
   and chart slot counts as an occupancy proxy.
4. **Find the quiet nights.** Compare the same restaurant across a week to see
   which evenings still have prime-time tables.
5. **Compare party sizes.** Check 2 versus 4 versus 6 covers to find out where
   larger groups actually fit.

### Input parameters

| Parameter               | Type    | Default        | Description                                                            |
| ----------------------- | ------- | -------------- | ---------------------------------------------------------------------- |
| `restaurants`           | array   | —              | Restaurant ids (`2295`), profile URLs, or names (`Balthazar New York`) |
| `location`              | string  | —              | Track the top restaurants in an area instead of a fixed list           |
| `maxRestaurants`        | integer | `20`           | How many restaurants to pull when tracking by location                 |
| `dates`                 | array   | today          | Dates as `YYYY-MM-DD`                                                  |
| `daysAhead`             | integer | `0`            | Used when no dates are given: today plus this many days                |
| `times`                 | array   | `["19:00"]`    | Reference times, 24-hour `HH:MM`                                       |
| `partySizes`            | array   | `["2"]`        | Party sizes to check                                                   |
| `fullDay`               | boolean | `true`         | Whole service day instead of slots near the reference time             |
| `onlyAvailable`         | boolean | `false`        | Push only rows that have a bookable slot                               |
| `includeRestaurantInfo` | boolean | `true`         | Add name, address, GPS, cuisine, price band, phone and rating          |
| `maxItems`              | integer | `500`          | Safety cap on rows                                                     |
| `proxyConfiguration`    | object  | Apify Proxy on | Leave enabled — see the FAQ                                            |

Rows scale as `restaurants × dates × times × partySizes`. The Actor logs the
planned number of checks before it starts and never exceeds `maxItems`.

#### Example input

```json
{
    "restaurants": [
        "https://www.opentable.com/restaurant/profile/2295",
        "Balthazar New York"
    ],
    "daysAhead": 6,
    "times": ["19:00"],
    "partySizes": ["2", "4"],
    "fullDay": true,
    "onlyAvailable": true,
    "maxItems": 100
}
```

#### Example output

```json
{
    "restaurantId": "2295",
    "name": "Carmine's - 44th Street - NYC",
    "url": "https://www.opentable.com/restaurant/profile/2295",
    "city": "New York",
    "state": "NY",
    "latitude": 40.7573,
    "longitude": -73.9871,
    "cuisine": "Italian",
    "priceBand": "$30 and under",
    "rating": 4.6,
    "reviewCount": 32986,
    "date": "2026-09-12",
    "requestedTime": "19:00",
    "partySize": 2,
    "isAvailable": true,
    "availableSlotCount": 41,
    "availableTimes": ["11:00", "11:15", "11:30"],
    "earliestTime": "11:00",
    "latestTime": "22:45",
    "slots": [
        {
            "dateTime": "2026-09-12T19:00",
            "time": "19:00",
            "type": "Standard",
            "points": 100,
            "priceAmount": 0,
            "offerIds": [],
            "diningAreas": ["INDOOR"],
            "token": "eyJ2IjozLCJtIjoxLCJ..."
        }
    ],
    "minPartySize": 1,
    "maxPartySize": 14,
    "checkedAt": "2026-09-02T12:00:00Z"
}
```

### Scheduling, webhooks and integrations

- **Schedule** the Actor as often as you like — every 15 minutes is a common
  cadence for cancellation hunting.
- **Webhooks** on `ACTOR.RUN.SUCCEEDED` let you alert Slack, email or your own
  service as soon as a run produces rows. Combine with *Only rows with
  availability* so a run that finds nothing produces no rows at all.
- **Export** to JSON, CSV, Excel, XML or RSS, or connect Google Sheets, Zapier,
  Make, Airbyte or S3.
- **Resume-safe:** progress is checkpointed after every row, so an interrupted
  run picks up where it stopped without repeating checks.

### Use it from an AI assistant (MCP)

Callable by Claude, ChatGPT or any MCP-compatible agent via the
[Apify MCP server](https://mcp.apify.com) — an assistant can answer *"is there a
table for four at Carmine's this Saturday?"* by running it. From code:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axlymxp/opentable-availability-tracker").call(
    run_input={
        "restaurants": ["2295"],
        "daysAhead": 6,
        "partySizes": ["2"],
        "onlyAvailable": True,
    }
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["date"], row["availableSlotCount"], row["availableTimes"])
```

### FAQ

**Is this real availability or an estimate?**
Real. Each row comes from OpenTable's own availability service for that exact
restaurant, date and party size, at the moment the run executes.

**Can it book a table for me?**
No. This Actor is read-only — it reports availability and returns each slot's
booking token, but never makes, changes or cancels a reservation.

**How do I identify a restaurant?**
Any of three ways: the numeric OpenTable id, an
`opentable.com/restaurant/profile/<id>` URL, or the restaurant's name. Names are
resolved through OpenTable's own search; use the id or URL when a name is
ambiguous.

**Why did a restaurant return no rows?**
Either the name could not be matched (check the log — it says which entries were
skipped) or the date falls outside the venue's booking window. In the latter case
you still get a row with `isAvailable: false` and `noAvailabilityReasons` filled
in, unless *Only rows with availability* is on.

**How far ahead can I check?**
As far as the restaurant allows; `maxDaysInAdvance` in each row tells you the
limit for that venue (commonly 90 days).

**Does it work outside the US?**
Yes — restaurants in every OpenTable market are supported.

**Do I need a proxy?**
It is on by default and there is nothing to configure. OpenTable silently drops
some requests coming from datacenter IP ranges, so leaving it enabled keeps runs
reliable.

**Is this legal?**
The Actor reads publicly available reservation information. You are responsible
for using the output in line with OpenTable's terms and applicable law.

# Actor input Schema

## `restaurants` (type: `array`):

Restaurants to check. Accepts OpenTable numeric ids (2295), profile URLs (https://www.opentable.com/restaurant/profile/2295) or restaurant names ('Carmine's 44th Street'). Leave empty and set a location instead to track a whole area.

## `location` (type: `string`):

City, neighborhood or ZIP. When set and no restaurants are listed, the Actor tracks the top restaurants in that area.

## `maxRestaurants` (type: `integer`):

How many restaurants to pull when tracking by location.

## `dates` (type: `array`):

Dates to check, in YYYY-MM-DD format. One row per date. Leave empty to use today (or today plus the days-ahead window below).

## `daysAhead` (type: `integer`):

Used only when no explicit dates are given: check today plus this many following days.

## `times` (type: `array`):

Reference times in 24-hour HH:MM format. With whole-day availability on, one time per date is enough.

## `partySizes` (type: `array`):

Party sizes to check. One row per party size.

## `fullDay` (type: `boolean`):

Return every bookable slot of the service day instead of only those near the reference time.

## `onlyAvailable` (type: `boolean`):

Skip rows where nothing is bookable. Useful for scheduled runs that should only fire a webhook when a table opens up.

## `includeRestaurantInfo` (type: `boolean`):

Add name, address, GPS, cuisine, price band, phone and rating to every row so results stand alone. Fetched once per restaurant.

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

Hard cap on rows. Restaurants x dates x times x party sizes can grow quickly — this is the safety limit.

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

Leave enabled. OpenTable silently drops some requests from datacenter IP ranges, so a proxy keeps runs reliable on the platform.

## Actor input object example

```json
{
  "restaurants": [
    "2295",
    "Balthazar New York"
  ],
  "location": "New York",
  "maxRestaurants": 20,
  "dates": [
    "2026-09-12",
    "2026-09-13"
  ],
  "daysAhead": 0,
  "times": [
    "12:30",
    "19:00"
  ],
  "partySizes": [
    "2",
    "4"
  ],
  "fullDay": true,
  "onlyAvailable": false,
  "includeRestaurantInfo": true,
  "maxItems": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

One JSON row per restaurant, date and party size, with every bookable timeslot.

# 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 = {
    "restaurants": [
        "https://www.opentable.com/restaurant/profile/2295"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/opentable-availability-tracker").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 = { "restaurants": ["https://www.opentable.com/restaurant/profile/2295"] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/opentable-availability-tracker").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 '{
  "restaurants": [
    "https://www.opentable.com/restaurant/profile/2295"
  ]
}' |
apify call axlymxp/opentable-availability-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/opentable-availability-tracker"
        }
    }
}

```

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/VUfExzNQ9ElwhG1Hp/builds/yRXFKOEilj2XieS04/openapi.json
