Overview
Before creating a booking, your integration must walk through a sequence of availability checks. Each step validates that the requested combination of date, shift, experience, and add-ons is available for the given party size. The diagram below shows the complete flow at a high level.The availability object
Throughout this flow, many objects in the response carry their ownavailability object. Whenever an object includes an availability, it manages its own availability independently — this applies at every level, from the top-level request down to individual entities such as work days, shifts, time slots, experiences, add-on groups, individual add-ons, and floor plan areas, among others.
This means a parent being available does not imply its children are: a shift can be available while a specific experience or add-on within it is not. Always check the availability of every object before offering it to the customer, not just the top-level one.
Each availability object exposes:
isAvailable— whether that specific object is available. Always check this first.- When
isAvailableisfalse—outcome,code, anddetailexplain why, andfallbackOptionslists alternative actions to offer the customer (see Handle fallbackOptions).
Identifying a shift and a time slot
Several endpoints in this flow carry{date} and {time} in the path. Both
values come from the response that offered you the option — copy them, do not
compute them.
Shifts have no public identifier on purpose: the IDs behind a work day’s shifts
can change at any time, so a stored one would go stale without warning. The
booking window is the stable handle instead — any time between
firstBookingAt and lastBookingAt resolves to that shift, and the response
covers the whole shift. Calling once per candidate time returns the same thing
every time.
Send {time} as the local time inside that ISO value, with no offset — see
Time Zones.
Handle fallbackOptions
Whenavailability.isAvailable is false, the response includes a fallbackOptions array with one or more actions to offer the user. Always check this array before showing a generic error.
code sits beside them and says exactly which rule the request hit. Read it
when you want to tell the customer what to change rather than offer a generic
alternative — see AvailabilityCode.
Step 1 — Get Calendar Availability (optional)
Use this endpoint to retrieve availability across a date range. This is typically used to populate a calendar view before the user picks a specific date. It is not required — you can go directly to Get Work Day Availability if you already have a date. Endpoint:POST /availability/calendar
Step 2 — Get Work Day Availability
Retrieves availability for a specific date and returns the list of available shifts for the given party size. Endpoint:POST /availability/work-days/{date}
Always send
status: CONFIRMED on all availability requests. If no
availability is found, fallbackOptions may offer alternative actions — such
as requesting the booking or joining the wait list — depending on the venue
configuration.shifts[] array. Each shift exposes two flags that determine the next steps:
Step 3 — Experiences
Ifshift.hasExperiences is true, you must check experience availability before proceeding to Get Shift Availability.
Retrieves the experiences available for the selected shift. The response includes shift.isExperienceRequired, which determines whether the user must select an experience to continue or may proceed without one.
Endpoint: POST /availability/work-days/{date}/shifts/{time}/experiences
Ticket quantity
tickets is always required. automaticTicketQuantity decides who picks the
value.
When it is false, the customer picks. Offer this range:
When it is
true, compute the value instead of asking the customer:
bookingSize is the
booking size.
Booking size is checked separately against minBookingSize and
maxBookingSize; it does not constrain the ticket count.
Step 4 — Experience Add-ons
If the selected experience has add-ons, call this endpoint to retrieve the available add-ons. Endpoint:POST /availability/work-days/{date}/shifts/{time}/experiences/add-ons
Add-on availability is checked at three levels — the request (availability), the group (addOnGroup.availability), and each individual add-on (addOnGroup.addOns[].availability). Offer only the add-ons whose isAvailable is true, and if the group itself is unavailable, continue without add-ons. Once the group is available, use addOnGroup.minTotalQuantity to determine whether selecting an add-on is mandatory (> 0) or optional (= 0).
Step 5 — Get Shift Availability
Retrieves the available time slots within the selected shift. Endpoint:POST /availability/work-days/{date}/shifts/{time}/time-slots
How timeSlots[] is shaped
One entry per bookable combination of start time and floor plan area.startAt
is not unique — the same time comes back once per area, each entry with its own
availability — and the entries are not in chronological order.
Do not deduplicate by time: you would keep one area’s availability at random,
hiding times that were free and offering times that were full.
floorPlanAreas[] can be wider than what is bookable. An area appears there even
when it has no times of its own, so offer only the ones that also appear in
timeSlots[].
Carry the floor plan area forward
Every entry intimeSlots[] brings its own floorPlanAreaId. Send it on each
later call — add-ons, the final availability check and Create Booking. A null
means there is no area to send.
Step 6 — Time Slot Add-ons
Ifshift.hasAddOns is true, you must check time slot add-on availability after the user selects a time slot.
Add-on availability is checked at three levels — the request (availability), the group (addOnGroup.availability), and each individual add-on (addOnGroup.addOns[].availability). Offer only the add-ons whose isAvailable is true, and if the group itself is unavailable, continue without add-ons. Once the group is available, use addOnGroup.minTotalQuantity to determine whether selecting an add-on is mandatory (> 0) or optional (= 0).
Endpoint: POST /availability/work-days/{date}/time-slots/{time}/add-ons
Step 7 — Get Booking Availability
The final availability check before creating a booking. This endpoint validates the complete booking request and returns the applicable booking conditions, such as the cancellation policy, that must be presented to the user before proceeding. Endpoint:POST /availability/bookings/{date}/{time}
Add-on names and prices
The top-leveladdOns resolves everything you requested — the shift’s add-ons
and the experience’s, flattened — with their current name, price and currency,
in the language of the request. Build the booking summary from it rather than
from values cached earlier in the funnel, which can carry a price the venue has
since changed, or the language the customer had selected then.