curl --request POST \
--url https://api.cal.com/v2/bookings/{bookingUid}/attendees \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'cal-api-version: <cal-api-version>' \
--data '
{
"name": "John Doe",
"timeZone": "America/New_York",
"email": "john.doe@example.com",
"phoneNumber": "+919876543210",
"language": "it"
}
'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/attendees"
payload = {
"name": "John Doe",
"timeZone": "America/New_York",
"email": "john.doe@example.com",
"phoneNumber": "+919876543210",
"language": "it"
}
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({
name: 'John Doe',
timeZone: 'America/New_York',
email: 'john.doe@example.com',
phoneNumber: '+919876543210',
language: 'it'
})
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/attendees', 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}/attendees",
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([
'name' => 'John Doe',
'timeZone' => 'America/New_York',
'email' => 'john.doe@example.com',
'phoneNumber' => '+919876543210',
'language' => 'it'
]),
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}/attendees"
payload := strings.NewReader("{\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\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}/attendees")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/attendees")
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 \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"name": "John Doe",
"email": "john@example.com",
"displayEmail": "john@example.com",
"timeZone": "America/New_York",
"absent": false,
"id": 251,
"bookingId": 313,
"language": "en",
"phoneNumber": "+1234567890"
}
}Add an attendee to a booking
Add a new attendee to an existing booking by its UID.
Seated Events:
This endpoint does not support seated event bookings. For seated events, each attendee must be added by creating a new booking for the same event type and time slot via POST /v2/bookings. Attempting to add an attendee to a seated event booking will return a 400 error.
Side effects:
- The booking’s attendee list is updated in the database
- The calendar event is updated on connected calendars (Google Calendar, Outlook, etc.) to include the new attendee
- An email notification is sent to the new attendee with the booking details
Permissions:
- The authenticated user must be either the booking organizer, an existing attendee, or have the
booking.updatepermission for the team
If accessed using an OAuth access token, the BOOKING_WRITE scope is required.
curl --request POST \
--url https://api.cal.com/v2/bookings/{bookingUid}/attendees \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'cal-api-version: <cal-api-version>' \
--data '
{
"name": "John Doe",
"timeZone": "America/New_York",
"email": "john.doe@example.com",
"phoneNumber": "+919876543210",
"language": "it"
}
'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/attendees"
payload = {
"name": "John Doe",
"timeZone": "America/New_York",
"email": "john.doe@example.com",
"phoneNumber": "+919876543210",
"language": "it"
}
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({
name: 'John Doe',
timeZone: 'America/New_York',
email: 'john.doe@example.com',
phoneNumber: '+919876543210',
language: 'it'
})
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/attendees', 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}/attendees",
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([
'name' => 'John Doe',
'timeZone' => 'America/New_York',
'email' => 'john.doe@example.com',
'phoneNumber' => '+919876543210',
'language' => 'it'
]),
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}/attendees"
payload := strings.NewReader("{\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\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}/attendees")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/attendees")
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 \"name\": \"John Doe\",\n \"timeZone\": \"America/New_York\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+919876543210\",\n \"language\": \"it\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"name": "John Doe",
"email": "john@example.com",
"displayEmail": "john@example.com",
"timeZone": "America/New_York",
"absent": false,
"id": 251,
"bookingId": 313,
"language": "en",
"phoneNumber": "+1234567890"
}
}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
The name of the attendee.
"John Doe"
The time zone of the attendee.
"America/New_York"
The email of the attendee.
"john.doe@example.com"
The phone number of the attendee in international format.
"+919876543210"
The preferred language of the attendee. Used for booking confirmation.
ar, ca, de, es, eu, he, id, ja, lv, pl, ro, sr, th, vi, az, cs, el, es-419, fi, hr, it, km, nl, pt, ru, sv, tr, zh-CN, bg, da, en, et, fr, hu, iw, ko, no, pt-BR, sk, ta, uk, zh-TW, bn "it"
Was this page helpful?