Creating a booking
These endpoints create a booking, in the order described in the
booking flow. The whole sequence is tied together by a
cbUuid, the reservation id that the reserve call returns. Pass it in every
following call.
Reserve a slot
POST /booking/reserve
Holds a slot so no one else can book it while the customer fills in their details.
Request
| Field | Required | Description |
|---|---|---|
slotKey | Yes | The key of a slot from the slots endpoint |
cbUuid | No | Your current reservation id, when the customer picks a new time. That hold is released before the new one is made |
captchaResponse | No | Send null, see Captcha |
{
"slotKey": "MTo4Mjc0OjQ2MzY4OjE3ODU0ODEyMDAwMDA6MzA6ZmFsc2U6NTAwLjAwOk5VTEw6"
}
Response 200
{
"cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6",
"cbRef": "mK0k22O3",
"reservationExpiry": "2026-07-23T09:46:24Z",
"services": [
{ "id": 66638, "name": "Påminnelser", "price": 0.0, "priceFrom": false, "duration": 10 }
],
"price": 0.0
}
The cbUuid in the response is the id of the new reservation. Pass it in all
following calls. cbRef is the short booking reference shown to the customer.
The reservation expires at reservationExpiry, about five minutes after the
call.
Errors
| Status | When |
|---|---|
| 410 | The slot is already taken or held by someone else. Fetch slots again |
Release a reservation
POST /booking/release
Releases a held slot. Call it when the customer abandons the booking or picks a new time, so the slot opens up for others right away. Reservations that are not released expire on their own.
Request
{ "cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6" }
Response is 204 with no body.
Add customer details
POST /booking/customer
Attaches the customer's details to the reservation.
Request
| Field | Required | Description |
|---|---|---|
cbUuid | Yes | The reservation to attach the customer to |
name | Yes | Full name |
phone | Yes | Mobile number in E.164 format, for example +46701234567 |
email | See settings | Required when web_requireEmail is on |
note | No | Message from the customer, free text |
personalNumber | See settings | Swedish personal number, required when web_requirePNo is on |
personalNumberType | With personalNumber | SE_PNO, or INTL_PNO for a foreign number |
orgName, orgNo | No | Company name and organization number for company bookings |
orgNoType | With orgNo | SE_ORG |
vehicleRegNo | See settings | Vehicle registration number, used by workshops |
vehicleRegNoType | With vehicleRegNo | SE_VEHICLE |
customFields | No | Answers to the account's custom fields, a list of {key, type, label, value} |
allowMarketing | No | The customer accepted marketing |
bookedSpecificResource | No | true when the customer picked a specific resource, false when your UI picked one for them |
captchaResponse | No | Send null, see Captcha |
{
"cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6",
"name": "Test Testsson",
"phone": "+46701234567",
"email": "test@example.com",
"note": "",
"customFields": [],
"allowMarketing": false,
"bookedSpecificResource": false
}
Response is 200. The body carries no information.
Which fields your form must collect is controlled by the account's settings preferences and features.
Errors
| Status | When |
|---|---|
| 404 | The cbUuid has no active reservation |
Get confirmation options
POST /booking/confirmation-options
Call this after the customer details are saved. It tells you how the booking must be confirmed, and triggers the confirmation PIN SMS when the account uses SMS verification.
Request
{ "cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6" }
Response 200
{
"cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6",
"cbRef": "mK0k22O3",
"reservationExpiry": "2026-07-23T09:46:24Z",
"confirmationMethod": "NoPin",
"paymentAmountIncVat": null,
"paymentProviders": [],
"allowDiscountVoucher": false,
"saleItems": [],
"attributes": { "pbk_allowMarketing": false },
"prefs": { "...": "same preference object as in settings, shortened here" }
}
| Field | Description |
|---|---|
confirmationMethod | NoPin, Pin or Payment, see the booking flow |
paymentAmountIncVat | Amount to pay online, null when no payment is required |
paymentProviders | Available payment providers when payment is required, see Payments |
allowDiscountVoucher | The customer may enter a discount or gift card code |
saleItems | Line items for the payment |
Confirm the booking
POST /booking/confirm
Turns the reservation into a real booking. Use this when confirmationMethod
is NoPin or Pin. Bookings that require payment are instead completed
through the payment endpoints, see Payments.
Request
| Field | Required | Description |
|---|---|---|
cbUuid | Yes | The reservation to confirm |
pin | With Pin | The PIN code from the SMS. Send null when the method is NoPin |
captchaResponse | No | Send null, see Captcha |
{ "cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6", "pin": null }
Response 201
{
"cbUuid": "4674c65b-a64f-43a5-94c7-af3b59053cc6",
"cbRef": "mK0k22O3",
"smsReminderEnabled": true,
"emailConfirmSent": true,
"smsConfirmSent": true,
"paymentStatus": "Unpaid",
"paymentProvider": "None"
}
The booking now exists in the calendar. Cliento sends the confirmation and reminder messages, your client does not need to.
Errors
| Status | When |
|---|---|
| 410 | The reservation expired before the call. Reserve a new slot |
| 403 | The PIN code was wrong, or the request was blocked |