Skip to main content
Authenticated API

This endpoint requires a valid JWT Bearer token. Accessible via the API gateway at /v1/commerce/*.

Reservations & Waitlist API

Manage restaurant reservations, check availability, and handle waitlist operations.

Authentication Required

All endpoints require a valid Bearer token. See Authentication for details.

Overview

AttributeValue
Base Path/api/v1/reservations, /api/v1/waitlist
AuthenticationBearer Token
Required Rolespos_staff, restaurant_staff, server, host, manager, restaurant_manager, tenant_admin, platform_admin, system_admin, super_admin

Reservation Endpoints

Create Reservation

Create a new reservation.

POST /api/v1/reservations

Request Body

{
"location_id": "loc_abc123",
"customer_name": "John Smith",
"customer_email": "john@example.com",
"customer_phone": "+1234567890",
"party_size": 4,
"reservation_date": "2026-01-25",
"reservation_time": "19:00",
"duration_minutes": 90,
"special_requests": "Anniversary dinner, quiet table",
"tags": ["anniversary", "vip"]
}

Response 201 Created

{
"id": "res_xyz789",
"confirmation_code": "RR-4521",
"location_id": "loc_abc123",
"customer_name": "John Smith",
"customer_email": "john@example.com",
"party_size": 4,
"reservation_datetime": "2026-01-25T19:00:00Z",
"duration_minutes": 90,
"status": "confirmed",
"table_preferences": [],
"special_requests": "Anniversary dinner, quiet table",
"created_at": "2026-01-24T10:00:00Z"
}

List Reservations

Retrieve reservations with filtering options.

GET /api/v1/reservations

Query Parameters

ParameterTypeDescription
location_iduuidFilter by location
datedateFilter by date (YYYY-MM-DD)
statusstringpending, confirmed, seated, completed, cancelled, no_show
customer_emailstringFilter by customer email
pageintegerPage number
limitintegerResults per page

Response

{
"data": [
{
"id": "res_xyz789",
"confirmation_code": "RR-4521",
"customer_name": "John Smith",
"party_size": 4,
"reservation_datetime": "2026-01-25T19:00:00Z",
"status": "confirmed",
"table_id": null,
"created_at": "2026-01-24T10:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 45
}
}

Get Reservation

Retrieve a single reservation by ID.

GET /api/v1/reservations/{id}

Update Reservation

Modify reservation details.

PUT /api/v1/reservations/{id}

Request Body

{
"party_size": 6,
"reservation_time": "19:30",
"special_requests": "Need high chair"
}

Update Reservation Status

Change reservation status.

PATCH /api/v1/reservations/{id}/status

Request Body

{
"status": "confirmed"
}

Status Values

StatusDescription
pendingAwaiting confirmation
confirmedConfirmed by restaurant
seatedGuest has been seated
completedVisit completed
cancelledCancelled by guest or restaurant
no_showGuest did not arrive

Cancel Reservation

Cancel a reservation.

POST /api/v1/reservations/{id}/cancel

Request Body

{
"reason": "Customer requested cancellation"
}

Confirm Reservation

Confirm a pending reservation.

POST /api/v1/reservations/{id}/confirm

Seat Reservation

Mark guest as seated and assign table.

POST /api/v1/reservations/{id}/seat

Request Body

{
"table_id": "tbl_002"
}

Mark No-Show

Mark a reservation as no-show.

POST /api/v1/reservations/{id}/noshow

Check Availability

Check available time slots for a date.

GET /api/v1/reservations/availability

Query Parameters

ParameterTypeDescription
location_iduuidRestaurant location
datedateDate to check
party_sizeintegerNumber of guests
duration_minutesintegerDesired duration (optional)

Response

{
"date": "2026-01-25",
"location_id": "loc_abc123",
"party_size": 4,
"available_slots": [
{
"time": "17:00",
"available_tables": 3,
"wait_time_minutes": 0
},
{
"time": "17:30",
"available_tables": 2,
"wait_time_minutes": 0
},
{
"time": "18:00",
"available_tables": 0,
"wait_time_minutes": 15
},
{
"time": "19:00",
"available_tables": 1,
"wait_time_minutes": 0
}
]
}

Waitlist Endpoints

Add to Waitlist

Add a party to the waitlist.

POST /api/v1/waitlist

Request Body

{
"location_id": "loc_abc123",
"customer_name": "Jane Doe",
"customer_phone": "+1234567890",
"party_size": 2,
"quoted_wait_minutes": 20,
"notes": "Prefers booth"
}

Response 201 Created

{
"id": "wl_abc123",
"position": 3,
"customer_name": "Jane Doe",
"party_size": 2,
"quoted_wait_minutes": 20,
"actual_wait_minutes": null,
"status": "waiting",
"check_in_time": "2026-01-24T18:30:00Z"
}

Get Waitlist

View current waitlist for a location.

GET /api/v1/waitlist

Query Parameters

ParameterTypeDescription
location_iduuidRestaurant location
statusstringwaiting, notified, seated, cancelled, expired

Response

{
"data": [
{
"id": "wl_abc123",
"position": 1,
"customer_name": "Jane Doe",
"party_size": 2,
"quoted_wait_minutes": 20,
"elapsed_wait_minutes": 12,
"status": "waiting"
}
],
"summary": {
"total_waiting": 5,
"average_wait_minutes": 18,
"longest_wait_minutes": 35
}
}

Get Wait Time Estimate

Get estimated wait time for a party size.

GET /api/v1/waitlist/estimate

Query Parameters

ParameterTypeDescription
location_iduuidRestaurant location
party_sizeintegerNumber of guests

Response

{
"location_id": "loc_abc123",
"party_size": 4,
"estimated_wait_minutes": 25,
"confidence": "high",
"current_waitlist_size": 5,
"tables_available_soon": 2
}

Get Waitlist Entry

Retrieve a specific waitlist entry.

GET /api/v1/waitlist/{id}

Update Waitlist Status

Change waitlist entry status.

PATCH /api/v1/waitlist/{id}/status

Request Body

{
"status": "notified",
"table_id": "tbl_005"
}

Notify Waitlist Party

Send notification that table is ready.

POST /api/v1/waitlist/{id}/notify

Sends SMS/push notification to customer.


Seat Waitlist Party

Seat a waitlist party at a table.

POST /api/v1/waitlist/{id}/seat

Request Body

{
"table_id": "tbl_005"
}

Cancel Waitlist Entry

Remove party from waitlist.

POST /api/v1/waitlist/{id}/cancel

Request Body

{
"reason": "Customer left"
}

Webhooks

EventDescription
reservation.createdNew reservation created
reservation.confirmedReservation confirmed
reservation.cancelledReservation cancelled
reservation.seatedGuest seated
reservation.no_showMarked as no-show
waitlist.addedParty added to waitlist
waitlist.notifiedParty notified table ready
waitlist.seatedWaitlist party seated

Error Responses

StatusCodeDescription
400invalid_dateDate format invalid
400invalid_party_sizeParty size must be 1-20
400past_datetimeCannot book in the past
404reservation_not_foundReservation ID not found
409no_availabilityNo tables available for time
409already_seatedReservation already seated