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

  1. Sign in to Calendo and open Settings → Integrations → API and Zapier / Make.
  2. Give the key a name (for example "Zapier") and select Create API key.
  3. 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

MethodPathDescription
GET/api/v1/meKey's account
GET/api/v1/event-typesMeeting types
GET/api/v1/availabilityAvailable times
GET/api/v1/bookingsBookings
POST/api/v1/bookingsCreate booking
GET/api/v1/bookings/{id}Single booking
POST/api/v1/bookings/{id}/cancelCancel 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/bookings

The 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/cancel

Cancelling 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 invalid
  • 401 unauthorized: the key is missing, invalid or deleted
  • 403 plan_required: the account is not on the Pro plan
  • 404 not_found: the booking or meeting type does not exist on this account
  • 409 conflict: the time is not available or all places are taken
  • 429 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

  1. In your Zap, create the trigger Webhooks by Zapier → Catch Hook and copy its URL.
  2. In Calendo, go to Settings → Integrations → Webhooks and Zapier, paste the URL and choose the events.
  3. 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.
  4. 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

  1. Add the action Webhooks by Zapier → Custom Request.
  2. Method POST, URL https://calendo.fi/api/v1/bookings, Data for example {"eventType":"konsultaatio","startsAt":"…","name":"…","email":"…"}.
  3. Headers: Authorization = Bearer cal_live_… and Content-Type = application/json.
  4. Cancelling: Method POST, URL https://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)

  1. 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.
  2. Action: add HTTP → Make a request. URL for example https://calendo.fi/api/v1/bookings, Method POST, Headers Authorization: Bearer cal_live_…, Body type Raw, Content type JSON, and the body as above. Select Parse response.
  3. Fetching bookings: Method GET, URL https://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.