Table reservations
Table reservations on LettBestilt are requests. The guest picks a time on your site, the restaurant approves or rejects the request in its dashboard, and the guest gets an email either way, as long as you sent guestEmail. A reservation is not an order: it has no food and no payment.
Check restaurant.capabilities.reservations before you show a booking form. The TypeScript examples use API, SLUG and headers from the shared setup.
Show available times
Ask for one date (Oslo time) and party size:
Slots are 15 minutes apart. Show time to the guest and keep iso for the request. available: false means no table fits the party at that time. Times outside opening hours, inside the restaurant’s minimum notice, or after the restaurant has closed online booking are left out. A party larger than maxPartySize gets no slots, so ask the guest to call instead.
Send the request
The response is 201 with status: "PENDING_APPROVAL". Tell the guest that the restaurant will confirm by email. Always send guestEmail if you can: without it, the guest cannot be told the answer.
The server checks the party size, the minimum notice and whether online booking is open, but not the time against existing bookings. Only offer times from the availability endpoint.
Follow the answer
The restaurant approves (and assigns a table) or rejects the request. You can follow it in two ways:
- Poll
GET /orders/{publicToken}. The status isPENDING_APPROVAL, thenCONFIRMEDorCANCELLED. - Webhooks:
RESERVATION_REQUESTEDwhen the request is created, thenRESERVATION_APPROVED(withtableId) orRESERVATION_REJECTED(with the restaurant’sreason, if any). Webhooks call the reservation’s IDorderId; it is the same value asreservationId. See Webhooks.
Errors
Retrying with the same Idempotency-Key and body returns the existing request with status 200 and idempotent: true, so a network error never creates two requests.

