Services are bookable offerings at a location (e.g., sauna session, haircut, consultation).
All endpoints are scoped to the organization that owns the API key:
/store/v0
List services
Retrieve all public services for the organization.
GET /store/v0/servicesResponse
{
"services": [
{
"public_id": "9c1a2b3c-4d5e-4f60-8123-9a0b1c2d3e4f",
"name": "Haircut",
"description": "Professional haircut service with styling",
"short_description": "Get a fresh new look",
"kind": "appointment",
"booking_mode": "exclusive",
"capacity": 1,
"default_duration_minutes": 60,
"slot_interval_minutes": 30,
"booking_cutoff_minutes": 1440,
"min_advance_hours": 24,
"max_advance_days": null,
"allow_customer_resource_preference": true,
"thumbnail": null,
"service_variants": [
{
"public_id": "4a7b8c9d-0e1f-4a2b-9c3d-4e5f6a7b8c9d",
"name": "Standard Haircut",
"description": "Classic haircut with styling",
"duration_minutes": 60,
"capacity": 1,
"position": 1,
"sales_currently_open": true,
"price": {
"cents": 35000,
"currency": "NOK",
"amount": 350.0,
"formatted": "350 NOK",
"abbreviated": "350 NOK"
}
}
]
}
]
}Field reference (service)
| Field | Type | Notes |
|---|---|---|
public_id | string | Public identifier |
name | string | Display name |
description | string | May contain HTML |
short_description | string | Brief description |
kind | string | "appointment" or "class" (see below) |
booking_mode | string | "exclusive" or "shared" (see below) |
capacity | integer | Maximum guests per slot |
default_duration_minutes | integer | Minutes |
slot_interval_minutes | integer | Minutes |
booking_cutoff_minutes | integer | Bookings close this many minutes before start |
min_advance_hours | integer | null | Deprecated, see below |
max_advance_days | null | Deprecated, see below |
allow_customer_resource_preference | boolean | If customers may pick a preferred staff resource |
thumbnail | object | null | Media (see Types) |
service_variants | array | Booking/price variants |
Booking window
Customers can book a slot until booking_cutoff_minutes before it starts, and at most one year ahead. The Service availability endpoint only returns slots inside this window, and adding a slot outside it to a cart fails.
min_advance_hours and max_advance_days are deprecated and will be removed from a future version. min_advance_hours is booking_cutoff_minutes in whole hours, or null when there is no cut-off. max_advance_days is always null. Use booking_cutoff_minutes instead.
Kinds
appointment: Guests pick any free slot inside the service's opening hours.class: Guests book a seat in a scheduled session. Handle this value even if you only see appointments today, so a class service added later doesn't break your storefront.
A class service's booking_mode is always "shared". Its sessions set their own times, length and seats, so slot_interval_minutes and allow_customer_resource_preference don't apply, and a booking lasts as long as its session, whatever the variant's duration_minutes.
Booking modes
The booking_mode field determines how time slots are consumed:
exclusive: Each booking takes the slot's resources to itself. A slot stays available while another booking could still get every resource the service needs, so a service needing any one of a group takes one booking per free member. A service with no resources takes one booking at a time. Typical for 1-on-1 services like haircuts or consultations.shared: Multiple independent bookings can occupy the same slot, up to the service'scapacity. Typical for group experiences like sauna sessions or tours. When adding a booking for a shared service to a cart, use theguest_countattribute to specify how many guests are in the booking. The Service availability endpoint reportsavailable_capacityper slot so you know how many guests can still be added.
Field reference (service variant)
| Field | Type | Notes |
|---|---|---|
public_id | string | Public identifier |
name | string | Display name |
description | string | Description |
duration_minutes | integer | Minutes |
capacity | integer | null | If null, inherits service capacity |
position | integer | Sort order |
sales_currently_open | boolean | If currently bookable |
price | object | Money (see Types) |
Get service
Retrieve a single service by public_id.
GET /store/v0/services/{public_id}Path parameters
| Parameter | Type | Description |
|---|---|---|
public_id | string | Service public identifier |
Response
{
"service": {
"public_id": "9c1a2b3c-4d5e-4f60-8123-9a0b1c2d3e4f",
"name": "Haircut"
}
}The service object has the same structure as in the list response (fields omitted above for brevity).