Request a table reservation
Creates a table reservation request. The restaurant approves or rejects it from its dashboard, and the guest gets an email when that happens (if you sent guestEmail). A new request always has status: "PENDING_APPROVAL" and tableId: null; the table is assigned on approval.
Follow the status with GET /orders/{token} using publicToken, or listen for the RESERVATION_APPROVED and RESERVATION_REJECTED webhooks. reservationId is the ID that webhooks call orderId.
The server checks the party size, the minimum notice and whether online booking is open. It does not check the time against opening hours or existing bookings, so only offer times from GET /dine-in/availability.
Idempotency-Key is supported. A replay with the same key and the same body returns the existing request with status 200 and idempotent: true; the same key with a different body returns 409 IDEMPOTENCY_CONFLICT.
Rate limit: 20 requests per 60 seconds per slug and IP. Walkthrough: Table reservations.
Authentication
Either this or a trusted browser origin. The restaurant’s API key, sent as Authorization: Bearer lbs_…. Use it from your server only, never in browser code. Keys are issued per restaurant by LettBestilt.
Either this or an API key. No key is needed when the request’s Origin header is trusted for this restaurant: https://{slug}.lettbestilt.no, a verified domain of the restaurant, or a partner origin LettBestilt has bound to the restaurant. Browsers set Origin themselves; it is not something you configure. Not accepted by GET /site-gate, which requires an API key.
Headers
Optional. 16–128 URL-safe characters (a-z, A-Z, 0-9, _, -).
Query parameters
Request
Start time in UTC (ISO 8601). Use iso from GET /dine-in/availability.
The guest’s consent to marketing. Requires guestEmail; the consent is stored in the restaurant’s subscriber list.
Optional. When the guest gave consent. Only allowed with marketingOptIn: true. If you leave it out, the server uses the time it received the request.
Campaign attribution: the value of ?lb_campaign=<id> from a LettBestilt campaign link. The reservation counts as a conversion for that campaign. Optional metadata: an invalid or unknown ID is dropped silently and never blocks the reservation. Note that orders call this field attributionCampaignId.
Response
The reservation’s ID. Webhooks call it orderId.
Use it with GET /orders/{token} to follow the status.
Always null when the request is created. Assigned when the restaurant approves it.

