API Reference

Bookings

Create appointments on behalf of your customers, read the salon calendar, and pull a single booking by id. Every booking belongs to the business that owns the API key. Mobile (at-customer) bookings are supported with live travel-fee quoting.

Scope and plan

Reading bookings requires the bookings:read scope. Creating a booking requires bookings:write. API keys are available on the PRO and ENTERPRISE plans. The path businessId must match the business your key belongs to.

List bookings

GET/businesses/{businessId}/bookings
bookings:readPRO plan

Returns a paginated list of bookings for the business, newest first by default.

Path parameters

NameTypeRequiredDescription
businessIduuidRequiredYour business id.

Query parameters

NameTypeRequiredDescription
statusenumOptionalFilter by booking status (PENDING, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED, NO_SHOW).
paymentStatusstringOptionalComma-separated payment statuses (e.g. PENDING,ON_SITE).
staffIduuidOptionalOnly bookings assigned to this staff member.
customerIduuidOptionalOnly bookings for this customer.
startDatedateOptionalInclusive lower bound (YYYY-MM-DD).
endDatedateOptionalInclusive upper bound (YYYY-MM-DD).
searchstringOptionalMatch customer name, email, phone, or booking number.
sortOrderasc | descOptionalSort direction by date. Defaults to desc.
pageintegerOptionalPage number. Defaults to 1.
limitintegerOptionalItems per page (1-100). Defaults to 20.
curl "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings?status=CONFIRMED&limit=20" \
  -H "X-API-Key: sk_live_..."
{
  "data": [
    {
      "id": "bk_3f9c2a",
      "bookingNumber": "B-100247",
      "businessId": "b_8f3a",
      "customerId": "cu_9a21",
      "staffId": "st_4d11",
      "date": "2026-07-02",
      "startTime": "09:00",
      "endTime": "10:00",
      "totalDuration": 60,
      "subtotal": 45,
      "travelCost": 0,
      "discount": 0,
      "total": 45,
      "tipAmount": 0,
      "status": "CONFIRMED",
      "customerName": "Anna Berg",
      "customerEmail": "[email protected]",
      "isMobile": false,
      "paymentMethod": "ON_SITE",
      "paymentStatus": "PENDING",
      "depositRequired": false,
      "depositPaid": false,
      "rescheduledCount": 0,
      "reminderSent": false,
      "createdAt": "2026-06-20T11:04:12.000Z",
      "updatedAt": "2026-06-20T11:04:12.000Z",
      "services": [
        {
          "id": "bs_01",
          "serviceId": "sv_77",
          "serviceName": "Women's Cut",
          "price": 45,
          "duration": 60,
          "addons": []
        }
      ]
    }
  ],
  "meta": { "total": 312, "page": 1, "limit": 20, "totalPages": 16 }
}

Retrieve a booking

GET/businesses/{businessId}/bookings/{bookingId}
bookings:readPRO plan

Path parameters

NameTypeRequiredDescription
businessIduuidRequiredYour business id.
bookingIduuidRequiredThe booking id.
curl "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings/bk_3f9c2a" \
  -H "X-API-Key: sk_live_..."
{
  "data": {
    "id": "bk_3f9c2a",
    "bookingNumber": "B-100247",
    "status": "CONFIRMED",
    "date": "2026-07-02",
    "startTime": "09:00",
    "endTime": "10:00",
    "total": 45,
    "paymentStatus": "PENDING",
    "customerName": "Anna Berg",
    "services": [
      { "id": "bs_01", "serviceId": "sv_77", "serviceName": "Women's Cut", "price": 45, "duration": 60, "addons": [] }
    ],
    "staff": { "id": "st_4d11", "firstName": "Marie", "lastName": "Dupont" }
  }
}

Create a booking

POST/businesses/{businessId}/bookings
bookings:writePRO plan

Books one or more services for a customer. Supply a customerId to book on behalf of an existing customer, or set isWalkIn with customerName/customerEmail for a walk-in. For at-customer (mobile) appointments, pass mobileAddress or addressId.

Idempotency

Pass an Idempotency-Key header to safely retry a create without risk of a duplicate booking. The same key replays the original response for 24 hours.

Body parameters

NameTypeRequiredDescription
datedateRequiredAppointment date (YYYY-MM-DD).
startTimestringRequiredStart time in HH:mm.
servicesobject[]RequiredArray of { serviceId, variantId?, addons?: [{ addonId }] }.
staffIduuidOptionalStaff member. Auto-assigned if omitted.
customerIduuidOptionalBook on behalf of an existing customer.
isWalkInbooleanOptionalMark as a walk-in customer.
customerNamestringOptionalWalk-in customer name.
customerEmailstringOptionalWalk-in customer email.
customerPhonestringOptionalWalk-in customer phone.
customerNotesstringOptionalCustomer notes or special requests.
mobileAddressstringOptionalFree-text address for an at-customer booking.
addressIduuidOptionalSaved customer address id for a mobile booking.
paymentMethodenumOptionalON_SITE (default) or ONLINE.
tipAmountnumberOptionalTip in main currency units (0-500). 100% goes to the venue.
couponCodestringOptionalCoupon code to apply.
giftCardCodesstring[]OptionalGift card codes to apply.
bookingSourceenumOptionalWEBSITE, WIDGET, MOBILE_APP, DASHBOARD, MARKETPLACE, GOOGLE.
curl -X POST "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 4c1f9b2e-..." \
  -d '{
    "date": "2026-07-02",
    "startTime": "09:00",
    "staffId": "st_4d11",
    "customerId": "cu_9a21",
    "services": [{ "serviceId": "sv_77" }],
    "paymentMethod": "ON_SITE"
  }'
{
  "booking": {
    "id": "bk_3f9c2a",
    "bookingNumber": "B-100247",
    "status": "CONFIRMED",
    "date": "2026-07-02",
    "startTime": "09:00",
    "endTime": "10:00",
    "total": 45,
    "paymentMethod": "ON_SITE",
    "paymentStatus": "PENDING",
    "services": [
      { "id": "bs_01", "serviceId": "sv_77", "serviceName": "Women's Cut", "price": 45, "duration": 60, "addons": [] }
    ]
  },
  "depositInfo": null
}

Reschedule a booking

PATCH/businesses/{businessId}/bookings/{bookingId}/reschedule
bookings:writePRO plan

Body parameters

NameTypeRequiredDescription
datedateRequiredNew date (YYYY-MM-DD).
startTimestringRequiredNew start time in HH:mm.
staffIduuidOptionalReassign to a different staff member.
curl -X PATCH "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings/bk_3f9c2a/reschedule" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "date": "2026-07-03", "startTime": "11:00" }'
{
  "data": {
    "id": "bk_3f9c2a",
    "status": "CONFIRMED",
    "date": "2026-07-03",
    "startTime": "11:00",
    "endTime": "12:00",
    "rescheduledCount": 1,
    "rescheduledFrom": "2026-07-02T09:00:00.000Z"
  }
}

Cancel a booking

PATCH/businesses/{businessId}/bookings/{bookingId}/cancel
bookings:writePRO plan

Body parameters

NameTypeRequiredDescription
cancelReasonstringOptionalFree-text cancellation reason.
cancelReasonKeyenumOptionalscheduleConflict, personalReasons, illness, providerUnreachable, noLongerNeeded, other.
curl -X PATCH "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings/bk_3f9c2a/cancel" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "cancelReasonKey": "noLongerNeeded" }'
{
  "data": {
    "id": "bk_3f9c2a",
    "status": "CANCELLED",
    "cancelledAt": "2026-06-21T08:15:00.000Z",
    "cancelReason": "noLongerNeeded"
  }
}

Quote a mobile booking

POST/businesses/{businessId}/bookings/mobile-quote
PRO plan

Returns a live travel-fee quote for an at-customer (mobile) booking before you create it. Pass a saved address id, a free-text address to geocode, or raw lat/lng coordinates, plus the service subtotal.

Body parameters

NameTypeRequiredDescription
subtotalnumberRequiredService subtotal before travel cost or discount.
addressIduuidOptionalSaved customer address id to quote against.
mobileAddressstringOptionalFree-text address to geocode.
latnumberOptionalCustomer latitude (used if no address is given).
lngnumberOptionalCustomer longitude (used if no address is given).
curl -X POST "https://api.salonify.eu/api/v1/businesses/b_8f3a/bookings/mobile-quote" \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "subtotal": 60, "mobileAddress": "Place Guillaume II, Luxembourg" }'
{
  "travelCost": 12.5,
  "travelDistanceKm": 8.4,
  "subtotal": 60,
  "total": 72.5,
  "withinRadius": true
}

Booking lifecycle actions

The status transitions confirm, start, complete, no-show, mark-paid and mark-remaining-paid all live under PATCH /businesses/{businessId}/bookings/{bookingId}/<action> and require the bookings:write scope. They take no body unless noted above.