Returns a paginated list of Appointments, optionally filtered by
the date range the appointments fall in, the date range that the
underlying Orders were submitted in, and by Practitioner,
Room, or Zone. Appointments are ordered by start_time
ascending.
This endpoint powers the calendar list views, day-sheet exports
(via the CSV variant returned when Accept: text/csv), and any
third-party reporting integration that needs the same data the
Trybe dashboard renders.
Retrieves a single Appointment by ID. Use this endpoint when you
have an appointment ID returned by listShopAppointments,
createBasketAppointmentItem, or a webhook payload, and need the
canonical record — including its current status, stage,
assigned Practitioners, Room, guest associations, and order
context.
The unique identifier of the Appointment. An appointment is a
booking of an AppointmentType against one or more Practitioners
and (optionally) a Room. The ID is the MongoDB ObjectID that the
appointment was assigned when it was created via the Basket.
Updates an Appointment in place. Common uses are reassigning the
practitioner, moving the appointment to a different Room,
rescheduling the start_time, or progressing the underlying
Order through stages (e.g. marking the customer as arrived,
in_treatment, or checked_out).
The update is routed through the basket / availability layer, so
the request is validated against the same rules a fresh booking
would face — overlapping practitioner bookings, room capacity,
site opening hours, and equipment availability are all enforced.
Users with the reservations.override-rules permission can bypass
these checks server-side; everyone else will receive a 400 Bad Request with the specific availability conflict.
The move object is a convenience for calendar drag-and-drop:
pass move.resource_type of practitioner or room plus the
from_id and to_id to swap the assigned resource without
spelling out the full practitioner_ids list. When only stage
is supplied the appointment slot is left untouched and the change
is applied to the parent order, saving the availability round-trip
entirely.
The unique identifier of the Appointment. An appointment is a
booking of an AppointmentType against one or more Practitioners
and (optionally) a Room. The ID is the MongoDB ObjectID that the
appointment was assigned when it was created via the Basket.
Replace the set of practitioners assigned to this appointment.
Pass an empty array to clear all assignments. Each ID must
belong to a practitioner who can perform this
AppointmentType at this site.
Replace the room assigned to this appointment. The room must
be one of the rooms permitted by the AppointmentType and
available for the appointment's time slot.
Reschedule the appointment to start at this date and time. The
end time is recalculated from the appointment's duration and
end_buffer. Must be an RFC 3339 timestamp with offset.
Convenience block for calendar drag-and-drop. Specifies which
practitioner or room is being swapped without restating the
whole list. When resource_type is practitioner,
practitioner_ids is updated automatically; when room, the
room_id is updated.
Move the underlying order through its check-in flow. When
stage is the only field provided the availability layer is
skipped entirely. Pass null to clear the stage back to the
default.
Possible values:arrivedin_treatmentchecked_outnot_arrived
Queues a background job that exports the same appointment list
returned by GET /shop/appointments-v2 as a CSV download. The
-v2 endpoint sources its data from the order-item store rather
than the legacy appointments collection, which means it can apply
a richer set of filters (sales channel, order label, brand, etc.)
and reflects the same totals shown in revenue reports.
The response returns a QueuedJob resource that you can poll via
GET /shop/queued-jobs/{queuedJobId} to check progress and fetch
the download_url once ready.
All filters supported by the list endpoint are accepted here and
are applied to the export.
Queues a background job that exports the same Appointment list
returned by GET /shop/appointments as a CSV download. Use this
when the result set is too large to retrieve synchronously, or when
you want the export delivered to the calling user as a downloadable
file.
The response returns a QueuedJob resource you can poll via
GET /shop/queued-jobs/{queuedJobId}. Once the job has finished,
its download_url becomes available and the CSV can be streamed.
All filters supported by the list endpoint (date range, order
submitted range, practitioner, room, zone) are accepted here and
are applied to the export.
Dry-runs an Appointment update without persisting the change.
Reports whether the proposed assignment of practitioners, room
and time-of-day slot would succeed.
Note: this endpoint validates against time-of-day only — it
is NOT a full reschedule dry-run. The body is a strict subset
of UpdateAppointment (practitioner_ids, room_id and a
HH:mmstart_time); other writable appointment fields (move,
stage, item_configuration, etc.) are not consulted here. Use
PUT /shop/appointments/{appointmentId} to actually persist
a reschedule.
Use this to surface conflicts (overlapping bookings, room
capacity, equipment availability, opening hours) to the operator
before they commit a drag-and-drop move on the calendar. The
response indicates whether the update is allowed, lists the
specific availability errors that would block it, and reports
whether the current user has the reservations.override-rules
permission to bypass them.
The unique identifier of the Appointment. An appointment is a
booking of an AppointmentType against one or more Practitioners
and (optionally) a Room. The ID is the MongoDB ObjectID that the
appointment was assigned when it was created via the Basket.
The practitioners that would be assigned to the appointment.
Each entry must be a valid Practitioner ID; the check fails
if any of the practitioners is unavailable or unqualified for
the appointment type.
Time-of-day the appointment would start, in HH:mm (24-hour)
format. The check endpoint validates only the time-of-day slot
— it does NOT accept a full RFC 3339 datetime; pass the date
via the path/appointment context and the clock time here.