An order is the booking envelope. It groups one or more typed line items, where each item is a stay (accommodation), a booking (e.g. a sauna or yoga session), an event ticket, or a product. Visit-level detail (start time, status, assigned space) lives on each item; the reference number, channel, totals, and customer reference live on the order.
Requires the orders:read permission.
There is no separate "reservation" object. A booking for several attendees is one order with several line items (one booking per attendee, or several tickets). "Number of attendees" is therefore per item, not a field on the order.
Venue. Every order belongs to the single organization your key is scoped to. Each money amount carries its own
currency; orders don't otherwise repeat venue fields.
List orders
GET /admin/v0/orders
Authorization: Bearer YOUR_API_KEYReturns the organization's orders, newest first, in the paginated envelope.
Query parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page index (default 1) |
per_page | integer | Items per page (default 50, max 200) |
created_from | string | ISO 8601 timestamp; only orders created at or after this time |
created_to | string | ISO 8601 timestamp; only orders created at or before this time |
sales_channel | string | Filter by channel: direct, pos, or ota |
Filtering is by when the order reached SERVOS (created_at), not booked_at. (Filtering by visit/arrival date is
not yet supported; ask the SERVOS team if you need it.)
Get an order
GET /admin/v0/orders/{id}
Authorization: Bearer YOUR_API_KEYResponse
{
"data": {
"id": "7eeecefd-e8ef-4bbf-bbe3-6d1724cba0be",
"order_number": 1042,
"lifecycle_status": "confirmed",
"payment_status": "paid",
"fulfillment_status": "unfulfilled",
"sales_channel": "direct",
"sales_channel_name": "Direct",
"sales_channel_ota": null,
"booked_at": "2026-07-03T09:00:00+02:00",
"created_at": "2026-07-03T09:00:00+02:00",
"updated_at": "2026-07-03T09:00:00+02:00",
"customer": {
"id": "8f268b4a-8197-438d-90ca-acf8612ad472",
"customer_type": "individual",
"marketing_consented": true,
"created_at": "2026-05-21T09:23:34+02:00",
"updated_at": "2026-05-21T09:23:34+02:00"
},
"subtotal": { "cents": 25000, "currency": "DKK", "formatted": "250 kr." },
"tax": { "cents": 0, "currency": "DKK", "formatted": "0 kr." },
"discount": { "cents": 0, "currency": "DKK", "formatted": "0 kr." },
"total": { "cents": 25000, "currency": "DKK", "formatted": "250 kr." },
"items": [
{
"id": "d576947e-532c-4dc5-9265-4dc5cc55f434",
"name": "Public Sauna - Standard Session",
"purchasable_type": "Appointment",
"line_total": {
"cents": 25000,
"currency": "DKK",
"formatted": "250 kr."
},
"tax_total": { "cents": 0, "currency": "DKK", "formatted": "0 kr." },
"detail": {
"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_name": "Public Sauna",
"variant_name": "Standard Session",
"status": "Upcoming"
}
}
]
}
}Order fields
| Field | Type | Notes |
|---|---|---|
id | string | Order public id |
order_number | number | Sequential, human-friendly reference |
lifecycle_status | string | confirmed or cancelled |
payment_status | string | unpaid / paid / partially_paid / refunded / partially_refunded / overpaid |
fulfillment_status | string | unfulfilled / partially_fulfilled / fulfilled |
sales_channel | string | direct / pos / ota |
sales_channel_name | string | The channel's name: Direct, POS, or the OTA's (Booking.com, Other OTA, …) |
sales_channel_ota | string | OTA key (booking_com, expedia, google_hotels, airbnb, unknown); null for other channels and OTAs |
booked_at | string | When the customer booked. Earlier than created_at for imported and OTA bookings |
created_at | string | When the order reached SERVOS |
updated_at | string | Last change to the order itself (not item-level transitions — see Events) |
customer | object | Customer reference, pseudonymous unless the key has customer_data:read — see Customers |
billing_address | object | Only with customer_data:read; null when the order has none — see below |
subtotal / tax / discount / total | money | Order totals |
items | array | Line items (excludes voided items and addons) |
Changed October 2026:
sales_channel_nameandsales_channel_otawere added. An order from an OTA that didn't say which one it was is namedOther OTA, withsales_channel_otaunknown.
Billing address fields
Only for a key granted customer_data:read.
| Field | Type | Notes |
|---|---|---|
line_1 | string | Street address |
line_2 | string | Second address line, or null |
postal_code | string | Or null |
city | string | |
state_province | string | Or null |
country_code | string | ISO 3166-1 alpha-2, e.g. NO |
Line item fields
| Field | Type | Notes |
|---|---|---|
id | string | Order item public id |
name | string | Display name of the line |
purchasable_type | string | Stay, Appointment, Ticket, ProductPurchase, or Fee |
line_total | money | Line revenue (incl. VAT) |
tax_total | money | VAT portion of the line |
detail | object | Type-specific booking detail — shape depends on purchasable_type |
Changes on 4 November 2026
On 4 November 2026 a booking line's purchasable_type changes from
Appointment to Booking. Its detail stays the same. Accept Booking as
well as Appointment before then, so your integration keeps working when it
changes.
detail by purchasable_type
Branch on purchasable_type to read detail. A booking detail (Appointment,
Stay, Ticket) mirrors the matching booking resource
(Bookings,
Stays, Tickets),
minus the order_id / customer_id / timestamp fields (you already have those
from the order). A Fee detail has no resource of its own and keeps its
created_at. status is a human-readable display label, not a stable code —
see Conventions → Status labels.
Appointment (sauna, yoga, …)
| 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_name | string | e.g. "Public Sauna" |
variant_name | string | e.g. "Standard Session" |
status | string | Upcoming / Checked in / No-show / … |
Stay (accommodation)
| Field | Type | Notes |
|---|---|---|
id | string | Stay public id |
check_in_date | string | Date |
check_out_date | string | Date |
nights | number | Number of nights |
occupancy_adults | number | Adults |
occupancy_children | number | Children |
occupancy_infants | number | Infants |
status | string | Status |
Ticket (event)
| Field | Type | Notes |
|---|---|---|
id | string | Ticket public id |
event_name | string | Event name |
variant_name | string | Ticket type |
status | string | Status |
ProductPurchase
| Field | Type | Notes |
|---|---|---|
id | string | Purchase id |
name | string | Product name |
status | string | Status |
Fee (e.g. a cancellation fee)
| Field | Type | Notes |
|---|---|---|
id | string | Fee public id |
name | string | Fee name |
created_at | string | When the fee reached SERVOS |