curl --request POST \
--url https://api.cal.com/v2/events/{uuid}/cancel \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "The venue fell through — we will announce a new date soon."
}
'import requests
url = "https://api.cal.com/v2/events/{uuid}/cancel"
payload = { "reason": "The venue fell through — we will announce a new date soon." }
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({reason: 'The venue fell through — we will announce a new date soon.'})
};
fetch('https://api.cal.com/v2/events/{uuid}/cancel', 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}/cancel",
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([
'reason' => 'The venue fell through — we will announce a new date soon.'
]),
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}/cancel"
payload := strings.NewReader("{\n \"reason\": \"The venue fell through — we will announce a new date soon.\"\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}/cancel")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"The venue fell through — we will announce a new date soon.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/events/{uuid}/cancel")
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 \"reason\": \"The venue fell through — we will announce a new date soon.\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"uuid": "<string>",
"slug": "<string>",
"title": "<string>",
"startTime": "2023-11-07T05:31:56Z",
"endTime": "2023-11-07T05:31:56Z",
"timeZone": "<string>",
"visibility": "PUBLIC",
"hidden": true,
"locations": [
{
"type": "address",
"address": "123 Event Street"
}
],
"requiresApproval": true,
"waitlistEnabled": true,
"hosts": [
{
"userId": 123,
"name": "Jane Doe",
"username": "jane",
"avatarUrl": "<string>"
}
],
"description": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"cancelledAt": "2023-11-07T05:31:56Z",
"coverImageUrl": "<string>",
"confirmedCount": 123,
"capacity": 100,
"price": 1500,
"currency": "eur",
"cancellationReason": "<string>",
"userId": 123,
"teamId": 123
}
}Cancel an Event
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.
curl --request POST \
--url https://api.cal.com/v2/events/{uuid}/cancel \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "The venue fell through — we will announce a new date soon."
}
'import requests
url = "https://api.cal.com/v2/events/{uuid}/cancel"
payload = { "reason": "The venue fell through — we will announce a new date soon." }
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({reason: 'The venue fell through — we will announce a new date soon.'})
};
fetch('https://api.cal.com/v2/events/{uuid}/cancel', 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}/cancel",
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([
'reason' => 'The venue fell through — we will announce a new date soon.'
]),
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}/cancel"
payload := strings.NewReader("{\n \"reason\": \"The venue fell through — we will announce a new date soon.\"\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}/cancel")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"The venue fell through — we will announce a new date soon.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/events/{uuid}/cancel")
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 \"reason\": \"The venue fell through — we will announce a new date soon.\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"uuid": "<string>",
"slug": "<string>",
"title": "<string>",
"startTime": "2023-11-07T05:31:56Z",
"endTime": "2023-11-07T05:31:56Z",
"timeZone": "<string>",
"visibility": "PUBLIC",
"hidden": true,
"locations": [
{
"type": "address",
"address": "123 Event Street"
}
],
"requiresApproval": true,
"waitlistEnabled": true,
"hosts": [
{
"userId": 123,
"name": "Jane Doe",
"username": "jane",
"avatarUrl": "<string>"
}
],
"description": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"cancelledAt": "2023-11-07T05:31:56Z",
"coverImageUrl": "<string>",
"confirmedCount": 123,
"capacity": 100,
"price": 1500,
"currency": "eur",
"cancellationReason": "<string>",
"userId": 123,
"teamId": 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
Why the Event is cancelled. Included in the cancellation email every registered guest receives.
500"The venue fell through — we will announce a new date soon."
Was this page helpful?