Download OpenAPI specification:
Token based authentication. Access to bookio API with specific channel assigned to the token.
Api keys are generated in the tenant administration.
Every key is issued with the READ policy, granting read-only access to the endpoints in this document. Write access is a work in progress.
A key is also bound to the facilities it may read. Passing a facilityId the key does not cover fails with error code 20.
Requests are metered per key. Every response carries a correlation id in X-Request-Id, and a successful one reports the remaining budget in X-API-Rate-Remaining. When the budget is exhausted the API answers 429 with a Retry-After header (seconds).
Availability endpoints are heavier and consume 2 tokens per request instead of 1.
A failed request answers with success: false plus a machine readable errorCode and errorType. HTTP 200 is only ever returned for a successful request, so a 200 body carries data and never carries errorCode or errors.
| ErrorCode | errorType | HTTP | Description |
|---|---|---|---|
| 10 | validation_error |
400 | Generic validation error, errors field will give more information |
| 12 | validation_error_no_resource |
400 | Resource not found |
| 20 | invalid_token |
400 / 401 | Invalid token or missing access rights. 401 when the Authorization header itself is missing or unknown, 400 when the key does not cover the requested facility |
| 50 | conflict |
409 | Resource already exists. Retryable, carries a Retry-After header |
| 403 | forbidden |
403 | You don't have enough permissions to access this endpoint |
| 422 | entity_validation_error |
422 | Validation error |
| 429 | too_many_requests |
429 | Too many requests |
| 666 | server_error |
500 | Unspecified internal error, this will be reported to us and we will look into it shortly |
Unless stated otherwise, datetimes are rendered as yyyy-MM-ddTHH:mm:ss in the facility's local timezone and carry no UTC offset. Plain dates use yyyy-MM-dd, times of day HH:mm.
Every request accepts parameter lang. Example: /api/v1/some-endpoint?lang=sk or /api/v1/some-endpoint?someParam=1&lang=en. Controls the language of texts. Unsupported locale will fallback to "en".
Returns a list of service reservations by filter, newest first.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| from | string <date> (Date) Example: from=2026-08-06 Only reservations starting on or after this date. |
| to | string <date> (Date) Example: to=2026-08-06 Only reservations ending on or before the end of this date. |
| offset | integer >= 0 Default: 0 Example: offset=50 Determines the offset within pagination. |
| limit | integer [ 0 .. 100 ] Default: 100 Example: limit=50 Limits the result set. |
{- "result": {
- "success": true,
- "data": {
- "pagination": {
- "total": 1234,
- "offset": 100,
- "limit": 100
}, - "reservations": [
- {
- "id": 123,
- "name": "John Audrey",
- "phone": "+421944888777",
- "service": 123,
- "price": 200.05,
- "duration": 45,
- "created": "2026-08-06T12:00:00",
- "dateFrom": "2026-08-06T12:00:00",
- "dateTo": "2026-08-06T12:00:00",
- "cancelTime": "2026-08-06T12:00:00",
- "cancellationReason": "string",
- "status": "CONFIRMED",
- "note": "string",
- "facilityId": 123,
- "workers": [
- 123
], - "customFields": [
- {
- "name": "invoice_number",
- "value": "2026/0042"
}
]
}
]
}
}
}Returns a list of course reservations by filter, newest first.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| offset | integer >= 0 Default: 0 Example: offset=50 Determines the offset within pagination. |
| limit | integer [ 0 .. 100 ] Default: 25 Example: limit=50 Limits the result set. |
{- "result": {
- "success": true,
- "data": {
- "pagination": {
- "total": 1234,
- "offset": 100,
- "limit": 100
}, - "reservations": [
- {
- "id": 123,
- "name": "John Audrey",
- "phone": "+421944888777",
- "course": 123,
- "created": "2026-08-06T12:00:00",
- "dateFrom": "2026-08-06T12:00:00",
- "dateTo": "2026-08-06T12:00:00",
- "cancelTime": "2026-08-06T12:00:00",
- "cancellationReason": "string",
- "status": "CONFIRMED",
- "note": "string",
- "facilityId": 123,
- "customFields": [
- {
- "name": "invoice_number",
- "value": "2026/0042"
}
]
}
]
}
}
}Returns the blocked (unavailable) time ranges of the facility's workers, newest first.
A blocked time either covers whole days (allDay: true, no timeFrom/timeTo of its own —
the facility's schedule bounds are reported instead) or a time window of each covered day.
The restriction field says how the range repeats.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| dateFrom | string <date> (Date) Example: dateFrom=2026-08-06 Only blocked times starting on or after this date. |
| dateTo | string <date> (Date) Example: dateTo=2026-08-06 Only blocked times ending on or before this date. |
| offset | integer >= 0 Default: 0 Example: offset=50 Determines the offset within pagination. |
| limit | integer [ 0 .. 100 ] Default: 25 Example: limit=50 Limits the result set. |
{- "result": {
- "success": true,
- "data": {
- "pagination": {
- "total": 1234,
- "offset": 100,
- "limit": 100
}, - "blockedTimes": [
- {
- "id": 123,
- "restriction": "specific_date",
- "allDay": false,
- "dateFrom": "2026-08-06T12:00:00",
- "dateTo": "2026-08-06T12:00:00",
- "timeFrom": "18:00",
- "timeTo": "18:00",
- "groupId": 42,
- "note": "string"
}
]
}
}
}Bookable days, arrival times, course terms and free capacities — the same data the booking widget uses. These endpoints consume 2 rate limit tokens per request.
Days of the requested month that still have at least one bookable slot, starting from the requested date. Days before the service's earliest bookable time are never returned.
Costs 2 rate limit tokens.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| serviceId required | integer <int64> (Id) Example: serviceId=123 Id of the service. Must belong to |
| date required | string <date> (Date) Example: date=2026-08-06 Any date of the month to scan. The scan starts at this date and runs to the end of its month. |
| workerIds | string Example: workerIds=12,15 Comma separated worker ids to restrict the answer to. Ids not assigned to the service are
dropped; if none remain the request fails with error code |
| addonIds | string Example: addonIds=3,7 Comma separated addon ids to include in the requested slot length. |
| count | integer >= 1 Example: count=2 Number of items to book at once, for item-based services. |
| participantsCount | integer >= 1 Example: participantsCount=3 Number of participants, for entry (room) services. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "serviceId": 123,
- "year": 2026,
- "month": 8,
- "days": [
- "2026-08-06"
]
}
}
}Bookable arrival times of a single day. Returns an empty times array when the day is fully
booked or entirely before the service's earliest bookable time.
Costs 2 rate limit tokens.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| serviceId required | integer <int64> (Id) Example: serviceId=123 Id of the service. Must belong to |
| date required | string <date> (Date) Example: date=2026-08-06 Day to list arrival times for. |
| workerIds | string Example: workerIds=12,15 Comma separated worker ids to restrict the answer to. Ids not assigned to the service are
dropped; if none remain the request fails with error code |
| addonIds | string Example: addonIds=3,7 Comma separated addon ids to include in the requested slot length. |
| count | integer >= 1 Example: count=2 Number of items to book at once, for item-based services. |
| participantsCount | integer >= 1 Example: participantsCount=3 Number of participants, for entry (room) services. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "serviceId": 123,
- "date": "2026-08-06",
- "times": [
- "2026-08-06T12:00:00"
]
}
}
}Currently offered terms of a course together with their free capacity.
Costs 2 rate limit tokens.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| courseId required | integer <int64> (Id) Example: courseId=123 Id of the course. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "courseId": 123,
- "terms": [
- {
- "id": 123,
- "freeCapacity": 5,
- "minCount": 1,
- "maxCount": 4,
- "type": "REPEATING",
- "placeOfAction": "Studio A",
- "times": [
- {
- "start": "2026-08-06T12:00:00",
- "end": "2026-08-06T12:00:00"
}
]
}
]
}
}
}Free capacity of the items (rooms) of an entry service at a given moment. Only available
for services of type BELONGS_TO_ROOM; other service types are rejected with error code 10.
Costs 2 rate limit tokens.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| serviceId required | integer <int64> (Id) Example: serviceId=123 Id of the service. Must belong to |
| start required | string (LocalDateTime) ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$ Example: start=2026-08-06T12:00:00 Moment to check, in facility local time. |
| itemId | integer <int64> (Id) Example: itemId=123 Restrict the answer to a single item. Must belong to the service. |
| duration | integer >= 1 Example: duration=90 Length of the intended stay in minutes. Defaults to the service duration. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "serviceId": 123,
- "start": "2026-08-06T12:00:00",
- "items": [
- {
- "itemId": 123,
- "capacity": 20,
- "freeCapacity": 7
}
]
}
}
}Returns the master data of a facility, including its address, contact, billing details, opening hours and gift cards.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "id": 123,
- "name": "Test facility",
- "code": "test-facility",
- "enabledPayments": true,
- "enabledCashPayments": true,
- "address": {
- "street": "Second street",
- "city": "Bratislava",
- "postcode": "82104",
- "country": {
- "name": "Slovakia",
- "code": "SVK"
}, - "gps": {
- "latitude": 48.152115,
- "longitude": 17.108769
}
}, - "contact": {
- "phone": "+421999888777",
}, - "billingDetails": {
- "name": "Peter",
- "surname": "Parker",
- "company": "Bookio",
- "address": {
- "street": "Second street",
- "city": "Bratislava",
- "postcode": "82104"
}, - "regNumber": "48798213",
- "vatNumber": "2014393920",
- "phone": "+421949888777",
- "iban": "SK33 0200 0000 0004 9999 9999"
}, - "openingHours": [
- {
- "from": "18:00",
- "to": "18:00",
- "weekday": 4
}
], - "giftCards": [
- {
- "name": "Poukazka",
- "note": "Some text",
- "price": 200.05,
- "currency": "EUR",
- "type": "CASH",
- "reservationsCount": 1,
- "allowedServices": [
- 123
], - "allowedCourses": [
- 123
], - "allowedFacilities": [
- 123
]
}
]
}
}
}Enabled workers and managers of the facility.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "workers": [
- {
- "id": 123,
- "name": "Peter",
- "surname": "Parker",
- "phone": "+421949666777",
}
]
}
}
}Enabled, publicly bookable services of the facility. Services flagged as direct-reservation only are not returned. Capped at 200 rows.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "services": [
- {
- "id": 123,
- "type": "BELONGS_TO_WORKER",
- "name": "Haircut",
- "note": "string",
- "category": {
- "id": 123,
- "name": "test category"
}, - "duration": 70,
- "timeBefore": 10,
- "timeAfter": 0,
- "orderType": "DIRECT",
- "paymentType": "FULL",
- "price": 200.05,
- "fixedPrice": true,
- "deposit": 15,
- "currency": "EUR",
- "prices": [
- {
- "name": "Long hair",
- "price": 200.05
}
], - "assignedWorkers": [
- {
- "id": 123
}
], - "assignedItems": [
- {
- "id": 123
}
]
}
]
}
}
}Service addons of the facility, ordered by priority and name. Each addon lists the enabled services it can be added to.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "addons": [
- {
- "id": 123,
- "name": "Hair wash",
- "duration": 15,
- "price": 200.05,
- "currency": "EUR",
- "serviceIds": [
- 123
]
}
]
}
}
}Enabled, publicly bookable courses of the facility with their sub-courses and times.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "courses": [
- {
- "id": 123,
- "type": "REPEATING",
- "name": "Yoga for beginners",
- "note": "string",
- "category": {
- "id": 123,
- "name": "test category"
}, - "timeBefore": 10,
- "timeAfter": 0,
- "paymentType": "FULL",
- "price": 200.05,
- "currency": "EUR",
- "fixedPrice": true,
- "deposit": 0,
- "prices": [
- {
- "id": 123,
- "name": "string"
}
], - "subCourses": [
- {
- "capacity": 12,
- "minCount": 1,
- "maxCount": 4,
- "times": [
- {
- "start": "2026-08-06T12:00:00",
- "end": "2026-08-06T12:00:00",
- "workers": [
- null
], - "duration": 60
}
], - "place": "Studio A",
- "gps": {
- "latitude": 48.152115,
- "longitude": 17.108769
}
}
]
}
]
}
}
}Enabled items (rooms/equipment) of the facility.
| facilityId required | integer <int64> (Id) Example: 123 Bookio facility id. |
{- "result": {
- "success": true,
- "data": {
- "items": [
- {
- "id": 123,
- "type": "ROOM",
- "name": "Sauna",
- "capacity": 20
}
]
}
}
}Ratings of the facility, newest first. A rating belongs either to a service reservation or to
a course reservation — the type field says which, and the corresponding service or
course object is filled in.
Censored ratings are included with their scores, but their note is returned as null and
flagged by noteCensored.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
| from | string <date> (Date) Example: from=2026-08-06 Only ratings added on or after this date. |
| to | string <date> (Date) Example: to=2026-08-06 Only ratings added on or before this date. |
| serviceId | integer <int64> (Id) Example: serviceId=123 Only ratings of reservations of this service. |
| courseId | integer <int64> (Id) Example: courseId=123 Only ratings of reservations of this course. |
| hasNote | boolean Filter to ratings that do ( |
| lang | string (Locale) Example: lang=sk Language of the returned service/course names and category labels. Falls back to the facility language. |
| offset | integer >= 0 Default: 0 Example: offset=50 Determines the offset within pagination. |
| limit | integer [ 0 .. 100 ] Default: 25 Example: limit=50 Limits the result set. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "categories": {
- "staff": "Personál",
- "service": "Služba",
- "environment": "Prostredie"
}, - "pagination": {
- "total": 1234,
- "offset": 100,
- "limit": 100
}, - "ratings": [
- {
- "id": 123,
- "date": "2026-08-06T12:00:00",
- "dateOfVisit": "2026-08-06T12:00:00",
- "type": "service",
- "service": {
- "id": 123,
- "name": "Haircut"
}, - "course": {
- "id": 123,
- "name": "Yoga for beginners"
}, - "values": {
- "staff": 5,
- "service": 4,
- "environment": 5,
- "average": 4.7
}, - "note": "string",
- "noteCensored": false
}
]
}
}
}The aggregated rating of the facility — the same cached figures the booking widget shows.
| facilityId required | integer <int64> (Id) Example: facilityId=123 Id of the facility. Must be covered by your api key. |
{- "result": {
- "success": true,
- "data": {
- "facilityId": 123,
- "average": 4.6,
- "count": 212,
- "distribution": {
- "1": 3,
- "2": 4,
- "3": 15,
- "4": 60,
- "5": 130
}
}
}
}Checks whether a customer is registered in the facility's loyalty system and returns their next upcoming booking.
Requires the loyalty integration to be enabled for your key and for the facility.
| loyaltySystem required | string Loyalty system the facility is integrated with. Case insensitive. |
| email required | |
| bookioId required | integer <int64> (Id) Example: bookioId=123 Bookio facility id. |
| externalId required | string Example: externalId=21312 Business id of the facility in the external loyalty system. Must match the facility's configured integration. |
{- "result": {
- "success": true,
- "data": {
- "exists": true,
- "bookioId": 123,
- "externalId": "e5753691-e71c-415a-844e-74b76af39a9d",
- "externalCardId": "f5753691-e71c-415a-844e-74b76af39a9d",
- "nextBooking": {
- "date": "2026-08-06",
- "time": "18:00",
- "service": "Strihanie",
- "serviceEng": "Haircut",
- "duration": 30,
- "status": "CONFIRMED"
}
}
}
}Returns the customer's nearest upcoming booking. Fails with error code 12 when the customer
is not in the loyalty system.
Requires the loyalty integration to be enabled for your key and for the facility.
| loyaltySystem required | string Loyalty system the facility is integrated with. Case insensitive. |
| email required | |
| bookioId required | integer <int64> (Id) Example: bookioId=123 Bookio facility id. |
| externalId required | string Example: externalId=21312 Business id of the facility in the external loyalty system. Must match the facility's configured integration. |
{- "result": {
- "success": true,
- "data": {
- "nextBooking": {
- "date": "2026-08-06",
- "time": "18:00",
- "service": "Strihanie",
- "serviceEng": "Haircut",
- "duration": 30,
- "status": "CONFIRMED"
}
}
}
}Registers a customer in the facility's loyalty system.
When the customer already has a card the response carries error code 50 and still returns
the existing card in data.
Requires the loyalty integration to be enabled for your key and for the facility.
| loyaltySystem required | string Loyalty system the facility is integrated with. Case insensitive. |
| bookioId required | integer <int64> Bookio facility id. |
| externalId required | string Business id of the facility in the external loyalty system. |
| externalCardId | string Loyalty card id from the external system. |
| email required | string Email of the customer. |
| name | string First name of the customer. |
| surname | string Surname of the customer. |
| phone | string Phone of the customer. |
{- "bookioId": 123,
- "externalId": "141512",
- "externalCardId": "08ab382e-1162-4d35-8c5b-ab1064b1afc7",
- "name": "John",
- "surname": "Audrey",
- "phone": "+421944888777"
}{- "result": {
- "success": true,
- "data": {
- "created": true,
- "bookioId": 123,
- "externalId": "e5753691-e71c-415a-844e-74b76af39a9d",
- "externalCardId": "f5753691-e71c-415a-844e-74b76af39a9d"
}
}
}Webhook is setup to point to one API url. Operations are distinguished by type field. We are using only POST http request.
Based on the `type` field the structure of the Json will change.
Webhooks are retried a limited number of times (timeout, your api is down, etc ...).
Further you can find structures of the webhooks.
Both service reservations and course reservations are delivered through the same
webhooks — a service reservation carries a service object, a course reservation carries a
course object instead.
If the partner is configured with an auth type, the configured value is sent in the
Authorization request header.
Sent when a reservation is created.
The data object is a service reservation (carries service) or a course
reservation (carries course).
| type | string Value: "create_reservation" Unique webhook type. This will tell you what structure to parse. Type: |
WebhookServiceReservation (object) or WebhookCourseReservation (object) Main data holder. |
{- "type": "create_reservation",
- "data": {
- "id": 123,
- "name": "John Audrey",
- "phone": "+421944888777",
- "service": {
- "id": 123,
- "name": "Haircut"
}, - "price": 30,
- "paymentStatus": "NOT_REQUIRED",
- "duration": 45,
- "created": "2026-08-06T12:00:00",
- "dateFrom": "2026-08-06T12:00:00",
- "dateTo": "2026-08-06T12:00:00",
- "status": "CONFIRMED",
- "note": "string",
- "facilityId": 123
}
}Sent when a reservation is modified.
The data object is a service reservation (carries service) or a course
reservation (carries course).
| type | string Value: "modify_reservation" Unique webhook type. This will tell you what structure to parse. Type: |
WebhookServiceReservation (object) or WebhookCourseReservation (object) Main data holder. |
{- "type": "modify_reservation",
- "data": {
- "id": 123,
- "name": "John Audrey",
- "phone": "+421944888777",
- "service": {
- "id": 123,
- "name": "Haircut"
}, - "price": 30,
- "paymentStatus": "NOT_REQUIRED",
- "duration": 45,
- "created": "2026-08-06T12:00:00",
- "dateFrom": "2026-08-06T12:00:00",
- "dateTo": "2026-08-06T12:00:00",
- "status": "CONFIRMED",
- "note": "string",
- "facilityId": 123
}
}Sent when a reservation is cancelled. Fired for both service and course reservations — the payload is the same in either case.
| type | string Value: "cancel_reservation" Unique webhook type. This will tell you what structure to parse. Type: |
object (WebhookCancelledReservation) Payload of a cancellation webhook, for both service and course reservations. |
{- "type": "cancel_reservation",
- "data": {
- "id": 123,
- "cancelTime": "2026-08-06T12:00:00",
- "cancellationReason": "string",
- "facilityId": 123
}
}