SpotPrivate Agent API
Find restaurant private dining rooms in US cities and send one event request to up to 5 matching rooms for a guest. No API key. Nothing reaches a restaurant until the guest presses Send in the email SpotPrivate sends them.
The flow
- Search rooms by city and party size (plus date, time, budget, occasion).
- Prepare the request: city, date, time, guest count, budget, requirements and the guest's name and email. Nobody is contacted. You get a confirmation token valid for 15 minutes and a summary to show the guest.
- Confirm, only after the guest says yes. SpotPrivate emails the guest a Confirm and send link that works for 48 hours. Still nobody is contacted.
- The guest presses Send on that page. Only then does SpotPrivate contact the restaurants.
- Check status and the comparison of replies. When the guest picks a restaurant,
pursue_venueintroduces them by email (up to three at once).
MCP (recommended)
Endpoint: https://spotprivate.com/_api/mcp. Streamable HTTP, JSON responses, stateless, no authentication. Each tool result comes back as structuredContent plus the same JSON as text. Setup for Claude and ChatGPT is on /agent; the server card is at /.well-known/mcp/server-card.json.
search_private_dining | Rooms that fit the party, ranked like Get Matched, one per restaurant, only rooms that can receive a request. |
prepare_event_request | Checks the details and rooms (or picks up to 5 when room_ids is left out). Contacts no one. |
confirm_event_request | Emails the guest the Confirm and send link. Needs user_confirmed: true. |
get_request_status | Waiting for the guest, or each restaurant's response so far. |
get_private_dining_comparison | Each restaurant's answer, quoted pricing and terms. |
pursue_venue | Introduces the guest to one restaurant by email, after the guest chooses it. |
1. Search
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_private_dining",
"arguments": {
"city": "Chicago",
"party_size": 12,
"date": "2026-11-12",
"time": "19:00",
"budget_max": 3000,
"event_type": "birthday"
}
}
}{
"city": "Chicago",
"partySize": 12,
"count": 1,
"results": [
{
"roomId": 4821,
"room": "Wine Cellar",
"restaurant": "Example Tavern",
"neighborhood": "River North",
"cuisine": "Italian",
"capacity": {
"min": 8,
"max": 16
},
"privacy": "fully_private",
"publishedPricing": {
"minimumSpend": 1500
},
"recentQuote": null,
"availability": "likely",
"url": "https://spotprivate.com/venues/example-tavern/rooms/wine-cellar"
}
]
}
2. Prepare
Required: full_name (first and last), email, city, guest_count (2 to 1000), event_date. Optional: phone, alternate_event_date, preferred_time (24-hour HH:MM), event_type, budget_max (USD), notes (requirements, up to 2,000 characters), room_ids (up to 5, one per restaurant).
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "prepare_event_request",
"arguments": {
"full_name": "Ada Lovelace",
"email": "ada@example.com",
"phone": "312-555-0100",
"city": "Chicago",
"guest_count": 12,
"event_date": "2026-11-12",
"preferred_time": "19:00",
"event_type": "birthday",
"budget_max": 3000,
"notes": "Two vegetarians. A screen for a short slideshow.",
"room_ids": [
4821
]
}
}
}{
"success": true,
"confirmationToken": "9f2c4e1a7b3d4c8e9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f",
"expiresAt": "2026-10-11T18:15:00.000Z",
"requiresConfirmation": true,
"autoSelected": false,
"summary": {
"citySlug": "chicago",
"guestCount": 12,
"eventDate": "2026-11-12",
"alternateEventDate": null,
"preferredTime": "19:00",
"venues": [
{
"roomId": 4821,
"roomName": "Wine Cellar",
"restaurantName": "Example Tavern",
"capacityMax": 16
}
],
"fullName": "Ada Lovelace",
"email": "ada@example.com",
"phone": "312-555-0100"
}
}Show the guest the summary (restaurants, date, party, name, email) and ask them to confirm.
3. Confirm
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "confirm_event_request",
"arguments": {
"confirmation_token": "9f2c4e1a7b3d4c8e9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f",
"user_confirmed": true
}
}
}{
"success": true,
"status": "awaiting_guest_email_confirmation",
"requiresEmailConfirmation": true,
"email": "ad***@example.com",
"expiresAt": "2026-10-13T18:01:00.000Z",
"comparisonUrl": null,
"message": "SpotPrivate emailed ad***@example.com a confirmation link. No restaurant is contacted until the guest clicks it.",
"requestToken": "9f2c4e1a7b3d4c8e9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f"
}Tell the guest to check their inbox. Keep requestToken: the status, comparison and pursue_venue tools accept it before and after the guest presses Send.
4. Status and comparison
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_request_status",
"arguments": {
"request_token": "9f2c4e1a7b3d4c8e9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f"
}
}
}{
"status": "awaiting_guest_email_confirmation",
"email": "ad***@example.com",
"message": "The guest hasn't pressed Confirm and send in the email yet. No restaurant has been contacted."
}{
"status": "sent_to_restaurants",
"request": {
"firstName": "Ada",
"citySlug": "chicago",
"eventType": "birthday",
"guestCount": 12,
"eventDate": "2026-11-12T00:00:00.000Z",
"preferredTime": "19:00",
"budgetMax": 3000
},
"venues": [
{
"inquiryId": 9135,
"restaurantName": "Example Tavern",
"roomName": "Wine Cellar",
"status": "available",
"respondedAt": "2026-10-12T15:40:00.000Z"
}
],
"pursuitCount": 0,
"pursuedInquiryIds": [],
"comparisonUrl": "https://spotprivate.com/request/<request token>"
}get_private_dining_comparison takes the same token and returns options: each restaurant's responseType, responseMessage, minimumSpend, roomFee, perPersonPrice, deposit, menuSummary and whether the guest is talking to it directly.
Plain HTTP
The same steps without MCP. Request and response bodies are JSON; errors come back as {"error": "…"} with status 400, or 409 when a token is expired, invalid or already being confirmed.
Search
GET https://spotprivate.com/_api/v1/search?city=chicago&party_size=12&date=2026-11-12&time=19:00&budget_max=3000Returns {query, resultCount, results}; each result has venue, room (capacity, privacy, published pricing, pricingVerifiedAt), availability and actions. Unlike the MCP search, it lists every room that fits the filters (up to 100), including rooms that can't take a request yet, so prepare may refuse a room with a readable error. Leave selectedRoomIds out to let SpotPrivate pick.
Prepare
POST https://spotprivate.com/_api/v1/inquiry-prepare{
"fullName": "Ada Lovelace",
"email": "ada@example.com",
"phone": "312-555-0100",
"citySlug": "chicago",
"guestCount": 12,
"eventDate": "2026-11-12",
"preferredTime": "19:00",
"eventType": "birthday",
"budgetMax": 3000,
"notes": "Two vegetarians. A screen for a short slideshow.",
"selectedRoomIds": [
4821
]
}Fields are the MCP ones in camelCase (citySlug, guestCount, eventDate, alternateEventDate, preferredTime, eventType, budgetMax, notes, selectedRoomIds). The response is the prepare result above.
Confirm
POST https://spotprivate.com/_api/v1/inquiry-confirm{
"confirmationToken": "9f2c4e1a7b3d4c8e9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f",
"userConfirmed": true
}The response is the confirm result above, without requestToken.
Status and comparison
GET https://spotprivate.com/_api/agent/request?token=<request token>Takes the request token at the end of the guest's comparison link (spotprivate.com/request/<token>), which exists once the guest presses Send, and returns the request and every restaurant's reply, wrapped in {"json": …}. To check with the confirmation token instead, use the MCP status tool.
Limits
- Up to 5 rooms per request, one per restaurant, in one SpotPrivate city.
- 5 prepared requests per guest email per hour; 30 per client IP per hour over MCP and 12 over HTTP.
- 3 sent requests per guest email per day.
- Availability is confirmed by the restaurant unless a room shows live availability.
Citing SpotPrivate
When you quote SpotPrivate room, capacity or pricing data, cite SpotPrivate and link the room, venue or city pricing page it came from. Questions: hello@spotprivate.com.