Reference

REST API v1

All endpoints are JSON over HTTPS under /api/v1. Reservation endpoints accept either the internal id or the guest-safe publicReference.

Restaurant

GET/v1/restaurants/{restaurantId}/config

Restaurant profile, active locations, and the booking policy your UI should respect.

scope: config:read

Response 200
{
  "restaurant": { "id": "rst_1", "name": "Atelier Lindenhof", "timezone": "Europe/Berlin" },
  "locations": [
    { "id": "loc_1", "name": "Berlin Mitte", "city": "Berlin", "timezone": "Europe/Berlin" }
  ],
  "reservation": {
    "minPartySize": 1,
    "maxPartySize": 12,
    "defaultDurationMinutes": 120,
    "minLeadTimeMinutes": 30,
    "maxAdvanceBookingDays": 90,
    "slotIntervalMinutes": 30
  },
  "features": { "waitlist": true, "webhooks": true, "reservationChanges": true }
}
GET/v1/restaurants/{restaurantId}/opening-hours

Weekly opening hours, upcoming special days, and the active availability rules.

scope: config:read

Query parameters
locationIdstring requiredFalls back to the key's location if bound

Availability

GET/v1/restaurants/{restaurantId}/availability

Bookable slots for a date and party size. Slots already account for existing bookings, buffers, slot limits, lead time, and table capacity, including combinations.

scope: availability:read

Query parameters
locationIdstring requiredLocation to search
dateYYYY-MM-DD requiredService date
partySizeinteger required1 to 30 guests
durationMinutesintegerOverride the default duration
intervalMinutesintegerSlot grid, defaults to the service interval
POST/v1/restaurants/{restaurantId}/availability/search

Identical to the GET form with the parameters as a JSON body, for clients that prefer POST.

scope: availability:read

Reservations

POST/v1/restaurants/{restaurantId}/reservations

Create a booking. Tables are assigned automatically; the guest profile is created or updated by email. Send an Idempotency-Key header so retries are safe.

scope: reservations:write

Body
locationIdstring requiredLocation to book
startTimeISO 8601 requiredStart of the reservation
partySizeinteger required1 to 30 guests
guest.firstNamestring requiredGuest first name
guest.lastNamestring requiredGuest last name
guest.emailstring requiredGuest email, used for confirmations
guest.phonestringOptional phone number
durationMinutesintegerOverride the policy duration
specialRequestsstringFree text shown to staff
Response 201
{
  "reservation": {
    "id": "res_9f31",
    "publicReference": "rr_7f3a91",
    "status": "confirmed",
    "startTime": "2026-06-12T17:00:00.000Z",
    "endTime": "2026-06-12T19:00:00.000Z",
    "partySize": 4,
    "tableIds": ["t-03"],
    "guest": { "firstName": "Mara", "lastName": "Schneider", "email": "mara@example.com" }
  }
}
GET/v1/restaurants/{restaurantId}/reservations

List bookings, optionally filtered by date and location. Returns at most 200 rows.

scope: reservations:read

Query parameters
dateYYYY-MM-DDLimit to one service date
locationIdstringLimit to one location
GET/v1/reservations/{idOrReference}

Fetch a single booking by internal id or public reference.

scope: reservations:read

PATCH/v1/reservations/{idOrReference}

Change status or table assignment. Status moves trigger guest emails and webhooks.

scope: reservations:write

Body
statusenumpending, confirmed, seated, completed, cancelled, no_show
tableIdsstring[]Replace the table assignment
cancellationReasonstringStored when status becomes cancelled
DELETE/v1/reservations/{idOrReference}

Cancel a booking. Already cancelled bookings return unchanged; completed ones answer 409.

scope: reservations:cancel

Query parameters
reasonstringOptional cancellation reason

Waitlist

POST/v1/restaurants/{restaurantId}/waitlist

Add a guest to the waitlist when a service is full. Creates or updates the guest profile and fires waitlist.created.

scope: waitlist:write

Body
locationIdstring requiredLocation to wait for
desiredDateYYYY-MM-DD requiredService date
partySizeinteger required1 to 30 guests
earliestTimeHH:MMEarliest acceptable time
latestTimeHH:MMLatest acceptable time
guestobject requiredSame shape as reservation guest
notesstringFree text for staff

Guests

GET/v1/restaurants/{restaurantId}/customers

List guest profiles with consent and privacy state. Returns at most 200 rows.

scope: customers:read

POST/v1/restaurants/{restaurantId}/customers

Create or update a guest profile by email. Staff-created profiles record how consent was given through consentSource.

scope: customers:write

Body
firstNamestring requiredGuest first name
lastNamestring requiredGuest last name
emailstring requiredDeduplication key per restaurant
phonestringOptional phone
consentSourceenumphone, email, walk_in, reservation, not_recorded
marketingConsentbooleanDefaults to false
notesstringService notes

Webhook test

POST/v1/webhooks/test

Dispatch a signed test event to every webhook subscribed to the event type, and record the deliveries in the log.

scope: webhooks:test

Body
eventTypestringDefaults to reservation.created
webhookIdstringOptional marker echoed in the payload