Skip to main content
GET
Get open start times
Returns bookable start times as UTC instants. Minimum notice, booking horizon, appointment duration, trailing buffers, and DST transitions are already applied, so every instant returned was bookable at the moment it was computed. The response never contains booking rows, customer data, or explicit busy ranges. slots is the entire payload by design — a busy-range response would leak the tenant’s calendar to anyone with a slug.
Availability is advisory; the submit is authoritative. Another customer can take a slot between this read and your write, which comes back as 409 booking_conflict.Responses are cached 5s in the browser and 15s in the shared cache, so a plain refetch straight after a conflict can hand you back the slot you just lost. Append a cache-buster (&_=${Date.now()}) when you refetch after a 409.

Grouping into local days is your job

slots are instants; timezone is the tenant’s IANA zone. Rendering “Tuesday” correctly — and surviving DST — means bucketing in that zone, not the visitor’s:

Window rules

from is inclusive, to is exclusive, both must be ISO-8601 with an offset, and the window may span at most 62 days. A wider window is 400 window_too_large — page through it instead. The hosted page requests 60 days, comfortably inside the cap.

Path Parameters

slug
string
required

The tenant's public booking slug. Issued by DPC; there is no discovery endpoint.

Query Parameters

service_id
string<uuid>
required

Duration and buffers are taken from this service.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
from
string<date-time>
required

Inclusive window start. ISO-8601 with an offset.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
to
string<date-time>
required

Exclusive window end. ISO-8601 with an offset. At most 62 days after from.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

Response

Open start times as UTC instants

service_id
string<uuid>
required
Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
from
string
required
to
string
required
timezone
string
required
slots
string[]
required