Sites & Organisation

Shop

Shopfront endpoints.

get/shop/shop/offerings/{offeringType}/{offeringId}

Retrieve an Offering

getShopOffering

Use this endpoint to retrieve an Offering.

Path parameters

  • offeringIdobject-idrequired

    The ID of the Offering.

  • offeringTypestringrequired

    The type of Offering.

    Possible values:appointmentappointment_enquiryarea_bookingcoursehotel_room_reservationmembershippackageproductsessiontable_reservationvoucher

Responses

  • 200

    Successfully retrieved an Offering.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

get/shop/shop/appointment-tags

List storefront appointment tags

listShopAppointmentTags

Returns every AppointmentTag configured at the organisation level. Tags label appointment types for the storefront UI (e.g. "couples", "mens") so customers can filter by interest.

Tags are organisation-level, not site-level — pass the organisation_id whose sites you're rendering for.

Query parameters

  • organisation_iduuidrequired

    ID of the organisation to scope the listing to. Categories and appointment tags are organisation-level, not site-level — pass the org that owns the relevant sites.

Responses

  • 200

    A list of AppointmentTags for the organisation.

  • 401

    The user is unauthenticated

  • 422

    The request didn't pass validation

get/shop/shop/appointments

List storefront appointment types

listShopAppointmentTypes

Returns the customer-facing AppointmentTypes at the given site — only those with visibility=public or visibility=link_only. Use this to render the appointment menu on the booking storefront.

For staff-facing listings (including hidden appointment types) use GET /shop/appointment-types instead.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

Responses

  • 200

    A list of public-facing AppointmentTypes.

  • 401

    The user is unauthenticated

  • 422

    The request didn't pass validation

get/shop/shop/categories

List storefront categories

listShopCategories

Returns every Category configured for the organisation. Categories bucket offerings on the storefront ("Spa", "Salon", "Fitness") and drive the top-level navigation of the booking site.

Categories are organisation-level, not site-level — pass the organisation_id whose sites you're rendering for.

Query parameters

  • organisation_iduuidrequired

    ID of the organisation to scope the listing to. Categories and appointment tags are organisation-level, not site-level — pass the org that owns the relevant sites.

Responses

  • 200

    A list of Categorys for the organisation.

  • 401

    The user is unauthenticated

  • 422

    The request didn't pass validation

get/shop/shop/offerings

List storefront offerings

listShopOfferings

Returns every customer-facing Offering at the given site — appointments, area bookings, packages, products, and sessions — in the order they should appear in the storefront listing. The shape of each item depends on offering_type.

Optional filters narrow the listing by category_id, partner_id, or date (only offerings with availability on the given day are returned). When customer / frontend-guard auth is present, the result accounts for the customer's coupon codes when calculating displayed pricing.

This is the public storefront endpoint; results are filtered to visibility=public and visibility=link_only records.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

  • datedateoptional

    Optional date (YYYY-MM-DD) used to scope the listing to offerings that have availability on that day.

  • category_idstringoptional

    Filter the result to a single offering category.

  • partner_idstringoptional

    Restrict the listing to offerings the given partner is allowed to sell. Pass the partner key (e.g. ota).

Responses

  • 200

    A list of public-facing Offerings at the given site. Each entry can be an appointment, area booking, package, session, or product — the concrete shape varies per offering type.

  • 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/shop/offerings/{offeringType}/{offeringId}/cross-sell

List cross-sell offerings for an offering

listShopOfferingCrossSells

Returns the configured cross-sell offerings for the given Offering. Cross-sells are surface elsewhere in the booking flow (e.g. "Customers also booked...") to drive add-on revenue. The response shape is identical to GET /shop/shop/offerings.

Only appointment, package, and session offering types expose cross-sells; other types return 404.

Path parameters

  • offeringTypestringrequired

    The type of Offering.

    Possible values:appointmentappointment_enquiryarea_bookingcoursehotel_room_reservationmembershippackageproductsessiontable_reservationvoucher
  • offeringIdobject-idrequired

    The ID of the Offering.

Responses

  • 200

    A list of public-facing Offerings at the given site. Each entry can be an appointment, area booking, package, session, or product — the concrete shape varies per offering type.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

get/shop/shop/offerings/{offeringType}/{offeringId}/up-sell

List up-sell offerings for an offering

listShopOfferingUpSells

Returns the configured up-sell offerings for the given Offering. Up-sells are surfaced at checkout ("Upgrade to...") to encourage customers to choose a higher-margin alternative. The response shape is identical to GET /shop/shop/offerings.

Only appointment, package, and session offering types expose up-sells; other types return 404.

Path parameters

  • offeringTypestringrequired

    The type of Offering.

    Possible values:appointmentappointment_enquiryarea_bookingcoursehotel_room_reservationmembershippackageproductsessiontable_reservationvoucher
  • offeringIdobject-idrequired

    The ID of the Offering.

Responses

  • 200

    A list of public-facing Offerings at the given site. Each entry can be an appointment, area booking, package, session, or product — the concrete shape varies per offering type.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

get/shop/shop/practitioners

List storefront practitioners

listShopPractitioners

Returns every Practitioner working at the given site, with only the public-facing fields (name, profile photo, bio, title, pronouns). Used to populate practitioner pickers and "Meet the team" pages on the booking storefront.

The result is unpaginated and not site-permission gated — it mirrors what a public visitor sees in the storefront UI.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

Responses

  • 200

    A list of Practitioners with public-facing fields suitable for the booking storefront.

  • 401

    The user is unauthenticated

  • 422

    The request didn't pass validation

post/shop/shop/practitioners

Create a storefront practitioner

createShopPractitioner

Creates a new Practitioner from the storefront-facing API. The body uses the same Practitioner shape as the admin endpoint; this route exists for legacy storefront integrations that already target /shop/shop/practitioners instead of the canonical /shop/practitioners.

Requires the SETTINGS_MANAGE permission on each site listed in site_ids.

Request body

  • idobject-idrequired

    Stable identifier for the practitioner. Used when assigning sessions, appointments and rotas to the practitioner, and when the booking storefront resolves a slot to a specific staff member.

  • appointment_restrictionsobject[]required
  • avatarobjectoptional
  • can_offer_tagsstring[]required
  • genderstringoptionalnullable

    Self-identified gender of the practitioner, surfaced to guests who filter the booking storefront by practitioner gender. Free text — common values are female, male and non-binary. null when the practitioner hasn't supplied a value.

  • namestringrequired

    Public display name of the practitioner. Shown to guests on the booking storefront and on receipts. Should be the name the practitioner wants to appear in front of guests — typically first name plus last initial or full name.

  • organisation_iduuidrequired

    Organisation the practitioner belongs to. Practitioners are scoped to a single organisation and are not visible to API callers from other organisations.

  • site_idsstring[]required
  • tag_idsstring[]required
  • tagsobject[]required
  • zonesobject[]required
  • user_iduuidrequirednullable

    Staff User linked to this practitioner record, if any. Linking lets the user manage their own rota and view their appointments from the staff console. null for practitioners that don't have a login account.

  • created_atdate-timerequired

    When then resource was created.

  • updated_atdate-timerequired

    When then resource was last updated.

Responses

  • 201

    The practitioner was created.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation