API and integrations
REST API v1, webhooks, Zapier and Make.
Overview
Calendo's public REST API is a Pro plan feature. With it you can fetch bookings, meeting types and available times, and create and cancel bookings from your own system, Zapier or Make.
All responses are JSON, and times are in ISO 8601 format in UTC (for example 2026-10-05T11:00:00.000Z). Machine-readable description: /api/v1/openapi.json (OpenAPI 3.1).
A booking made through the API follows the same rules as a booking added in the admin panel: the time is checked against availability and calendars, capacity and the host are taken into account, a calendar event and a confirmation message are created, and webhooks are sent. No prepayment is charged (as with bookings you add yourself in the admin panel).
Authentication and API keys
- Sign in to Calendo and open Settings → Integrations → API and Zapier / Make.
- Give the key a name (for example "Zapier") and select Create API key.
- Copy the key right away. It is shown only once; Calendo stores only a hash of it.
Send the key with every request in this header:
Authorization: Bearer cal_live_…A key only gives access to the data of the account where it was created. If a key falls into the wrong hands, delete it in the same view: it stops working immediately. If the account moves to a plan below Pro, its keys do not work until Pro is active again.
Rate limits
Each key can make at most 120 requests per minute and 3000 per hour. The X-RateLimit-Limit and X-RateLimit-Remaining response headers show where you stand. When you exceed the limit, the response is 429 and the Retry-After header tells you how many seconds to wait.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/me | Key's account |
| GET | /api/v1/event-types | Meeting types |
| GET | /api/v1/availability | Available times |
| GET | /api/v1/bookings | Bookings |
| POST | /api/v1/bookings | Create booking |
| GET | /api/v1/bookings/{id} | Single booking |
| POST | /api/v1/bookings/{id}/cancel | Cancel booking |
Examples
Bookings in a date range
curl -H "Authorization: Bearer $CALENDO_KEY" \
"https://calendo.fi/api/v1/bookings?from=2026-10-01&to=2026-11-01&status=confirmed"Available times for the next week
curl -H "Authorization: Bearer $CALENDO_KEY" \
"https://calendo.fi/api/v1/availability?eventType=konsultaatio&from=2026-10-05&days=7"Creating a booking
curl -X POST -H "Authorization: Bearer $CALENDO_KEY" -H "Content-Type: application/json" \
-d '{"eventType":"konsultaatio","startsAt":"2026-10-05T11:00:00Z","name":"Maija Meikäläinen","email":"maija@example.com","phone":"+358401234567","notes":"Tuli verkkokaupasta"}' \
https://calendo.fi/api/v1/bookingsThe start time must be one of the available times returned by /availability; otherwise the response is 409.
Cancelling a booking
curl -X POST -H "Authorization: Bearer $CALENDO_KEY" https://calendo.fi/api/v1/bookings/123/cancelCancelling refunds any prepayment in full, removes the calendar event and sends the customer a cancellation message.
Errors
Error responses always have the same shape (the message text is in Finnish):
{ "error": { "code": "conflict", "message": "Aika ei ole enää vapaana. Valitse toinen aika." } }400 invalid_request: a field is missing or invalid401 unauthorized: the key is missing, invalid or deleted403 plan_required: the account is not on the Pro plan404 not_found: the booking or meeting type does not exist on this account409 conflict: the time is not available or all places are taken429 rate_limited: the rate limit was exceeded
Webhooks (events)
Calendo can notify an address you choose about new (booking.created), cancelled (booking.cancelled) and rescheduled (booking.rescheduled) bookings. Webhooks are added under Settings → Integrations → Webhooks and Zapier (Growth and Pro).
The body is JSON: { "event": "booking.created", "createdAt": "…", "data": { …varaus… } }, where the booking has the same shape as the API's Booking. Every request is signed with the header Calendo-Signature: t=<unix-time>,v1=<HMAC-SHA256>, where the HMAC is computed with the webhook's secret over the string <t>.<body>. A failed delivery is retried after 1, 5 and 30 minutes and after 2 and 12 hours.
Zapier
Zapier's own "Webhooks by Zapier" actions are all you need to connect Zapier; no separate Calendo app is required. Note that Webhooks by Zapier is a Zapier premium app and requires a paid Zapier plan.
Trigger: new, cancelled or rescheduled booking
- In your Zap, create the trigger Webhooks by Zapier → Catch Hook and copy its URL.
- In Calendo, go to Settings → Integrations → Webhooks and Zapier, paste the URL and choose the events.
- Press Send test in Calendo to check the connection. Then make one real booking (test bookings do not send webhooks) and pull it into Zapier as a sample.
- The booking details (customer, time, service, management link) appear in Zapier as fields you can pick in later steps.
Action: create or cancel a booking, fetch bookings
- Add the action Webhooks by Zapier → Custom Request.
- Method
POST, URLhttps://calendo.fi/api/v1/bookings, Data for example{"eventType":"konsultaatio","startsAt":"…","name":"…","email":"…"}. - Headers:
Authorization=Bearer cal_live_…andContent-Type=application/json. - Cancelling: Method
POST, URLhttps://calendo.fi/api/v1/bookings/ID/cancel.
A dedicated Calendo app in Zapier's app directory (ready-made "Calendo" triggers and actions without Webhooks by Zapier) requires building the app on Zapier's developer platform and going through Zapier's own review and publishing process. This has not been done yet. The API and the OpenAPI description are enough to build it on.
Make (formerly Integromat)
- Trigger: add Webhooks → Custom webhook to your scenario, copy the URL and add it in Calendo under Settings → Integrations → Webhooks and Zapier. Then make one booking (for example for yourself, and cancel it afterwards) so that Make can detect the booking's data structure. Test bookings do not send webhooks.
- Action: add HTTP → Make a request. URL for example
https://calendo.fi/api/v1/bookings, MethodPOST, HeadersAuthorization: Bearer cal_live_…, Body type Raw, Content type JSON, and the body as above. Select Parse response. - Fetching bookings: Method
GET, URLhttps://calendo.fi/api/v1/bookings?from=…&sort=-createdAt.
You can also build your own Calendo app in Make (Custom app). It would only become public in Make's app directory after Make has reviewed it.