curl --request POST \
--url https://api.cal.com/v2/bookings/{bookingUid}/guests \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'cal-api-version: <cal-api-version>' \
--data '
{
"guests": [
{
"email": "john.doe@example.com",
"name": "John Doe",
"timeZone": "America/New_York"
},
{
"email": "jane.smith@example.com",
"name": "Jane Smith"
}
]
}
'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/guests"
payload = { "guests": [
{
"email": "john.doe@example.com",
"name": "John Doe",
"timeZone": "America/New_York"
},
{
"email": "jane.smith@example.com",
"name": "Jane Smith"
}
] }
headers = {
"cal-api-version": "<cal-api-version>",
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'cal-api-version': '<cal-api-version>',
Authorization: '<authorization>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
guests: [
{email: 'john.doe@example.com', name: 'John Doe', timeZone: 'America/New_York'},
{email: 'jane.smith@example.com', name: 'Jane Smith'}
]
})
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/guests', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cal.com/v2/bookings/{bookingUid}/guests",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'guests' => [
[
'email' => 'john.doe@example.com',
'name' => 'John Doe',
'timeZone' => 'America/New_York'
],
[
'email' => 'jane.smith@example.com',
'name' => 'Jane Smith'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"cal-api-version: <cal-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cal.com/v2/bookings/{bookingUid}/guests"
payload := strings.NewReader("{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cal-api-version", "<cal-api-version>")
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cal.com/v2/bookings/{bookingUid}/guests")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/guests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cal-api-version"] = '<cal-api-version>'
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": 123,
"uid": "booking_uid_123",
"title": "Consultation",
"description": "Learn how to integrate scheduling into marketplace.",
"hosts": [
{
"id": 1,
"name": "Jane Doe",
"email": "jane100@example.com",
"displayEmail": "jane100@example.com",
"username": "jane100",
"timeZone": "America/Los_Angeles"
}
],
"status": "accepted",
"start": "2024-08-13T15:30:00Z",
"end": "2024-08-13T16:30:00Z",
"duration": 60,
"eventTypeId": 50,
"eventType": {
"id": 1,
"slug": "some-event"
},
"location": "https://example.com/meeting",
"absentHost": true,
"createdAt": "2024-08-13T15:30:00Z",
"updatedAt": "2024-08-13T15:30:00Z",
"attendees": [
{
"name": "John Doe",
"email": "john@example.com",
"displayEmail": "john@example.com",
"timeZone": "America/New_York",
"absent": false,
"language": "en",
"phoneNumber": "+1234567890"
}
],
"bookingFieldsResponses": {
"customField": "customValue"
},
"cancellationReason": "User requested cancellation",
"cancelledByEmail": "canceller@example.com",
"reschedulingReason": "User rescheduled the event",
"rescheduledByEmail": "rescheduler@example.com",
"rescheduledFromUid": "previous_uid_123",
"rescheduledToUid": "new_uid_456",
"meetingUrl": "https://example.com/recurring-meeting",
"metadata": {
"key": "value"
},
"rating": 4,
"icsUid": "ics_uid_123",
"guests": [
"guest1@example.com",
"guest2@example.com"
]
}
}Add guests to an existing booking
Add one or more guests to an existing booking. Maximum 10 guests per request, with a limit of 30 total guests per booking.
Rate Limiting: This endpoint is rate limited to 5 requests per minute to prevent abuse.
Seated Events:
This endpoint does not support seated event bookings. For seated events, each guest must be added by creating a new booking for the same event type and time slot via POST /v2/bookings. Attempting to add guests to a seated event booking will return a 400 error.
Email Notifications: When guests are added, the following notifications are sent (unless disabled by event type settings):
-
Organizer & Team Members: Receive an “Add Guests” notification email informing them that new guests have been added to the booking.
-
New Guests: Receive a “Scheduled Event” email with full booking details and calendar invite. If they have a phone number, they also receive an SMS notification.
-
Existing Guests: Receive an “Add Guests” notification email informing them that additional guests have been added to the booking.
If accessed using an OAuth access token, the BOOKING_WRITE scope is required.
curl --request POST \
--url https://api.cal.com/v2/bookings/{bookingUid}/guests \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'cal-api-version: <cal-api-version>' \
--data '
{
"guests": [
{
"email": "john.doe@example.com",
"name": "John Doe",
"timeZone": "America/New_York"
},
{
"email": "jane.smith@example.com",
"name": "Jane Smith"
}
]
}
'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/guests"
payload = { "guests": [
{
"email": "john.doe@example.com",
"name": "John Doe",
"timeZone": "America/New_York"
},
{
"email": "jane.smith@example.com",
"name": "Jane Smith"
}
] }
headers = {
"cal-api-version": "<cal-api-version>",
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'cal-api-version': '<cal-api-version>',
Authorization: '<authorization>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
guests: [
{email: 'john.doe@example.com', name: 'John Doe', timeZone: 'America/New_York'},
{email: 'jane.smith@example.com', name: 'Jane Smith'}
]
})
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/guests', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cal.com/v2/bookings/{bookingUid}/guests",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'guests' => [
[
'email' => 'john.doe@example.com',
'name' => 'John Doe',
'timeZone' => 'America/New_York'
],
[
'email' => 'jane.smith@example.com',
'name' => 'Jane Smith'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"cal-api-version: <cal-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cal.com/v2/bookings/{bookingUid}/guests"
payload := strings.NewReader("{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cal-api-version", "<cal-api-version>")
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cal.com/v2/bookings/{bookingUid}/guests")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/guests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cal-api-version"] = '<cal-api-version>'
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"guests\": [\n {\n \"email\": \"john.doe@example.com\",\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\"\n },\n {\n \"email\": \"jane.smith@example.com\",\n \"name\": \"Jane Smith\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": 123,
"uid": "booking_uid_123",
"title": "Consultation",
"description": "Learn how to integrate scheduling into marketplace.",
"hosts": [
{
"id": 1,
"name": "Jane Doe",
"email": "jane100@example.com",
"displayEmail": "jane100@example.com",
"username": "jane100",
"timeZone": "America/Los_Angeles"
}
],
"status": "accepted",
"start": "2024-08-13T15:30:00Z",
"end": "2024-08-13T16:30:00Z",
"duration": 60,
"eventTypeId": 50,
"eventType": {
"id": 1,
"slug": "some-event"
},
"location": "https://example.com/meeting",
"absentHost": true,
"createdAt": "2024-08-13T15:30:00Z",
"updatedAt": "2024-08-13T15:30:00Z",
"attendees": [
{
"name": "John Doe",
"email": "john@example.com",
"displayEmail": "john@example.com",
"timeZone": "America/New_York",
"absent": false,
"language": "en",
"phoneNumber": "+1234567890"
}
],
"bookingFieldsResponses": {
"customField": "customValue"
},
"cancellationReason": "User requested cancellation",
"cancelledByEmail": "canceller@example.com",
"reschedulingReason": "User rescheduled the event",
"rescheduledByEmail": "rescheduler@example.com",
"rescheduledFromUid": "previous_uid_123",
"rescheduledToUid": "new_uid_456",
"meetingUrl": "https://example.com/recurring-meeting",
"metadata": {
"key": "value"
},
"rating": 4,
"icsUid": "ics_uid_123",
"guests": [
"guest1@example.com",
"guest2@example.com"
]
}
}Headers
Must be set to 2024-08-13. This header is required as this endpoint does not exist in older API versions.
"2024-08-13"
value must be Bearer <token> where <token> is api key prefixed with cal_, managed user access token, or OAuth access token
Path Parameters
Body
Array of guests to add to the booking. Maximum 100 guests per request.
1Show child attributes
Show child attributes
[ { "email": "john.doe@example.com", "name": "John Doe", "timeZone": "America/New_York" }, { "email": "jane.smith@example.com", "name": "Jane Smith" } ]
Response
success, error "success"
Booking data, which can be either a BookingOutput object, a RecurringBookingOutput object, or an array of RecurringBookingOutput objects
- Booking · object
- Recurring Booking · object
- Recurring Bookings (array) · object[]
- Seated Booking · object
- Recurring Seated Booking · object
- Recurring Seated Bookings (array) · object[]
Show child attributes
Show child attributes
Was this page helpful?