Scheduling is a white-label booking engine on top of calendar. Event types define the offer; the availability engine computes safe slots; bookings are created transactionally so two invitees cannot take the same slot. Scheduling request bodies and responses use camelCase field names.
Event types
An event type is a bookable meeting definition: duration, location type, availability policy (host timezone, working windows, notice, buffers), an optional connection and calendar to write to, branding, and custom questions. Create and update them via the API or the panel.
curl -X POST https://api.hora.to/v1/scheduling/event-types \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"slug":"intro-call","name":"Intro call","durationMinutes":30,"connectionId":"conn_123","calendarId":"cal_primary"}'Availability
Ask an event type for bookable slots in a window. The engine returns slots already adjusted for the host timezone, working hours, minimum notice, maximum advance, and buffers — offer them to the invitee as-is.
curl "https://api.hora.to/v1/scheduling/event-types/evt_123/availability?from=2026-06-10T00:00:00Z&to=2026-06-17T00:00:00Z" \
-H "Authorization: Bearer $HORATO_API_KEY"Bookings
Create a booking against an offered slot. The write is transactional and re-checks availability, so a slot taken concurrently returns a `conflict` instead of a double-booking. If the event type has a connection and calendar, a calendar event (and conference link) is created best-effort. Reschedule and cancel move or release the slot.
Send an `Idempotency-Key` so a retried create returns the original booking instead of a duplicate.
curl -X POST https://api.hora.to/v1/scheduling/bookings \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Idempotency-Key: bk-2026-06-10-dana" \
-H "Content-Type: application/json" \
-d '{"eventTypeId":"evt_123","start":"2026-06-10T16:00:00Z","inviteeEmail":"dana@example.com","inviteeName":"Dana","inviteeTimezone":"America/Costa_Rica"}'curl -X POST https://api.hora.to/v1/scheduling/bookings/bk_123/reschedule \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"start":"2026-06-11T16:00:00Z"}'
curl -X POST https://api.hora.to/v1/scheduling/bookings/bk_123/cancel \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Invitee requested"}'Confirmation and reminders
Reminders are opt-in per event type through `reminderPolicy`. Turn on a confirmation (sent immediately on booking) and any number of reminder offsets in minutes before the start. Notifications are sent from the event type's connection and delivered by the same retrying dispatcher as scheduled email; cancelling or rescheduling a booking automatically voids or re-anchors its pending notifications.
By default `reminderPolicy` is empty, so existing event types stay silent until you opt in. Point `confirmationTemplateSlug` / `reminderTemplateSlug` at an email template to control the copy, or omit them to use built-in wording.
curl -X PATCH https://api.hora.to/v1/scheduling/event-types/evt_123 \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reminderPolicy":{"confirmation":true,"reminderMinutes":[1440,60]}}'