Skip to main content
External booking is a two-step conversation with the diary: ask what is free, then book one of the answers. Both steps run on the same engine as the PracticeHub calendar and online booking, so a slot the API offers is a slot the practice would book.
1

Find free slots

Slots are in the clinic timezone, earliest first, at most 50 per day. unavailable_dates lists days in the range with nothing free — handy for greying out a calendar without a request per day.
2

Book one of them

Copy start, end, practitioner_id, location_id and appointment_type_id straight from the slot. For a group slot send its group_master_id instead of start/end — you are taking a place in an existing session.
3

Handle a clash

Someone may book the same time between your two calls. POST /appointments checks the practitioner’s diary at the moment of writing and answers 409 with code slot_unavailable if the time is no longer free (or group_full for a group). Re-query availability and offer the next slot — the Idempotency-Key makes a retry of the same booking safe, but a new time is a new request.

Parameters

Two views of the diary

visibility=online (default)

What a patient sees when booking online. The location, appointment type and (if given) practitioner must be enabled for online booking — otherwise 422 not_online_bookable — and every online-booking rule applies: minimum advance notice, how far ahead, daily caps, online-only availability guides, slot clustering. Use this for websites, apps and marketplaces.

visibility=all

What the front desk could book: every open slot for practitioners who provide the type, subject only to physical capacity (columns / resources). No online-booking rules. Use this for staff-facing tools and internal automations.

Deliberate overbooking

The clash check exists to protect the diary from integrations that cannot see it. If you mean to book over an existing appointment — a data migration, a practice that double-books on purpose — send "allow_clash": true and the appointment is written wherever you say, exactly as a staff member clicking the calendar would.

Not the same as practitioner_availabilities

practitioner_availabilities is a resource: the raw working-hours records (who is in, where, when). GET /availability is a computation over those records, existing appointments, closures, resources and the appointment type — the free time that is left. Read the first to know when someone works; call the second to know when they can be booked.
Rate limits are per API key. A booking widget serving many visitors should fetch a week at a time and re-check only when the visitor picks a day, rather than polling per day.