Create a booking proposal
A booking proposal is a booking request that carries several candidate times instead of one. The organizer later confirms exactly one of them, and only then does a booking exist.
The request body is the same as POST /v2/bookings, except that the single start is replaced by requestedTimeslots — a list of proposed start times in UTC.
The number of proposed times must exactly match the event type’s bookingProposalCount, and every one of them must be available. If any proposed time is unavailable the whole request is rejected.
Reschedules, recurring event types, seated event types and paid event types do not accept proposals.
Headers
Must be set to 2024-08-13. If not set to this value, the endpoint will default to an older version.
"2024-08-13"
value must be Bearer <token> where <token> is api key prefixed with cal_, managed user access token, or OAuth access token
For platform customers - OAuth client secret key
For platform customers - OAuth client ID
Body
The attendee's details.
The proposed start times in ISO 8601 format in UTC timezone. The number of times must exactly match the event type's bookingProposalCount, and each must be an available slot.
1Booking field responses consisting of an object with booking field slug as keys and user response as values for custom booking fields added by you.
The ID of the event type that is booked. Required unless eventTypeSlug and username are provided as an alternative to identifying the event type.
123
The slug of the event type. Required along with username / teamSlug and optionally organizationSlug if eventTypeId is not provided.
"my-event-type"
The username of the event owner. Required along with eventTypeSlug and optionally organizationSlug if eventTypeId is not provided.
"john-doe"
Team slug for team that owns event type for which slots are fetched. Required along with eventTypeSlug and optionally organizationSlug if the team is part of organization
"john-doe"
The organization slug. Optional, only used when booking with eventTypeSlug + username or eventTypeSlug + teamSlug.
"acme-corp"
An optional list of guest emails attending the event.
Deprecated - use 'location' instead. Meeting URL just for this booking. Displayed in email and calendar event. If not provided then cal video link will be generated.
"https://example.com/meeting"
One of the event type locations. If instead of passing one of the location objects as required by schema you are still passing a string please use an object.
- Address
- Attendee Address
- Attendee Defined
- Attendee Phone
- Integration
- Link
- Phone
- Organizer Default App
You can store any additional data you want here. Metadata must have at most 50 keys, each key up to 40 characters, and string values up to 500 characters.
If it is an event type that has multiple possible lengths that attendee can pick from, you can pass the desired booking length here. If not provided then event type default length will be used for the booking.
x >= 130
Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.
Email verification code required when event type has email verification enabled.
"123456"
When true and the authenticated user is a host of the event type, availability conflict checks are bypassed. If the user is not a host or is unauthenticated, this parameter is silently ignored.
true
When true and the authenticated user is a host of the event type, booking time out-of-bounds checks are bypassed allowing bookings outside the normally permitted scheduling window. If the user is not a host or is unauthenticated, this parameter is silently ignored. Only supported on the 2026-02-25 API version.
true
When true and the authenticated user is a host of the event type, booking limit checks (event type, team, and per-host limits such as bookings per day/week/month/year, as well as duration limits) are bypassed, allowing the booking to be created even when a host has reached their limit. If the user is not a host or is unauthenticated, this parameter is silently ignored. Only supported on the 2026-02-25 API version.
true