openapi: 3.2.0 info: title: Cal.com API v2 Events API description: '' version: 1.0.0 contact: {} servers: [] tags: - name: Events paths: /v2/events: get: description: 'Returns the Events the authenticated user hosts: Events they own, plus Events they have accepted a co-host invitation to. A co-hosted Event may be owned by a team, so a team-owned Event can appear here — but team-owned Events the user neither hosts nor co-hosts are not returned by this endpoint; list those with `GET /v2/teams/{teamId}/events`. Ordered by start time, newest first when `status` is omitted. Cursor-based pagination: pass `pagination.nextCursor` from a previous response as the `cursor` query parameter to fetch the next page; omit `cursor` for the first page. `pagination.hasMore` is `false` and `pagination.nextCursor` is `null` on the last page. Must pass `cal-api-version: 2026-05-01` (or later). Older versions use `take`/`skip` offset pagination. Events are fixed-date RSVP pages served at cal.com/{slug}; they are not event types (bookable meeting templates) or calendar events. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventsController_listCursor parameters: - 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: eyJ2IjoyLCJzdGFydFRpbWUiOiIyMDMwLTAxLTAxVDAwOjAwOjAwLjAwMFoiLCJldmVudFR5cGVVdWlkIjoiMDE4ZjRjMmUtM2YxYS03YWJjLTlkZWYtMDEyMzQ1Njc4OWFiIn0 type: string - name: limit required: false in: query description: Maximum number of Events to return. schema: minimum: 1 maximum: 250 default: 50 example: 25 type: number - name: slug required: false in: query description: Filter by the event's public page slug (cal.com/{slug}). schema: example: team-offsite type: string - name: status required: false in: query description: 'Filter events by lifecycle status. `draft`: not published and not cancelled, ordered soonest first. `upcoming`: published and not yet ended, or cancelled but not yet started, ordered soonest first. `past`: everything else, ordered latest first. Omit to return all statuses, newest first. When provided, `pagination.nextCursor` encodes the status — cursors from one status value cannot be used with another and return 400.' schema: example: upcoming type: string enum: - draft - upcoming - past - name: cal-api-version in: header description: Must be set to 2026-05-01 (or a later API version) for cursor pagination. required: true schema: type: string example: '2026-05-01' default: '2026-05-01' - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventsCursorOutputResponseDto' '400': description: Invalid cursor '401': description: Unauthenticated '403': description: Insufficient permissions summary: List Events (cursor pagination) tags: - Events x-mcp: name: get_events guidance: 'List the authenticated user''s Cal Events: fixed-date RSVP pages served at cal.com/{slug}, such as a workshop or meetup that guests register for. Events are NOT event types (bookable meeting templates; use get_event_types) and NOT calendar events or bookings. Use this when the user asks about their Events or RSVP pages, or to find an Event''s uuid for get_event. Returns Events the user owns or co-hosts, newest start time first; team-owned Events they do not host are not included. Supports limit (1-250, default 50) and filtering by slug; when pagination.hasMore is true, pass pagination.nextCursor as cursor to fetch the next page.' x-oauth-scopes: - EVENT_READ post: description: 'Creates a draft Event for the authenticated user. A draft is not public and nobody can register until it is published with `POST /v2/events/{uuid}/publish`. To create an Event owned by a team, use `POST /v2/teams/{teamId}/events`. `startTime` and `endTime` are ISO 8601 in UTC; `startTime` must not be in the past and `endTime` must be after `startTime`. `guestList` controls whether guests see names, a count, or neither. `locations` sets where the Event happens; set `price` and `currency` on a location to charge for that place. Events are fixed-date RSVP pages served at cal.com/{slug}; they are not event types (bookable meeting templates) or calendar events. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventsController_create 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateEventInput' responses: '201': description: '' content: application/json: schema: $ref: '#/components/schemas/EventOutputResponseDto' '400': description: Invalid input, or a start time in the past '401': description: Unauthenticated '403': description: Insufficient permissions summary: Create an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}: get: description: 'Returns one Event by UUID. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.read`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. Events are fixed-date RSVP pages served at cal.com/{slug}; they are not event types (bookable meeting templates) or calendar events. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventsController_get parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventOutputResponseDto' '400': description: Invalid Event UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Get an Event tags: - Events x-mcp: name: get_event guidance: Get one Cal Event (a fixed-date RSVP page served at cal.com/{slug}) by its uuid. Not for event types (use get_event_type with a numeric id) or calendar events. Use this when you already have the Event's uuid; otherwise call get_events first and never guess the uuid. An Event the user cannot access returns 404, the same as one that does not exist. x-oauth-scopes: - EVENT_READ patch: description: 'Updates the properties sent and leaves every other property as it is. Takes the same properties as `POST /v2/events` except `locations`, which have their own endpoints under `/v2/events/{uuid}/locations`. `hosts`, `liveStreams`, `registrationFields`, `lineup` and `schedule` replace the whole stored list. `lineup: null` removes the lineup. Pass `null` to `capacity` for unlimited guests. The slug and the guest list can''t change once the Event is published, and a cancelled Event can''t be updated. New times must keep every schedule item inside the Event. An accepted co-host can update the Event but not its hosts, slug or policies such as `visibility`, `guestList` or `requiresApproval`. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventsController_update parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateEventInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventOutputResponseDto' '400': description: Invalid input, an end time that is not after the start time, new times that leave a schedule item outside the Event, a slug change after publishing, or a cancelled Event '401': description: Unauthenticated '403': description: Insufficient permissions, a guest list change after publishing, or a co-host changing the hosts, slug or policies '404': description: Event not found summary: Update an Event tags: - Events x-oauth-scopes: - EVENT_WRITE delete: description: 'Removes an Event, its registrations and its occurrence booking. An upcoming published Event is cancelled first, notifying its guests, and disappears from listings immediately; it is permanently removed once those notices have gone out. An Event cancelled more than seven days earlier is removed at once. An ended Event that still has confirmed guests cannot be deleted, and a published paid Event cannot be deleted because its payment records are retained. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an external co-host gets 404. PBAC permission for team events: `calEvent.delete`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventsController_delete parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/DeleteEventOutputResponseDto' '400': description: Invalid Event UUID, or the Event must be cancelled first '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Delete an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/publish: post: description: 'Takes a draft Event live: its public page becomes reachable, guests can RSVP, the occurrence lands on the hosts'' calendars. Idempotent for an Event that is already published. A cancelled Event cannot be published. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an external co-host gets 404, exactly like an unknown uuid. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventsController_publish parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventOutputResponseDto' '400': description: Invalid Event UUID, a cancelled Event, or an Event that cannot be published as configured '401': description: Unauthenticated '403': description: Insufficient permissions, or the account must verify its email first '404': description: Event not found summary: Publish an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/cancel: post: description: 'Cancels a published Event and notifies every registered guest; paid registrations are refunded. The Event stays listed with `cancelledAt` set. Drafts cannot be cancelled (delete them instead) and neither can Events that already ended. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an external co-host gets 404. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventsController_cancel parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CancelEventInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventOutputResponseDto' '400': description: Invalid Event UUID, a draft, or an Event that already ended '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Cancel an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/bookings: get: description: 'Returns the Event''s guests in the statuses given by `status`, confirmed guests by default. A confirmed guest holds a seat on the Event''s occurrence booking, the same way `GET /v2/bookings` reads attendees; pass `status=PENDING_APPROVAL` to list the guests waiting for approval, `WAITLISTED` for the waitlist, or `PENDING_PAYMENT` for guests who have not paid yet. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.read`. Cursor-based pagination: pass `pagination.nextCursor` from a previous response as the `cursor` query parameter to fetch the next page; omit `cursor` for the first page. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventRegistrationsController_listBookings parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: type: string - name: limit required: false in: query description: Maximum number of guests to return. schema: minimum: 1 maximum: 250 default: 50 example: 25 type: number - name: status required: false in: query description: Filter by registration status. Separate several statuses with a comma. Defaults to confirmed guests only. schema: minItems: 1 default: - CONFIRMED example: ?status=PENDING_APPROVAL,WAITLISTED type: array items: type: string enum: - PENDING_APPROVAL - WAITLISTED - PENDING_PAYMENT - PENDING_CONFIRMATION - OFFER_EXPIRED - CONFIRMED - DECLINED - CANCELLED - name: rsvpResponse required: false in: query description: Filter by the guest's RSVP response. schema: type: string enum: - 'YES' - 'NO' - MAYBE - name: search required: false in: query description: Filter by guest name or email, case-insensitive substring match. schema: maxLength: 255 type: string - name: locationId required: false in: query description: Filter by the location the guest registered for. schema: maxLength: 128 type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventBookingsOutputResponseDto' '400': description: Invalid Event UUID, cursor or status '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: List an Event's bookings tags: - Events x-oauth-scopes: - EVENT_READ /v2/events/{uuid}/registrations/{registrationId}/check-in: post: description: 'Records a door check-in for one registration, the roster''s manual tap (no QR involved). Same access as approving/declining guests — an external co-host may also work the door. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_checkInById parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: registrationId required: true in: path schema: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CheckInOutcomeOutputResponseDto' '400': description: Invalid Event or registration UUID, or check-in is closed '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or registration not found '429': description: Rate limit exceeded summary: Check in a guest by registration id tags: - Events x-oauth-scopes: - EVENT_WRITE delete: description: 'Clears a mistaken door check-in. Idempotent: undoing an unchecked registration is a no-op report. Not gated by the event''s check-in window — undo corrects the host''s own record rather than recording attendance. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_undoCheckIn parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: registrationId required: true in: path schema: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/UndoCheckInOutcomeOutputResponseDto' '400': description: Invalid Event or registration UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or registration not found '429': description: Rate limit exceeded summary: Undo a guest's check-in tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/check-ins: post: description: 'Redeems a scanned check-in QR token. The token is carried in the request body, never the URL, since URLs land in history and access logs. Same access as the by-id check-in; an external co-host may also work the door. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_checkInByToken parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CheckInByTokenInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CheckInOutcomeOutputResponseDto' '400': description: Invalid Event UUID, invalid token, or check-in is closed '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or registration not found '429': description: Rate limit exceeded summary: Check in a guest by scanned QR token tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/registrations/approve-all: post: description: 'Approves the Event''s guests waiting for approval, optionally only those matching `search` or registered for `locationId`, as the roster''s Approve all does. A free Event approves them in this request and returns `completed` with the counts. A paid Event sends each guest a payment request in the background and returns `started`. The Event must be published and not cancelled. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_approveAll parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ApproveAllRegistrationsInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ApproveAllOutcomeOutputResponseDto' '400': description: Invalid Event UUID or body, the Event is not open for registration, or too many pending guests '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '429': description: Rate limit exceeded summary: Approve every pending guest tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/registrations/{registrationId}/approve: post: description: 'Approves one guest waiting for approval, as the roster''s Approve does. On a free Event the guest gets a seat and `kind` is `confirmed`; when the Event is full the guest stays pending and `kind` is `event_full_offer_waitlist`. On a paid Event the guest is sent a payment request and `kind` is `payment_pending`. The Event must be published and not cancelled. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_approve parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: registrationId required: true in: path schema: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/RegistrationDecisionOutcomeOutputResponseDto' '400': description: Invalid Event or registration UUID, the Event is not open for registration, or the guest is not waiting for approval '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or registration not found '429': description: Rate limit exceeded summary: Approve a guest tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/registrations/{registrationId}/decline: post: description: 'Declines one guest waiting for approval or on the waitlist, as the roster''s Decline does, and emails them. `kind` is `declined`. A guest can be declined even when the Event is cancelled. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventRegistrationsController_decline parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: registrationId required: true in: path schema: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/RegistrationDecisionOutcomeOutputResponseDto' '400': description: Invalid Event or registration UUID, or the guest is not waiting for approval or on the waitlist '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or registration not found summary: Decline a guest tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/registrations/counts: get: description: 'Returns how many of the Event''s guests are in each status, how many answered each RSVP, how many are checked in and how many seats each location holds, as the roster''s tabs show them. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.read`. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventRegistrationsController_counts parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/RegistrationCountsOutputResponseDto' '400': description: Invalid Event UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Count an Event's guests tags: - Events x-oauth-scopes: - EVENT_READ /v2/events/{uuid}/co-hosts: get: description: 'Returns the Event''s co-hosts in their display order, with pending and declined invitations alongside accepted co-hosts. Co-hosts are people invited by email to help run the Event without joining the owning team. Unlike hosts — the owner and the team members on the Event''s host roster, who can do everything — an accepted co-host can view and edit the Event''s details and manage its guests (invite, approve, check in), but cannot publish, cancel or delete the Event, change its pricing, or manage co-hosts. An invitation grants nothing until the invitee accepts it while signed in with the invited email address. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team; an accepted co-host sees only the accepted co-hosts. PBAC permission for team events: `calEvent.read`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventCoHostsController_list parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CoHostsOutputResponseDto' '400': description: Invalid Event UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: List an Event's co-hosts tags: - Events x-oauth-scopes: - EVENT_READ post: description: 'Invites an email address to co-host the Event and emails it a link to accept, valid for 7 days. See `GET /v2/events/{uuid}/co-hosts` for what a co-host can do. The new invitation joins the end of the co-host list; re-inviting an address that is already invited sends a fresh link and keeps its place, and re-inviting an accepted co-host changes nothing. Rate limited per user. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an accepted co-host cannot invite and gets 404, exactly like an unknown uuid. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoHostsController_invite parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InviteCoHostInput' responses: '201': description: '' content: application/json: schema: $ref: '#/components/schemas/InviteCoHostOutputResponseDto' '400': description: Invalid Event UUID, an invalid or undeliverable email address, or the caller's own address '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '429': description: Rate limit exceeded summary: Invite a co-host to an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/co-hosts/order: patch: description: 'Saves the display order of the Event''s co-hosts. `coHostIds` must name every co-host on the Event, accepted and pending alike, exactly once; a list that went stale under a concurrent invite or removal is refused with 400 and nothing is saved. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an accepted co-host cannot reorder and gets 404, exactly like an unknown uuid. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoHostsController_reorder parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ReorderCoHostsInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CoHostsActionOutputResponseDto' '400': description: Invalid Event UUID, or `coHostIds` does not name every co-host on the Event exactly once '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Reorder an Event's co-hosts tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/co-hosts/{coHostId}: delete: description: 'Removes an accepted co-host, or cancels a pending invitation so its link stops working. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an accepted co-host cannot remove anyone and gets 404, exactly like an unknown uuid. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoHostsController_revoke parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: coHostId required: true in: path description: Id of the co-host on this Event, the `id` from `GET /v2/events/{uuid}/co-hosts`. Not a user id. schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CoHostsActionOutputResponseDto' '400': description: Invalid Event UUID or co-host id '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event or co-host not found summary: Remove a co-host from an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/coordinates: get: description: 'Returns the `latitude` and `longitude` shown on the map of the Event''s public page. Update them with `PATCH /v2/events/{uuid}/coordinates`. The Event must have an address location. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventCoordinatesController_get parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventCoordinatesOutputResponseDto' '400': description: Invalid Event UUID, a cancelled Event, or an Event without an address location '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Get an Event's coordinates tags: - Events x-oauth-scopes: - EVENT_READ patch: description: 'Moves where the Event''s address location sits on the map of its public page and re-renders the map. The Event must have an address location. The coordinates must stay within 1 km of where the address geocodes to; coordinates within a few metres of it reset to the address. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. Rate limited to 5 requests per minute per API key or access token. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoordinatesController_update parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateEventCoordinatesInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/UpdateEventCoordinatesOutputResponseDto' '400': description: Invalid Event UUID or coordinates, a cancelled Event, an Event without an address location, an address that cannot be placed on a map, or coordinates farther than 1 km from the address '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '429': description: Too many requests summary: Update an Event's coordinates tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/cover-image: post: description: 'Uploads a JPEG, PNG or WebP image of at most 10 MB as the Event''s cover, replacing the current cover and any poster design. The response carries the image''s public URL and its dimensions as displayed. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoverImageController_upload parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: type: string format: binary description: JPEG, PNG or WebP image, at most 10 MB. responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventCoverImageOutputResponseDto' '400': description: Invalid Event UUID, a missing file, an unsupported image type, or an unreadable image '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '413': description: Image exceeds 10 MB summary: Upload an Event cover image tags: - Events x-oauth-scopes: - EVENT_WRITE delete: description: 'Removes the Event''s cover image and any poster design. Idempotent for an Event without a cover. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventCoverImageController_remove parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/DeleteEventCoverImageOutputResponseDto' '400': description: Invalid Event UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Remove an Event cover image tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/locations: get: description: 'Returns the Event''s locations, each with its `id`, in the same shape as `locations` on `GET /v2/events/{uuid}`. A location this API version can''t represent is returned as `type: "unknown"`. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.read`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventLocationsController_list parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventLocationsOutputResponseDto' '400': description: Invalid Event UUID '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: Get an Event's locations tags: - Events x-oauth-scopes: - EVENT_READ post: description: 'Adds one location after the Event''s existing locations and returns it with its `id`. Takes the same shape as an item of `locations` on `POST /v2/events`. Every existing location is kept as it is, including one this API version can''t represent. An Event can have one address and one conferencing location, either an integration or the organizer''s default app; links can repeat. On a published Event, a new location can''t change what guests who already registered are charged, and adding it emails the guests. If the Event changes while the location is being added, nothing is saved and 409 is returned. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team; an accepted co-host can only add a free location. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventLocationsController_add parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: oneOf: - title: Address $ref: '#/components/schemas/EventAddressLocationInput' - title: Link $ref: '#/components/schemas/EventLinkLocationInput' - title: Integration $ref: '#/components/schemas/EventIntegrationLocationInput' - title: Organizer Default App $ref: '#/components/schemas/EventOrganizersDefaultAppLocationInput' responses: '201': description: '' content: application/json: schema: $ref: '#/components/schemas/EventLocationOutputResponseDto' '400': description: Invalid Event UUID, an invalid location, a second address or conferencing location, a price that changes what registered guests are charged, or a cancelled Event '401': description: Unauthenticated '403': description: Insufficient permissions, or a co-host adding a priced location '404': description: Event not found '409': description: The Event changed while the location was being saved summary: Add a location to an Event tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/locations/{locationId}: delete: description: 'Removes one location and returns the Event''s remaining locations, in the same shape as `GET /v2/events/{uuid}/locations`. Every other location is kept as it is, including one this API version can''t represent. On a published paid Event, locations can''t be removed. On a published Event, removing a location emails the guests. If the Event changes while the location is being removed, nothing is saved and 409 is returned. The authenticated user must be its owner, one of its hosts, or a member of the owning team; an accepted co-host gets 403. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventLocationsController_remove parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: locationId required: true in: path description: Id of the location, the `id` from `GET /v2/events/{uuid}/locations`. schema: format: uuid type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventLocationsOutputResponseDto' '400': description: Invalid Event UUID or location id, a published paid Event, or a cancelled Event '401': description: Unauthenticated '403': description: Insufficient permissions, or a co-host removing a location '404': description: Event or location not found '409': description: The Event changed while the location was being removed summary: Remove a location from an Event tags: - Events x-oauth-scopes: - EVENT_WRITE patch: description: 'Changes the fields sent and keeps the rest of the location, including its `id`. `type` is required and must match the stored location; to change it, delete the location and add a new one. Pass null for `label`, `price` or `capacity` to remove it. A location returned as `type: "unknown"` can''t be edited. On a published Event, a location''s price and currency can''t change, and changing a location emails the guests. If the Event changes while the location is being saved, nothing is saved and 409 is returned. The authenticated user must be its owner, one of its hosts, an accepted co-host, or a member of the owning team; an accepted co-host can''t change a price. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventLocationsController_update parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - name: locationId required: true in: path description: The location's `id`, from `GET /v2/events/{uuid}/locations`. schema: type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: oneOf: - title: Address $ref: '#/components/schemas/UpdateEventAddressLocationInput' - title: Link $ref: '#/components/schemas/UpdateEventLinkLocationInput' - title: Integration $ref: '#/components/schemas/UpdateEventIntegrationLocationInput' - title: Organizer Default App $ref: '#/components/schemas/UpdateEventOrganizersDefaultAppLocationInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventLocationOutputResponseDto' '400': description: Invalid Event UUID, an invalid field, a different `type`, a price change on a published Event, or a cancelled Event '401': description: Unauthenticated '403': description: Insufficient permissions, or a co-host changing a price '404': description: Event or location not found '409': description: The Event changed while the location was being saved summary: Edit an Event's location tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/person-avatar: post: description: 'Uploads a photo for a person in the Event''s lineup or schedule and returns its public URL, which you then set as that person''s `avatarUrl` when updating the Event. Uploading alone does not change the Event. Send the image as the multipart field `file`: JPEG, PNG or WebP, at most 2 MB and 2048 pixels on each side. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. Learn more about API access control at https://cal.com/docs/api-reference/v2/access-control. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventPersonAvatarController_upload parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: type: string format: binary description: JPEG, PNG or WebP image, at most 2 MB. responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/EventPersonAvatarOutputResponseDto' '400': description: Invalid Event UUID, a missing file, an unsupported image type, or an unreadable image '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '413': description: The image exceeds 2 MB or 2048 pixels on a side summary: Upload an Event person avatar tags: - Events x-oauth-scopes: - EVENT_WRITE /v2/events/{uuid}/messages: post: description: 'Emails one segment of the Event''s guests, optionally narrowed to one location or to guests who did or did not check in. The message is queued and sent in the background; list the Event''s messages to follow its status. The authenticated user must be the Event''s owner, one of its hosts, or a member of the owning team. Co-hosts cannot message guests. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventMessagesController_sendMessage parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendMessageInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/SendMessageOutputResponseDto' '400': description: Invalid Event UUID or body, the segment has no guests to email, or the Event no longer accepts messages '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found '429': description: Rate limit exceeded summary: Message an Event's guests tags: - Events x-oauth-scopes: - EVENT_WRITE get: description: 'Returns the Event''s messages, newest first, with their delivery status. The authenticated user must be the Event''s owner, one of its hosts, or a member of the owning team. Co-hosts cannot message guests. PBAC permission for team events: `calEvent.update`. Cursor-based pagination: pass `pagination.nextCursor` from a previous response as the `cursor` query parameter to fetch the next page; omit `cursor` for the first page. If accessed using an OAuth access token, the `EVENT_READ` scope is required.' operationId: EventMessagesController_listMessages parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: type: string - 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: true schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/MessagesOutputResponseDto' '400': description: Invalid Event UUID, or invalid cursor '401': description: Unauthenticated '403': description: Insufficient permissions '404': description: Event not found summary: List the messages sent to an Event's guests tags: - Events x-oauth-scopes: - EVENT_READ /v2/events/{uuid}/invitations: post: description: 'Emails an invitation to each address. Addresses that are already invited or registered are skipped, and the response reports what happened to every address. The Event must be published, not cancelled and not started yet, and the authenticated user must have a verified email. An Event holds at most 200 active invitations. The authenticated user must be the Event''s owner, one of its hosts, an accepted co-host, or a member of the owning team. PBAC permission for team events: `calEvent.update`. If accessed using an OAuth access token, the `EVENT_WRITE` scope is required.' operationId: EventInvitationsController_inviteGuests parameters: - name: uuid required: true in: path description: Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`). schema: format: uuid type: string - 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: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InviteGuestsInput' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/InviteGuestsOutputResponseDto' '400': description: Invalid Event UUID or body, the Event is unpublished, cancelled or started, or the invitation limit is reached '401': description: Unauthenticated '403': description: Insufficient permissions, or the user's email is not verified '404': description: Event not found '429': description: Rate limit exceeded summary: Invite guests to an Event tags: - Events x-oauth-scopes: - EVENT_WRITE components: schemas: EventBookingOutputDto: type: object properties: type: type: string enum: - event description: Discriminates this booking as a Cal Event attendee, as opposed to a regular booking. registrationId: type: string format: uuid description: The registration id. Pass this as `registrationId` to the check-in, approve and decline endpoints. name: type: string email: type: string phoneNumber: type: - string - 'null' status: enum: - PENDING_APPROVAL - WAITLISTED - PENDING_PAYMENT - PENDING_CONFIRMATION - OFFER_EXPIRED - CONFIRMED - DECLINED - CANCELLED type: string rsvpResponse: enum: - 'YES' - 'NO' - MAYBE type: string responses: type: - object - 'null' description: Registration-form answers. locationId: type: - string - 'null' createdAt: format: date-time type: string checkedInAt: format: date-time type: - string - 'null' description: When a door check-in was recorded. checkedInByUserId: type: - number - 'null' description: Host who recorded the door check-in. avatarUrl: type: - string - 'null' description: The guest's Cal.com profile photo when their email belongs to an account, otherwise an external avatar when one is found. `null` when neither exists. payment: description: The guest's payment. `null` when the guest has no payment, for example on a free Event. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventBookingPaymentOutputDto' noShow: type: boolean description: Whether a host marked the guest as a no-show. decidedAt: format: date-time type: - string - 'null' description: When a host approved or declined the guest. `null` until a host decides. required: - type - registrationId - name - email - status - rsvpResponse - createdAt - noShow EventLineupOutput: type: object properties: title: type: - string - 'null' people: type: array items: $ref: '#/components/schemas/EventLineupPersonOutput' required: - title - people UndoCheckInOutcomeOutputDto: type: object properties: kind: enum: - undone - not_checked_in type: string registration: $ref: '#/components/schemas/RegistrationOutputDto' required: - kind EventScheduleItemOutput: type: object properties: startTime: format: date-time type: - string - 'null' endTime: format: date-time type: - string - 'null' timeLabel: type: - string - 'null' content: type: string people: type: array items: $ref: '#/components/schemas/EventSchedulePersonOutput' required: - startTime - endTime - timeLabel - content - people EventHostInput: type: object properties: userId: type: number minimum: 1 example: 123 required: - userId RegistrationRsvpCountsOutputDto: type: object properties: 'yes': type: number description: Guests who answered Yes, in any status. 'no': type: number description: Guests who answered No, in any status. maybe: type: number description: Guests who answered Maybe, in any status. required: - 'yes' - 'no' - maybe CustomPhoneFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: phone enum: - phone description: A phone-number input on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type EventLocationOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: oneOf: - title: Address $ref: '#/components/schemas/EventAddressLocationOutput' - title: Link $ref: '#/components/schemas/EventLinkLocationOutput' - title: Integration $ref: '#/components/schemas/EventIntegrationLocationOutput' - title: Organizer Default App $ref: '#/components/schemas/EventOrganizersDefaultAppLocationOutput' required: - status - data CustomMultiSelectFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: multiSelect enum: - multiSelect description: A list that allows multiple selections. required: - field - slug - label - required - hidden - disableOnPrefill - options - type CheckInOutcomeOutputDto: type: object properties: kind: enum: - checked_in - already_checked_in - not_confirmed type: string registration: $ref: '#/components/schemas/RegistrationOutputDto' checkedInAt: format: date-time type: string description: Set only when `kind` is `already_checked_in`. status: enum: - PENDING_APPROVAL - WAITLISTED - PENDING_PAYMENT - PENDING_CONFIRMATION - OFFER_EXPIRED - CONFIRMED - DECLINED - CANCELLED type: string description: Set only when `kind` is `not_confirmed`. required: - kind UpdateEventLinkLocationInput: type: object properties: label: type: - string - 'null' description: Name shown for this location. Pass null to remove it. maxLength: 100 price: type: - number - 'null' minimum: 1 description: Price for this location, in the currency's smallest unit. Pass null to make it free. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required with `price` when the location has no currency yet. example: usd capacity: type: - number - 'null' minimum: 1 description: Seats at this location. Pass null for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: link enum: - link description: The location's type. It can't change. link: type: string format: uri example: https://example.com/watch required: - type SendMessageOutputDto: type: object properties: id: type: string description: Unique identifier of the message. status: enum: - QUEUED - FAILED_TO_QUEUE type: string description: '`QUEUED` when the message is on its way, `FAILED_TO_QUEUE` when it could not be queued and nothing was sent.' recipientCount: type: number description: How many guests will be emailed. textRecipientCount: type: number description: How many guests will be texted instead, because they have only a phone number. skippedPhoneCount: type: number description: Guests in the segment who have only a phone number and will not be texted. required: - id - status - recipientCount - textRecipientCount - skippedPhoneCount UpdateEventInput: type: object properties: title: type: string minLength: 1 description: The Event's title. example: Team offsite maxLength: 255 endTime: type: string description: When the Event ends, in ISO 8601 format in UTC timezone. It must be after `startTime`. example: '2030-01-01T11:00:00.000Z' timeZone: type: string description: The IANA time zone the Event's times are shown in. example: Europe/Berlin description: type: - object - 'null' description: What the Event is about, shown on its page. maxLength: 5000 paymentTimeoutMinutes: type: - object - 'null' minimum: 10 maximum: 10080 description: How many minutes a guest's seat is held while they pay. null uses the default of 10 minutes. theme: enum: - light - dark type: - string - 'null' description: Default theme of the event page. null follows the visitor's system setting. background: description: Animated background of the event page. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventBackgroundInput' lineup: description: Speakers or performers on the event page. Avatars need the Event uuid, so create people without avatarUrl and upload avatars with the person avatar endpoint afterwards. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventLineupInput' schedule: description: Agenda on the event page. Each item has either a startTime or a timeLabel. Avatars need the Event uuid, so create people without avatarUrl and upload avatars with the person avatar endpoint afterwards. maxItems: 50 type: array items: $ref: '#/components/schemas/EventScheduleItemInput' registrationFields: type: array description: The questions guests answer when they register. items: oneOf: - title: Default Full Name $ref: '#/components/schemas/SystemFullNameFieldInput_2026_06_12' - title: Default Split Name $ref: '#/components/schemas/SystemSplitNameFieldInput_2026_06_12' - title: Default Email $ref: '#/components/schemas/SystemEmailFieldInput_2026_06_12' - title: Default Location $ref: '#/components/schemas/SystemLocationFieldInput_2026_06_12' - title: Default Title $ref: '#/components/schemas/SystemTitleFieldInput_2026_06_12' - title: Default Notes $ref: '#/components/schemas/SystemNotesFieldInput_2026_06_12' - title: Default Guests $ref: '#/components/schemas/SystemGuestsFieldInput_2026_06_12' - title: Default Reschedule Reason $ref: '#/components/schemas/SystemRescheduleReasonFieldInput_2026_06_12' - title: Default Attendee Phone $ref: '#/components/schemas/SystemAttendeePhoneFieldInput_2026_06_12' - title: Workflow-added SMS Reminder $ref: '#/components/schemas/SystemSmsReminderFieldInput_2026_06_12' - title: Workflow-added AI Agent Phone $ref: '#/components/schemas/SystemAiAgentPhoneFieldInput_2026_06_12' - title: Custom Email $ref: '#/components/schemas/CustomEmailFieldInput_2026_06_12' - title: Custom Phone $ref: '#/components/schemas/CustomPhoneFieldInput_2026_06_12' - title: Custom Address $ref: '#/components/schemas/CustomAddressFieldInput_2026_06_12' - title: Custom Short Text $ref: '#/components/schemas/CustomShortTextFieldInput_2026_06_12' - title: Custom Number $ref: '#/components/schemas/CustomNumberFieldInput_2026_06_12' - title: Custom Long Text $ref: '#/components/schemas/CustomLongTextFieldInput_2026_06_12' - title: Custom Select $ref: '#/components/schemas/CustomSelectFieldInput_2026_06_12' - title: Custom Multi-Select $ref: '#/components/schemas/CustomMultiSelectFieldInput_2026_06_12' - title: Custom Multiple Emails $ref: '#/components/schemas/CustomMultiEmailFieldInput_2026_06_12' - title: Custom Checkbox Group $ref: '#/components/schemas/CustomCheckboxGroupFieldInput_2026_06_12' - title: Custom Checkbox $ref: '#/components/schemas/CustomCheckboxFieldInput_2026_06_12' - title: Custom Radio Group $ref: '#/components/schemas/CustomRadioGroupFieldInput_2026_06_12' - title: Custom URL $ref: '#/components/schemas/CustomUrlFieldInput_2026_06_12' hosts: description: The Event's hosts. The creator is always a host and always listed first, even when not passed. Personal Events can only have the creator, so passing other ids returns a 400. On team Events every id must be an accepted team member, otherwise it returns a 400. type: array items: $ref: '#/components/schemas/EventHostInput' liveStreams: description: Links where people can watch the event live. maxItems: 5 type: array items: $ref: '#/components/schemas/EventLiveStreamInput' price: type: - number - 'null' minimum: 1 description: Price of the Event, in the currency's smallest unit. Only for Events without locations, which need at least one live stream; Events with locations are priced per location. On update, null makes the Event free. Check `paymentsEnabled` on the Event before setting it. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: - string - 'null' description: Cal Pay currency code. Required when `price` is set. example: usd startTime: type: string description: When the Event starts, in ISO 8601 format in UTC timezone. It must be before `endTime`. example: '2030-01-01T10:00:00.000Z' slug: type: string description: 'Public page slug (cal.com/{slug}): 10-100 lowercase letters, digits and hyphens. It can''t change once the Event is published.' example: team-offsite-2030 visibility: enum: - PUBLIC - UNLISTED type: string description: 'Once published: PUBLIC is listed on the owner''s page, UNLISTED only opens from its link.' capacity: type: - number - 'null' minimum: 1 description: 'The most guests the Event can take. Pass null for unlimited. Ignored once any location has its own `capacity`: the Event then takes the sum of the location capacities, or is unlimited if any location has none. It can''t go below the number of confirmed guests.' maximum: 100000 waitlistEnabled: type: boolean description: Let guests join a waitlist when the Event is full. The waitlist only opens when the Event or the chosen location is full, so it only works when capacity is set on the Event or on a location. requiresApproval: type: boolean description: Registrations wait for a host's approval. showOrganizerEmail: type: boolean description: Show the organizer's email to guests. guestList: enum: - hidden - names - count type: string description: Who guests can see on the Event's page. `names` lists them, `count` shows how many, `hidden` shows neither. It can't change once the Event is published. showPresentedBy: type: boolean description: Show who the Event is presented by. category: enum: - meetup - conference - music - sports type: string description: What kind of event it is. CustomShortTextFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: shortText enum: - shortText description: A single-line text input on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type CustomRadioGroupFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: radioGroup description: Only allowed value is 'radioGroup'. required: - field - slug - label - options - type EventCoordinatesOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/EventCoordinatesOutput' required: - status - data CustomLongTextFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: longText description: Only allowed value is 'longText'. minLength: type: number minimum: 0 maximum: 1000 description: Minimum character length for the long text field. Defaults to 0 if not provided. maxLength: type: number minimum: 0 maximum: 1000 description: Maximum character length for the long text field. Defaults to 1000 if not provided. required: - field - slug - label - type UpdateEventAddressLocationInput: type: object properties: label: type: - string - 'null' description: Name shown for this location. Pass null to remove it. maxLength: 100 price: type: - number - 'null' minimum: 1 description: Price for this location, in the currency's smallest unit. Pass null to make it free. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required with `price` when the location has no currency yet. example: usd capacity: type: - number - 'null' minimum: 1 description: Seats at this location. Pass null for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: address enum: - address description: The location's type. It can't change. address: type: string minLength: 1 example: 1 Example Street, Berlin required: - type SystemGuestsFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: guests description: Identifies this as the guests default booking field. slug: type: string example: guests description: The default additional-guests field always uses `guests` as its slug. required: - required - hidden - disableOnPrefill - field - slug SystemAttendeePhoneFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: attendeePhoneNumber description: Identifies this as the attendee phone number default booking field. slug: type: string example: attendeePhoneNumber description: The default attendee phone field always uses `attendeePhoneNumber` as its slug. required: - required - hidden - disableOnPrefill - field - slug MessagesOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: type: array items: $ref: '#/components/schemas/MessageOutputDto' pagination: $ref: '#/components/schemas/EventsCursorPaginationMetaDto' required: - status - data - pagination SendMessageOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/SendMessageOutputDto' required: - status - data EventBookingsOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: type: array items: $ref: '#/components/schemas/EventBookingOutputDto' pagination: $ref: '#/components/schemas/EventsCursorPaginationMetaDto' required: - status - data - pagination SystemTitleFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: title description: Identifies this as the title default booking field. slug: type: string example: title description: The default booking title field always uses `title` as its slug. required: - required - hidden - disableOnPrefill - field - slug EventSchedulePersonLinkOutput: type: object properties: url: type: string required: - url InviteCoHostInput: type: object properties: email: type: string minLength: 3 maxLength: 320 description: Email address to invite as a co-host. Trimmed and lowercased; it must be deliverable and not on a blocklist. example: co-host@example.com required: - email DeleteEventOutputDto: type: object properties: uuid: type: string description: Unique identifier of the deleted Event. required: - uuid EventBookingPaymentOutputDto: type: object properties: success: type: boolean description: Whether the guest's payment went through. refunded: type: boolean description: Whether the payment was refunded. amount: type: number example: 2000 description: Amount in the currency's smallest unit, for example cents. currency: type: string example: eur description: ISO 4217 currency code. required: - success - refunded - amount - currency CoHostOutputDto: type: object properties: id: type: string description: Id of the co-host on this Event. Not a user id. format: uuid email: type: string description: The invited email address, lowercased. status: enum: - PENDING - ACCEPTED - DECLINED type: string name: type: - string - 'null' description: Display name, set once the invite is accepted. avatarUrl: type: - string - 'null' description: Avatar URL, set once the invite is accepted. required: - id - email - status InviteGuestsOutputDto: type: object properties: invitedCount: type: number skippedAlreadyInvited: type: number skippedAlreadyRegistered: type: number skippedOnCooldown: type: number skippedInvalid: type: number failedCount: type: number description: Addresses whose invitation could not be saved. They can be retried. outcomes: description: One entry per submitted address. type: array items: $ref: '#/components/schemas/InviteOutcomeOutputDto' required: - invitedCount - skippedAlreadyInvited - skippedAlreadyRegistered - skippedOnCooldown - skippedInvalid - failedCount - outcomes ApproveAllOutcomeOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/ApproveAllOutcomeOutputDto' required: - status - data CustomRadioGroupFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: radioGroup enum: - radioGroup description: A group of radio buttons that allows one selection. required: - field - slug - label - required - hidden - disableOnPrefill - options - type EventSchedulePersonInput: type: object properties: name: type: string pattern: \S role: type: - string - 'null' avatarUrl: type: - string - 'null' description: Avatar for this person. Must be a Cal Event media URL returned by the person avatar endpoint. links: maxItems: 5 type: array items: $ref: '#/components/schemas/EventSchedulePersonLinkInput' required: - name SystemEmailFieldInput_2026_06_12: type: object properties: field: type: string example: email description: Only allowed value is 'email'. slug: type: string example: email description: Only allowed value is 'email'. label: type: string required: type: boolean description: 'To enable phone-only bookings, set this to false and hidden to true, then pass an attendeePhoneNumber default booking field with required: true and hidden: false.' hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&email=bob@gmail.com`, the email field will be prefilled with this value and disabled. excludeEmails: description: Bookers whose email matches an entry cannot book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string requireEmails: description: Only bookers whose email matches an entry can book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string required: - field SystemLocationFieldInput_2026_06_12: type: object properties: field: type: string example: location description: Only allowed value is 'location'. The Booker renders the location picker only when the event type has at least 2 location options. slug: type: string example: location description: Only allowed value is 'location'. label: type: string required: - field SystemAttendeePhoneFieldInput_2026_06_12: type: object properties: field: type: string example: attendeePhoneNumber description: Only allowed value is 'attendeePhoneNumber'. slug: type: string example: attendeePhoneNumber description: Only allowed value is 'attendeePhoneNumber'. required: type: boolean description: 'To enable email-only bookings, set this to false and hidden to true, then pass an email default booking field with required: true and hidden: false.' hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&attendeePhoneNumber=+37122222222`, the phone field will be prefilled with this value and disabled. required: - field SystemSmsReminderFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: smsReminderNumber description: Phone-number field added automatically by an SMS workflow. slug: type: string example: smsReminderNumber description: This workflow-added field always uses `smsReminderNumber` as its slug. required: - required - hidden - disableOnPrefill - field - slug EventPersonAvatarOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/EventPersonAvatarOutputDto' required: - status - data EventLiveStreamInput: type: object properties: url: type: string description: Where people can watch the event live. maxLength: 2048 required: - url MessageCountsOutputDto: type: object properties: sentCount: type: number failedCount: type: number skippedPhoneCount: type: number description: Guests skipped because they have only a phone number. skippedUnsubscribedCount: type: number description: Guests skipped because they unsubscribed from the Event's emails. required: - sentCount - failedCount - skippedPhoneCount - skippedUnsubscribedCount EventHostOutput: type: object properties: userId: type: number example: 123 name: type: string example: Jane Doe description: Empty string when the host has no name. username: type: string example: jane description: Empty string when the host has no username. avatarUrl: type: string description: Empty string when the host has no avatar. required: - userId - name - username - avatarUrl RegistrationCountsOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/RegistrationCountsOutputDto' required: - status - data EventCoverImageOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/EventCoverImageOutputDto' required: - status - data CustomUrlFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: url description: Only allowed value is 'url'. required: - field - slug - label - type EventLineupPersonMediaInput: type: object properties: url: type: string label: type: - string - 'null' required: - url MessageOutputDto: type: object properties: id: type: string segment: enum: - GOING - MAYBE - PENDING type: string createdAt: format: date-time type: string sender: description: '`null` once the sender''s account is deleted.' type: - object - 'null' allOf: - $ref: '#/components/schemas/MessageSenderOutputDto' status: enum: - SENDING - SENT - PARTIALLY_SENT - NOT_SENT - NOT_SENT_EVENT_UNSENDABLE type: string description: '`SENDING` while it goes out, `SENT`, `PARTIALLY_SENT`, `NOT_SENT`, or `NOT_SENT_EVENT_UNSENDABLE` when the Event stopped accepting messages before it went out.' counts: description: '`null` while sending and whenever nothing was delivered.' type: - object - 'null' allOf: - $ref: '#/components/schemas/MessageCountsOutputDto' required: - id - segment - createdAt - status CustomAddressFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: address enum: - address description: An address input on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type EventPersonAvatarOutputDto: type: object properties: avatarUrl: type: string description: Public URL of the uploaded image. Set it as a lineup or schedule person's `avatarUrl` when updating the Event. required: - avatarUrl EventLineupPersonInput: type: object properties: name: type: string pattern: \S role: type: - string - 'null' description: Shown under the person's name, e.g. their job title or act. avatarUrl: type: - string - 'null' description: Avatar for this person. Must be a Cal Event media URL returned by the person avatar endpoint. links: maxItems: 5 type: array items: $ref: '#/components/schemas/EventLineupPersonLinkInput' media: description: Spotify, YouTube or SoundCloud links, shown as players with the person. maxItems: 6 type: array items: $ref: '#/components/schemas/EventLineupPersonMediaInput' required: - name EventSchedulePersonOutput: type: object properties: name: type: string role: type: - string - 'null' avatarUrl: type: - string - 'null' links: type: array items: $ref: '#/components/schemas/EventSchedulePersonLinkOutput' required: - name - role - avatarUrl - links EventPosterPaletteOutput: type: object properties: background: type: string description: Background hex color. example: '#0b1c2c' foreground: type: string description: Foreground hex color. example: '#a5d8ff' accent: type: string description: Accent hex color. example: '#1f6feb' required: - background - foreground - accent EventBackgroundOutput: type: object properties: effect: enum: - aurora - tide - satin - resonance - veil - facet - lumen - contour - recess - halftone - strata type: string colors: type: array items: type: string required: - effect - colors CustomAddressFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: address description: Only allowed value is 'address'. required: - field - slug - label - type EventLocationsOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: type: array items: oneOf: - title: Address $ref: '#/components/schemas/EventAddressLocationOutput' - title: Link $ref: '#/components/schemas/EventLinkLocationOutput' - title: Integration $ref: '#/components/schemas/EventIntegrationLocationOutput' - title: Organizer Default App $ref: '#/components/schemas/EventOrganizersDefaultAppLocationOutput' - title: Unknown $ref: '#/components/schemas/EventUnknownLocationOutput' required: - status - data EventsCursorOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: type: array items: $ref: '#/components/schemas/EventOutputDto' pagination: $ref: '#/components/schemas/EventsCursorPaginationMetaDto' required: - status - data - pagination EventLiveStreamOutput: type: object properties: url: type: string description: Where people can watch the event live. required: - url ApproveAllOutcomeOutputDto: type: object properties: kind: enum: - completed - started type: string description: '`completed` when every pending guest was handled in this request. `started` when a paid Event''s approval runs in the background.' approvedCount: type: number description: Set only when `kind` is `completed`. Guests approved; on a paid Event, guests sent a payment request. notSeatedCount: type: number description: Set only when `kind` is `completed`. Guests left pending because the Event is full. operationId: type: string description: Set only when `kind` is `started`. Identifies the background approval. total: type: number description: Set only when `kind` is `started`. Guests the background approval will handle. required: - kind EventCoordinatesOutput: type: object properties: latitude: type: number example: 51.5092 description: Latitude shown on the public Event page's map. longitude: type: number example: -0.1278 description: Longitude shown on the public Event page's map. required: - latitude - longitude EventBackgroundInput: type: object properties: effect: enum: - aurora - tide - satin - resonance - veil - facet - lumen - contour - recess - halftone - strata type: string description: Which animated effect renders. colors: minItems: 3 maxItems: 3 description: Exactly three hex colors the effect is drawn with. example: - '#0b1c2c' - '#1f6feb' - '#a5d8ff' type: array items: type: string pattern: ^#[0-9a-f]{6}$ required: - effect - colors EventSchedulePersonLinkInput: type: object properties: url: type: string required: - url CustomCheckboxFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: checkbox description: Only allowed value is 'checkbox'. required: - field - slug - label - type UndoCheckInOutcomeOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/UndoCheckInOutcomeOutputDto' required: - status - data SystemRescheduleReasonFieldInput_2026_06_12: type: object properties: field: type: string example: rescheduleReason description: Only allowed value is 'rescheduleReason'. slug: type: string example: rescheduleReason description: Only allowed value is 'rescheduleReason'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&rescheduleReason=travel`, the rescheduleReason field will be prefilled with this value and disabled. required: - field SystemSplitNameFieldOutput_2026_06_12: type: object properties: field: type: string example: name description: Identifies this as the name default booking field. slug: type: string example: name description: The default name field always uses `name` as its slug. variant: type: string example: splitName enum: - splitName description: The booking page displays separate fields for the attendee's first and last names. firstNameLabel: type: string firstNamePlaceholder: type: string lastNameLabel: type: string lastNamePlaceholder: type: string lastNameRequired: type: boolean description: Whether the last name sub-field is required. disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. required: - field - slug - variant - lastNameRequired - disableOnPrefill EventUnknownLocationOutput: type: object properties: id: type: string description: Identifier of this location. Pass it to `PATCH` or `DELETE /v2/events/{uuid}/locations/{locationId}` to edit or remove this location. label: type: string description: Name shown for this location. maxLength: 100 price: type: - number - 'null' example: 2500 description: Price a guest who picks this location pays, in the currency's smallest unit. null when the location is free. currency: type: - string - 'null' example: usd description: Currency of price. null when the location is free. capacity: type: number description: Seats at this location. Absent when unlimited. minimum: 1 maximum: 100000 type: type: string example: unknown enum: - unknown location: type: string description: The stored location as JSON, for a location this API version can't represent. Remove it with `DELETE /v2/events/{uuid}/locations/{locationId}`. required: - id - price - currency - type - location CustomNumberFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: number description: Only allowed value is 'number'. required: - field - slug - label - type CoHostsOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: type: array items: $ref: '#/components/schemas/CoHostOutputDto' required: - status - data CustomCheckboxFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: checkbox enum: - checkbox description: A single checkbox on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type InviteOutcomeOutputDto: type: object properties: email: type: string reason: enum: - invited - already-invited - already-registered - cooldown - invalid-format - undeliverable - duplicate - failed type: string description: 'What happened to this address: `invited`; skipped as `already-invited`, `already-registered` or `cooldown` (re-invited too recently); rejected as `invalid-format`, `undeliverable` or `duplicate` (repeated in this request); or `failed`, which can be retried.' required: - email - reason InviteGuestsOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/InviteGuestsOutputDto' required: - status - data ReorderCoHostsInput: type: object properties: coHostIds: maxItems: 500 description: Every co-host id on the Event, accepted and pending alike, in the new display order. Each id must appear exactly once. These are the `id` values from `GET /v2/events/{uuid}/co-hosts`, not user ids. type: array items: type: string format: uuid required: - coHostIds SystemGuestsFieldInput_2026_06_12: type: object properties: field: type: string example: guests description: Only allowed value is 'guests'. slug: type: string example: guests description: Only allowed value is 'guests'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&guests=bob@cal.com`, the guests field will be prefilled with this value and disabled. required: - field UpdateEventOrganizersDefaultAppLocationInput: type: object properties: label: type: - string - 'null' description: Name shown for this location. Pass null to remove it. maxLength: 100 price: type: - number - 'null' minimum: 1 description: Price for this location, in the currency's smallest unit. Pass null to make it free. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required with `price` when the location has no currency yet. example: usd capacity: type: - number - 'null' minimum: 1 description: Seats at this location. Pass null for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: organizersDefaultApp enum: - organizersDefaultApp description: The location's type. It can't change. required: - type EventLineupPersonOutput: type: object properties: name: type: string role: type: - string - 'null' avatarUrl: type: - string - 'null' links: type: array items: $ref: '#/components/schemas/EventLineupPersonLinkOutput' media: type: array items: $ref: '#/components/schemas/EventLineupPersonMediaOutput' required: - name - role - avatarUrl - links - media CustomLongTextFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: longText enum: - longText description: A multi-line text input on the booking page. minLength: type: number description: Minimum character length for the long text field. maxLength: type: number description: Maximum character length for the long text field. required: - field - slug - label - required - hidden - disableOnPrefill - type SystemTitleFieldInput_2026_06_12: type: object properties: field: type: string example: title description: Only allowed value is 'title'. slug: type: string example: title description: Only allowed value is 'title'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&title=journey`, the title field will be prefilled with this value and disabled. required: - field RegistrationDecisionOutcomeOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/RegistrationDecisionOutcomeOutputDto' required: - status - data SystemNotesFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: notes description: Identifies this as the notes default booking field. slug: type: string example: notes description: The default additional-notes field always uses `notes` as its slug. required: - required - hidden - disableOnPrefill - field - slug CustomEmailFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: email enum: - email description: An email input on the booking page. excludeEmails: description: Bookers whose email matches an entry cannot book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string requireEmails: description: Only bookers whose email matches an entry can book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string required: - field - slug - label - required - hidden - disableOnPrefill - type CheckInOutcomeOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/CheckInOutcomeOutputDto' required: - status - data UnknownBookingFieldOutput_2026_06_12: type: object properties: field: type: string example: unknown enum: - unknown slug: type: string example: unknown enum: - unknown bookingField: type: string description: Raw booking-field data that this API version does not recognize. required: - field - slug - bookingField EventLineupInput: type: object properties: title: type: - string - 'null' description: Heading above the people on the event page. people: maxItems: 30 type: array items: $ref: '#/components/schemas/EventLineupPersonInput' required: - people SystemNotesFieldInput_2026_06_12: type: object properties: field: type: string example: notes description: Only allowed value is 'notes'. slug: type: string example: notes description: Only allowed value is 'notes'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `¬es=bring notebook`, the notes field will be prefilled with this value and disabled. required: - field SystemRescheduleReasonFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: rescheduleReason description: Identifies this as the reschedule reason default booking field. slug: type: string example: rescheduleReason description: The default reschedule-reason field always uses `rescheduleReason` as its slug. required: - required - hidden - disableOnPrefill - field - slug EventLineupPersonMediaOutput: type: object properties: url: type: string label: type: - string - 'null' required: - url - label MessageSenderOutputDto: type: object properties: id: type: number name: type: - string - 'null' required: - id CustomSelectFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: select description: Only allowed value is 'select'. required: - field - slug - label - options - type SystemFullNameFieldOutput_2026_06_12: type: object properties: field: type: string example: name description: Identifies this as the name default booking field. slug: type: string example: name description: The default name field always uses `name` as its slug. variant: type: string example: fullName enum: - fullName description: Single full-name input variant. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. required: - field - slug - variant - disableOnPrefill EventLineupPersonLinkInput: type: object properties: url: type: string required: - url CustomShortTextFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: shortText description: Only allowed value is 'shortText'. required: - field - slug - label - type SystemAiAgentPhoneFieldInput_2026_06_12: type: object properties: field: type: string example: aiAgentCallPhoneNumber description: Only allowed value is 'aiAgentCallPhoneNumber'. This field is added automatically by an AI-agent workflow. It may be echoed from a GET response in create, update, or replace bodies, but the API ignores it; targeted PATCH and DELETE operations reject it. slug: type: string example: aiAgentCallPhoneNumber description: Only allowed value is 'aiAgentCallPhoneNumber'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. required: - field CustomSelectFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: select enum: - select description: A dropdown that allows one selection. required: - field - slug - label - required - hidden - disableOnPrefill - options - type EventAddressLocationOutput: type: object properties: id: type: string description: Identifier of this location. Pass it to `PATCH` or `DELETE /v2/events/{uuid}/locations/{locationId}` to edit or remove this location. label: type: string description: Name shown for this location. maxLength: 100 price: type: - number - 'null' example: 2500 description: Price a guest who picks this location pays, in the currency's smallest unit. null when the location is free. currency: type: - string - 'null' example: usd description: Currency of price. null when the location is free. capacity: type: number description: Seats at this location. Absent when unlimited. minimum: 1 maximum: 100000 type: type: string example: address enum: - address address: type: string example: 123 Event Street required: - id - price - currency - type - address CreateEventInput: type: object properties: title: type: string minLength: 1 description: The Event's title. example: Team offsite maxLength: 255 startTime: type: string description: When the Event starts, in ISO 8601 format in UTC timezone. It must not be in the past. example: '2030-01-01T10:00:00.000Z' endTime: type: string description: When the Event ends, in ISO 8601 format in UTC timezone. It must be after `startTime`. example: '2030-01-01T11:00:00.000Z' timeZone: type: string description: The IANA time zone the Event's times are shown in. example: Europe/Berlin slug: type: string description: 'Public page slug (cal.com/{slug}): 10-100 lowercase letters, digits and hyphens. Generated from the title when omitted.' example: team-offsite-2030 description: type: - string - 'null' description: What the Event is about, shown on its page. maxLength: 5000 visibility: enum: - PUBLIC - UNLISTED type: string description: 'Once published: PUBLIC is listed on the owner''s page, UNLISTED only opens from its link. Defaults to PUBLIC.' default: PUBLIC capacity: type: - number - 'null' minimum: 1 description: 'The most guests the Event can take. Omit or pass null for unlimited. Ignored once any location has its own `capacity`: the Event then takes the sum of the location capacities, or is unlimited if any location has none. The waitlist only opens when the Event or the chosen location is full, so it only works when capacity is set on the Event or on a location.' maximum: 100000 waitlistEnabled: type: boolean description: Let guests join a waitlist when the Event is full. The waitlist only opens when the Event or the chosen location is full, so it only works when capacity is set on the Event or on a location. default: false paymentTimeoutMinutes: type: - number - 'null' minimum: 10 maximum: 10080 description: How many minutes a guest's seat is held while they pay. null uses the default of 10 minutes. requiresApproval: type: boolean description: Registrations wait for a host's approval. default: false showOrganizerEmail: type: boolean description: Show the organizer's email to guests. default: true guestList: enum: - hidden - names - count type: string description: Who guests can see on the Event's page. `names` lists them, `count` shows how many, `hidden` shows neither. Defaults to `names`. default: names showPresentedBy: type: boolean description: Show who the Event is presented by. default: true theme: enum: - light - dark type: - string - 'null' description: Default theme of the event page. null follows the visitor's system setting. background: description: Animated background of the event page. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventBackgroundInput' lineup: description: Speakers or performers on the event page. Avatars need the Event uuid, so create people without avatarUrl and upload avatars with the person avatar endpoint afterwards. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventLineupInput' schedule: description: Agenda on the event page. Each item has either a startTime or a timeLabel. Avatars need the Event uuid, so create people without avatarUrl and upload avatars with the person avatar endpoint afterwards. maxItems: 50 type: array items: $ref: '#/components/schemas/EventScheduleItemInput' registrationFields: type: array description: The questions guests answer when they register. items: oneOf: - title: Default Full Name $ref: '#/components/schemas/SystemFullNameFieldInput_2026_06_12' - title: Default Split Name $ref: '#/components/schemas/SystemSplitNameFieldInput_2026_06_12' - title: Default Email $ref: '#/components/schemas/SystemEmailFieldInput_2026_06_12' - title: Default Location $ref: '#/components/schemas/SystemLocationFieldInput_2026_06_12' - title: Default Title $ref: '#/components/schemas/SystemTitleFieldInput_2026_06_12' - title: Default Notes $ref: '#/components/schemas/SystemNotesFieldInput_2026_06_12' - title: Default Guests $ref: '#/components/schemas/SystemGuestsFieldInput_2026_06_12' - title: Default Reschedule Reason $ref: '#/components/schemas/SystemRescheduleReasonFieldInput_2026_06_12' - title: Default Attendee Phone $ref: '#/components/schemas/SystemAttendeePhoneFieldInput_2026_06_12' - title: Workflow-added SMS Reminder $ref: '#/components/schemas/SystemSmsReminderFieldInput_2026_06_12' - title: Workflow-added AI Agent Phone $ref: '#/components/schemas/SystemAiAgentPhoneFieldInput_2026_06_12' - title: Custom Email $ref: '#/components/schemas/CustomEmailFieldInput_2026_06_12' - title: Custom Phone $ref: '#/components/schemas/CustomPhoneFieldInput_2026_06_12' - title: Custom Address $ref: '#/components/schemas/CustomAddressFieldInput_2026_06_12' - title: Custom Short Text $ref: '#/components/schemas/CustomShortTextFieldInput_2026_06_12' - title: Custom Number $ref: '#/components/schemas/CustomNumberFieldInput_2026_06_12' - title: Custom Long Text $ref: '#/components/schemas/CustomLongTextFieldInput_2026_06_12' - title: Custom Select $ref: '#/components/schemas/CustomSelectFieldInput_2026_06_12' - title: Custom Multi-Select $ref: '#/components/schemas/CustomMultiSelectFieldInput_2026_06_12' - title: Custom Multiple Emails $ref: '#/components/schemas/CustomMultiEmailFieldInput_2026_06_12' - title: Custom Checkbox Group $ref: '#/components/schemas/CustomCheckboxGroupFieldInput_2026_06_12' - title: Custom Checkbox $ref: '#/components/schemas/CustomCheckboxFieldInput_2026_06_12' - title: Custom Radio Group $ref: '#/components/schemas/CustomRadioGroupFieldInput_2026_06_12' - title: Custom URL $ref: '#/components/schemas/CustomUrlFieldInput_2026_06_12' hosts: description: The Event's hosts. The creator is always a host and always listed first, even when not passed. Personal Events can only have the creator, so passing other ids returns a 400. On team Events every id must be an accepted team member, otherwise it returns a 400. type: array items: $ref: '#/components/schemas/EventHostInput' liveStreams: description: Links where people can watch the event live. maxItems: 5 type: array items: $ref: '#/components/schemas/EventLiveStreamInput' category: enum: - meetup - conference - music - sports type: string description: What kind of event it is. If not passed, it's guessed from the title. price: type: - number - 'null' minimum: 1 description: Price of the Event, in the currency's smallest unit. Only for Events without locations, which need at least one live stream; Events with locations are priced per location. On update, null makes the Event free. Check `paymentsEnabled` on the Event before setting it. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: - string - 'null' description: Cal Pay currency code. Required when `price` is set. example: usd locations: type: array description: Where the Event happens. Links can repeat. An Event can have one address and one conferencing location, either an integration or the organizer's default app. items: oneOf: - $ref: '#/components/schemas/EventAddressLocationInput' - $ref: '#/components/schemas/EventLinkLocationInput' - $ref: '#/components/schemas/EventIntegrationLocationInput' - $ref: '#/components/schemas/EventOrganizersDefaultAppLocationInput' required: - title - startTime - endTime - timeZone InviteCoHostOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/InvitedCoHostOutputDto' required: - status - data SystemSmsReminderFieldInput_2026_06_12: type: object properties: field: type: string example: smsReminderNumber description: Only allowed value is 'smsReminderNumber'. This field is added automatically by an SMS workflow. It may be echoed from a GET response in create, update, or replace bodies, but the API ignores it; targeted PATCH and DELETE operations reject it. slug: type: string example: smsReminderNumber description: Only allowed value is 'smsReminderNumber'. required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. required: - field EventOrganizersDefaultAppLocationOutput: type: object properties: id: type: string description: Identifier of this location. Pass it to `PATCH` or `DELETE /v2/events/{uuid}/locations/{locationId}` to edit or remove this location. label: type: string description: Name shown for this location. maxLength: 100 price: type: - number - 'null' example: 2500 description: Price a guest who picks this location pays, in the currency's smallest unit. null when the location is free. currency: type: - string - 'null' example: usd description: Currency of price. null when the location is free. capacity: type: number description: Seats at this location. Absent when unlimited. minimum: 1 maximum: 100000 type: type: string example: organizersDefaultApp enum: - organizersDefaultApp required: - id - price - currency - type DeleteEventCoverImageOutputDto: type: object properties: coverImageUrl: type: - string - 'null' example: null description: Always `null` once removed. required: - coverImageUrl EventAddressLocationInput: type: object properties: label: type: string description: Name shown for this location. maxLength: 100 price: type: number minimum: 1 description: Price for this location, in the currency's smallest unit. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required when `price` is set. example: usd capacity: type: number minimum: 1 description: Seats at this location. Omit for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: address enum: - address address: type: string minLength: 1 example: 1 Example Street, Berlin required: - type - address EventLinkLocationOutput: type: object properties: id: type: string description: Identifier of this location. Pass it to `PATCH` or `DELETE /v2/events/{uuid}/locations/{locationId}` to edit or remove this location. label: type: string description: Name shown for this location. maxLength: 100 price: type: - number - 'null' example: 2500 description: Price a guest who picks this location pays, in the currency's smallest unit. null when the location is free. currency: type: - string - 'null' example: usd description: Currency of price. null when the location is free. capacity: type: number description: Seats at this location. Absent when unlimited. minimum: 1 maximum: 100000 type: type: string example: link enum: - link link: type: string example: https://example.com/event required: - id - price - currency - type - link EventIntegrationLocationInput: type: object properties: label: type: string description: Name shown for this location. maxLength: 100 price: type: number minimum: 1 description: Price for this location, in the currency's smallest unit. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required when `price` is set. example: usd capacity: type: number minimum: 1 description: Seats at this location. Omit for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: integration enum: - integration integration: enum: - cal-video - google-meet - zoom - whereby-video - whatsapp-video - webex-video - telegram-video - tandem - sylaps-video - skype-video - sirius-video - signal-video - shimmer-video - salesroom-video - roam-video - riverside-video - ping-video - office365-video - mirotalk-video - jitsi - jelly-video - jelly-conferencing - huddle - facetime-video - element-call-video - eightxeight-video - discord-video - demodesk-video - campfire-video type: string example: cal-video credentialId: type: number description: Identifies which connected account will host the Event when a host has multiple connected accounts. required: - type - integration RegistrationOutputDto: type: object properties: id: type: string description: Unique identifier of the registration. name: type: string email: type: string phoneNumber: type: - string - 'null' status: enum: - PENDING_APPROVAL - WAITLISTED - PENDING_PAYMENT - PENDING_CONFIRMATION - OFFER_EXPIRED - CONFIRMED - DECLINED - CANCELLED type: string rsvpResponse: enum: - 'YES' - 'NO' - MAYBE type: string responses: type: - object - 'null' description: Registration-form answers. locationId: type: - string - 'null' createdAt: format: date-time type: string checkedInAt: format: date-time type: - string - 'null' description: When a door check-in was recorded. checkedInByUserId: type: - number - 'null' description: Host who recorded the door check-in. required: - id - name - email - status - rsvpResponse - createdAt CoHostsActionOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success required: - status SystemFullNameFieldInput_2026_06_12: type: object properties: field: type: string example: name description: Only allowed value is 'name'. slug: type: string example: name description: Only allowed value is 'name'. variant: type: string example: fullName description: Only allowed value is 'fullName'. Used for having a single booking field for the attendee's full name. label: type: string placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&name=bob`, the name field will be prefilled with this value and disabled. required: - field - variant CustomMultiSelectFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: multiSelect description: Only allowed value is 'multiSelect'. required: - field - slug - label - options - type SystemEmailFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: email description: Identifies this as the email default booking field. slug: type: string example: email description: The default email field always uses `email` as its slug. excludeEmails: description: Bookers whose email matches an entry cannot book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string requireEmails: description: Only bookers whose email matches an entry can book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string required: - required - hidden - disableOnPrefill - field - slug EventCoverImageOutputDto: type: object properties: coverImageUrl: type: string description: Public URL of the uploaded cover image. coverImageWidth: type: number description: Width of the cover image in pixels, as displayed. coverImageHeight: type: number description: Height of the cover image in pixels, as displayed. required: - coverImageUrl - coverImageWidth - coverImageHeight RegistrationDecisionOutcomeOutputDto: type: object properties: kind: enum: - confirmed - payment_pending - declined - waitlisted - event_full_offer_waitlist type: string description: '`confirmed` when the guest got a seat. `payment_pending` when a paid Event sent the guest a payment request; the guest is confirmed once they pay. `event_full_offer_waitlist` when the Event is full; the guest stays pending. `declined` when the guest was declined.' registration: $ref: '#/components/schemas/RegistrationOutputDto' required: - kind - registration RegistrationCountsOutputDto: type: object properties: pendingApproval: type: number description: Guests waiting for approval. waitlisted: type: number description: Guests on the waitlist. pendingPayment: type: number description: Guests sent a payment request who have not paid yet. offerExpired: type: number description: Guests whose payment request expired. declined: type: number description: Declined guests. cancelled: type: number description: Guests who cancelled. confirmed: type: number description: Confirmed guests, whatever their RSVP. going: type: number description: Confirmed guests who answered Yes. checkedIn: type: number description: Confirmed guests with a recorded door check-in. rsvpResponses: $ref: '#/components/schemas/RegistrationRsvpCountsOutputDto' byLocation: description: Seats held per location. type: array items: $ref: '#/components/schemas/RegistrationLocationCountOutputDto' required: - pendingApproval - waitlisted - pendingPayment - offerExpired - declined - cancelled - confirmed - going - checkedIn - rsvpResponses - byLocation SystemSplitNameFieldInput_2026_06_12: type: object properties: field: type: string example: name description: Only allowed value is 'name'. slug: type: string example: name description: Only allowed value is 'name'. variant: type: string example: splitName description: Only allowed value is 'splitName'. Used to have 2 booking fields — one for first name and one for last name. firstNameLabel: type: string firstNamePlaceholder: type: string lastNameLabel: type: string lastNamePlaceholder: type: string lastNameRequired: type: boolean description: Whether the last name sub-field is required. The first name sub-field is always required and cannot be configured. disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `?name=John%20Doe`, the first name and last name fields will be prefilled with these values and disabled. The value may also be a JSON object such as `{"firstName":"John","lastName":"Doe"}`. required: - field - variant EventLineupPersonLinkOutput: type: object properties: url: type: string required: - url CheckInByTokenInput: type: object properties: checkInToken: type: string minLength: 1 maxLength: 256 description: The signed check-in token scanned from the guest's QR code. required: - checkInToken EventsCursorPaginationMetaDto: 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: eyJ2IjoyLCJzdGFydFRpbWUiOiIyMDMwLTAxLTAxVDAwOjAwOjAwLjAwMFoiLCJldmVudFR5cGVVdWlkIjoiMDE4ZjRjMmUtM2YxYS03YWJjLTlkZWYtMDEyMzQ1Njc4OWFiIn0 hasMore: type: boolean description: Whether more pages are available after this one. example: true required: - nextCursor - hasMore EventLinkLocationInput: type: object properties: label: type: string description: Name shown for this location. maxLength: 100 price: type: number minimum: 1 description: Price for this location, in the currency's smallest unit. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required when `price` is set. example: usd capacity: type: number minimum: 1 description: Seats at this location. Omit for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: link enum: - link link: type: string format: uri example: https://example.com/watch required: - type - link CustomEmailFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: email description: Only allowed value is 'email'. excludeEmails: description: Bookers whose email matches an entry cannot book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string requireEmails: description: Only bookers whose email matches an entry can book. Entries may be a bare domain (`example.com`), a domain with `@` (`@example.com`), or an exact address (`person@example.com`). Matching is case-insensitive. type: array items: type: string required: - field - slug - label - type CancelEventInput: type: object properties: reason: type: string maxLength: 500 description: Why the Event is cancelled. Included in the cancellation email every registered guest receives. example: The venue fell through — we will announce a new date soon. EventOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/EventOutputDto' required: - status - data UpdateEventIntegrationLocationInput: type: object properties: label: type: - string - 'null' description: Name shown for this location. Pass null to remove it. maxLength: 100 price: type: - number - 'null' minimum: 1 description: Price for this location, in the currency's smallest unit. Pass null to make it free. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required with `price` when the location has no currency yet. example: usd capacity: type: - number - 'null' minimum: 1 description: Seats at this location. Pass null for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: integration enum: - integration description: The location's type. It can't change. integration: enum: - cal-video - google-meet - zoom - whereby-video - whatsapp-video - webex-video - telegram-video - tandem - sylaps-video - skype-video - sirius-video - signal-video - shimmer-video - salesroom-video - roam-video - riverside-video - ping-video - office365-video - mirotalk-video - jitsi - jelly-video - jelly-conferencing - huddle - facetime-video - element-call-video - eightxeight-video - discord-video - demodesk-video - campfire-video type: string example: cal-video description: Switching the integration drops the stored `credentialId` unless a new one is sent. credentialId: type: number description: Identifies which connected account will host the Event when a host has multiple connected accounts. required: - type EventScheduleItemInput: type: object properties: startTime: type: - string - 'null' description: When the item starts, in ISO 8601 format in UTC timezone. Send either startTime or timeLabel. Required when endTime is set. example: '2030-01-01T10:10:00.000Z' endTime: type: - string - 'null' description: When the item ends, in ISO 8601 format in UTC timezone. Must be after startTime. example: '2030-01-01T10:40:00.000Z' timeLabel: type: - string - 'null' pattern: \S description: Free text such as "Doors open" for an item without a startTime. Send either startTime or timeLabel. content: type: string pattern: \S description: What happens during this item. people: maxItems: 10 type: array items: $ref: '#/components/schemas/EventSchedulePersonInput' required: - content EventIntegrationLocationOutput: type: object properties: id: type: string description: Identifier of this location. Pass it to `PATCH` or `DELETE /v2/events/{uuid}/locations/{locationId}` to edit or remove this location. label: type: string description: Name shown for this location. maxLength: 100 price: type: - number - 'null' example: 2500 description: Price a guest who picks this location pays, in the currency's smallest unit. null when the location is free. currency: type: - string - 'null' example: usd description: Currency of price. null when the location is free. capacity: type: number description: Seats at this location. Absent when unlimited. minimum: 1 maximum: 100000 type: type: string example: integration enum: - integration integration: type: string description: The integration's API name, e.g. `zoom` or `google-meet`. An app without an API name is returned with its stored type, e.g. `integrations:dialpad_video`. example: zoom credentialId: type: number description: Identifies which connected account will host the Event when a host has multiple connected accounts. required: - id - price - currency - type - integration EventOrganizersDefaultAppLocationInput: type: object properties: label: type: string description: Name shown for this location. maxLength: 100 price: type: number minimum: 1 description: Price for this location, in the currency's smallest unit. example: 1500 currency: enum: - usd - eur - gbp - cad - aud - chf - nzd - jpy - brl - mxn - inr - sgd - hkd - dkk - nok - sek - pln - czk - huf - ron - bgn - krw - thb - php - myr - idr - try - zar - aed - cop type: string description: Cal Pay currency code. Required when `price` is set. example: usd capacity: type: number minimum: 1 description: Seats at this location. Omit for unlimited. All locations together can have at most 100000 seats. maximum: 100000 type: type: string example: organizersDefaultApp enum: - organizersDefaultApp required: - type CustomMultiEmailFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: multiEmail enum: - multiEmail description: An input that accepts multiple email addresses. required: - field - slug - label - required - hidden - disableOnPrefill - type CustomNumberFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: number enum: - number description: A number input on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type RegistrationLocationCountOutputDto: type: object properties: locationId: type: - string - 'null' description: Event location id, or null for guests not registered for a location. count: type: number description: Seats held at this location by confirmed guests and guests holding a seat while they pay or confirm. required: - count CustomUrlFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: url enum: - url description: A URL input on the booking page. required: - field - slug - label - required - hidden - disableOnPrefill - type InvitedCoHostOutputDto: type: object properties: id: type: string description: Id of the co-host on this Event. Not a user id. format: uuid email: type: string description: The invited email address, lowercased. status: enum: - PENDING - ACCEPTED - DECLINED type: string required: - id - email - status SendMessageInput: type: object properties: segment: enum: - GOING - MAYBE - PENDING type: string description: 'Which guests receive the message: `GOING` (confirmed, RSVP yes), `MAYBE` (confirmed, RSVP maybe) or `PENDING` (waiting for approval).' subject: type: string description: Email subject in plain text, up to 200 characters. HTML is refused. body: type: string description: Message in plain text, up to 5000 characters. Links are allowed as plain URLs; HTML is refused. locationId: type: string maxLength: 128 description: Only message guests who registered for this location of the Event. checkedIn: type: boolean description: Only message guests who checked in (`true`) or who did not (`false`). Omit to message both. required: - segment - subject - body ApproveAllRegistrationsInput: type: object properties: search: type: string maxLength: 255 description: Only approve guests whose name or email contains this text, case-insensitive. locationId: type: string maxLength: 128 description: Only approve guests who registered for this location. retry: type: boolean description: 'Paid Events only: when the previous approve-all failed, approve the guests it had not reached instead of reading the pending guests again.' UpdateEventCoordinatesOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success required: - status DeleteEventCoverImageOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/DeleteEventCoverImageOutputDto' required: - status - data CustomPhoneFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: phone description: Only allowed value is 'phone'. required: - field - slug - label - type EventOutputDto: type: object properties: uuid: type: string description: Unique identifier of the Event. slug: type: string title: type: string description: type: - string - 'null' startTime: format: date-time type: string endTime: format: date-time type: string checkInOpensAt: format: date-time type: string description: 'When hosts can start checking guests in: 12 hours before `startTime`.' checkInClosesAt: format: date-time type: string description: 'When check-in closes: 12 hours after `endTime`.' timeZone: type: string visibility: enum: - PUBLIC - UNLISTED type: string category: enum: - meetup - conference - music - sports type: string description: What kind of event it is. hidden: type: boolean publishedAt: format: date-time type: - string - 'null' cancelledAt: format: date-time type: - string - 'null' status: enum: - draft - published - cancelled type: string description: 'Lifecycle status that summarises hidden, publishedAt and cancelledAt: cancelled when the Event was cancelled, published once published, draft otherwise.' locations: type: array items: oneOf: - title: Address $ref: '#/components/schemas/EventAddressLocationOutput' - title: Link $ref: '#/components/schemas/EventLinkLocationOutput' - title: Integration $ref: '#/components/schemas/EventIntegrationLocationOutput' - title: Organizer Default App $ref: '#/components/schemas/EventOrganizersDefaultAppLocationOutput' - title: Unknown $ref: '#/components/schemas/EventUnknownLocationOutput' coverImageUrl: type: - string - 'null' requiresApproval: type: boolean paymentTimeoutMinutes: type: - number - 'null' description: How many minutes a guest's seat is held while they pay. null uses the default of 10 minutes. waitlistEnabled: type: boolean description: Whether guests can join a waitlist when the Event is full. The waitlist only opens when the Event or the chosen location is full, so it only works when capacity is set on the Event or on a location. showOrganizerEmail: type: boolean description: Whether guests can see the organizer's email. guestList: enum: - hidden - names - count type: string description: 'Who guests can see on the Event''s page: their names, only the count, or neither.' showPresentedBy: type: boolean description: Whether the Event shows who it is presented by. confirmedCount: type: number description: Confirmed guest count. Returned when listing Events and omitted when fetching a single Event by uuid. liveStreams: description: Links where people can watch the event live, in display order. type: array items: $ref: '#/components/schemas/EventLiveStreamOutput' theme: enum: - light - dark type: - string - 'null' description: Default theme of the event page; null follows the visitor's system setting. poster: description: Poster cover design. The web app draws `coverImageUrl` from it. null when the cover is an uploaded image. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventPosterOutput' lineup: description: Speakers or performers on the event page. Returned on single-Event responses, not on Event lists. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventLineupOutput' schedule: description: Agenda on the event page. Returned on single-Event responses, not on Event lists. type: - array - 'null' items: $ref: '#/components/schemas/EventScheduleItemOutput' background: description: Animated background of the event page. type: - object - 'null' allOf: - $ref: '#/components/schemas/EventBackgroundOutput' registrationFields: type: array description: Questions guests answer when registering. Always includes name and email. items: discriminator: propertyName: field oneOf: - title: Default Name discriminator: propertyName: variant oneOf: - title: Default Full Name $ref: '#/components/schemas/SystemFullNameFieldOutput_2026_06_12' - title: Default Split Name $ref: '#/components/schemas/SystemSplitNameFieldOutput_2026_06_12' - title: Default Email $ref: '#/components/schemas/SystemEmailFieldOutput_2026_06_12' - title: Default Location $ref: '#/components/schemas/SystemLocationFieldOutput_2026_06_12' - title: Default Title $ref: '#/components/schemas/SystemTitleFieldOutput_2026_06_12' - title: Default Notes $ref: '#/components/schemas/SystemNotesFieldOutput_2026_06_12' - title: Default Guests $ref: '#/components/schemas/SystemGuestsFieldOutput_2026_06_12' - title: Default Reschedule Reason $ref: '#/components/schemas/SystemRescheduleReasonFieldOutput_2026_06_12' - title: Default Attendee Phone $ref: '#/components/schemas/SystemAttendeePhoneFieldOutput_2026_06_12' - title: Workflow-added SMS Reminder $ref: '#/components/schemas/SystemSmsReminderFieldOutput_2026_06_12' - title: Workflow-added AI Agent Phone $ref: '#/components/schemas/SystemAiAgentPhoneFieldOutput_2026_06_12' - title: Custom Booking Field discriminator: propertyName: type oneOf: - title: Custom Email $ref: '#/components/schemas/CustomEmailFieldOutput_2026_06_12' - title: Custom Phone $ref: '#/components/schemas/CustomPhoneFieldOutput_2026_06_12' - title: Custom Address $ref: '#/components/schemas/CustomAddressFieldOutput_2026_06_12' - title: Custom Short Text $ref: '#/components/schemas/CustomShortTextFieldOutput_2026_06_12' - title: Custom Number $ref: '#/components/schemas/CustomNumberFieldOutput_2026_06_12' - title: Custom Long Text $ref: '#/components/schemas/CustomLongTextFieldOutput_2026_06_12' - title: Custom Select $ref: '#/components/schemas/CustomSelectFieldOutput_2026_06_12' - title: Custom Multi-Select $ref: '#/components/schemas/CustomMultiSelectFieldOutput_2026_06_12' - title: Custom Multiple Emails $ref: '#/components/schemas/CustomMultiEmailFieldOutput_2026_06_12' - title: Custom Checkbox Group $ref: '#/components/schemas/CustomCheckboxGroupFieldOutput_2026_06_12' - title: Custom Radio Group $ref: '#/components/schemas/CustomRadioGroupFieldOutput_2026_06_12' - title: Custom Checkbox $ref: '#/components/schemas/CustomCheckboxFieldOutput_2026_06_12' - title: Custom URL $ref: '#/components/schemas/CustomUrlFieldOutput_2026_06_12' - title: Unknown Booking Field $ref: '#/components/schemas/UnknownBookingFieldOutput_2026_06_12' hosts: description: Ordered host roster, creator first. External co-hosts are not included. type: array items: $ref: '#/components/schemas/EventHostOutput' capacity: type: - number - 'null' description: The most guests the Event can take; null when unlimited. Once any location has its own `capacity`, this is the sum of the location capacities, or null if any location has none. The waitlist only opens when the Event or the chosen location is full, so it only works when capacity is set on the Event or on a location. example: 100 price: type: - number - 'null' description: Price of an Event without locations, in the currency's smallest unit; null when free. Events with locations are priced per location. example: 1500 currency: type: - string - 'null' description: Cal Pay currency code of `price`. example: usd paymentsEnabled: type: boolean description: Whether paid Events are available. When false, setting `price` on the Event or a location returns a 400. example: true cancellationReason: type: - string - 'null' userId: type: - number - 'null' description: Owner user id for a personal Event; null for a team-owned one. teamId: type: - number - 'null' description: Owning team id for a team-owned Event; null for a personal one. required: - uuid - slug - title - startTime - endTime - checkInOpensAt - checkInClosesAt - timeZone - visibility - category - hidden - status - locations - requiresApproval - waitlistEnabled - showOrganizerEmail - guestList - showPresentedBy - liveStreams - registrationFields - hosts - paymentsEnabled UpdateEventCoordinatesInput: type: object properties: latitude: type: number minimum: -90 maximum: 90 description: Latitude of the Event's address location. Must stay within 1 km of the geocoded address. example: 51.5092 longitude: type: number minimum: -180 maximum: 180 description: Longitude of the Event's address location. Must stay within 1 km of the geocoded address. example: -0.1278 required: - latitude - longitude CustomMultiEmailFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. type: type: string example: multiEmail description: Only allowed value is 'multiEmail'. required: - field - slug - label - type SystemLocationFieldOutput_2026_06_12: type: object properties: field: type: string example: location description: Identifies this as the location default booking field. The Booker renders the location picker only when the event type has at least 2 location options. slug: type: string example: location description: The default location field always uses `location` as its slug. label: type: string example: Your location default field label required: - field - slug CustomCheckboxGroupFieldOutput_2026_06_12: type: object properties: field: type: string example: custom description: Identifies this as a custom booking field. slug: type: string description: Unique slug identifier for this custom field. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: checkboxGroup enum: - checkboxGroup description: A group of checkboxes that allows multiple selections. required: - field - slug - label - required - hidden - disableOnPrefill - options - type InviteGuestsInput: type: object properties: emails: minItems: 1 description: Email addresses to invite. Between 1 and 200 per request. example: - guest@example.com type: array items: type: string format: email hostNote: type: string maxLength: 500 description: A personal note from the host, included in the invitation email. required: - emails EventPosterOutput: type: object properties: layout: enum: - date - bauhaus - rings - waves - halftone - split type: string palette: $ref: '#/components/schemas/EventPosterPaletteOutput' headline: type: - string - 'null' seed: type: number required: - layout - palette - headline - seed SystemAiAgentPhoneFieldOutput_2026_06_12: type: object properties: required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. label: type: string example: Your default field label placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. field: type: string example: aiAgentCallPhoneNumber description: Phone-number field added automatically by an AI-agent workflow. slug: type: string example: aiAgentCallPhoneNumber description: This workflow-added field always uses `aiAgentCallPhoneNumber` as its slug. required: - required - hidden - disableOnPrefill - field - slug CustomCheckboxGroupFieldInput_2026_06_12: type: object properties: field: type: string example: custom description: Must be 'custom' for all custom booking fields. slug: type: string description: Unique identifier for the field, e.g. `some-slug`. Can contain letters, numbers, hyphens, and underscores. example: some-slug label: type: string example: Your custom field label required: type: boolean hidden: type: boolean description: Hide this booking field from the booking page while keeping it in the event type's settings. Hidden fields are only returned to callers authorized on the event type. placeholder: type: string disableOnPrefill: type: boolean description: Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if the slug is `my-field` and the URL contains `&my-field=value`, the field will be prefilled with this value and disabled. options: example: - Option 1 - Option 2 type: array items: type: string type: type: string example: checkboxGroup description: Only allowed value is 'checkboxGroup'. required: - field - slug - label - options - type DeleteEventOutputResponseDto: type: object properties: status: enum: - success - error type: string example: success data: $ref: '#/components/schemas/DeleteEventOutputDto' required: - status - data 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) 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)