Local services & SaaS
Faire
Orders, inventory, reorders and messages for wholesale brands.
12 endpoints
Read OpenTable saved restaurants and reservations through MCP or REST. Connect your diner account to an agent or a personal planning workflow.
13 tools Read and write
OpenTable has no public API and no MCP server (checked 27 Oct 2026). Its Booking, Sync and CRM APIs go to approved integration partners and work per restaurant, not on your diner account. Cotlet runs 13 OpenTable tools hosted, over MCP for agents and REST for scripts.
| What you need | Partner API | ChatGPT booking | Cotlet |
|---|---|---|---|
| Find open tables and book | After approval | Yes | Yes, after your OK |
| List, move or cancel your reservations | Partner bookings only | Sent to OpenTable | Yes |
| Watch a full restaurant on a schedule | After approval | No | Yes |
| Read the reservation book and guest notes | Sync and CRM tiers | No | Yes |
| Use from Claude, n8n or a script | Your own code | ChatGPT only | Yes |
| Allowed by OpenTable's terms | Yes, official | Yes, official partner | Uses the website |
Checked 27 Oct 2026. Sources: OpenTable API documentation · OpenTable's API and Partner FAQs · OpenAI: ChatGPT release notes, 10 Aug 2026 · Make: OpenTable community app
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your OpenTable password, and no booking reaches a restaurant until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Turn on OpenTable for agents. Create a Cotlet account, sign in to OpenTable in its Cloud Browser, then press Enable for agents.
Add the MCP address. Paste https://cotlet.dev/mcp/v1 into your agent as an MCP server or connector.
Allow the connection. Chat apps open a Cotlet sign-in. Code editors, n8n and scripts take an API key from the console.
The shared address https://cotlet.dev/mcp/v1 carries OpenTable next to the other apps you enable. Turned OpenTable on after you connected? Refresh the connector and its tools appear.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-opentable \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-opentable": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-opentable]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: opentable_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: opentable_write Sign in to OpenTable in its Cotlet Cloud Browser and enable the app for agents. Use your diner login for saved restaurants; restaurant-book and Guestbook reads require a separate OpenTable for Restaurants login with access.
Create a Cotlet API key with access to OpenTable and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
curl https://cotlet.dev/api/v1/opentable/saved-restaurants \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "opentable",
"tool": "list_saved_restaurants",
"result": {
"saved": [
{
"restaurant_id": "rid_120771",
"name": "Harbor Room",
"cuisine": "Seafood",
"neighborhood": "Embarcadero"
}
]
}
} Read result.saved; saved restaurants have no pagination inputs. Use a returned restaurant ID for availability on your selected date and party size.
Diner reservation lists accept status and a limit without a cursor or a documented numeric maximum. A limited list is not an unlimited historical export.
Restaurant reservation-book reads are a separate account role. Availability checks reserve nothing, and table inventory can change between calls.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read saved restaurants and dated availability into a dining shortlist without making reservations. |
| Make | HTTP > Make a request | Read diner reservations into a personal itinerary and compare timing on refresh. |
| Python or Node.js | REST API | With restaurant access, read the reservation book and guest records into a shift brief with visit-specific tags. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads OpenTable; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Times are what OpenTable shows at that moment; nothing is held until you book. Saving a restaurant touches only your own list.
Returns restaurants in the order OpenTable ranks them for the search, each with its restaurant_id, name, cuisine, neighborhood and the open times near the time you asked for. It searches the same listings as opentable.com. A restaurant with no table near that time can still show up with an empty list of times.
MCP callopentable_read → search_restaurants
REST endpointGET https://cotlet.dev/api/v1/opentable/restaurants/search
| Name | Type | Description |
|---|---|---|
| location string required | string | A city, neighborhood or address, for example "Union Square, San Francisco". |
| date string required | string | Date in YYYY-MM-DD. |
| time string required | string | Preferred time in HH:MM, 24-hour. |
| party_size integer required | integer | Number of guests. |
| query string | string | Cuisine or restaurant name, for example "italian" or "sushi". |
| limit integer | integer | How many restaurants to return. |
{
"location": "location",
"date": "date",
"time": "time",
"party_size": 1
} {
"restaurants": [
{
"restaurant_id": "rid_104822",
"name": "Trattoria Verde",
"cuisine": "Italian",
"neighborhood": "Union Square",
"times": [
"19:00",
"19:30",
"20:15"
]
},
{
"restaurant_id": "rid_118305",
"name": "Osteria Nove",
"cuisine": "Italian",
"neighborhood": "Union Square",
"times": [
"19:45"
]
}
]
} Returns each open time with its seating area where the restaurant shows one, and the booking policy for that time: whether a credit card is required and the cancellation policy text the restaurant set. It reserves nothing; a time can be gone by the time you book. Use the slot_id with book_reservation or modify_reservation.
MCP callopentable_read → get_availability
REST endpointGET https://cotlet.dev/api/v1/opentable/restaurants/{restaurant_id}/availability
| Name | Type | Description |
|---|---|---|
| restaurant_id string required | string | A restaurant_id from search_restaurants or list_saved_restaurants. |
| date string required | string | Date in YYYY-MM-DD. |
| time string | string | Time in HH:MM to search around. Defaults to 19:00. |
| party_size integer required | integer | Number of guests. |
{
"restaurant_id": "restaurant_8c41d2",
"date": "date",
"party_size": 1
} {
"restaurant_id": "rid_104822",
"date": "2026-10-30",
"party_size": 6,
"slots": [
{
"slot_id": "sl_7f21",
"time": "19:00",
"area": "Dining room"
},
{
"slot_id": "sl_7f24",
"time": "19:30",
"area": "Patio"
}
],
"credit_card_required": true,
"cancellation_policy": "Cancel at least 24 hours before your reservation to avoid a fee."
} Returns each saved restaurant with its restaurant_id, name, cuisine and neighborhood. The agent uses them to search where you already like to eat. It does not change the list.
MCP callopentable_read → list_saved_restaurants
REST endpointGET https://cotlet.dev/api/v1/opentable/saved-restaurants
No parameters.
{
"saved": [
{
"restaurant_id": "rid_120771",
"name": "Harbor Room",
"cuisine": "Seafood",
"neighborhood": "Embarcadero"
},
{
"restaurant_id": "rid_104822",
"name": "Trattoria Verde",
"cuisine": "Italian",
"neighborhood": "Union Square"
}
]
} Returns the restaurant and whether it is saved now. It changes only your own list, reaches no one, and the same call with saved false undoes it, so it runs without asking you.
MCP callopentable_write → save_restaurant
REST endpointPOST https://cotlet.dev/api/v1/opentable/restaurants/{restaurant_id}/save
| Name | Type | Description |
|---|---|---|
| restaurant_id string required | string | A restaurant_id from search_restaurants. |
| saved boolean | boolean | true to save, false to remove. Defaults to true. |
{
"restaurant_id": "restaurant_8c41d2"
} {
"restaurant_id": "rid_120771",
"name": "Harbor Room",
"saved": true
} Booking, moving and cancelling reach the restaurant, so each waits for your OK. Bookings that need a card end with a link to finish in OpenTable.
Returns each reservation with its reservation_id, restaurant, date and time, party size, status and the confirmation number, upcoming ones soonest first. It reads what your account shows under your reservations. Bookings you made by phone with the restaurant show up only if the restaurant linked them to your OpenTable profile.
MCP callopentable_read → list_reservations
REST endpointGET https://cotlet.dev/api/v1/opentable/reservations
| Name | Type | Description |
|---|---|---|
| status string | string | upcoming or past. Defaults to upcoming. |
| limit integer | integer | How many reservations to return. |
{
"reservations": [
{
"reservation_id": "res_55120",
"restaurant": "Trattoria Verde",
"date": "2026-10-31",
"time": "19:00",
"party_size": 4,
"status": "confirmed",
"confirmation": "2048"
}
]
} Books the table in your name and the restaurant sees it in its reservation book, so the call waits for your approval. Where the restaurant requires a credit card, the call stops and returns a link to finish in OpenTable, because Cotlet never enters card details. Returns the reservation_id and the confirmation number. By default you confirm each call; you can switch that off for this tool.
MCP callopentable_write → book_reservation
REST endpointPOST https://cotlet.dev/api/v1/opentable/restaurants/{restaurant_id}/reservations
| Name | Type | Description |
|---|---|---|
| restaurant_id string required | string | A restaurant_id from search_restaurants. |
| slot_id string required | string | A slot_id from get_availability. |
| party_size integer required | integer | Number of guests, the same as in get_availability. |
| special_request string | string | A note for the restaurant, for example "high chair" or "birthday". |
{
"restaurant_id": "rid_104822",
"slot_id": "sl_7f21",
"party_size": 6,
"special_request": "Birthday dinner"
} {
"reservation_id": "res_55120",
"restaurant": "Trattoria Verde",
"date": "2026-10-30",
"time": "19:00",
"party_size": 6,
"status": "confirmed",
"confirmation": "2048"
} Changes the booking the restaurant sees, so the call waits for your approval. A new time must come from get_availability for the new party size. When the change is not possible, the reservation stays as it was and the call returns why. By default you confirm each call; you can switch that off for this tool.
MCP callopentable_write → modify_reservation
REST endpointPOST https://cotlet.dev/api/v1/opentable/reservations/{reservation_id}/modify
| Name | Type | Description |
|---|---|---|
| reservation_id string required | string | A reservation_id from list_reservations. |
| slot_id string | string | A new slot_id from get_availability. Leave out to keep the time. |
| party_size integer | integer | New number of guests. |
| special_request string | string | New note for the restaurant. |
{
"reservation_id": "reservation_8c41d2"
} {
"reservation_id": "res_55120",
"restaurant": "Trattoria Verde",
"date": "2026-10-31",
"time": "20:30",
"party_size": 4,
"status": "confirmed"
} Cancels the booking and frees the table for the restaurant, so the call waits for your approval. OpenTable asks diners to cancel at least 30 minutes ahead, and a restaurant can charge a fee under its own cancellation policy, which get_availability returns. A cancelled reservation cannot be restored; book again instead. By default you confirm each call; you can switch that off for this tool.
MCP callopentable_write → cancel_reservation
REST endpointPOST https://cotlet.dev/api/v1/opentable/reservations/{reservation_id}/cancel
| Name | Type | Description |
|---|---|---|
| reservation_id string required | string | A reservation_id from list_reservations. |
{
"reservation_id": "reservation_8c41d2"
} {
"reservation_id": "res_55120",
"restaurant": "Trattoria Verde",
"status": "cancelled"
} Needs an OpenTable for Restaurants login with the reservation book, Guestbook and waitlist. Notes and tags stay inside your team; the waitlist text goes to the guest.
Returns the reservations OpenTable for Restaurants shows for that date in time order, each with guest name, guest_id, time, party size, status, guest and visit tags, and the visit note. It needs an OpenTable for Restaurants login with access to the reservation book. It changes nothing.
MCP callopentable_read → list_restaurant_reservations
REST endpointGET https://cotlet.dev/api/v1/opentable/restaurant-reservations
| Name | Type | Description |
|---|---|---|
| date string required | string | Date in YYYY-MM-DD. |
| shift string | string | A shift name as your restaurant sets it, for example "Dinner". Defaults to all shifts. |
{
"date": "date"
} {
"date": "2026-10-27",
"reservations": [
{
"reservation_id": "rr_88410",
"time": "18:30",
"guest": "Alex Rivera",
"guest_id": "g_30115",
"party_size": 2,
"status": "confirmed",
"tags": [
"Anniversary"
],
"note": "Celebrating 10 years"
},
{
"reservation_id": "rr_88422",
"time": "19:15",
"guest": "Sam Lee",
"guest_id": "g_30422",
"party_size": 4,
"status": "confirmed",
"tags": [
"Shellfish allergy"
],
"note": ""
}
]
} Returns the guest's name, guest tags, notes and the number of past visits with the last visit date, as OpenTable for Restaurants shows them. Guest tags stay on the profile for future visits; visit tags belong to one reservation. Contact details are left out of the response.
MCP callopentable_read → get_guest
REST endpointGET https://cotlet.dev/api/v1/opentable/guests/{guest_id}
| Name | Type | Description |
|---|---|---|
| guest_id string required | string | A guest_id from list_restaurant_reservations. |
{
"guest_id": "guest_8c41d2"
} {
"guest_id": "g_30115",
"name": "Alex Rivera",
"tags": [
"Regular",
"Wine lover"
],
"notes": [
"Prefers a booth"
],
"visits": 9,
"last_visit": "2026-09-12"
} Returns the guest profile with its tags and notes after the change. Notes and tags are internal to your restaurant team; the guest is not told, and you remove them in the Guestbook in one step, so it runs without asking you. It only uses tags that exist in your restaurant's tag list.
MCP callopentable_write → add_guest_note
REST endpointPOST https://cotlet.dev/api/v1/opentable/guests/{guest_id}/note
| Name | Type | Description |
|---|---|---|
| guest_id string required | string | A guest_id from list_restaurant_reservations. |
| note string | string | Note text, for example "Prefers a quiet table". |
| tags array | array | Names of guest tags your restaurant already has, for example ["Shellfish allergy"]. |
{
"guest_id": "guest_8c41d2"
} {
"guest_id": "g_30422",
"name": "Sam Lee",
"tags": [
"Shellfish allergy",
"Regular"
],
"notes": [
"Allergy confirmed by phone"
]
} Returns each waiting party with its waitlist_id, guest name, party size, the time they joined and the quoted wait, in the order OpenTable for Restaurants shows them. It needs a restaurant login with access to the waitlist. It changes nothing.
MCP callopentable_read → list_waitlist
REST endpointGET https://cotlet.dev/api/v1/opentable/waitlists
No parameters.
{
"waitlist": [
{
"waitlist_id": "wl_3011",
"guest": "Jordan Park",
"party_size": 2,
"joined_at": "19:05",
"quoted_minutes": 25
},
{
"waitlist_id": "wl_3012",
"guest": "Taylor Green",
"party_size": 5,
"joined_at": "19:10",
"quoted_minutes": 40
}
]
} Sends the guest the table-ready text message OpenTable for Restaurants sends from the waitlist, so the call waits for your approval. A text cannot be taken back. Returns the party and the time the text went out. By default you confirm each call; you can switch that off for this tool.
MCP callopentable_write → notify_waitlist_party
REST endpointPOST https://cotlet.dev/api/v1/opentable/waitlists/{waitlist_id}/party/notify
| Name | Type | Description |
|---|---|---|
| waitlist_id string required | string | A waitlist_id from list_waitlist. |
{
"waitlist_id": "waitlist_8c41d2"
} {
"waitlist_id": "wl_3011",
"guest": "Jordan Park",
"party_size": 2,
"notified_at": "19:31"
} Your signed-in OpenTable profile, AES-256-GCM encrypted, in Finland. No password.
The 13 OpenTable tools. Never the cookie itself.
Your reservations, saved restaurants and profile; for a restaurant login, its book and Guestbook.
Card details, card holds, gift cards, your password and deleting the account.
Signing in can ask for a code by text or email. You type it, we never do.
Disable for agents, reset the browser, or sign out in OpenTable.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"You agree not to (and not to allow any third party to): (1) use any deep-link, robot, spider, scraper, generative AI or other AI technology including, but not limited to, those that operate by interacting with or otherwise making use of your browser, such as automated assistants or other automatic or manual device, process, or means to access, copy, search, or monitor any portion of the Services or OpenTable Content, except as expressly authorized by OpenTable."
This is the plainest ban on our way of working we have read in any app's terms. OpenTable lets AI book through partners it chose (ChatGPT, Gemini, Copilot, Perplexity, Alexa+), not through your own agent. The same section lets OpenTable cancel reservations and close accounts at its discretion. In public it enforces resale of reservations and no-shows: four no-shows in 12 months suspend an account. We found no case of a diner account closed for using an AI agent (checked 27 Oct 2026). Use these tools knowing the risk is yours.
Keep it to what you would do by hand: a check once a day on a restaurant, not a loop every minute, and cancel what you will not use.
When OpenTable renames a field or changes its booking steps, we change the tool and your prompts keep working. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Save a restaurant | save_restaurant with saved false, one call |
| Add a guest note or tag | Remove it in the Guestbook |
| Book or move a reservation | modify_reservation or cancel_reservation, after your OK |
| Cancel a reservation | None; book again if the time is still open |
| Text a waitlist party | None; a text cannot be taken back |
4 of 13 tools ask first: book_reservation, modify_reservation, cancel_reservation and notify_waitlist_party. Each one reaches a restaurant or a guest. Searches, saved restaurants and internal guest notes run at once. Switching the wait off is your choice, per tool.
Where a restaurant needs a card to hold the table, the booking stops with a link to finish in OpenTable. Cotlet never types card numbers.
{
"name": "book_reservation",
"arguments": {
"restaurant_id": "rid_104822",
"slot_id": "sl_7f21",
"party_size": 6,
"special_request": "Birthday dinner"
}
} curl -X POST https://cotlet.dev/api/v1/opentable/restaurants/rid_104822/reservations \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"slot_id":"sl_7f21","party_size":6,"special_request":"Birthday dinner"}' {
"reservation_id": "res_55120",
"restaurant": "Trattoria Verde",
"date": "2026-10-30",
"time": "19:00",
"party_size": 6,
"status": "confirmed",
"confirmation": "2048"
} Scripts and cron jobs call the same tools over REST at /api/v1/opentable, with the same key and price. A failed call costs nothing. Each tool in the list above shows its REST path.
About $12 a monthfor one diner with a daily watch on one restaurant, 1,990 credits. An OpenTable diner account is free.
| Job | Calls | Credits |
|---|---|---|
| Find and book a table | 4 × 3 | 120 |
| Watch a full restaurant, daily | 1 × 30 | 300 |
| Move a reservation | 3 × 1 | 30 |
| Check what is booked | 1 × 4 | 40 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 1,990 |
The month is our example: 3 bookings, 1 change, a daily check on one fully booked restaurant and 4 looks at what is booked. OpenTable publishes no reservations-per-diner figure, so the volume is our assumption. A restaurant that runs a daily floor briefing makes more calls. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| chrischall/opentable-mcp | MCP server that sends each request through your signed-in Chrome tab with a browser extension. Search, slots, book, modify, cancel, favorites. MIT, last commit 25 Oct 2026. | Alpha (v0.3.0), no stars yet. Works only while your own Chrome is open on your computer. |
| markswendsen-code/mcp-opentable | Community MCP server that drives the OpenTable website with Playwright: search and book. | Last commit 21 Apr 2026. OpenTable's bot protection answers scripted browsers with a challenge. |
| jtur671/opentable-watcher-mcp | Watches a restaurant for open times and alerts you. MIT, last commit 25 Jul 2026. | Watch and alert only; it does not book. |
| Apify OpenTable Booker | Hosted actor with MCP: search, availability, book, view and cancel. Paid per event, $3.99 per booking. | Diner side only. No restaurant book, Guestbook or waitlist. |
| Bright Data OpenTable MCP | Paid scraping of public OpenTable pages. | Public data only. It does not sign in or book. |
| ChatGPT restaurant booking | Search and reserve inside ChatGPT, through OpenTable as a partner. | Inside ChatGPT only; changes and cancellations go back to OpenTable. |
If you only book now and then from ChatGPT, its built-in booking is the official route and the safest one. Cotlet is for the rest: moving and cancelling, watching a full restaurant on a schedule, the restaurant side, and any agent besides ChatGPT, hosted.
Take Group sp. z o.o. runs Cotlet, a software company registered in Poland, EU (VAT PL6342984273), working since 2019 and founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the OpenTable tools go to contact@cotlet.dev.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open OpenTable under Integrations in the console and sign in to OpenTable in its Cloud Browser. The trial starts with your first app, no card asked.
Yes, for search and booking. Since 10 Aug 2026 ChatGPT can show OpenTable times and reserve a table in the chat, and sends you to OpenTable when a credit card is required (OpenAI Help Center release notes). It does not list, change or cancel the reservations on your account, and it does not work in Claude Code, n8n or a script. Cotlet does all of these on your own account.
OpenTable asks diners to cancel reservations they cannot honor at least 30 minutes ahead, and a restaurant can set its own cancellation policy with a fee (OpenTable Terms of Use). get_availability returns that policy before you book, and cancel_reservation cancels in one call after your OK.
An OpenTable for Restaurants login with access to the reservation book, the Guestbook and the waitlist. Guest tags stay on a guest profile for future visits, and visit tags stay on one reservation (OpenTable Support: Understand guest needs with custom tags).
It can check one restaurant on a schedule and book after your OK when a time opens. It cannot create tables that are not offered. OpenTable's terms ban reselling reservations, and a resold or unused booking puts the account at risk.
It works in your own OpenTable account on the OpenTable site of your country. Restaurants, times and card rules are what that site shows.
Only the way in differs. Both carry the same 13 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with OpenTable or Booking Holdings.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy