Bookings API
The Booking object
A booking is a meeting someone picked on a host's booking page (/book/<workspace>/<host>/<type>), or one you booked for them with POST /api/v1/bookings. Each booking also creates a MEETING task on the CRM calendar and links the invitee to a contact, or to a new lead.
Scopes
| Scope | Allows |
|---|---|
read:bookings | List and read bookings, meeting types, hours, hosts and open slots |
write:bookings | Book, cancel and reschedule; create, change, pause and archive meeting types; change hours and host timezones |
write:calendar | Put a meeting on the CRM calendar, and refresh a user's connected calendars |
An API key belongs to the workspace, not to a person. Endpoints that act for a particular person take a hostUserId, which must be an active user in the key's workspace. GET /api/v1/booking-hosts lists them.
Fields
| Field | Type | Notes |
|---|---|---|
id | string | The booking ID |
status | string | CONFIRMED or CANCELLED |
startAt, endAt | string | ISO 8601 instants in UTC |
hostTimezone | string | The host's timezone when the meeting was booked |
inviteeTimezone | string | The invitee's timezone |
host | object | { id, name, email } |
bookingType | object | { id, title, slug, durationMin, locationKind, locationValue } |
inviteeName, inviteeEmail | string | |
inviteePhone, inviteeNotes | string or null | |
guests | string[] | Extra attendee emails |
answers | object[] | { label, value } for each booking-form question, with the label as it was asked |
contactId, leadId | string or null | The contact the invitee matched, or the lead created for them |
taskId | string or null | The MEETING task on the CRM calendar |
joinUrl | string or null | The video link. Null once cancelled |
onHostCalendar | boolean | The meeting is on the host's Google or Outlook calendar |
sequence | integer | Goes up by one on every reschedule and on cancel |
cancelReason, cancelledBy, cancelledAt | string or null | cancelledBy is host or invitee |
createdAt | string |
{
"id": "cmq9book0alk34567890",
"status": "CONFIRMED",
"startAt": "2026-10-05T13:00:00.000Z",
"endAt": "2026-10-05T13:30:00.000Z",
"hostTimezone": "America/New_York",
"inviteeTimezone": "Europe/London",
"host": { "id": "cmq1user0alk34567890", "name": "Kevin Shah", "email": "kevin@example.com" },
"bookingType": { "id": "cmq8type0alk34567890", "title": "Intro call", "slug": "intro-call", "durationMin": 30, "locationKind": "GOOGLE_MEET", "locationValue": null },
"inviteeName": "Dana Reed",
"inviteeEmail": "dana@example.com",
"inviteePhone": null,
"inviteeNotes": "Pricing for 40 seats.",
"guests": [],
"answers": [{ "label": "Company size", "value": "40" }],
"contactId": "cmq2cont0alk34567891",
"leadId": null,
"taskId": "cmq7task0alk34567890",
"joinUrl": "https://meet.google.com/abc-defg-hij",
"onHostCalendar": true,
"sequence": 0,
"cancelReason": null,
"cancelledBy": null,
"cancelledAt": null,
"createdAt": "2026-09-27T14:02:00.000Z"
}The invitee's private reschedule and cancel link is never part of a booking in the API. Anyone holding it could change the meeting without signing in, so it only ever goes to the invitee by email.