Cursor-based pagination. Pass the pagination.nextCursor from the previous response as the cursor query parameter to fetch the next page. Omit cursor to fetch the first page. pagination.hasMore is false and pagination.nextCursor is null when you’ve reached the last page.
cal-api-version: 2026-05-01 header.status accepts at most one value. Each call walks exactly one status (e.g. ?status=upcoming) or none. To list bookings across multiple statuses, issue parallel requests — one per status — and merge client-side. Supplying two or more status values returns 400 Bad Request.
The sort direction and the page-1 anchor are derived from status:
status | Sort | Walk direction | Page-1 anchor (uuid bound) |
|---|---|---|---|
| (omitted) | Booking.uuid DESC | Backward from far-future | upper bound at year 2100 |
upcoming | Booking.uuid ASC | Forward in time | lower bound at NOW() − 1h |
recurring | Booking.uuid ASC | Forward in time | lower bound at NOW() − 1h |
unconfirmed | Booking.uuid ASC | Forward in time | lower bound at NOW() − 1h |
past | Booking.uuid DESC | Backward in time | upper bound at NOW() |
cancelled | Booking.uuid DESC | Backward from far-future | upper bound at year 2100 |
If accessed using an OAuth access token, the BOOKING_READ scope is required.
Documentation Index
Fetch the complete documentation index at: https://cal.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Must be set to 2026-05-01.
value must be Bearer <token> where <token> is api key prefixed with cal_, managed user access token, or OAuth access token
Filter bookings by status. Accepts at most one value per call (e.g. ?status=upcoming). Omit to walk all statuses ordered by Booking.uuid DESC. To list bookings across multiple statuses, issue parallel requests, one per status.
upcoming, recurring, past, cancelled, unconfirmed "?status=upcoming"
Filter bookings by the attendee's email address.
"example@domain.com"
Filter bookings by the attendee's name.
"John Doe"
Filter bookings by the booking Uid.
"2NtaeaVcKfpmSZ4CthFdfk"
Filter bookings by event type ids belonging to the user. Event type ids must be separated by a comma.
"?eventTypeIds=100,200"
Filter bookings by event type id belonging to the user.
"?eventTypeId=100"
Filter bookings by team ids that user is part of. Team ids must be separated by a comma.
"?teamIds=50,60"
Filter bookings by team id that user is part of
"?teamId=50"
Filter bookings with start after this date string.
"?afterStart=2025-03-07T10:00:00.000Z"
Filter bookings with end before this date string.
"?beforeEnd=2025-03-07T11:00:00.000Z"
Filter bookings that have been created after this date string.
"?afterCreatedAt=2025-03-07T10:00:00.000Z"
Filter bookings that have been created before this date string.
"?beforeCreatedAt=2025-03-14T11:00:00.000Z"
Filter bookings that have been updated after this date string.
"?afterUpdatedAt=2025-03-07T10:00:00.000Z"
Filter bookings that have been updated before this date string.
"?beforeUpdatedAt=2025-03-14T11:00:00.000Z"
Sort results by their start time in ascending or descending order.
asc, desc "?sortStart=asc OR ?sortStart=desc"
Sort results by their end time in ascending or descending order.
asc, desc "?sortEnd=asc OR ?sortEnd=desc"
Sort results by their creation time (when booking was made) in ascending or descending order.
asc, desc "?sortCreated=asc OR ?sortCreated=desc"
Sort results by their updated time (for example when booking status changes) in ascending or descending order.
asc, desc "?sortUpdated=asc OR ?sortUpdated=desc"
Opaque cursor for cursor-based pagination. Pass the pagination.nextCursor value from a previous response to fetch the next page. Omit to fetch the first page.
"eyJ2IjoxLCJzb3J0VXVpZCI6IjAxOGY0YzJlLTNmMWEtN2FiYy05ZGVmLTAxMjM0NTY3ODlhYiJ9"
The number of items to return
50