curl --request POST \
--url https://api.cal.com/v2/events/{uuid}/messages \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "<string>",
"body": "<string>",
"locationId": "<string>",
"checkedIn": true
}
'import requests
url = "https://api.cal.com/v2/events/{uuid}/messages"
payload = {
"subject": "<string>",
"body": "<string>",
"locationId": "<string>",
"checkedIn": True
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: '<string>',
body: JSON.stringify('<string>'),
locationId: '<string>',
checkedIn: true
})
};
fetch('https://api.cal.com/v2/events/{uuid}/messages', 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/events/{uuid}/messages",
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([
'subject' => '<string>',
'body' => '<string>',
'locationId' => '<string>',
'checkedIn' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json"
],
]);
$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/events/{uuid}/messages"
payload := strings.NewReader("{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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/events/{uuid}/messages")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/events/{uuid}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": "<string>",
"status": "QUEUED",
"recipientCount": 123,
"textRecipientCount": 123,
"skippedPhoneCount": 123
}
}Message an Event's guests
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.
curl --request POST \
--url https://api.cal.com/v2/events/{uuid}/messages \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "<string>",
"body": "<string>",
"locationId": "<string>",
"checkedIn": true
}
'import requests
url = "https://api.cal.com/v2/events/{uuid}/messages"
payload = {
"subject": "<string>",
"body": "<string>",
"locationId": "<string>",
"checkedIn": True
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: '<string>',
body: JSON.stringify('<string>'),
locationId: '<string>',
checkedIn: true
})
};
fetch('https://api.cal.com/v2/events/{uuid}/messages', 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/events/{uuid}/messages",
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([
'subject' => '<string>',
'body' => '<string>',
'locationId' => '<string>',
'checkedIn' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json"
],
]);
$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/events/{uuid}/messages"
payload := strings.NewReader("{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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/events/{uuid}/messages")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/events/{uuid}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"locationId\": \"<string>\",\n \"checkedIn\": true\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": "<string>",
"status": "QUEUED",
"recipientCount": 123,
"textRecipientCount": 123,
"skippedPhoneCount": 123
}
}Headers
value must be Bearer <token> where <token> is api key prefixed with cal_, managed user access token, or OAuth access token
Path Parameters
Event UUID. Accepts the canonical UUID (e.g. 018ff5cd-6dc4-7d57-bcbc-374702ca8b38) or its short-uuid (Flickr Base58) form (e.g. 1cbZYoAFoJdwqN4tixezd5).
Body
Which guests receive the message: GOING (confirmed, RSVP yes), MAYBE (confirmed, RSVP maybe) or PENDING (waiting for approval).
GOING, MAYBE, PENDING Email subject in plain text, up to 200 characters. HTML is refused.
Message in plain text, up to 5000 characters. Links are allowed as plain URLs; HTML is refused.
Only message guests who registered for this location of the Event.
128Only message guests who checked in (true) or who did not (false). Omit to message both.
Was this page helpful?