Booking Pro API

Classes

Read the class timetable, see who is booked, and book, cancel or check in a spot.

Gyms and studios run group classes next to one-to-one appointments: a class has spots, a roster, and a waitlist, and a member's spot is covered by their membership or package when they check in. These endpoints need the read:classes and write:classes scopes. A salon or spa key gets an empty timetable.

The timetable

GET /classes lists the classes in a window (default the next 7 days, at most 31), earliest first, with how many spots are booked and left:

curl "https://api.bookingpro.ai/api/v1/classes?location_id=loc_...&from=2026-09-16T00:00:00Z&to=2026-09-17T00:00:00Z" \
  -H "Authorization: Bearer bp_sk_live_..."
{
  "data": [
    {
      "id": "cls_...",
      "location_id": "loc_...",
      "service_id": "svc_...",
      "service_name": "Spin Class",
      "technician_name": "Dana Levi",
      "start": "2026-09-16T17:00:00Z",
      "end": "2026-09-16T17:45:00Z",
      "capacity": 16,
      "booked": 11,
      "spots_left": 5,
      "waiting": 0,
      "status": "scheduled"
    }
  ],
  "next_cursor": null
}

GET /classes/{id} adds the roster (each spot with its status and what covers it in paid_by) and the waitlist in order.

Book a spot

POST /classes/{id}/book with a contact_id holds a spot. Nothing is charged at booking; paid_by tells you what will be consumed at check-in:

  • membership: a plan that covers the service with a visit available (per-service limits such as "2 classes a week" are honored by class start time).
  • package: a prepaid credit.
  • free_class: one of the free classes the service allows before payment.
  • none: nothing covers it; the front desk charges at checkout.

When the service requires a membership or package and the contact has none, you get 422 entitlement_required. Pass allow_without_entitlement: true to book anyway (the desk charges later), which is what staff do. A full class returns 409 class_full; members can join the waitlist from the customer app. Signup cutoff, max per day and first-timers-only rules return 422 booking_rule with a plain-language message. Send an Idempotency-Key.

Cancel a spot

POST /classes/{id}/cancel with the contact_id releases the spot. Inside the location's cancellation window it is a late cancel (late: true) and the covering credit is still consumed, unless you pass excuse: true. A freed spot goes to the waitlist automatically.

Check in

POST /classes/{id}/check-in with the contact_id marks the spot checked in and consumes the covering credit. The location's member check-in alert blocks apply: a blocked check-in returns 422 checkin_blocked with reasons (for example past_due, no_card, form_missing); a manager overrides at the desk.

What you cannot do here yet

Creating class times (the weekly series), the waitlist, and standing enrollments are managed in the dashboard and the customer app. Tell us if your integration needs them.

On this page