Skip to main content
When a booker picks a time, you often need a few moments for them to fill out a form before the booking is final. To avoid two people grabbing the same slot, use a hold-then-confirm pattern: reserve the slot to place a temporary hold, let the booker complete checkout, then confirm by creating the booking. If they never finish, the hold expires on its own. All requests use the base URL https://api.cal.id and are authenticated with a Bearer token.
Before you begin, make sure you have:
1

Reserve the slot

Call POST /slots/reserve with the eventTypeId (integer) and the slotStart (ISO) you want to hold. Optionally pass slotDuration (minutes) and reservationDuration (how long to hold the slot, in minutes).
The reservation is returned in data as reservationUid — note the field is not called uid. Keep it; you need it to release the hold early. The hold lasts 5 minutes unless you pass reservationDuration (in minutes).
2

Confirm the booking

While the hold is active, let the booker finish checkout, then create the booking as usual with POST /booking/ (its body includes eventTypeId, start, end, and responses with name and email). See Create a booking for the full flow.If the booking isn’t confirmed within reservationDuration minutes, the hold expires automatically and the slot becomes available to others again.
3

Release the hold

If the booker cancels or backs out before confirming, release the hold early instead of waiting for it to expire. Call DELETE /slots/\{reservationUid\} with the reservationUid from Step 1.

Slot reservation reference

A successful reservation does not guarantee the booking will succeed. POST /slots/reserve does not re-check availability — reserving a time that GET /slots/ never offered returns 200, and the later POST /booking/ then fails with no_available_users_found_error. Always reserve a slot that came back from GET /slots/.