The calendar surface normalizes Google and Microsoft calendars, and adds a virtual calendar for accounts that have no external calendar provider.
Calendars and events
List calendars on a connection, then create, read, update, and delete events. Times are ISO 8601; include the event timezone so recurring and all-day handling stays correct. Conference links (Google Meet, Microsoft Teams) are requested per event and returned on the event.
curl -X POST https://api.hora.to/v1/calendars/cal_primary/events \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"connection_id":"conn_123","title":"Intro call","start":"2026-06-10T16:00:00Z","end":"2026-06-10T16:30:00Z","timezone":"America/Costa_Rica"}'Availability and free/busy
Query raw free/busy across one or more calendars, or ask the availability engine for bookable slots. Availability accounts for the host timezone, working windows, notice, and buffers, so slots are safe to offer to an invitee.
curl -X POST https://api.hora.to/v1/calendars/freebusy/query \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"connection_id":"conn_123","calendar_ids":["primary"],"from":"2026-06-10T00:00:00Z","to":"2026-06-11T00:00:00Z"}'RSVP and conferencing
Respond to invitations (accept, tentative, decline) and the response propagates to the provider. Request a conference link on an event so meetings created through Horato carry a join URL.
Virtual calendar
When an account has no Google, Microsoft, or Apple calendar, create a Horato-native virtual calendar. It activates immediately with no OAuth, behaves like any other calendar connection, and is a first-class scheduling and recorder target — bookings, reminders, and meeting notetakers all work against it.
Create it by connecting the `virtual` provider; a default virtual calendar is provisioned automatically.
curl -X POST https://api.hora.to/v1/connections \
-H "Authorization: Bearer $HORATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"provider":"virtual"}'