https://vzl.one/api/v1/booking
Integrations for Beauty Studio
Add online booking as a widget or connect your own server-side integration through the API.API tokens
Create a separate token for each website or server-side integration.Secure booking integration
The API intentionally has narrow access and is tied to the selected business.
- It can retrieve services, team members and availability, and create a booking.
- It cannot access the client list, CRM, or booking history.
- Call the API only from your server—never embed the token in website JavaScript.
Booking API documentation
A complete server-side integration reference for online booking: retrieve services and availability, create bookings safely, and handle every expected error.
Recommended integration flow
Always retrieve current identifiers and availability from the API before creating a booking.
- 1Retrieve servicesShow active services to the client and retain the service_id.
- 2Choose a specialistFilter the team by service_id and retain the employee_id.
- 3Check availabilityFetch a fresh list of slots immediately before confirmation.
- 4Create the bookingSend the exact starts_at value returned by availability.
Authorization for every request
Add a Bearer token to the Authorization header. Each token is scoped to one business.
Authorization: Bearer $VUZOL_API_TOKEN
Accept: application/json
Each token allows up to 120 read requests and 30 write requests per 60 seconds. A 429 response includes a Retry-After header with the number of seconds to wait.
Errors and safe recovery
The API returns a standard HTTP status and a detail field with an explanation. Do not retry booking creation until you have checked the error reason.
The Bearer token is missing, revoked, or malformed. Create a new token or verify the Authorization header.
The business was removed, disabled, or no longer belongs to the token owner.
The service, team member, or business identifier does not exist or is not available for online booking.
The slot is taken, closed, in the past, or became unavailable because of a schedule change, break, day off, closed date, or temporary business closure.
A required field is missing or blank, the phone is invalid, or a query parameter does not match the expected format or range.
The token limit has been reached. Wait for the number of seconds in Retry-After and then send the request again.
Availability is a snapshot at the time of the request. Another client or an administrator can book or close the slot before your POST request, so only a 201 response from appointments is final confirmation.
- Call availability again with the same service_id and employee_id.
- Show the refreshed list and ask the client to choose a different starts_at.
- Retry POST only with the new starts_at value; never loop on the old slot.
HTTP/1.1 409 Conflict
Content-Type: application/json
{"detail":"This slot is no longer available. Please choose another time."}
Endpoints and examples
Every section is open, so parameters, ready-to-use curl requests, response examples, and errors are visible without extra clicks.
GET/api/v1/booking/businessPublic details for this business
Returns details for the business scoped to the token, including its public booking page URL.
curl -H "Authorization: Bearer $VUZOL_API_TOKEN" \
https://vzl.one/api/v1/booking/business
{
"data": {
"id": "business_01",
"name": "Vuzol Studio",
"slug": "vuzol-studio",
"phone": "+380501112233",
"address": "Kyiv",
"logo_url": "https://cdn.example.com/logo.png",
"booking_url": "https://vzl.one/book/vuzol-studio"
}
}
GET/api/v1/booking/servicesServices available for online booking
Returns only active services that can be booked online. Use the service id in subsequent requests.
curl -H "Authorization: Bearer $VUZOL_API_TOKEN" \
https://vzl.one/api/v1/booking/services
{
"data": [
{
"id": "service_01",
"name": "Consultation",
"category": "Services",
"description": "60-minute consultation",
"duration_minutes": 60,
"price": 900.0
}
]
}
GET/api/v1/booking/teamTeam members for the selected service
Returns active business team members. When service_id is supplied, the list is limited to specialists assigned to that service.
| Field | Requirement | Description |
|---|---|---|
service_idstring · query | Optional | A service ID from /services. If omitted, the API returns the entire available team. |
curl -H "Authorization: Bearer $VUZOL_API_TOKEN" \
"https://vzl.one/api/v1/booking/team?service_id=SERVICE_ID"
{
"data": [
{
"id": "employee_01",
"full_name": "Iryna Kovalenko",
"role": "Specialist",
"photo_url": "https://cdn.example.com/iryna.jpg"
}
]
}
GET/api/v1/booking/availabilityAvailable dates and time slots
Calculates open slots from service duration, schedules, breaks, vacations, closed dates, existing bookings, and business availability.
| Field | Requirement | Description |
|---|---|---|
service_idstring · query | Required | The active online service ID returned by /services. |
employee_idstring · query | Optional | A specialist ID from /team. When omitted, slots for all available team members are returned. |
start_datedate · YYYY-MM-DD | Optional | The first search date. Defaults to the server’s current date. |
daysinteger · 1–31 | Optional | Number of calendar days to search. Defaults to 7; allowed range is 1 through 31. |
For POST /appointments, send starts_at exactly as returned in this list. A time constructed by the client may not match the calendar interval or schedule.
curl -H "Authorization: Bearer $VUZOL_API_TOKEN" \
"https://vzl.one/api/v1/booking/availability?service_id=SERVICE_ID&employee_id=EMPLOYEE_ID&start_date=2026-09-10&days=7"
{
"data": [
{
"employee_id": "employee_01",
"employee_name": "Iryna Kovalenko",
"starts_at": "2026-09-10T14:00",
"date": "2026-09-10",
"time": "14:00"
}
],
"meta": {
"service_id": "service_01",
"employee_id": "employee_01",
"start_date": "2026-09-10",
"days": 7
}
}
POST/api/v1/booking/appointmentsCreate a new online booking
Creates or updates the client record by phone, reserves the slot, and returns a public receipt URL for the booking.
| Field | Requirement | Description |
|---|---|---|
service_idstring · max 100 | Required | The service ID for which the slot was retrieved. |
employee_idstring · max 100 | Required | The team member ID from the selected slot. |
starts_atstring · ISO 8601 | Required | The exact ISO starts_at value from /availability. Do not reformat or round it. |
client_namestring · max 120 | Required | The client name shown in the calendar and CRM. |
client_phonestring · max 40 | Required | A valid client contact number, used to find or create the client record. |
notesstring · max 2000 | Optional | Optional booking notes. Send an empty string or omit the field when there are no notes. |
curl -X POST https://vzl.one/api/v1/booking/appointments \
-H "Authorization: Bearer $VUZOL_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"service_id": "SERVICE_ID",
"employee_id": "EMPLOYEE_ID",
"starts_at": "2026-09-10T14:00",
"client_name": "Iryna Kovalenko",
"client_phone": "+380501112233",
"notes": "First visit"
}'
{
"data": {
"booking_id": "appointment_01",
"status": "booked",
"service_id": "service_01",
"employee_id": "employee_01",
"starts_at": "2026-09-10T14:00",
"ends_at": "2026-09-10T15:00",
"receipt_url": "https://vzl.one/book/vuzol-studio/appointments/PUBLIC_TOKEN"
}
}