Scheduling

Scheduling

Define bookable event types, offer availability, take bookings, and send confirmation and reminder emails.

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.

Create an event typebash
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.

Get availabilitybash
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.

Create a bookingbash
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"}'
Reschedule and cancelbash
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.

Enable confirmation + 24h/1h remindersbash
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]}}'