Skip to content

Holds

A hold claims a slot without booking it, so you can assemble the rest of a package or take a payment while the table stays yours. It occupies a real table from the moment it is taken and counts against availability exactly as a booking does.

A hold has no guest and does not appear in GET /v1/reservations. It becomes a booking through POST /v1/reservations with a hold_id. Every endpoint here uses the reservation scopes — there is no separate hold scope. The fields, the two kinds and the four statuses are on The hold object.

Endpoint What it does
POST /v1/holds Takes the slot off sale. Idempotency-Key is required, and expires_at in the response is the deadline — the server clamps whatever you asked for.
GET /v1/holds Lists the restaurant’s holds that did not become bookings, newest first.
GET /v1/holds/{id} Retrieves one hold, including a released, expired or converted one.
DELETE /v1/holds/{id} Gives the table back before the deadline. Releasing an already-released or expired hold returns the same hold with 200.

GET /v1/holds returns live, released and expired holds. One that converted is absent, because it is a reservation now and belongs to GET /v1/reservations. Its hold id still resolves on GET /v1/holds/{id}, answering status: "converted" and naming the booking in reservation.

Hold a slot walks the sequence, and Change a held time covers moving one.