Booking Flow

Availability

Retrieve availability for an offering.

get/shop/item-availability/appointment-enquiries/{appointmentTypeId}

Check ability to enquire at the given times

actionCheckAppointmentEnquiryAvailability

Use this endpoint to check availability for an appointment enquiry

Path parameters

Query parameters

  • date_time_fromstringrequired

    The earliest time the appointment could start.

  • date_time_tostringrequired

    The latest time the appointment could end.

Responses

  • 200

    Results of the availability check for an appointment enquiry

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

get/shop/availability-details

Get availability details for a date

getAvailabilityDetails

Returns an exhaustive availability snapshot for a single site/date, combining opening hours, calendar availability, practitioner and room schedules, equipment, and the periods already occupied by existing bookings or blocks.

The endpoint powers Trybe's calendar day view and the booking workflow's "explain" panel — the same payload is used to render why a slot is or isn't bookable.

Scope the response to a single offering by supplying both offering_type and offering_id. When omitted, the response includes every practitioner, room and equipment item at the site and skips offering-specific calendars.

The current user must have the reservations.manage permission on the site to call this endpoint.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

  • datedate-timerequired

    The date on which to inspect availability. Expressed as an ISO-8601 date-time anchored in the site's local timezone. Only the date portion is significant — the endpoint always returns availability for the full day.

  • offering_typestringoptional

    The type of offering to scope availability to. Required when offering_id is provided. When omitted, the response includes every practitioner, room and equipment item at the site and skips offering-specific calendars.

    Possible values:appointmentarea_bookingsessioncourseproductpackagevoucher
  • offering_idobject-idoptional

    The identifier of an offering (e.g. an AppointmentType or AreaBookingType) to focus the response on. When supplied together with offering_type, the response includes the offering's calendar availability and only the practitioners, rooms and equipment associated with that offering.

Responses

  • 200

    The availability details were successfully retrieved.

  • 400

    The request failed.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/item-availability/appointment-slots/{siteId}/{appointmentTypeId}

List appointment slots

listAppointmentSlotsByRange

Returns every bookable slot for the given AppointmentType at the given site between date_time_from and date_time_to. Each entry includes the slot's start/end time, eligible practitioners, current capacity, and the per-slot price.

For ranges of one day or less the server runs a live availability check; longer ranges fall back to the cached schedule.

exclude_appointments / exclude_basket_items let you ignore existing bookings or basket items during an edit flow so the item being edited doesn't block itself.

Path parameters

  • siteIduuidrequired

    The ID of the site the offering belongs to.

  • appointmentTypeIdmongo-idrequired

    The ID of the appointment type to check availability for.

Query parameters

  • date_time_fromstringrequired

    Earliest date-time to consider, in ISO-8601 format in the offering's site timezone (e.g. 2026-06-01T09:00:00+01:00).

  • date_time_tostringrequired

    Latest date-time to consider. Must be strictly after date_time_from. For per-day endpoints, the range may not exceed a single day.

  • durationintegeroptional

    Override the offering's default duration, in minutes. Must be positive.

  • practitioner_idstringoptional

    Limit slots to a single practitioner. The practitioner must be eligible to deliver the appointment type.

  • practitioner_idsstringoptional

    Comma-separated requested practitioner IDs bound to the exact quote, in place of practitioner_id when an appointment is held to several practitioners. Only slots in which all of these practitioners are available are listed.

  • replacement_item_idstringoptional

    Existing standalone appointment item to replace. Requires basket_id; the item must belong to that basket and site. The quote binds this item identity and excludes only its booking from pricing demand. General availability exclusions do not affect pricing demand. Submit the token to this item's update endpoint.

  • practitioner_genderstringoptional

    Requested practitioner gender bound to the exact appointment quote. Availability is independently verified on acceptance.

    Possible values:malefemale
  • equipment_idsstringoptional

    Comma-separated requested equipment IDs bound to the exact quote. Only slots in which all of this equipment is available are listed. Availability is independently verified on acceptance.

  • room_idstringoptional

    Requested room for the exact priced selection. Only slots in which this room is available are listed.

  • exclude_appointmentsstringoptional

    Comma-separated list of existing appointment IDs to ignore when calculating resource conflicts. Use this when re-checking availability during an appointment-edit flow so the appointment being edited doesn't block itself.

  • exclude_basket_itemsstringoptional

    Comma-separated list of basket-item IDs to ignore. Mirrors exclude_appointments / exclude_bookings but for items already in the caller's basket.

  • basket_idstringoptional

    Basket ID to scope the check to. The server reads the basket's coupon codes (for price computation) and excludes its items when computing conflicts.

  • guest_idstringoptional

    Guest ID to attribute the slot to. Drives per-guest booking limits.

  • required_quantityintegeroptional

    Number of guests/instances the slot must accommodate. Defaults to 1.

Responses

  • 200

    A list of bookable AppointmentAvailabilitySlots plus a meta block with the practitioner roster and selection mode.

  • 400

    The request could not be completed.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

get/shop/item-availability/area-booking-slots/{areaBookingTypeId}

List area-booking slots

listAreaBookingSlotsByRange

Returns every bookable slot for the given AreaBookingType between date_time_from and date_time_to. The range may not exceed one day — large windows are rejected with 400 Bad Request.

Slots are ordered earliest first; ties on start time are broken by shortest duration first. Pass quantity to size the slot up for multiple guests (mutually exclusive with guest_id).

Path parameters

  • areaBookingTypeIdmongo-idrequired

    The ID of the area booking type to check availability for.

Query parameters

  • date_time_fromstringrequired

    Earliest date-time to consider, in ISO-8601 format in the offering's site timezone (e.g. 2026-06-01T09:00:00+01:00).

  • date_time_tostringrequired

    Latest date-time to consider. Must be strictly after date_time_from. For per-day endpoints, the range may not exceed a single day.

  • durationintegeroptional

    Override the offering's default duration, in minutes. Must be positive.

  • exclude_bookingsstringoptional

    Comma-separated list of existing area-booking IDs to ignore when calculating area conflicts.

  • exclude_basket_itemsstringoptional

    Comma-separated list of basket-item IDs to ignore. Mirrors exclude_appointments / exclude_bookings but for items already in the caller's basket.

  • basket_idstringoptional

    Basket ID to scope the check to. The server reads the basket's coupon codes (for price computation) and excludes its items when computing conflicts.

  • guest_idstringoptional

    Guest ID to attribute the slot to. Drives per-guest booking limits.

  • quantityintegeroptional

    Number of guests/instances the slot must accommodate. Defaults to 1.

Responses

  • 200

    A list of AreaBookingSlots for the requested day. Slots are ordered earliest first, then shortest first when start times match.

  • 400

    The request failed.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

post/shop/item-availability/multi-appointment-slots

List combined slots for multiple appointment types

actionCheckMultiAppointmentAvailability

Returns the set of start times on a given day where every requested AppointmentType can be booked back-to-back at the same site. Used by the booking UI when a customer adds multiple appointments to their basket and expects them to chain together.

The response is a list of MultiAppointmentSlotGroups — one per viable start time, each containing the individual slots in order.

Deprecated. The server logs every call to this endpoint as a deprecated request. Prefer building the chain with per-type appointment-slots calls if you are starting from scratch.

Request body

  • site_idstringrequired

    ID of the site to search at.

  • datedaterequired

    Day to slot the appointments into, ISO-8601 YYYY-MM-DD in the site's timezone.

  • itemsobject[]required

    One entry per appointment type to chain. Order matters — each item slots immediately after the previous one.

  • practitioner_idstringoptional

    Preferred practitioner for the chain. Types offered by this practitioner are constrained to them; other types retain their own practitioners. Accept each returned practitioner_id.

  • basket_idstringoptional

    Basket to exclude from the conflict calculation (useful when re-checking after an edit).

Responses

  • 200

    A list of MultiAppointmentSlotGroups — one per common start time that can host every requested appointment type in sequence.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

get/shop/item-availability/offering-dates

List availability by day for an offering

listOfferingDateAvailability

Returns one OfferingDateAvailability per day in the date_from..date_to range, indicating whether the offering has any bookable slots on that day plus the cheapest slot price. Use this to drive a calendar UI that greys-out unbookable days without firing a slot-level query per day.

The maximum supported range is 31 days. Larger ranges return 400 Bad Request.

Supports appointment, session, package, and area_booking offering types.

Query parameters

  • date_fromdaterequired

    First date in the requested window (inclusive), ISO-8601 YYYY-MM-DD in the offering's site timezone.

  • date_todaterequired

    Last date in the requested window (inclusive). For most offerings the range may not exceed 31 days.

  • offering_idstringrequired

    The offering whose date-by-date availability should be returned. Must be paired with offering_type so the platform knows which catalogue to look the ID up in (appointments, sessions or packages). Returns 422 if the ID does not resolve to a live offering of the supplied type.

  • offering_typestringrequired

    The kind of offering offering_id refers to.

    Possible values:appointmentsessionpackagearea_booking
  • quantityintegeroptional

    Number of guests/instances the slot must accommodate. Defaults to 1.

  • partner_idstringoptional

    Restrict the check to the given partner's allotment. Pass the partner's partner_id (e.g. ota).

Responses

  • 200

    Per-day availability for an offering across the requested date range. Each entry is one calendar day.

  • 400

    The request failed.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

get/shop/item-availability/package-slots/{packageId}/choices/{choiceId}

List bookable slots for a package choice

listPackageChoiceSlots

Returns, for each option of a Package choice, the bookable slots on the requested day. Each option's slots mirror the per-offering availability endpoints (appointment-slots, area-booking-slots, etc.) — the option's item_type drives which fields are populated.

Pass package_item_id or basket_item_id when editing an existing item so its own booking does not block the check.

Path parameters

  • packageIdmongo-idrequired

    The ID of the package to check availability for.

  • choiceIdmongo-idrequired

    The ID of the package item choice (the slot in the package that's being filled).

Query parameters

  • datedaterequired

    The day to list slots for, ISO-8601 YYYY-MM-DD in the package site's timezone.

  • option_idstringoptional

    Only return slots for the given option of the choice.

  • basket_idstringoptional

    Basket ID to scope the check to. The server reads the basket's coupon codes (for price computation) and excludes its items when computing conflicts.

  • basket_item_idstringoptional

    ID of the basket item being edited. Its own bookings are excluded so its times still appear available, and package rules are taken into account. The basket is inferred from it.

  • package_item_idstringoptional

    ID of the package item being edited. Takes precedence over basket_item_id and basket_id.

Responses

  • 200

    The options of a single package choice, each with its bookable slots on the requested day.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation

get/shop/item-availability/products/{productId}

Get product stock availability

getProductAvailability

Returns the current sellable stock for the given Product at its site. Stock-tracking products return their on-hand count; non-tracking products return a large sentinel quantity_available (effectively unlimited).

Use this just before adding a product to a basket to confirm the unit is still purchasable.

Path parameters

  • productIdmongo-idrequired

    The ID of the product to check availability for.

Responses

  • 200

    Current stock availability for the requested Product.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

get/shop/item-availability/sessions/{siteId}/{sessionTypeId}

List session occurrences

listSessionOccurrences

Returns every scheduled SessionType occurrence between date_time_from and date_time_to (or the whole calendar days between date_from and date_to), with current capacity and pricing. Use this to build the customer-facing session calendar.

Unlike appointments, session occurrences are pre-scheduled — the endpoint reads the published rota rather than computing slots from rules.

Send either the date_time_from/date_time_to pair or the date-only date_from/date_to pair. Prefer the date-only pair when you want whole site-local days: the server resolves the day boundaries with the site's timezone rules, so the client never has to compute a UTC offset itself.

Path parameters

  • siteIduuidrequired

    The ID of the site the offering belongs to.

  • sessionTypeIdmongo-idrequired

    The ID of the session type to check availability for.

Query parameters

  • date_time_fromstringoptional

    Earliest date-time to consider, in ISO-8601 format in the offering's site timezone (e.g. 2026-06-01T09:00:00+01:00). Required unless date_from is sent.

  • date_time_tostringoptional

    Latest date-time to consider. Must be strictly after date_time_from. Required unless date_to is sent.

  • date_fromdateoptional

    First date in the requested window (inclusive), ISO-8601 YYYY-MM-DD in the offering's site timezone. The server resolves the day's boundaries using the site's timezone rules. Required unless date_time_from is sent.

  • date_todateoptional

    Last date in the requested window (inclusive). Must be on or after date_from. Required unless date_time_to is sent.

  • basket_idstringoptional

    Basket ID to scope the check to. The server reads the basket's coupon codes (for price computation) and excludes its items when computing conflicts.

  • guest_idstring[]optional

    Comma-separated IDs of the guests the occurrence is for. Drives per-guest booking limits.

  • quantityintegeroptional

    Number of guests/instances the slot must accommodate. Defaults to 1.

  • basket_item_idstringoptional

    Selected Session Basket Item being replaced. Only its booking is excluded from demand; sibling bookings still count. The item must belong to basket_id at this Site.

Responses

  • 200

    A list of SessionAvailabilityOccurrences for the requested window.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

  • 422

    The request didn't pass validation