Customer Booking Lifecycle
Manage bookings from the customer's perspective — cancel, edit, personalize, and accept invitations.
For creating bookings, see Order & Checkout Flow. For admin booking management, see Admin Booking Lifecycle. For general conventions, see JSON-API Conventions.
Prerequisites
- A booking associated with the authenticated customer account, or
- A booking number/code for unauthenticated lookup
Booking Statuses
| Status | Meaning |
|---|---|
reserved |
Temporary hold (in cart, not yet completed) |
requested |
Submitted by customer, awaiting admin approval |
accepted |
Accepted and active |
invited |
Participant invited, not yet accepted |
rejected |
Request denied by admin. If payment already exists, the rejection results in a full refund. |
canceled |
Canceled by customer or admin. Refunds follow the configured cancellation policy. |
expired |
Expired because the booking was not checked in within the configured check-in window. |
Looking Up Bookings
Request path documentation:
paths/public/bookings.yamlforGET /api/v1/bookings/by-number
By Booking Number
GET /api/v1/bookings/by-number?number={booking_number}
Accepts an optional hash parameter for terminal/kiosk authentication.
Cancelling a Booking
Request path documentation:
paths/public/bookings.yamlforGET /api/v1/bookings/{booking_id}/cancel
Step 1 — Preview Cancellation Terms
Before cancelling, check the cancellation policy:
GET /api/v1/bookings/{booking_id}/cancellation-preview
Returns the applicable cancellation fee based on how far in advance the cancellation is made. The response includes:
- The fee percentage or amount
- The refund amount
- The deadline for the current fee tier
Step 2 — Cancel
GET /api/v1/bookings/{booking_id}/cancel
The cancellation can apply to a single booking or an entire recurring series, depending on the booking type. Refunds and invoice adjustments are handled automatically.
Accepting or Rejecting Invitations
When a participant is invited to a booking (status: invited):
Accept
POST /api/v1/bookings/{booking_id}/accept-invite
Updates the participant's status to accepted.
Reject
POST /api/v1/bookings/{booking_id}/reject-invite
Removes the participant from the booking.
Personalization
Submit custom form data for a booking (e.g. dietary preferences, t-shirt size):
POST /api/v1/bookings/{booking_id}/personalization
{
"field_uuid_1": "Vegetarian",
"field_uuid_2": "L",
"email": "jane@example.com"
}
The required fields are dynamic — they depend on the service's CustomForm configuration. A CustomForm defines which fields are available and which are mandatory. Fetch the service's custom form to discover the expected field UUIDs and types before submitting personalization data.
Editing an Accepted Booking
Edit Participants
POST /api/v1/bookings/{booking_id}/edit-participants
{
"participants": [
{
"email": "jane@example.com",
"name": "Jane Doe",
"attending_virtually": false
}
]
}
| Field | Type | Description |
|---|---|---|
email |
string | Participant email (max 200 chars) |
name |
string | Participant display name |
can_edit |
boolean | Whether the participant can edit their own data |
attending_virtually |
boolean | Virtual attendance flag |
Edit Service Options (Add-Ons)
Change add-on selections on an accepted booking:
POST /api/v1/bookings/{booking_id}/edit-service-options
{
"addons": [
{ "add_on_id": "{add_on_uuid}", "quantity": 2 }
]
}
Note: This endpoint is only available when the service has
canEditServiceOptionsenabled.
Edit Booking Date/Time (Rebooking)
Change the date, time, or resource of an accepted booking:
POST /api/v1/bookings/{booking_id}/edit-booking-base-data
{
"start_date": "2026-04-16T10:00:00+02:00",
"end_date": "2026-04-16T11:00:00+02:00",
"resource_id": "{new_resource_uuid}"
}
The new time is validated against availability. If the edit creates a price difference, the order is recalculated automatically.
Each edit endpoint (edit-participants, edit-service-options, edit-booking-base-data) is self-contained — a successful response means the edit is applied. There is no separate "finish edit" endpoint.
Cancel an In-Progress Edit
If you started an edit but want to revert:
GET /api/v1/bookings/{booking_id}/cancel-edit-booking
Reverts the booking to its original state before the edit was initiated.
Instant Booking
Request path documentation:
paths/public/bookings.yamlforPOST /api/v1/bookings/instant
Create and complete a booking immediately in a single request:
POST /api/v1/bookings/instant
{
"start_date": "2026-04-15T09:00:00+02:00",
"end_date": "2026-04-15T10:00:00+02:00",
"resource_id": "{resource_uuid}",
"service_id": "{service_uuid}"
}
This flow is documented in the customer API only. It requires an authenticated customer context and a service that supports instant bookings (controlled by the can_instant_book flag in the service's meta configuration).
Common Errors
| Error | Cause | Solution |
|---|---|---|
403 — unauthorized |
Not the booking owner or participant | Verify customer account matches |
422 — booking not cancelable |
Booking status doesn't allow cancellation | Check status — only accepted and requested bookings can be cancelled |
422 — slot unavailable |
Rebooking to an occupied time slot | Check availability before editing base data |
404 — booking not found |
Invalid number or code | Verify the booking number/code |