Offerings catalog

Appointment Types

An AppointmentType is the catalog record for a bookable appointment — what it's called, how long it runs, which practitioners can deliver it, the rooms and equipment it consumes, its pricing, deposit and cancellation policy, and the categories it appears in on the booking storefront. Appointment types are the source the booking flow reads from when listing offerings and computing slot availability; the resulting booking is an Appointment.

The AppointmentType object

Attributes

{
  "id": "64a9f3b2c3d8e1f4a5b6c7d8",
  "allocate_multi_capacity_rooms": false,
  "canada_rmt_eligible": false,
  "categories": [
    {
      "id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "name": "Massages",
      "voucher_applicable": false
    }
  ],
  "category_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "contraindications": [
    {
      "condition": "blood_pressure",
      "indication": "conditional",
      "notes": "Free-form text from the resource."
    }
  ],
  "cross_sell_offerings": [
    "string"
  ],
  "currency": "gbp",
  "customer_cancellation_min_duration": "P7D",
  "customer_cancellation_permitted": "allowed",
  "customers_only": false,
  "description": "Free-form text from the resource.",
  "durations": [
    1
  ],
  "end_buffer": 1,
  "enquiries_enabled": false,
  "external_id": "00000000-0000-0000-0000-000000000000",
  "equipment_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "image": "string",
  "include_pricing_on_calendar": false,
  "max_advance_bookings_interval": "string",
  "max_guests": 1,
  "practitioners_per_guest": 1,
  "max_per_basket": 1,
  "max_per_guest": 1,
  "members_only": false,
  "membership_booking_windows": [
    {
      "membership_type_id": "00000000-0000-0000-0000-000000000000",
      "max_advance_bookings_interval": "P2W",
      "min_advance_bookings_interval": "P2D"
    }
  ],
  "membership_booking_windows_enabled": false,
  "meta": {
    "description": "Free-form text from the resource.",
    "title": "string"
  },
  "min_advance_bookings_interval": "string",
  "min_guests": 1,
  "name": "Alex Morgan",
  "offered_online": false,
  "permitted_membership_type_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "private": false,
  "product_code": "string",
  "practitioner_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "price_rules": [
    {
      "id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "appointment_type_id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "date_from": "2026-01-15",
      "date_to": "2026-01-15",
      "duration": 1,
      "price": 1,
      "time_from": "12:00",
      "time_to": "16:00",
      "weekdays": [
        "string"
      ]
    }
  ],
  "related_retail_offerings": [
    "string"
  ],
  "revenue_centre": "string",
  "room_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "shop_practitioner_selection": "by_name",
  "site_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "start_time_interval": 1,
  "tag_ids": [
    "64a9f3b2c3d8e1f4a5b6c7d8"
  ],
  "tags": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "Alex Morgan",
      "organisation_id": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "upsell_offerings": [
    "string"
  ],
  "visibility": "public",
  "deleted_at": "2025-02-04T12:00:00+01:00",
  "updated_at": "2025-02-04T12:00:00+01:00"
}
get/shop/appointment-types

List appointment types

listAppointmentTypes

Returns a paginated list of AppointmentTypes configured at the given site, ordered by name. Use this to power a settings dashboard or to populate a booking-frame selector. The list includes archived items only when archived=true is passed.

Requires the RESERVATIONS_VIEW permission on the site.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

  • pageintegeroptional

    The page to retrieve results from

  • per_pageintegeroptional

    The number of results to return per page

  • archivedbooleanoptional

    Whether to include archived resources in the response. When true, archived resources are returned; when false or omitted, only non-archived resources are returned.

  • practitioner_idstringoptional

    Filter results to appointment types that include the given practitioner in their practitioner_ids. Comma-separate to OR multiple practitioners (e.g. practitioner_id=abc,def).

  • category_idstringoptional

    Filter results to appointment types that include the given category in their category_ids. Comma-separate to OR multiple categories.

Responses

  • 200

    A paginated list of AppointmentTypes for the requested site.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

post/shop/appointment-types

Create an appointment type

createAppointmentType

Creates a new AppointmentType at the given site(s). The minimum body is name + site_ids; everything else has sensible defaults. Requires the SETTINGS_MANAGE permission on every site listed in site_ids.

If max_guests > 1, shop_practitioner_selection is forced to null server-side regardless of the value sent — multi-guest appointments don't support per-guest practitioner choice today.

Query parameters

  • site_idstringrequired

    Filter results by the site they belong to

  • pageintegeroptional

    The page to retrieve results from

  • per_pageintegeroptional

    The number of results to return per page

  • archivedbooleanoptional

    Whether to include archived resources in the response. When true, archived resources are returned; when false or omitted, only non-archived resources are returned.

  • practitioner_idstringoptional

    Filter results to appointment types that include the given practitioner in their practitioner_ids. Comma-separate to OR multiple practitioners (e.g. practitioner_id=abc,def).

  • category_idstringoptional

    Filter results to appointment types that include the given category in their category_ids. Comma-separate to OR multiple categories.

Request body

  • namestringrequired

    Display name for the appointment type. Visible to customers in the booking flow and to staff in the admin UI. Plain text only — HTML tags are rejected at validation time.

  • descriptionstringoptional

    Long-form description shown to customers when they're selecting the appointment type. Markdown is rendered.

  • product_codestringoptionalnullable

    Optional product code used to map this appointment type to an external POS or PMS catalog. Free-form string; uniqueness is not enforced server-side.

  • external_idstringoptionalnullable

    External identifier used by integrations to reference this offering. Free-form.

  • currencystringoptional

    The ISO-4217 currency code.

  • site_idsstring[]required

    One or more site IDs to offer this appointment type at. The caller's API key must have access to every listed site; requests with a site they don't own get 422.

  • organisation_iduuidoptional

    Optional organisation to attribute this offering to. Defaults to the caller's primary organisation if omitted.

  • practitioner_idsstring[]optional

    Practitioners who can perform this appointment type. Only practitioners belonging to one of the listed site_ids are accepted — others are silently filtered out.

  • equipment_idsstring[]optional

    Equipment required to run this appointment type.

  • room_idsstring[]optional

    Rooms where this appointment type can be held. Filtered to rooms belonging to one of the listed site_ids.

  • category_idsstring[]optional

    Category IDs the appointment type belongs to. Used for shopfront grouping.

  • tag_idsstring[]optional

    Free-form tag IDs for filtering and reporting.

  • durationsinteger[]optional

    Available durations in minutes. The customer picks one when booking; the duration then determines the price (via price rules) and the time slot allocated.

  • start_time_intervalintegeroptional

    The granularity (in minutes) at which start times are offered. 15 means slots are offered at :00, :15, :30, :45.

  • end_bufferintegeroptionalnullable

    Minutes of buffer time added after the appointment ends. Useful for clean-up, resets, or practitioner breaks. The calendar slot is reserved for duration + end_buffer.

  • offered_onlinebooleanoptional

    When true, the appointment type is bookable via the public shopfront. When false, it's bookable only via the admin UI. Defaults to false.

  • privatebooleanoptional

    When true, only customers with the direct link can book this appointment type.

  • visibilitystringoptional

    Visibility override. When set, controls who can see this offering in the shopfront beyond the offered_online/private defaults.

    Possible values:publichiddenmembers_only
  • customers_onlybooleanoptional

    When true, only registered customers (not guests) can book.

  • members_onlybooleanoptional

    When true, only members of permitted membership types can book.

  • permitted_membership_type_idsstring[]optionalnullable

    Membership type IDs whose members are allowed to book. Only relevant when members_only=true. Membership types from outside the site's brand are silently filtered out.

  • When true, members can book further in advance than the standard window. The exact extra advance period per membership type is defined in membership_booking_windows.

  • Per-membership-type advance-booking-window overrides.

  • min_guestsintegeroptionalnullable

    Minimum number of guests for a single booking.

  • max_guestsintegeroptionalnullable

    Maximum number of guests for a single booking. If greater than 1, shop_practitioner_selection is forced to null (multi-guest bookings don't support per-guest practitioner choice).

  • max_advance_bookings_intervalstringoptionalnullable

    ISO 8601 duration limiting how far in advance customers can book. e.g. P30D = 30 days, P1Y = 1 year. Null means unbounded.

  • min_advance_bookings_intervalstringoptionalnullable

    ISO 8601 duration limiting how soon before the appointment a customer can book. e.g. PT2H = at least 2 hours' notice.

  • customer_cancellation_permittedstringoptionalnullable

    Whether and when customers can cancel a booking themselves. allowed = always. if_unpaid = only if no payment has been taken. disallowed = never (admin only).

    Possible values:allowedif_unpaiddisallowed
  • ISO 8601 duration before the appointment start during which cancellation is no longer permitted. e.g. PT24H = no cancellation in the last 24 hours.

  • When true, this appointment type can be assigned to rooms with multi-guest capacity. Otherwise each booking exclusively occupies the room.

  • Whether to surface the price alongside the offering in calendar views.

  • max_per_basketintegeroptionalnullable

    Maximum number of this appointment type per basket.

  • max_per_guestintegeroptionalnullable

    Maximum number of this appointment type per individual guest within a basket.

  • revenue_centrestringoptionalnullable

    Identifier of the revenue centre that bookings of this appointment type post to. Must be a valid revenue centre for every site in site_ids.

  • shop_practitioner_selectionstringoptionalnullable

    Controls whether and how the customer is asked to pick a practitioner on the shopfront. forced = required; optional = nice-to-have; disabled = practitioner is auto-assigned. Forced to null when max_guests > 1.

    Possible values:forcedoptionaldisabled
  • contraindicationsobject[]optional

    Health declarations to surface before booking is allowed. Each entry pairs a condition (e.g. pregnant, recent surgery) with an indication (cannot-book / requires-disclaimer / etc.).

  • availability_rulesobject[]optional

    Per-day availability rules for when this appointment type can be booked. See AvailabilityRule schema for shape.

  • upsell_offeringsobject[]optional

    Other offerings to upsell on the booking confirmation page.

  • cross_sell_offeringsobject[]optional

    Other offerings to cross-sell during the booking flow.

  • image_idstringoptionalnullable

    ID of an uploaded Media to use as the cover image.

  • metaobjectoptional

    SEO metadata for the public shopfront page.

Responses

  • 201

    A single AppointmentType.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/appointment-types/{appointmentTypeId}

Retrieve an appointment type

getAppointmentType

Returns the full AppointmentType for the given ID. Use this to populate an admin edit screen or to look up settings when building a booking against a known offering.

Path parameters

Responses

  • 200

    A single AppointmentType.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

put/shop/appointment-types/{appointmentTypeId}

Update an appointment type

updateAppointmentType

Partially updates an AppointmentType. Every field is optional; only fields you send are written. Fields you omit retain their current values.

Requires the SETTINGS_MANAGE permission on at least one of the appointment type's sites. As with create, max_guests > 1 forces shop_practitioner_selection to null.

Path parameters

Request body

  • namestringoptional

    Display name. Plain text only — HTML tags are rejected.

  • descriptionstringoptionalnullable

    Long-form description shown to customers. Markdown rendered.

  • product_codestringoptionalnullable

    External POS/PMS product code.

  • external_idstringoptionalnullable

    External identifier used by integrations.

  • priceintegeroptionalnullable

    Base price in the smallest currency unit (e.g. pence/cents). Most appointments instead use price rules; this field is a flat override for the simplest case.

  • currencystringoptional

    The ISO-4217 currency code.

  • practitioner_idsstring[]optional

    Practitioners who can perform this type. Filtered to those at the appointment type's site.

  • equipment_idsstring[]optional

    Equipment IDs required to run this appointment type. Bookings are only offered for time slots where at least one of each listed equipment is available.

  • room_idsstring[]optional

    Rooms where the type can be held. Filtered to the appointment type's site.

  • category_idsstring[]optional

    Category IDs for shopfront grouping.

  • tag_idsstring[]optional

    Tag IDs for filtering and reporting.

  • durationsinteger[]optional

    Available durations in minutes.

  • start_time_intervalintegeroptional

    Granularity (in minutes) at which start times are offered.

  • end_bufferintegeroptionalnullable

    Buffer minutes added after the appointment ends.

  • offered_onlinebooleanoptional

    Whether bookable via the public shopfront.

  • privatebooleanoptional

    When true, only customers with the direct link can book.

  • visibilitystringoptional

    Visibility override that determines who sees this offering on the shopfront. public shows it to everyone; hidden keeps it out of search and browse (still bookable by direct link); members_only restricts to authenticated members of permitted membership types.

    Possible values:publichiddenmembers_only
  • customers_onlybooleanoptional

    Restrict booking to registered customers.

  • members_onlybooleanoptional

    Restrict booking to permitted membership-type holders.

  • permitted_membership_type_idsstring[]optionalnullable

    Membership types whose members can book when members_only=true.

  • Whether to apply per-membership-type advance-booking windows.

  • Per-membership-type advance-window overrides.

  • min_guestsintegeroptionalnullable

    Minimum guests per booking.

  • max_guestsintegeroptionalnullable

    Maximum guests per booking. When > 1, shop_practitioner_selection is forced to null server-side.

  • max_advance_bookings_intervalstringoptionalnullable

    ISO 8601 max-advance booking duration.

  • min_advance_bookings_intervalstringoptionalnullable

    ISO 8601 min-advance booking duration.

  • customer_cancellation_permittedstringoptionalnullable

    Customer self-cancellation policy.

    Possible values:allowedif_unpaiddisallowed
  • ISO 8601 duration before start at which cancellation is locked.

  • Whether multi-capacity rooms can host this type.

  • Surface prices in calendar views.

  • max_per_basketintegeroptionalnullable

    Max of this type per basket.

  • max_per_guestintegeroptionalnullable

    Max of this type per guest per basket.

  • revenue_centrestringoptionalnullable

    Revenue centre to post bookings to. Must be valid for the appointment type's site.

  • shop_practitioner_selectionstringoptionalnullable

    Shopfront practitioner-selection mode. Forced to null when max_guests > 1.

    Possible values:forcedoptionaldisabled
  • contraindicationsobject[]optional

    Health-declaration prompts.

  • availability_rulesobject[]optional

    Per-day availability rules.

  • upsell_offeringsobject[]optional

    Upsell candidates at booking confirmation.

  • cross_sell_offeringsobject[]optional

    Cross-sell candidates during booking.

  • image_idstringoptionalnullable

    ID of an uploaded Media for the cover image.

  • metaobjectoptional

    SEO metadata for the shopfront page.

Responses

  • 200

    A single AppointmentType.

  • 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

delete/shop/appointment-types/{appointmentTypeId}

Delete an appointment type

deleteAppointmentType

Soft-deletes the appointment type. Existing bookings are unaffected; the type is removed from new-booking flows. Use POST .../restore to bring it back.

409 Conflict if the appointment type is referenced by any Package's item choices — remove it from those packages first.

Path parameters

Responses

  • 204

    Appointment type deleted successfully.

  • 400

    Deletion blocked because the appointment type is referenced by existing packages. The response body lists the package names.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

post/shop/appointment-types/{appointmentTypeId}/copy

Duplicate an appointment type

copyAppointmentType

Creates a copy of an existing AppointmentType with new fields applied from the request body. Useful when seeding a new offering off an existing one rather than building from scratch. The new appointment type is created under the same site(s) and organisation as the original; you can override most fields by sending them in the body.

Requires the SETTINGS_MANAGE permission on the original appointment type's site.

Path parameters

Request body

  • namestringrequired

    Display name for the new copy. Required so the copy is distinguishable from the source.

  • external_idstringoptionalnullable

    Override external identifier on the copy. Defaults to null so integrations don't accidentally see two offerings with the same external id.

  • priceintegeroptionalnullable

    Base price in the smallest currency unit.

  • currencystringoptional

    The ISO-4217 currency code.

  • descriptionstringoptionalnullable

    Override the customer-facing long-form description. Defaults to the source's description when omitted. Markdown rendered.

  • organisation_iduuidoptional

    Override organisation; defaults to the source's.

  • practitioner_idsstring[]optional

    Override the practitioner allowlist on the copy. Filtered to practitioners at the appointment type's site; defaults to the source's list.

  • equipment_idsstring[]optional

    Override the equipment requirement. Defaults to the source's equipment list.

  • room_idsstring[]optional

    Override the rooms where the copy can be held. Filtered to the appointment type's site.

  • category_idsstring[]optional

    Override the shopfront category memberships on the copy.

  • tag_idsstring[]optional

    Override the reporting/filtering tags on the copy.

  • durationsinteger[]optional

    Override the available durations (in minutes) on the copy.

  • start_time_intervalintegeroptional

    Override the start-time granularity (in minutes) on the copy. 15 means slots are offered at :00, :15, :30, :45.

  • offered_onlinebooleanoptional

    Whether the copy is bookable via the public shopfront. Defaults to the source's value.

  • privatebooleanoptional

    When true, only customers with the direct link can book the copy.

  • visibilitystringoptional

    Visibility override on the copy. Same semantics as on the source.

    Possible values:publichiddenmembers_only
  • customers_onlybooleanoptional

    When true, only registered customers (not guests) can book the copy.

  • members_onlybooleanoptional

    When true, only members of permitted membership types can book the copy.

  • permitted_membership_type_idsstring[]optionalnullable

    Membership types whose members can book the copy when members_only=true.

  • Whether to apply per-membership-type advance-booking windows on the copy.

  • Per-membership-type advance-window overrides on the copy.

  • max_advance_bookings_intervalstringoptionalnullable

    ISO 8601 duration limiting how far in advance customers can book the copy. e.g. P30D = 30 days.

  • min_advance_bookings_intervalstringoptionalnullable

    ISO 8601 duration limiting how soon before the appointment start a customer can book the copy. e.g. PT2H = at least 2 hours' notice.

  • When true, the copy can be assigned to rooms with multi-guest capacity; otherwise each booking exclusively occupies the room.

  • customer_cancellation_permittedstringoptionalnullable

    Customer self-cancellation policy on the copy. allowed = always; if_unpaid = only if no payment has been taken; disallowed = never.

    Possible values:allowedif_unpaiddisallowed
  • ISO 8601 duration before the appointment start during which cancellation is no longer permitted on the copy.

  • Whether to surface the price alongside the offering in calendar views on the copy.

  • max_per_basketintegeroptionalnullable

    Maximum number of the copy per basket.

  • max_per_guestintegeroptionalnullable

    Maximum number of the copy per individual guest within a basket.

  • revenue_centrestringoptionalnullable

    Revenue centre identifier that bookings of the copy post to. Must be a valid revenue centre for the appointment type's site.

  • shop_practitioner_selectionstringoptionalnullable

    Shopfront practitioner-selection mode on the copy. Forced to null when max_guests > 1.

    Possible values:forcedoptionaldisabled
  • contraindicationsobject[]optional

    Override the contraindication prompts on the copy.

  • availability_rulesobject[]optional

    Override the per-day availability rules on the copy.

  • upsell_offeringsobject[]optional

    Override the upsell candidates surfaced at booking confirmation on the copy.

  • cross_sell_offeringsobject[]optional

    Override the cross-sell candidates surfaced during the booking flow on the copy.

  • metaobjectoptional

    SEO metadata for the copy's shopfront page.

Responses

  • 201

    A single AppointmentType.

  • 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

post/shop/appointment-types/{appointmentTypeId}/restore

Restore a deleted appointment type

restoreAppointmentType

Un-deletes a previously soft-deleted AppointmentType. The appointment type returns to its pre-deletion state, including all sites, practitioners, and rules. Existing bookings against it remain unaffected by either the delete or the restore.

Requires the SETTINGS_MANAGE permission on the appointment type's site. No request body.

Path parameters

Responses

  • 200

    A single AppointmentType.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

get/shop/appointment-types/{appointmentTypeId}/availability-rules

List availability rules for an appointment type

listAppointmentTypeAvailabilityRules

Returns all AvailabilityRules configured on an AppointmentType. Availability rules carve up the working calendar into windows when bookings can or cannot happen — useful for blocking holidays, restricting weekend hours, or making a treatment available only during specific seasons.

Rule semantics: any is_available: false rule overrides any is_available: true rule for the same time period.

Path parameters

Responses

  • 200

    A list of AvailabilityRules on an AppointmentType.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

post/shop/appointment-types/{appointmentTypeId}/availability-rules

Create an availability rule for an appointment type

createAppointmentTypeAvailabilityRule

Adds a new AvailabilityRule to an AppointmentType. With is_available: true the rule opens new bookable windows; with is_available: false it blocks them. Omitting date/time/weekday filters means the rule applies always.

Requires the SETTINGS_MANAGE permission on the appointment type's site.

Path parameters

Request body

  • is_availablebooleanoptional

    Whether the window is bookable. false rules override true rules.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive).

  • date_todateoptionalnullable

    Last date this rule applies (inclusive).

  • time_fromstringoptionalnullable

    Daily start time in HH:MM.

  • time_tostringoptionalnullable

    Daily end time in HH:MM.

  • min_durationintegeroptionalnullable

    Match only for durations ≥ this many minutes.

  • max_durationintegeroptionalnullable

    Match only for durations ≤ this many minutes.

  • weekdaysstring[]optional

Responses

  • 201

    A single AvailabilityRule.

  • 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/appointment-types/{appointmentTypeId}/availability-rules/{availabilityRuleId}

Retrieve an availability rule

getAppointmentTypeAvailabilityRule

Returns a single AvailabilityRule belonging to the given AppointmentType.

Path parameters

Responses

  • 200

    A single AvailabilityRule.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

put/shop/appointment-types/{appointmentTypeId}/availability-rules/{availabilityRuleId}

Update an availability rule

updateAppointmentTypeAvailabilityRule

Replaces an AvailabilityRule. The server validates the same shape as on create, so is_available is required. Requires the SETTINGS_MANAGE permission on the appointment type's site.

Path parameters

Request body

  • is_availablebooleanrequired

    Whether the window is bookable. false rules override true rules.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive).

  • date_todateoptionalnullable

    Last date this rule applies (inclusive).

  • time_fromstringoptionalnullable

    Daily start time in HH:MM.

  • time_tostringoptionalnullable

    Daily end time in HH:MM.

  • min_durationintegeroptionalnullable

    Match only for durations ≥ this many minutes.

  • max_durationintegeroptionalnullable

    Match only for durations ≤ this many minutes.

  • weekdaysstring[]optional

Responses

  • 200

    A single AvailabilityRule.

  • 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

delete/shop/appointment-types/{appointmentTypeId}/availability-rules/{availabilityRuleId}

Delete an availability rule

deleteAppointmentTypeAvailabilityRule

Removes an AvailabilityRule from an AppointmentType. Calendar availability is recomputed from the remaining rules. Existing bookings are unaffected.

Path parameters

Responses

  • 204

    Availability rule deleted successfully.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

get/shop/appointment-types/{appointmentTypeId}/price-rules

List price rules for an appointment type

listAppointmentTypePriceRules

Returns all PriceRules configured for the given AppointmentType, filterable by date range and weekday. Price rules determine the price a customer pays based on when the appointment is booked — peak vs off-peak, weekday vs weekend, seasonal overrides, etc. The first rule whose conditions match the booking time wins.

Path parameters

Query parameters

  • date_fromdateoptional

    Restrict results to those on or after this date, ISO-8601 YYYY-MM-DD.

  • date_todateoptional

    Restrict results to those on or before this date, ISO-8601 YYYY-MM-DD.

  • weekdaysstring[]optional

    Filter for price rules that are apply on any of the given weekdays.

  • pageintegeroptional

    The page to retrieve results from

  • per_pageintegeroptional

    The number of results to return per page

Responses

  • 200

    A list of price rules for an appointment type.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

post/shop/appointment-types/{appointmentTypeId}/price-rules

Create a price rule for an appointment type

createAppointmentTypePriceRule

Adds a new PriceRule to an AppointmentType. Rules with date and time ranges + weekday filters combine to express most pricing scenarios — peak vs off-peak, weekday vs weekend, seasonal overrides. The first rule whose conditions match a given booking wins. Omitting all filters creates a fallback "always applies" rule.

Requires the SETTINGS_MANAGE permission on the appointment type's site.

Path parameters

Request body

  • priceintegerrequired

    Price in the smallest currency unit (e.g. pence, cents). 4800 means £48.00 in a GBP-denominated site.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive). Defaults to today in the site's timezone if omitted.

  • date_todateoptionalnullable

    Last date this rule applies (inclusive). When omitted, the rule has no end date.

  • time_fromstringoptionalnullable

    Start of the time-of-day window in 24-hour HH:MM format. When time_to is set, must be earlier than time_to (the rule does not wrap past midnight).

  • time_tostringoptionalnullable

    End of the time-of-day window in 24-hour HH:MM format. Must be later than time_from if both are set.

  • durationintegeroptional

    Match this rule only when the customer picks the given appointment duration (in minutes). Omit to apply the rule regardless of duration.

  • weekdaysstring[]optional

    Days of the week this rule applies on. Empty / omitted means every day.

Responses

  • 201

    A single PriceRule on an AppointmentType.

  • 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/appointment-types/{appointmentTypeId}/price-rules/{priceRuleId}

Retrieve a price rule

getAppointmentTypePriceRule

Returns a single PriceRule belonging to the given AppointmentType.

Path parameters

Responses

  • 200

    A single PriceRule on an AppointmentType.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

put/shop/appointment-types/{appointmentTypeId}/price-rules/{priceRuleId}

Update a price rule

updateAppointmentTypePriceRule

Partially updates a PriceRule. Every field is optional; only fields you send are written. Requires the SETTINGS_MANAGE permission on the appointment type's site.

Path parameters

Request body

  • priceintegeroptional

    Price in the smallest currency unit.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive).

  • date_todateoptionalnullable

    Last date this rule applies (inclusive).

  • time_fromstringoptionalnullable

    Start of the time-of-day window in HH:MM.

  • time_tostringoptionalnullable

    End of the time-of-day window in HH:MM.

  • durationintegeroptional

    Match only this duration in minutes.

  • weekdaysstring[]optional

Responses

  • 200

    A single PriceRule on an AppointmentType.

  • 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

delete/shop/appointment-types/{appointmentTypeId}/price-rules/{priceRuleId}

Delete a price rule

deleteAppointmentTypePriceRule

Removes a PriceRule from an AppointmentType. Existing bookings already priced under this rule are unaffected — they retain the price set at booking time.

Path parameters

Responses

  • 204

    Price rule deleted successfully.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

get/shop/appointment-types/{appointmentTypeId}/check-rules

Check price rule coverage for an appointment type

getAppointmentTypeCheckRules

Validates that every active availability rule on the AppointmentType is also covered by a matching PriceRule. The response reports any date ranges where the appointment type is available but doesn't have a configured price — useful as a pre-publish sanity check when seeding a new appointment type and when shifting availability windows.

Path parameters

Responses

  • 200

    The check was successfully performed.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found