A booking is a wellness session (e.g. sauna, yoga) — one
record per attendee. This is the booking/visit view; for revenue, follow
order_id to Orders.
Requires the bookings:read permission.
Changes on 4 November 2026
Bookings used to be called appointments. On 4 November 2026 the remaining appointment names go:
- The
/admin/v0/appointmentsand/admin/v0/appointments/{id}paths are removed. Until then they return the same data as the/admin/v0/bookingspaths below, withDeprecationandSunsetresponse headers. Switch to the bookings paths before that date. - An order line's
purchasable_typebecomesBookinginstead ofAppointment(Orders). - Events report
resource_typebookinginstead ofappointment, and actionsbooking.*instead ofappointment.*, including events recorded before that date (Events).
List bookings
GET /admin/v0/bookings?visit_from=2026-07-01T00:00:00Z&visit_to=2026-07-08T00:00:00Z
Authorization: Bearer YOUR_API_KEYReturns bookings newest-first, in the paginated envelope.
Query parameters
| Parameter | Type | Description |
|---|---|---|
visit_from | string | ISO 8601 timestamp; sessions starting at/after this |
visit_to | string | ISO 8601 timestamp; sessions starting at/before this |
updated_since | string | ISO 8601 timestamp; for incremental sync |
page | integer | Page index (default 1) |
per_page | integer | Items per page (default 50, max 200) |
Get a booking
GET /admin/v0/bookings/{id}
Authorization: Bearer YOUR_API_KEYResponse
{
"data": {
"id": "0ab6af2e-3fed-46f1-86b5-3e507ae3efab",
"starts_at": "2026-07-04T09:00:00+02:00",
"ends_at": "2026-07-04T10:00:00+02:00",
"guest_count": 1,
"service_id": "2b3c…",
"service_name": "Public Sauna",
"variant_name": "Standard Session",
"status": "Upcoming",
"order_id": "7eeecefd-…",
"customer_id": "8f268b4a-…",
"booked_at": "2026-06-01T10:15:00+02:00",
"created_at": "2026-06-01T10:15:00+02:00",
"updated_at": "2026-07-04T10:05:00+02:00",
"cancelled_at": null
}
}Fields
| Field | Type | Notes |
|---|---|---|
id | string | Booking public id |
starts_at | string | Session start |
ends_at | string | Scheduled end |
guest_count | number | Always 1: each booking is one attendee |
service_id | string | Public id of the service, e.g. Sauna / Yoga |
service_name | string | e.g. "Public Sauna" |
variant_name | string | e.g. "Standard Session" |
status | string | Display label (see note below) |
order_id | string | The order this booking belongs to (revenue) |
customer_id | string | Pseudonymous customer id (no PII) |
booked_at | string | When the customer booked |
created_at | string | When the booking reached SERVOS |
updated_at | string | Last change to the booking |
cancelled_at | string | When it was cancelled; null if not cancelled |
status is a human-readable label — one of Upcoming, Starting soon,
In progress, Checked in, Completed, No-show, Cancelled. Completed
means checked in and ended. No-show covers a booking marked as one and a
booking that ended without a check-in, which earlier read Overdue. It's for
display, not logic: see
Conventions → Status labels.