Optional body: secret (enables signature verification), payloadTemplate (custom JSON template with {{variable}} placeholders), version (currently only "2021-10-20" is supported)
Other documented triggers include BOOKING_CONFIRMED, BOOKING_REJECTED, BOOKING_NO_SHOW, BOOKING_PAYMENT_INITIATED, BOOKING_PAID, MEETING_STARTED, MEETING_ENDED, RECORDING_READY and more — list them explicitly, there is no 'all' wildcard
Verify incoming deliveries by computing HMAC-SHA256 of the raw request body with your secret and comparing to the x-cal-signature-256 header
Response: 201 with webhook object (id, userId/eventTypeId, subscriberUrl, triggers, active)
Docs: https://cal.com/docs/api-reference/v2/webhooks/create-a-webhook and https://cal.com/docs/developing/guides/automation/webhooks
Known gotchas
Event-type-level webhooks fire only for that event type; use user-level webhooks for account-wide coverage
If you set a secret, verify HMAC-SHA256 against the RAW body bytes — parsing and re-serializing JSON first breaks the signature
Webhook payload version is separate from cal-api-version; only "2021-10-20" is currently supported for the webhook version field
Payload templates use {{placeholder}} substitution; unknown variables are not expanded — test with a real BOOKING_CREATED delivery
Anything built on API v1 webhooks must be migrated — v1 was retired in April 2026
Give your agent this knowledge — and 15,500+ more routes
One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?