Skip to content

Booking Pages

Booking pages (bkp_ prefix) are public, agent-provisioned scheduling links. An agent creates a page bound to a calendar; a human opens the hosted booking_url, picks a slot, and Chronary creates a confirmed event on the calendar and fires event.created with a booking_page_id correlation field. See the Booking Pages guide for a walkthrough.

POST /v1/booking-pages
FieldTypeRequiredDescription
calendar_idstringyesCalendar a booking resolves to.
titlestringyesMeeting title shown on the page.
descriptionstringnoDescription shown to the booker.
duration_minutesintegernoSlot length (5–480, default 30).
buffer_minutesintegernoPadding before/after existing events (0–120, default 0).
window_daysintegernoHow far ahead bookings are allowed (1–365, default 14).
min_notice_minutesintegernoMinimum lead time before a bookable slot (default 0).
timezonestringnoIANA timezone for display + working hours (default UTC).
availability_constraintsobject | nullnoWeekly working hours, e.g. {"mon":{"start":"09:00","end":"17:00"}}. null = any time in the window.
activebooleannoWhether the page accepts bookings (default true).
{
"calendar_id": "cal_01H9X4M2P5R8T6V0",
"title": "Intro call",
"duration_minutes": 30,
"window_days": 14
}

Response 201: a BookingPage object including a slug and booking_url (https://api.chronary.ai/book/<slug>).

GET /v1/booking-pages?limit=50&offset=0

Response 200: { data: BookingPage[], total, limit, offset }. Agent-scoped keys see only pages on their own agent’s calendars.

GET /v1/booking-pages/:id
PATCH /v1/booking-pages/:id
DELETE /v1/booking-pages/:id

PATCH accepts any of the create fields except calendar_id. DELETE soft-deletes the page (its hosted URL stops resolving; already-booked events are unaffected) and returns 204.

The slug is the credential — these endpoints take no API key.

GET /book/:slug/slots

Response 200:

{
"booking_page": { "slug": "<slug>", "title": "Intro call", "description": null, "duration_minutes": 30, "timezone": "UTC" },
"slots": [{ "start": "2026-07-15T16:00:00.000Z", "end": "2026-07-15T16:30:00.000Z" }]
}
POST /book/:slug

Accepts JSON (returns JSON) or an HTML form (returns an HTML confirmation).

{ "name": "Ada Lovelace", "email": "[email protected]", "notes": "Looking forward!", "start": "2026-07-15T16:00:00.000Z" }

Response 201: { "booking_page_id": "bkp_...", "event": { "id": "evt_...", "status": "confirmed" } }. The start is re-validated against live availability; a slot taken since the page loaded returns 409.

GET /book/:slug

Returns the server-rendered HTML scheduling page (text/html). Pass ?slot=<ISO> to render the confirmation form for a chosen slot.

Booking pages are available on every plan — Free: 1, Pro: 25, Custom: unlimited. Each booking creates an event, so booking volume counts toward the monthly events quota.