# OpenTable Booker: AI Restaurant Reservations (MCP Server) (`clearpath/opentable-booker`) Actor

MCP server for AI agents to search, book, and manage OpenTable restaurant reservations. 7 tools: search restaurants with availability, check time slots, book tables, view and cancel reservations. Works with Claude, ChatGPT, OpenClaw. Pay-per-action billing. No login needed for search.

- **URL**: https://apify.com/clearpath/opentable-booker.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (community)
- **Categories:** Agents, MCP servers, Automation
- **Stats:** 87 total users, 22 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / booking

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/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

**Book OpenTable restaurants through AI assistants like Claude, ChatGPT, and OpenClaw.**

No scraping. No data extraction. Just tell your AI agent where and when you want to eat.

Search restaurants worldwide, check real-time availability, book tables, view and cancel reservations. All as conversational tool calls within a single session.

<table>
<tr>
<td style="color:#1C1917;padding:14px 20px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none">
Stateful MCP server running in Apify Standby mode. Authenticate once, session persists across tool calls with no cold starts.
</td>
</tr>
</table>

[![Demo](https://asciinema.org/a/h6DHevMHoMh6CwHA.svg)](https://asciinema.org/a/h6DHevMHoMh6CwHA)

**MCP endpoint:**

```
https://clearpath--opentable-booker.apify.actor/mcp
```

 

<table><tr>
<th style="border-bottom:2px solid #333;padding:12px 16px;text-align:left;font-weight:600">Restaurant Bookers ➤</th>
<td style="border-bottom:1px solid #ddd;padding:12px 16px"><b>OpenTable (MCP)</b></td>
<td style="border-bottom:1px solid #ddd;padding:12px 16px"><a href="https://apify.com/clearpath/resy-booker" style="text-decoration:none;font-weight:600">Resy (MCP)</a></td>
</tr></table>

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
clearpath/opentable-booker on Apify (Standby actor). Base URL: https://clearpath--opentable-booker.apify.actor. Auth: Authorization: Bearer TOKEN. Endpoints: /mcp (MCP server with 8 tools: search_restaurants, check_availability, book_reservation, my_reservations, cancel_reservation, wallet_cards, login, verify_otp). Full API spec: GET https://api.apify.com/v2/acts/clearpath~opentable-booker/builds/default (Bearer TOKEN) → readme, actorDefinition. Pricing: pay-per-event, search $0.03/call, check availability $0.05/call, book $3.99/booking, login/verify/view/cancel free. Get token: https://console.apify.com/account/integrations
```

### Tools

8 tools available to connected AI agents:

- `search_restaurants`
  - Find restaurants with available time slots
  - Inputs:
    - `query` (string): Restaurant name, cuisine, or keyword
    - `city` (string, optional): City name (e.g. "New York", "London")
    - `date` (string, optional): YYYY-MM-DD format (defaults to today)
    - `time` (string, optional): HH:MM format (defaults to 19:00)
    - `party_size` (number, optional): Number of guests (default 2)
    - `sort` (string, optional): "best", "rating", "distance", or "popularity"
    - `limit` (number, optional): Max restaurants (default 10)
  - Returns restaurants with available slots
  - **~$0.03 per call**

- `check_availability`
  - Check available time slots for a specific restaurant
  - Inputs:
    - `restaurant` (string): Restaurant ID, OpenTable URL, or restaurant name
    - `date` (string): YYYY-MM-DD format
    - `time` (string, optional): HH:MM format (defaults to 19:00)
    - `party_size` (number, optional): Number of guests (default 2)
  - **~$0.05 per call**

- `book_reservation`
  - Book a table at an OpenTable restaurant (requires login)
  - Inputs:
    - `restaurant` (string): Restaurant ID or URL
    - `date` (string): YYYY-MM-DD format
    - `time` (string): HH:MM format (must match an available slot)
    - `party_size` (number): Number of guests
    - `phone` (string): Your phone number (any format)
    - `occasion` (string, optional): "NONE", "birthday", "anniversary", "date", "special\_occasion", "business\_meal"
    - `notes` (string, optional): Special requests
    - `card_last4` (string, optional): Last 4 digits of a saved card to secure a card-required reservation (defaults to your default card)
  - Card-required venues return the no-show policy with the result; see [Card-required reservations](#card-required-reservations)
  - **$3.99 per booking**

- `my_reservations`
  - List your current OpenTable reservations (requires login)
  - No inputs required
  - **Free**

- `cancel_reservation`
  - Cancel a reservation by its confirmation number (requires login)
  - Inputs:
    - `confirmation_number` (string): From `my_reservations` or `book_reservation` results
  - **Free**

- `wallet_cards`
  - List the saved payment cards on your account (requires login)
  - No inputs required
  - Returns each card's last 4 digits, type, expiry, and default flag
  - **Free**

- `login`
  - Start login to your OpenTable account via one-time code (no password needed)
  - Inputs:
    - `method` (string, optional): "email" or "sms" (defaults to email)
  - **Free**

- `verify_otp`
  - Verify the one-time code received after calling `login`
  - Inputs:
    - `code` (string): The 6-digit code from your email or SMS
  - **Free**

### Quick Start

#### Search for restaurants

```json
{
    "query": "Italian",
    "city": "New York",
    "date": "2026-03-20",
    "party_size": 4
}
```

#### Check a specific restaurant

```json
{
    "restaurant": "151951",
    "date": "2026-03-20",
    "party_size": 2
}
```

Each returned slot includes `requiresCreditCard` (and `cardPolicy`, e.g. `HOLD`, when applicable), so your assistant can tell up front whether a table needs a card on file.

#### Book a slot

```json
{
    "restaurant": "151951",
    "date": "2026-03-20",
    "time": "19:30",
    "party_size": 2,
    "phone": "+15551234567"
}
```

#### Book at a card-required venue

Turn on **Allow card-required reservations** in the actor input, then book as usual — the saved card is used automatically. To pick a specific saved card, add `card_last4`:

```json
{
    "restaurant": "1200952",
    "date": "2026-06-20",
    "time": "19:30",
    "party_size": 2,
    "phone": "+15551234567",
    "card_last4": "1585"
}
```

#### What a booking returns

A successful card-required booking includes the hold policy:

```json
{
    "success": true,
    "confirmationNumber": "82861",
    "restaurant": "9 Mile Station",
    "dateTime": "2026-06-20T19:30",
    "partySize": 2,
    "hold": {
        "policyType": "HOLD",
        "currency": "USD",
        "cancellable": true,
        "cancellationCutoff": "2026-06-19T17:00",
        "noShowFee": { "amount": 25, "unit": "perPerson" },
        "message": "This restaurant requires a credit card to secure this reservation...",
        "cardLast4": "1585"
    }
}
```

If a booking can't complete, you get a clear reason instead of a generic failure:

```json
{
    "success": false,
    "errorCode": "CARD_HOLD_NOT_ENABLED",
    "error": "This restaurant needs a card on file to hold the table. Card-required bookings are turned off.",
    "hold": { "policyType": "HOLD", "currency": "USD", "noShowFee": { "amount": 25, "unit": "perPerson" } }
}
```

Possible `errorCode` values: `NOT_LOGGED_IN`, `RESTAURANT_NOT_FOUND`, `CARD_HOLD_NOT_ENABLED`, `NO_SAVED_CARD`, `CARD_NOT_FOUND`, `CARD_DECLINED`, `SCA_REQUIRED`, `DEPOSIT_NOT_SUPPORTED`, `WALLET_UNAVAILABLE`, `SLOT_TAKEN`, `OVERLAPPING_RESERVATION`, `NO_SLOT_AT_TIME`, `BOOKING_FAILED`.

### How It Works

1. **Agent connects** to the MCP server endpoint
2. **Search** for restaurants (no login needed): `search_restaurants(query="Italian", city="New York")`
3. **Check availability** for a specific restaurant: `check_availability(restaurant="151951", date="2026-03-20")`
4. **Login** when ready to book: `login()` then `verify_otp(code="123456")`
5. **Book** with `book_reservation(restaurant="151951", date="2026-03-20", time="19:30", ...)`
6. **Verify** with `my_reservations()`

Search and availability work without login. Login is only needed for booking, viewing, and cancelling.

**One-time login.** Your session is encrypted and stored securely. After the first login, calling `login(email="...")` in future sessions automatically restores your session with no OTP needed. Re-authentication only happens after 14 days of inactivity.

***

### Card-required reservations

Some restaurants require a card on file to hold the table against no-shows. To let the booker complete these:

1. Save a card on your OpenTable account (in the OpenTable app or website).
2. Turn on **Allow card-required reservations** in the actor input.

When a reservation requires a card, the booker uses your saved card and returns the no-show policy with the result — the fee, the currency, the cancellation cutoff, and which card (last 4 digits) was used. The fee applies only if you no-show or cancel after the cutoff.

Use the `wallet_cards` tool to see your saved cards, and pass `card_last4` to `book_reservation` to choose a specific one (otherwise the default card is used).

If a reservation needs extra card verification that can't be completed automatically, the booker returns a clear reason instead of a partial booking.

***

### Pricing — Pay Per Event (PPE)

| Action | Cost |
|--------|------|
| Search restaurants | $0.03 |
| Check availability | $0.05 |
| Book a reservation | $3.99 |
| Login, verify, view, cancel | Free |

***

### Configuration

#### Input Parameters

Credentials are configured in the Apify actor input. Your email/phone is used to send a one-time login code. No password needed.

| Parameter | Type | Description |
|-----------|------|-------------|
| `loginEmail` | string | Your OpenTable account email |
| `loginPhone` | string | Your OpenTable phone (any format) |
| `allowCardRequired` | boolean | Allow booking restaurants that require a card to hold the table against no-shows (off by default) |

The server auto-refreshes your session across restarts. Re-login is only needed after 14 days of inactivity.

Replace `YOUR_APIFY_TOKEN` in all examples below with your [Apify API token](https://console.apify.com/account/integrations).

#### Usage with ChatGPT

ChatGPT supports MCP servers natively (Plus, Pro, Team, Enterprise plans).

1. Open **Settings > Connectors > Add connector**
2. Set **Name** to `OpenTable`
3. Set **MCP Server URL** to:

```
   https://clearpath--opentable-booker.apify.actor/mcp
```

4. Set **Authentication** to **API Key** and set the header:
   - Header name: `Authorization`
   - Value: `Bearer YOUR_APIFY_TOKEN`
5. Click **Save**
6. Start a new chat, click **+** near the composer, select **More**, choose **OpenTable**

#### Usage with Claude Desktop

Add to your `claude_desktop_config.json`:

- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
    "mcpServers": {
        "opentable-booker": {
            "type": "http",
            "url": "https://clearpath--opentable-booker.apify.actor/mcp",
            "headers": {
                "Authorization": "Bearer YOUR_APIFY_TOKEN"
            }
        }
    }
}
```

Restart Claude Desktop after saving.

#### Usage with Claude Code

```bash
claude mcp add --transport http --scope user opentable-booker \
  --header "Authorization: Bearer YOUR_APIFY_TOKEN" \
  https://clearpath--opentable-booker.apify.actor/mcp
```

Or add to your project's `.mcp.json`:

```json
{
    "mcpServers": {
        "opentable-booker": {
            "type": "http",
            "url": "https://clearpath--opentable-booker.apify.actor/mcp",
            "headers": {
                "Authorization": "Bearer ${APIFY_TOKEN}"
            }
        }
    }
}
```

#### Usage with OpenClaw

Add to `~/.openclaw/openclaw.json`:

```json5
{
  "provider": {
    "mcpServers": {
      "opentable-booker": {
        "url": "https://clearpath--opentable-booker.apify.actor/mcp",
        "headers": {
          "Authorization": "Bearer YOUR_APIFY_TOKEN"
        }
      }
    }
  }
}
```

Then message your OpenClaw bot on Telegram, WhatsApp, or Discord:

> "Find me a table for 2 in London this Saturday"

> "What Italian restaurants are available in NYC next Friday?"

> "Book the 7:30 PM slot at that restaurant"

The assistant calls the OpenTable Booker, searches availability, and books the reservation for you.

#### Other MCP Clients

Any client supporting the Streamable HTTP transport works. Use the MCP endpoint URL with your Apify API token as a Bearer auth header.

***

### FAQ

**Do I need an OpenTable account?**
Only for booking. Search and availability checks work without an account.

**Can I use this without an AI assistant?**
Yes. Any MCP client works. You can also call tools programmatically via any MCP SDK.

**What restaurants are supported?**
All restaurants on OpenTable across the US, UK, Germany, France, Italy, Spain, Netherlands, Ireland, UAE, Canada, Mexico, Japan, Australia, and more.

**Will it actually book a real reservation?**
Yes. `book_reservation` creates a real reservation on your OpenTable account. Cancel with `cancel_reservation`.

**What happens if a slot is no longer available?**
The tool returns an error. Search again or try a different time.

***

### Support

- **Email**: max@mapa.slmail.me
- **Bugs**: Issues tab

### Legal

This actor interacts with OpenTable on behalf of authenticated users. It performs the same actions a user would in the OpenTable app. Users are responsible for complying with OpenTable's terms of service.

***

*Search, book, and manage OpenTable reservations through AI agents.*

# Actor input Schema

## `loginEmail` (type: `string`):

Your OpenTable account email. Used for passwordless login via one-time code.<br><br>Provide <b>either</b> email or phone, not both. Leave both empty if you only need search and availability (no login required for those).

## `loginPhone` (type: `string`):

Your OpenTable account phone number. Used for passwordless login via SMS code.<br><br>Any format works: <code>+1 212 555 1234</code>, <code>00491234567890</code>, <code>01234567890</code><br><br>Provide <b>either</b> phone or email, not both.

## `allowCardRequired` (type: `boolean`):

Some restaurants require a card on file to hold the table against no-shows. Turn this on to let the booker complete those reservations using the card saved on your OpenTable account. The no-show policy and fee are returned with each booking. Off by default.

## Actor input object example

```json
{
  "allowCardRequired": false
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/opentable-booker").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/opentable-booker").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 '{}' |
apify call clearpath/opentable-booker --silent --output-dataset

```

## MCP server setup

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

```

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/gGWfIJqbEiBKDgTAe/builds/LaRMbsc16cTqyb5AZ/openapi.json
