API

Booking API documentation

A public booking API for reading business availability and creating or cancelling customer appointments. Every request is authenticated with the business private key sent in the x-private-key header.

Authentication

Required on every request

x-private-key

Full pk_live_… key for that business

Customers only need one thing: their private key in x-private-key. No additional auth tokens are required.

Base URL

Deploy once, reuse everywhere

Use this base URL for all booking API requests.

https://api.booqara.com

Conventions

Response rules and booking flow

The API keeps the public booking surface simple: direct JSON payloads on success, standard error bodies on failure, and consistent availability logic from date search through final booking.

Response shape conventions

Success (most GET requests)
200
Returns the domain object directly. No success wrapper.
Success POST /booking/appointments
200
{ "success": true, "booking": { … } }
Success DELETE /booking/appointments/{id}
200
{ "success": true, "status": "cancelled" }
Client error
400 / 401 / 404 / 409
{ "success": false, "error": "…" }
Server error
500
{ "success": false, "error": "Internal server error" }

Customer booking flow

0
Optional branding, hours, booking rules, and page flags
GET /booking/business
1
Pick a service
GET /booking/services
2
Pick a professional, including Any Available
GET /booking/staff (?serviceId=<uuid> optional)
3
Get the next dates that have at least one open slot
GET /booking/dates?serviceId=<uuid>
4
Load time slots for a single day
GET /booking/slots?date=YYYY-MM-DD&serviceId=<uuid>
5
Collect guest details and confirm the booking
POST /booking/appointments
GET/booking/business

Business profile and booking rules

Returns public business details, weekly opening hours, timezone, booking settings, and booking page display flags.

Request notes

  • No query parameters are required.
  • If no booking settings row exists, the API returns the documented default values.

Response

{
  "name": "North Elm Studio",
  "description": "Modern color and styling appointments",
  "category": "Salon",
  "logoUrl": "https://cdn.example.com/logo.png",
  "phone": "(555) 555-1234",
  "address": "123 Main St",
  "timezone": "America/Chicago",
  "hours": [
    {
      "day": "Sunday",
      "isOpen": true,
      "openTime": "09:00:00",
      "closeTime": "19:00:00"
    }
  ],
  "bookingSettings": {
    "bookingLeadTimeMinutes": 60,
    "bookingWindowDays": 7,
    "slotIntervalMinutes": 30
  },
  "bookingPage": {
    "showStaffSelection": true,
    "showServicePrices": true,
    "showServiceDuration": true,
    "requireCustomerEmail": true
  }
}
  • hours[*].day uses the full English weekday name.
  • openTime and closeTime may be null when the business is closed.
curl -X GET "https://api.booqara.com/booking/business" \
  -H "x-private-key: pk_live_your_private_key"
GET/booking/services

Service catalog grouped by category

Returns active services grouped under categories. Price and duration fields are included only when the business allows them on the public booking page.

Request notes

  • No query parameters are required.
  • id, name, description, and photoUrl are always present when the service is returned.

Response

{
  "categories": [
    {
      "categoryId": "3df6c08d-1111-2222-3333-a0ce0c2d8f11",
      "categoryName": "Cuts",
      "services": [
        {
          "id": "2f564239-1111-2222-3333-fdc2233f6c7d",
          "name": "Fade",
          "description": "Classic fade with clean finish",
          "photoUrl": null,
          "durationMinutes": 45,
          "price": 35
        }
      ]
    }
  ]
}
  • When prices are hidden, price is omitted instead of set to zero.
  • When service duration is hidden, durationMinutes is omitted.
curl -X GET "https://api.booqara.com/booking/services" \
  -H "x-private-key: pk_live_your_private_key"
GET/booking/staff

Qualified staff list

Returns the staff members that can appear in the public booking flow. Optional serviceId narrows the list to staff who can perform that service.

Request

serviceIduuidNo

Only staff who can perform that service. Omit to list all bookable staff.

Request notes

  • Path: GET /booking/staff or GET /booking/staff?serviceId=<uuid>.
  • For any professional, call GET /booking/dates, GET /booking/slots, and POST /booking/appointments with userId omitted or userId=any.

Response

{
  "staff": [
    {
      "id": "8caa3f5f-1111-2222-3333-bdfd8ef3f743",
      "fullName": "Maria Gomez",
      "jobTitle": "Lead stylist",
      "about": null,
      "photoUrl": null,
      "nextAvailable": null
    }
  ]
}
  • jobTitle, about, photoUrl, and color may be null.
  • nextAvailable is reserved and currently null.
curl -G "https://api.booqara.com/booking/staff" \
  -H "x-private-key: pk_live_your_private_key" \
  --data-urlencode "serviceId=2f564239-1111-2222-3333-fdc2233f6c7d"
GET/booking/dates

Available booking dates

Scans forward from a starting date and returns only days that have at least one bookable slot for the requested service and optional staff member.

Request

serviceIduuidYes

The selected service UUID.

userIduuid | anyNo

Specific staff UUID, or any / omitted for the full qualified pool.

fromYYYY-MM-DDNo

Start scanning from this date. Defaults to today in the business timezone.

countnumberNo

How many available dates to return. Defaults to 7, range 1–30.

horizonnumberNo

Maximum forward days to walk. Defaults to 60, range 1–120.

Response

{
  "from": "2026-01-15",
  "dates": [
    { "date": "2026-01-15", "slotCount": 4 },
    { "date": "2026-01-17", "slotCount": 2 }
  ]
}
  • slotCount is based on slot start times that are actually available, using the business slot interval.
  • Returns 400 when serviceId is missing or from is not in YYYY-MM-DD format.
curl -G "https://api.booqara.com/booking/dates" \
  -H "x-private-key: pk_live_your_private_key" \
  --data-urlencode "serviceId=2f564239-1111-2222-3333-fdc2233f6c7d" \
  --data-urlencode "userId=any" \
  --data-urlencode "from=2026-01-15" \
  --data-urlencode "count=7"
GET/booking/slots

Available slots for a date

Returns the slot grid for one date and one service, optionally narrowed to a specific staff member.

Request

dateYYYY-MM-DDYes

The local business date you want to inspect.

serviceIduuidYes

The service being booked.

userIduuid | anyNo

Specific staff UUID, or any / omitted for the qualified pool.

Response

{
  "date": "2026-01-15",
  "slots": [
    { "time": "10:00", "available": true },
    { "time": "10:30", "available": false },
    { "time": "11:00", "available": true }
  ]
}
  • Returns 400 when date or serviceId is missing.
  • An empty slots array means the day is closed, off-limits, outside the booking window, or fully unavailable.
curl -G "https://api.booqara.com/booking/slots" \
  -H "x-private-key: pk_live_your_private_key" \
  --data-urlencode "date=2026-01-15" \
  --data-urlencode "serviceId=2f564239-1111-2222-3333-fdc2233f6c7d" \
  --data-urlencode "userId=any"
POST/booking/appointments

Create an appointment

Creates a public appointment. The final status becomes confirmed when auto_confirm_bookings is enabled for the business, otherwise pending.

Request

serviceIduuidYes

Selected service UUID.

userIduuid | "any"No

Specific staff UUID, or any / omitted for auto-assign.

appointmentDateYYYY-MM-DDYes

The booking date.

appointmentTimeHH:MMYes

The requested slot start.

guestNamestringYes

Guest full name.

guestEmailstringNo

If provided, booking emails are sent to the guest.

guestPhonestringNo

Guest phone number.

customerNotesstringNo

Optional notes from the guest.

Response

{
  "success": true,
  "booking": {
    "id": "5a43e6ce-1111-2222-3333-39f7d1a233fb",
    "confirmationCode": "BN-1234",
    "serviceName": "Fade",
    "servicePrice": 35,
    "appointmentDate": "2026-01-20",
    "appointmentTime": "10:00",
    "durationMinutes": 45,
    "staffName": "Maria Gomez",
    "businessName": "North Elm Studio",
    "businessAddress": "123 Main St",
    "guestName": "Jordan Smith",
    "guestEmail": "jordan@example.com",
    "status": "confirmed"
  }
}
  • status is confirmed or pending depending on auto_confirm_bookings.
  • Use 409 responses as a signal to re-fetch /booking/slots and ask the customer to choose again.

Error cases

400

Missing required fields, bad date/time, invalid service, or invalid staff.

404

Service not found for this business.

409

The slot was taken concurrently and is no longer free.

curl -X POST "https://api.booqara.com/booking/appointments" \
  -H "Content-Type: application/json" \
  -H "x-private-key: pk_live_your_private_key" \
  -d '{
    "serviceId": "2f564239-1111-2222-3333-fdc2233f6c7d",
    "userId": "any",
    "appointmentDate": "2026-01-20",
    "appointmentTime": "10:00",
    "guestName": "Jordan Smith",
    "guestEmail": "jordan@example.com",
    "guestPhone": "(555) 123-4567",
    "customerNotes": "Please ring when you arrive"
  }'
GET/booking/appointments/{id}

Fetch an appointment by ID

Loads a single appointment belonging to the authenticated business so you can confirm booking details or power a manage-booking screen.

Request

iduuidYes

Appointment UUID in the path.

Response

{
  "id": "5a43e6ce-1111-2222-3333-39f7d1a233fb",
  "confirmationCode": "BN-1234",
  "serviceName": "Fade",
  "servicePrice": 35,
  "appointmentDate": "2026-01-20",
  "appointmentTime": "10:00:00",
  "durationMinutes": 45,
  "staffName": "Maria Gomez",
  "status": "pending",
  "guestName": "Jordan Smith",
  "guestEmail": "jordan@example.com",
  "businessName": "North Elm Studio",
  "businessAddress": "123 Main St"
}
  • appointmentTime is returned in the database form, often HH:MM:SS.
  • Returns 404 with { "success": false, "error": "Not found" } when the appointment does not belong to the business.
curl -X GET "https://api.booqara.com/booking/appointments/5a43e6ce-1111-2222-3333-39f7d1a233fb" \
  -H "x-private-key: pk_live_your_private_key"
DELETE/booking/appointments/{id}

Cancel an appointment

Cancels a pending or confirmed appointment for the same business. Use this for public manage-booking flows.

Request

iduuidYes

Appointment UUID in the path.

Response

{
  "success": true,
  "status": "cancelled"
}
  • Returns 404 if the appointment is missing, outside the valid range, or not cancellable.
curl -X DELETE "https://api.booqara.com/booking/appointments/5a43e6ce-1111-2222-3333-39f7d1a233fb" \
  -H "x-private-key: pk_live_your_private_key"
OPTIONSAny route

CORS preflight

OPTIONS requests are supported on every route for browser preflight handling.

Response

{}
  • Returns HTTP 200 with an empty JSON body.
  • CORS allows Content-Type and x-private-key.
curl -X OPTIONS "https://api.booqara.com/booking/services"