---
title: "List combined slots for multiple appointment types"
method: POST
path: "/shop/item-availability/multi-appointment-slots"
tags: ["Availability"]
---

# List combined slots for multiple appointment types

`POST /shop/item-availability/multi-appointment-slots`

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 `MultiAppointmentSlotGroup`s — 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

- object
  - `site_id` string, required — ID of the site to search at.
  - `date` string, date, required — Day to slot the appointments into, ISO-8601 `YYYY-MM-DD` in the site's timezone.
  - `items` MultiAppointmentSlotItemInput[], required — One entry per appointment type to chain. Order matters — each item slots immediately after the previous one.
    - `appointment_type_id` string, required — ID of the `AppointmentType` to schedule.
    - `duration` integer — Optional duration override for this item.
    - `quantity` integer — Optional guest quantity for this item.
  - `practitioner_id` string — Constrain every appointment to the same practitioner.
  - `basket_id` string — Basket to exclude from the conflict calculation (useful when re-checking after an edit).

## Response `200`

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

- object
  - `data` MultiAppointmentSlotGroup[], required
    - `start_time` string, date-time, required
    - `nonoptimal_practitioner_allocation` boolean — Whether the chosen combination leaves a low-value gap in a practitioner's calendar.
    - `total_cost` integer, required — Total cost of the combined appointments in the smallest currency unit.
    - `appointments` MultiAppointmentSlotEntry[], required — The individual appointment slots — one per appointment type in the request.
      - `appointment_type_id` string, required — ID of the appointment type this slot fills.
      - `start_time` string, date-time, required — Slot start time, in the site's timezone.
      - `end_time` string, date-time, required — Slot end time including any post-appointment buffer.
      - `duration` integer, required — Duration in minutes.
      - `end_buffer` integer, required — Post-appointment buffer (cleaning time) included in `end_time`.
      - `practitioner_id` string, required — Practitioner assigned to this slot.
      - `price` integer, required — Per-slot price in the smallest currency unit, with any applicable basket discounts already applied.

## Other responses

- `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

---

[API](https://skmtc.dev/try/apis/trybe-api.md) · [All operations](https://skmtc.dev/try/apis/trybe-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/try/trybe-api/revisions/f37f92702da5/schema)
