curl --request PATCH \
--url https://api.cal.id/webhook/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"active": false,
"eventTriggers": [
"BOOKING_CANCELLED"
]
}
'import requests
url = "https://api.cal.id/webhook/{id}"
payload = {
"active": False,
"eventTriggers": ["BOOKING_CANCELLED"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({active: false, eventTriggers: ['BOOKING_CANCELLED']})
};
fetch('https://api.cal.id/webhook/{id}', 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.id/webhook/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'active' => false,
'eventTriggers' => [
'BOOKING_CANCELLED'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.id/webhook/{id}"
payload := strings.NewReader("{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.cal.id/webhook/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/webhook/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"payloadTemplate": null,
"platformOAuthClientId": null,
"id": "wh_6f0c2a3b8d41",
"eventTriggers": [
"BOOKING_CREATED",
"BOOKING_RESCHEDULED",
"BOOKING_CANCELLED"
],
"subscriberUrl": "https://hooks.example.com/cal-id/bookings",
"active": false,
"secret": "whsec_2f8c41d7b93e4a06"
},
"message": "Webhook updated"
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Update a webhook
Partially updates a webhook: point it at a new subscriberUrl, change which eventTriggers it listens for, rotate the secret, or set active: false to pause deliveries without losing the subscription. Sending eventTriggers replaces the whole list rather than adding to it, so include every trigger you want to keep. The updated subscription is returned.
curl --request PATCH \
--url https://api.cal.id/webhook/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"active": false,
"eventTriggers": [
"BOOKING_CANCELLED"
]
}
'import requests
url = "https://api.cal.id/webhook/{id}"
payload = {
"active": False,
"eventTriggers": ["BOOKING_CANCELLED"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({active: false, eventTriggers: ['BOOKING_CANCELLED']})
};
fetch('https://api.cal.id/webhook/{id}', 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.id/webhook/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'active' => false,
'eventTriggers' => [
'BOOKING_CANCELLED'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.id/webhook/{id}"
payload := strings.NewReader("{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.cal.id/webhook/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/webhook/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"active\": false,\n \"eventTriggers\": [\n \"BOOKING_CANCELLED\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"payloadTemplate": null,
"platformOAuthClientId": null,
"id": "wh_6f0c2a3b8d41",
"eventTriggers": [
"BOOKING_CREATED",
"BOOKING_RESCHEDULED",
"BOOKING_CANCELLED"
],
"subscriberUrl": "https://hooks.example.com/cal-id/bookings",
"active": false,
"secret": "whsec_2f8c41d7b93e4a06"
},
"message": "Webhook updated"
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Authorizations
Use the Authorization header with Bearer scheme.
Examples:
- API Key: Authorization: Bearer calid_xxxxx
Path Parameters
Webhook identifier.
1"2f33b5cd-8ec7-4eb0-91fd-9488c30f4744"
Body
Optional custom payload template delivered to the subscriber.
"{\"event\":\"BOOKING_CREATED\",\"bookingId\":\"bk_123\"}"
Webhook events that should trigger delivery.
BOOKING_CREATED, BOOKING_PAYMENT_INITIATED, BOOKING_PAID, BOOKING_RESCHEDULED, BOOKING_REQUESTED, BOOKING_CANCELLED, BOOKING_REJECTED, BOOKING_NO_SHOW_UPDATED, FORM_SUBMITTED, OOO_CREATED ["BOOKING_CREATED"]
Destination URL that receives webhook requests.
"https://example.com/webhooks/calid"
Whether this webhook is currently enabled.
true
Optional shared secret used to sign webhook payloads.
"whsec_1234567890"
Was this page helpful?