openapi: 3.2.0 info: title: Cal.com API v2 Orgs / Bookings API description: '' version: 1.0.0 contact: {} servers: [] tags: - name: Orgs / Bookings paths: /v2/organizations/{orgId}/bookings: get: description: 'Cursor-paginated org bookings listing. 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. Must pass `cal-api-version: 2026-05-01` header. **`status` filters to a single status.** Pass one (e.g. `?status=upcoming`) or omit to walk all statuses. To list bookings across multiple statuses, issue parallel requests — one per status — and merge client-side. Required membership role: `org admin`. PBAC permission: `booking.readOrgBookings`. If accessed using an OAuth access token, the `ORG_BOOKING_READ` scope is required. For managed organizations, bookings where the managed organization owner is the organizer or an attendee are excluded from the result.' operationId: OrganizationsBookingsController_getAllOrgTeamBookingsCursor parameters: - name: Authorization in: header description: value must be `Bearer ` where `` is api key prefixed with cal_, managed user access token, or OAuth access token required: false schema: type: string - name: x-cal-secret-key in: header description: For platform customers - OAuth client secret key required: false schema: type: string - name: x-cal-client-id in: header description: For platform customers - OAuth client ID required: false schema: type: string - name: status required: false in: query description: Filter bookings by a single status. Pass one (e.g. `?status=upcoming`) or omit to walk all statuses ordered by `Booking.uuid DESC`. To list bookings across multiple statuses, issue parallel requests, one per status. schema: example: upcoming type: string enum: - upcoming - recurring - past - cancelled - unconfirmed - name: attendeeEmail required: false in: query description: Filter bookings by the attendee's email address. schema: example: example@domain.com type: string - name: attendeeName required: false in: query description: Filter bookings by the attendee's name. schema: example: John Doe type: string - name: bookingUid required: false in: query description: Filter bookings by the booking Uid. schema: example: 2NtaeaVcKfpmSZ4CthFdfk type: string - name: eventTypeIds required: false in: query description: Filter bookings by event type ids. Event type ids must be separated by a comma. schema: minItems: 1 example: ?eventTypeIds=100,200 type: string - name: eventTypeId required: false in: query description: Filter bookings by event type id. schema: example: ?eventTypeId=100 type: string - name: teamsIds required: false in: query description: Filter bookings by team ids that user is part of. Team ids must be separated by a comma. schema: minItems: 1 example: ?teamIds=50,60 type: string - name: teamId required: false in: query description: Filter bookings by team id that user is part of schema: example: ?teamId=50 type: string - name: afterStart required: false in: query description: Filter bookings with start after this date string. schema: example: ?afterStart=2025-03-07T10:00:00.000Z type: string - name: beforeEnd required: false in: query description: Filter bookings with end before this date string. schema: example: ?beforeEnd=2025-03-07T11:00:00.000Z type: string - name: afterCreatedAt required: false in: query description: Filter bookings that have been created after this date string. schema: example: ?afterCreatedAt=2025-03-07T10:00:00.000Z type: string - name: beforeCreatedAt required: false in: query description: Filter bookings that have been created before this date string. schema: example: ?beforeCreatedAt=2025-03-14T11:00:00.000Z type: string - name: afterUpdatedAt required: false in: query description: Filter bookings that have been updated after this date string. schema: example: ?afterUpdatedAt=2025-03-07T10:00:00.000Z type: string - name: beforeUpdatedAt required: false in: query description: Filter bookings that have been updated before this date string. schema: example: ?beforeUpdatedAt=2025-03-14T11:00:00.000Z type: string - name: sortStart required: false in: query description: Sort results by their start time in ascending or descending order. schema: example: ?sortStart=asc OR ?sortStart=desc type: string enum: - asc - desc - name: sortEnd required: false in: query description: Sort results by their end time in ascending or descending order. schema: example: ?sortEnd=asc OR ?sortEnd=desc type: string enum: - asc - desc - name: sortCreated required: false in: query description: Sort results by their creation time (when booking was made) in ascending or descending order. schema: example: ?sortCreated=asc OR ?sortCreated=desc type: string enum: - asc - desc - name: sortUpdatedAt required: false in: query description: Sort results by their updated time (for example when booking status changes) in ascending or descending order. schema: example: ?sortUpdatedAt=asc OR ?sortUpdatedAt=desc type: string enum: - asc - desc - name: cursor required: false in: query description: 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. schema: example: eyJ2IjoxLCJzb3J0VXVpZCI6IjAxOGY0YzJlLTNmMWEtN2FiYy05ZGVmLTAxMjM0NTY3ODlhYiJ9 type: string - name: limit required: false in: query description: The number of items to return schema: minimum: 1 maximum: 100 default: 50 example: 50 type: number - name: userIds required: false in: query description: Filter bookings by ids of users within your organization. schema: minItems: 1 example: ?userIds=100,200 type: string - name: orgId required: true in: path schema: type: number responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/GetBookingsOutput_2026_05_01' summary: Get organization bookings (cursor pagination) tags: - Orgs / Bookings x-oauth-scopes: - ORG_BOOKING_READ x-platform-plan: ESSENTIALS /v2/organizations/{orgId}/bookings/report: post: description: Report a booking within the organization. A booking report is created and the reported booking along with other matching upcoming bookings are silently cancelled. If accessed using an OAuth access token, the `ORG_BOOKING_WRITE` scope is required. operationId: OrganizationsBookingsController_reportOrgBooking parameters: - name: Authorization in: header description: value must be `Bearer ` where `` is api key prefixed with cal_, managed user access token, or OAuth access token required: false schema: type: string - name: x-cal-secret-key in: header description: For platform customers - OAuth client secret key required: false schema: type: string - name: x-cal-client-id in: header description: For platform customers - OAuth client ID required: false schema: type: string - name: orgId required: true in: path schema: type: number requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ReportOrgBookingInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ReportOrgBookingOutput' summary: Report an organization booking tags: - Orgs / Bookings x-oauth-scopes: - ORG_BOOKING_WRITE x-platform-plan: ESSENTIALS /v2/organizations/{orgId}/bookings/block: post: description: Add the email or domain of a booking attendee to the organization blocklist. All matching upcoming bookings in the organization are silently cancelled. If accessed using an OAuth access token, the `ORG_BOOKING_WRITE` scope is required. operationId: OrganizationsBookingsController_blockOrgBooking parameters: - name: Authorization in: header description: value must be `Bearer ` where `` is api key prefixed with cal_, managed user access token, or OAuth access token required: false schema: type: string - name: x-cal-secret-key in: header description: For platform customers - OAuth client secret key required: false schema: type: string - name: x-cal-client-id in: header description: For platform customers - OAuth client ID required: false schema: type: string - name: orgId required: true in: path schema: type: number requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BlockOrgBookingInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/BlockOrgBookingOutput' summary: Block an organization booking attendee tags: - Orgs / Bookings x-oauth-scopes: - ORG_BOOKING_WRITE x-platform-plan: ESSENTIALS components: schemas: ReportOrgBookingOutput: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/ReportOrgBookingData' required: - status - data BlockOrgBookingData: type: object properties: success: type: boolean description: Whether the operation was successful example: true message: type: string description: A human-readable message describing the result example: Added to blocklist and 3 bookings cancelled bookingUid: type: string description: The UID of the booking whose attendee was blocked example: booking-uid-123 cancelledCount: type: number description: The number of bookings cancelled example: 3 blockedValue: type: string description: The email or domain that was added to the blocklist example: spammer@example.com required: - success - message - bookingUid - cancelledCount - blockedValue ReportOrgBookingData: type: object properties: success: type: boolean description: Whether the operation was successful example: true message: type: string description: A human-readable message describing the result example: Booking reported and cancelled successfully bookingUid: type: string description: The UID of the reported booking example: booking-uid-123 reportedCount: type: number description: The number of booking reports created example: 1 cancelledCount: type: number description: The number of bookings cancelled example: 3 required: - success - message - bookingUid - reportedCount - cancelledCount BlockOrgBookingOutput: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/BlockOrgBookingData' required: - status - data RecurringBookingOutput_2024_08_13: type: object properties: id: type: number example: 123 uid: type: string example: booking_uid_123 title: type: string example: Consultation description: type: string example: Learn how to integrate scheduling into marketplace. hosts: type: array items: $ref: '#/components/schemas/BookingHost' status: enum: - cancelled - accepted - rejected - pending - awaiting_host type: string example: accepted description: '`awaiting_host` is an instant meeting that is live and waiting for a host to join.' cancellationReason: type: string example: User requested cancellation cancelledByEmail: type: string format: email example: canceller@example.com reschedulingReason: type: string example: User rescheduled the event rescheduledByEmail: type: string format: email example: rescheduler@example.com rescheduledFromUid: type: string example: previous_uid_123 description: UID of the previous booking from which this booking was rescheduled. rescheduledToUid: type: string example: new_uid_456 description: UID of the new booking to which this booking was rescheduled. start: type: string example: '2024-08-13T15:30:00Z' format: date-time end: type: string example: '2024-08-13T16:30:00Z' format: date-time duration: type: number example: 60 eventTypeId: type: number example: 50 deprecated: true description: Deprecated - rely on 'eventType' object containing the id instead. eventType: $ref: '#/components/schemas/EventType' eventUuid: type: - string - 'null' example: 0199b5d2-7c1e-7f3a-9b4d-2e6f8a1c3d5e description: UUID of the Event this booking belongs to. Pass it to `GET /v2/events/{uuid}` to fetch the Event. `null` when the booking is not for an Event. meetingUrl: type: string format: uri description: Deprecated - rely on 'location' field instead. example: https://example.com/recurring-meeting deprecated: true location: type: string example: https://example.com/meeting absentHost: type: boolean example: true createdAt: type: string example: '2024-08-13T15:30:00Z' format: date-time updatedAt: type: - string - 'null' example: '2024-08-13T15:30:00Z' format: date-time metadata: type: object additionalProperties: type: string example: key: value rating: type: number example: 4 icsUid: type: string example: ics_uid_123 description: UID of ICS event. attendees: type: array items: $ref: '#/components/schemas/BookingAttendee' guests: example: - guest1@example.com - guest2@example.com type: array items: type: string bookingFieldsResponses: type: object additionalProperties: true description: Booking field responses consisting of an object with booking field slug as keys and user response as values. example: customField: customValue recurringBookingUid: type: string example: recurring_uid_987 required: - id - uid - title - description - hosts - status - start - end - duration - eventTypeId - eventType - location - absentHost - createdAt - updatedAt - attendees - bookingFieldsResponses - recurringBookingUid BlockOrgBookingInput: type: object properties: bookingUid: type: string description: The UID of the booking whose attendee should be blocked example: booking-uid-123 blockType: enum: - EMAIL - DOMAIN type: string description: Whether to block by email or domain. EMAIL blocks the specific booker email. DOMAIN blocks all emails from the same domain. example: EMAIL required: - bookingUid - blockType GetSeatedBookingOutput_2024_08_13: type: object properties: id: type: number example: 123 uid: type: string example: booking_uid_123 title: type: string example: Consultation description: type: string example: Learn how to integrate scheduling into marketplace. hosts: type: array items: $ref: '#/components/schemas/BookingHost' status: enum: - cancelled - accepted - rejected - pending - awaiting_host type: string example: accepted description: '`awaiting_host` is an instant meeting that is live and waiting for a host to join.' cancellationReason: type: string example: User requested cancellation cancelledByEmail: type: string format: email example: canceller@example.com reschedulingReason: type: string example: User rescheduled the event rescheduledByEmail: type: string format: email example: rescheduler@example.com rescheduledFromUid: type: string example: previous_uid_123 description: UID of the previous booking from which this booking was rescheduled. rescheduledToUid: type: string example: new_uid_456 description: UID of the new booking to which this booking was rescheduled. start: type: string example: '2024-08-13T15:30:00Z' format: date-time end: type: string example: '2024-08-13T16:30:00Z' format: date-time duration: type: number example: 60 eventTypeId: type: number example: 50 deprecated: true description: Deprecated - rely on 'eventType' object containing the id instead. eventType: $ref: '#/components/schemas/EventType' eventUuid: type: - string - 'null' example: 0199b5d2-7c1e-7f3a-9b4d-2e6f8a1c3d5e description: UUID of the Event this booking belongs to. Pass it to `GET /v2/events/{uuid}` to fetch the Event. `null` when the booking is not for an Event. meetingUrl: type: string format: uri description: Deprecated - rely on 'location' field instead. example: https://example.com/recurring-meeting deprecated: true location: type: string example: https://example.com/meeting absentHost: type: boolean example: true createdAt: type: string example: '2024-08-13T15:30:00Z' format: date-time updatedAt: type: - string - 'null' example: '2024-08-13T15:30:00Z' format: date-time metadata: type: object additionalProperties: type: string example: key: value rating: type: number example: 4 icsUid: type: string example: ics_uid_123 description: UID of ICS event. attendees: type: array items: $ref: '#/components/schemas/SeatedAttendee' required: - id - uid - title - description - hosts - status - start - end - duration - eventTypeId - eventType - location - absentHost - createdAt - updatedAt - attendees GetBookingsOutput_2026_05_01: type: object properties: status: enum: - success - error type: string example: success data: type: array items: oneOf: - title: Booking $ref: '#/components/schemas/BookingOutput_2024_08_13' - title: Recurring Booking $ref: '#/components/schemas/RecurringBookingOutput_2024_08_13' - title: Seated Booking $ref: '#/components/schemas/GetSeatedBookingOutput_2024_08_13' - title: Recurring Seated Booking $ref: '#/components/schemas/GetRecurringSeatedBookingOutput_2024_08_13' description: Array of booking data, which can contain either BookingOutput objects or RecurringBookingOutput objects pagination: $ref: '#/components/schemas/CursorPaginationMeta_2026_05_01' required: - status - data - pagination SeatedAttendee: type: object properties: name: type: string example: John Doe email: type: string example: john@example.com displayEmail: type: string example: john@example.com description: Clean email for display purposes timeZone: type: string example: America/New_York language: enum: - ar - ca - de - es - eu - he - id - ja - lv - pl - ro - sr - th - vi - az - cs - el - es-419 - fi - hr - it - km - nl - pt - ru - sv - tr - zh-CN - bg - da - en - et - fr - hu - iw - ko - 'no' - pt-BR - sk - sl - ta - uk - zh-TW - bn type: string example: en absent: type: boolean example: false phoneNumber: type: string example: '+1234567890' seatUid: type: string example: 3be561a9-31f1-4b8e-aefc-9d9a085f0dd1 createdAt: type: string example: '2024-08-13T15:30:00Z' description: The date and time when the attendee joined the seated booking. bookingFieldsResponses: type: object additionalProperties: true description: Booking field responses consisting of an object with booking field slug as keys and user response as values. example: customField: customValue metadata: type: object additionalProperties: type: string example: key: value status: type: string enum: - cancelled example: cancelled description: Present on API version 2026-02-25 and later when this attendee was loaded from a cancelled seat. Omitted for occupied seats. confirmationStatus: enum: - pending - accepted - rejected type: string example: accepted description: Confirmation verdict of this live seat. Omitted when the attendee has no live seat. An attendee loaded from a cancelled seat has status cancelled and does not include confirmationStatus. required: - name - email - displayEmail - timeZone - absent - seatUid - bookingFieldsResponses BookingHost: type: object properties: id: type: number example: 1 uuid: type: string format: uuid example: 3f2504e0-4f89-41d3-9a0c-0305e82c3301 name: type: string example: Jane Doe email: type: string example: jane100@example.com displayEmail: type: string example: jane100@example.com description: Clean email for display purposes username: type: string example: jane100 timeZone: type: string example: America/Los_Angeles required: - id - uuid - name - email - displayEmail - username - timeZone BookingAttendee: type: object properties: name: type: string example: John Doe email: type: string example: john@example.com displayEmail: type: string example: john@example.com description: Clean email for display purposes timeZone: type: string example: America/New_York language: enum: - ar - ca - de - es - eu - he - id - ja - lv - pl - ro - sr - th - vi - az - cs - el - es-419 - fi - hr - it - km - nl - pt - ru - sv - tr - zh-CN - bg - da - en - et - fr - hu - iw - ko - 'no' - pt-BR - sk - sl - ta - uk - zh-TW - bn type: string example: en absent: type: boolean example: false phoneNumber: type: string example: '+1234567890' required: - name - email - displayEmail - timeZone - absent ReportOrgBookingInput: type: object properties: bookingUid: type: string description: The UID of the booking to report example: booking-uid-123 reason: enum: - SPAM - UNWANTED - DONT_KNOW_PERSON - OTHER type: string description: The reason for reporting the booking example: SPAM description: type: string description: Additional description for the report reportType: enum: - EMAIL - DOMAIN type: string description: Whether to report by email or domain. EMAIL targets the specific booker email. DOMAIN targets all emails from the same domain. example: EMAIL required: - bookingUid - reason - reportType GetRecurringSeatedBookingOutput_2024_08_13: type: object properties: id: type: number example: 123 uid: type: string example: booking_uid_123 title: type: string example: Consultation description: type: string example: Learn how to integrate scheduling into marketplace. hosts: type: array items: $ref: '#/components/schemas/BookingHost' status: enum: - cancelled - accepted - rejected - pending - awaiting_host type: string example: accepted description: '`awaiting_host` is an instant meeting that is live and waiting for a host to join.' cancellationReason: type: string example: User requested cancellation cancelledByEmail: type: string format: email example: canceller@example.com reschedulingReason: type: string example: User rescheduled the event rescheduledByEmail: type: string format: email example: rescheduler@example.com rescheduledFromUid: type: string example: previous_uid_123 description: UID of the previous booking from which this booking was rescheduled. rescheduledToUid: type: string example: new_uid_456 description: UID of the new booking to which this booking was rescheduled. start: type: string example: '2024-08-13T15:30:00Z' format: date-time end: type: string example: '2024-08-13T16:30:00Z' format: date-time duration: type: number example: 60 eventTypeId: type: number example: 50 deprecated: true description: Deprecated - rely on 'eventType' object containing the id instead. eventType: $ref: '#/components/schemas/EventType' eventUuid: type: - string - 'null' example: 0199b5d2-7c1e-7f3a-9b4d-2e6f8a1c3d5e description: UUID of the Event this booking belongs to. Pass it to `GET /v2/events/{uuid}` to fetch the Event. `null` when the booking is not for an Event. meetingUrl: type: string format: uri description: Deprecated - rely on 'location' field instead. example: https://example.com/recurring-meeting deprecated: true location: type: string example: https://example.com/meeting absentHost: type: boolean example: true createdAt: type: string example: '2024-08-13T15:30:00Z' format: date-time updatedAt: type: - string - 'null' example: '2024-08-13T15:30:00Z' format: date-time metadata: type: object additionalProperties: type: string example: key: value rating: type: number example: 4 icsUid: type: string example: ics_uid_123 description: UID of ICS event. attendees: type: array items: $ref: '#/components/schemas/SeatedAttendee' recurringBookingUid: type: string example: recurring_uid_987 required: - id - uid - title - description - hosts - status - start - end - duration - eventTypeId - eventType - location - absentHost - createdAt - updatedAt - attendees - recurringBookingUid CursorPaginationMeta_2026_05_01: type: object properties: nextCursor: type: - string - 'null' description: Opaque cursor to fetch the next page. Pass this value as the `cursor` query parameter on the next request. `null` when `hasMore` is `false`. example: eyJ2IjoxLCJzb3J0VXVpZCI6IjAxOGY0YzJlLTNmMWEtN2FiYy05ZGVmLTAxMjM0NTY3ODlhYiJ9 hasMore: type: boolean description: Whether more pages are available after this one. example: true required: - nextCursor - hasMore BookingOutput_2024_08_13: type: object properties: id: type: number example: 123 uid: type: string example: booking_uid_123 title: type: string example: Consultation description: type: string example: Learn how to integrate scheduling into marketplace. hosts: type: array items: $ref: '#/components/schemas/BookingHost' status: enum: - cancelled - accepted - rejected - pending - awaiting_host type: string example: accepted description: '`awaiting_host` is an instant meeting that is live and waiting for a host to join.' cancellationReason: type: string example: User requested cancellation cancelledByEmail: type: string format: email example: canceller@example.com reschedulingReason: type: string example: User rescheduled the event rescheduledByEmail: type: string format: email example: rescheduler@example.com rescheduledFromUid: type: string example: previous_uid_123 description: UID of the previous booking from which this booking was rescheduled. rescheduledToUid: type: string example: new_uid_456 description: UID of the new booking to which this booking was rescheduled. start: type: string example: '2024-08-13T15:30:00Z' format: date-time end: type: string example: '2024-08-13T16:30:00Z' format: date-time duration: type: number example: 60 eventTypeId: type: number example: 50 deprecated: true description: Deprecated - rely on 'eventType' object containing the id instead. eventType: $ref: '#/components/schemas/EventType' eventUuid: type: - string - 'null' example: 0199b5d2-7c1e-7f3a-9b4d-2e6f8a1c3d5e description: UUID of the Event this booking belongs to. Pass it to `GET /v2/events/{uuid}` to fetch the Event. `null` when the booking is not for an Event. meetingUrl: type: string format: uri description: Deprecated - rely on 'location' field instead. example: https://example.com/recurring-meeting deprecated: true location: type: string example: https://example.com/meeting absentHost: type: boolean example: true createdAt: type: string example: '2024-08-13T15:30:00Z' format: date-time updatedAt: type: - string - 'null' example: '2024-08-13T15:30:00Z' format: date-time metadata: type: object additionalProperties: type: string example: key: value rating: type: number example: 4 icsUid: type: string example: ics_uid_123 description: UID of ICS event. attendees: type: array items: $ref: '#/components/schemas/BookingAttendee' guests: example: - guest1@example.com - guest2@example.com type: array items: type: string bookingFieldsResponses: type: object additionalProperties: true description: Booking field responses consisting of an object with booking field slug as keys and user response as values. example: customField: customValue required: - id - uid - title - description - hosts - status - start - end - duration - eventTypeId - eventType - location - absentHost - createdAt - updatedAt - attendees - bookingFieldsResponses EventType: type: object properties: id: type: number example: 1 slug: type: string example: some-event required: - id - slug x-provenance: method: harvested publisher: Cal.com source: https://cal.com/docs/api-reference/v2/openapi.json note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json); stamped by stamp-openapi-provenance.py (roadmap#793)