Booking Lifecycle
Create a Booking
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
meetingTypeId | string | Yes | Meeting type UUID |
start | string | Yes | Start time (ISO 8601 with timezone) |
hostIds | string[] | No* | Host user UUIDs |
queueId | string | No* | Queue ID for round-robin (alternative to hostIds) |
attendee | object | Yes | Attendee information |
duration | number | No | Duration in minutes (must match an allowed duration on the meeting type) |
channel | string | No | Meeting channel: google, zoom, teamsForBusiness2, phone, phone-incoming, local, local-attendee, connect, webex, whatsapp |
location | string | No | For local channel: selects from configured locations. For local-attendee: can also use attendee.notes.address |
icsTitle | string | No | Custom calendar invite title (max 200 chars), overrides meeting type default |
icsDescription | string | No | Custom calendar invite description (max 2000 chars), overrides meeting type default |
skipNotifications | boolean | No | Skip email notifications (default: false) |
phoneOnlyBooking | boolean | No | Use phone as identifier instead of email. See Voice AI Bot |
hostIds or queueId is required
Attendee Object
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes* | Attendee email |
firstname | string | No† | First name (†either fullname or firstname/lastname required) |
lastname | string | No† | Last name |
fullname | string | No† | Full name (alternative to first/last) |
phone | string | No | Phone number |
receiveReminders | boolean | Yes | Whether the attendee receives reminder emails |
notes | object | Yes | Key-value object for form field responses and UTM parameters. Pass {} if none |
language | string | No | Locale for notifications (en, de, etc.) |
timezone | string | No | Attendee timezone (e.g. Europe/Berlin) |
bringalongEmails | string[] | No | Additional attendee emails (max 5) |
phoneOnlyBooking is true and the meeting type has allowPhoneOnlyBooking enabled. See Voice AI Bot for details.
See Create Booking API Reference for full field documentation, examples with custom ICS content, and UTM tracking.
Response (Standard)
Store the
secret to cancel or reschedule without authentication.Response (Double Opt-In)
If the meeting type requires email confirmation:Get Appointments
Get Paginated Appointments
Get Single Appointment
Response
Cancel an Appointment
As Host (Authenticated)
With Secret (Unauthenticated)
For self-service cancellation by attendees:- Cancellation emails to all parties
booking_cancelledwebhook event- Calendar event removal (if integrated)
Reschedule an Appointment
With Secret (Unauthenticated)
As Host (Authenticated)
Response
- Updated calendar invites
- Notification emails
booking_rescheduledwebhook event
Meeting Transcription & Summary
After a meeting takes place, you can attach a transcription and/or an AI-generated summary. Both fields accept markdown-formatted text, making them ideal for structured meeting records. This is designed for integrations with transcription services (e.g. Otter.ai, Fireflies, Whisper), AI meeting assistants, or any tool that produces meeting records.Update Transcription
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
transcription | string | null | No | Full meeting transcription in markdown. Set to null to clear. Omit to leave unchanged. |
summary | string | null | No | AI-generated meeting summary in markdown. Set to null to clear. Omit to leave unchanged. |
Reading Transcription Data
Thetranscription and summary fields are included in the appointment response when you fetch an appointment:
Both fields are
null by default until populated. They are returned in all authenticated appointment endpoints (single, paginated, today, current).Form Fields and UTM Parameters
Pass form field responses and UTM tracking data viaattendee.notes:
- Included in webhook payloads
- Visible in the dashboard
- Synced to CRM integrations (UTM parameters can be mapped to Salesforce fields via Integrations → Salesforce → Settings)
Round-Robin Bookings
For team meeting types, usequeueId instead of hostIds:
- Round-robin rotation
- Current availability
- Existing bookings
Error Handling
Time Slot Unavailable
Invalid Duration
Missing Host
hostIds array or queueId.
Best Practices
Always query availability first - Don’t book without checking available slots
Store the secret - You’ll need it for self-service cancel/reschedule
Handle race conditions - Slots can be booked between availability query and booking
Use webhooks - Get real-time notifications instead of polling