Date-level availability vs. slot-level inventory
There is no single “list availabilities” endpoint — which one to call depends oninventorySelectionType (NORMAL or SEATMAP), and which level of detail you need:
- Use the date-level (Availabilities) call to power a date picker or calendar — it tells you which dates have any open inventory, before the user has picked a time slot.
- Use the slot-level (Inventory) call once a date is picked — it returns the exact time slots, remaining seats/pax, and slot-level pricing needed for checkout.
- Both levels must always be called in real time — never cache or reuse availability or inventory responses.
- Inventory is time-slot based and highly dynamic — slots can sell out or open up between the user browsing and completing checkout.
remaining count and availability status
remaining is present on every inventory and availability response — seatmap and non-seatmap alike. It is not restricted to seatmap products.
NORMALproducts (Availabilities-Normal, Inventory-Normal): each item has both anavailabilitystatus (LIMITED/UNLIMITED/CLOSED) and aremainingcount.remainingis only meaningful whenavailabilityisLIMITED— forUNLIMITEDslots,remainingis a sentinel value (1000) and should not be shown as the real seat count.SEATMAPproducts (Availabilities-Seatmap, Inventory-Seatmap): there is no separateavailabilitystatus field. Availability is expressed purely throughremaining— at the top level (total across the show), and persection(total across that section’s seats).remaining: 0means sold out; a missing seat/section means it isn’t bookable.
Pax types
- Pax types are defined at the time slot level. They can differ between slots for the same variant
- Fetch pax types as the last step, once a time slot is selected. Read them from
pricing.persons[]on the inventory response for that slot, and build the guest-count selector from that list. Re-read them every time the user picks a different slot - Treat
persons[].typeas an opaque identifier: showname(anddescriptionwhen present) to the user, and sendtypeback unchanged aspersonTypein the booking request personsis empty forPER_GROUPvariants. Price those from thegroupstiers instead of showing a pax type selector- Common examples: Adult, Child, EU Adult, Non-EU Adult. The actual set varies per slot
- See Pax Types for the reference list. Use it to understand what the values look like, not as a list to enumerate in code
pricing.persons[].ageFrom / ageTo on the inventory response for that time slot. A type named “Child” doesn’t have a fixed age band; check ageFrom/ageTo on that specific inventory entry to know which ages qualify. ageTo: null means no upper age limit.
Pricing
Pricing surfaces at four levels in the API — product, variant, date, and slot. Which one to show depends on which page you’re rendering. They are not interchangeable:
Fields inside
pricing:
currency— currency code for the returned priceprofileType—PER_PERSONorPER_GROUPheadoutSellingPrice— the Headout selling price (minimum selling price, MSP) — partners must not sell below this, at any page levelnetPrice— partner net price (API Partner accounts)commissionAmount— commission amount (Affiliate accounts)
pricing is the minimum bookable price across all variants and time slots for that product. A product with a single variant can still show different starting prices on different dates because slot-level and supplier-backed inventory varies — treat the starting price as the lowest currently-known starting point, not a fixed quote.
Deprecated: listingPrice. The older listingPrice object (with minimumPrice, bestDiscount, etc.) is deprecated. It is still returned for backward compatibility but should not be used in new integrations — read pricing instead.