Workspace

Bookings API

Read the open slots, take one, from your own booking page.

Two calls against the same slug you already share as /b/your-call. One reads what is free, the other takes a time. Both are public, need no key, and are callable straight from the browser on any domain.

Open slots

GET https://www.systemos.so/api/public/book/your-call

{
  "unbookable": false,
  "type": { "name": "Intro call", "durationMinutes": 30, "questions": [...], "provider": "google_meet" },
  "host": { "name": "Finn Garrels" },
  "timezone": "Europe/Tallinn",
  "slots": [{ "startISO": "2026-09-22T09:00:00.000Z", "endISO": "2026-09-22T09:30:00.000Z" }, ...]
}

unbookable true with an empty slots list means the call cannot be taken right now — typically a Google Meet type whose calendar connection is gone. Say so on your page rather than showing a booking form that will be refused.

Taking a slot

POST https://www.systemos.so/api/public/book/your-call
Content-Type: application/json

{
  "start": "2026-09-22T09:00:00.000Z",
  "name": "Anna Weber",
  "email": "anna@studiokern.de",
  "timezone": "Europe/Berlin",
  "answers": { "<question id>": "Rebrand for a launch in March" }
}

→ 200 { "ok": true, "bookingId": "…", "meetLink": "https://meet.google.com/…", "when": "Tue, 22 Sep, 12:00 EEST" }

start has to be one of the startISO values the GET returned, verbatim. The slot is checked again on the way in, so a time taken in the meantime comes back as 409 with a message you can show — that is a normal outcome on a busy calendar, not an error to hide.

timezone is the invitee's, and only decides how the confirmation reads to them. Leave it out and it is treated as UTC.

Answers

Unlike the forms API, the keys here are not free: an answer is kept only when its key is one of the question ids from the GET. Anything else is dropped without a word. The confirmation email prints each answer under its question's label, and a field with no question has no label to print.

What you get back

  • 400 — a missing name, an invalid email, or no slot.
  • 404 — no such booking page.
  • 409 — the slot went while they were typing, or the page cannot mint the Meet link it promises.
  • 429 — rate limited: 20 bookings per IP and 60 per page, each per 10 minutes.
A booking through the API is a booking: the confirmation email goes out, the event lands on the host's real calendar with a Meet link, and the webhook fires. Test against a booking type you are happy to actually receive.