Skip to main content

Endpoint

POST https://api.yourdomain.com/inbound/cal_com/:workspaceId
You don’t need to copy this URL. When you connect Cal.com in Settings → Integrations, Nous calls POST https://api.cal.com/v2/webhooks with this URL, a freshly generated signing secret, and the three booking triggers.

Auth

Each Cal.com connection stores its own signing key (encrypted) in workflow_provider_connections.encrypted_credentials.webhook_signing_key. Cal.com signs every delivery with that key and Nous verifies before processing.
HeaderFormat
x-cal-signature-256hex HMAC-SHA256 of the raw request body
Verification:
HMAC-SHA256(  message = rawBody,
  key     = signing_key
) === header_value
Comparison is timing-safe. Nous also accepts a leading sha256= prefix on the header value in case Cal.com adds one later.

Supported events

Cal.com triggerActivity logged
BOOKING_CREATEDmeeting_scheduled
BOOKING_CANCELLEDmeeting_cancelled
BOOKING_RESCHEDULEDmeeting_scheduled (new time)
The activity’s external_id is keyed on the booking uid so the same booking discovered via webhook and via CSV-import backfill (scanCalCom) dedupes cleanly.

Payload

{
  "triggerEvent": "BOOKING_CREATED",
  "payload": {
    "uid": "BOOKING_UID",
    "title": "30 Min Discovery Call",
    "startTime": "2026-05-20T14:00:00Z",
    "endTime": "2026-05-20T14:30:00Z",
    "attendees": [
      {
        "email": "prospect@company.com",
        "name": "Jane Smith",
        "timeZone": "America/New_York"
      }
    ],
    "organizer": {
      "email": "you@yourcompany.com",
      "name": "You"
    },
    "eventType": {
      "id": 12345,
      "slug": "30min"
    }
  }
}
Cal.com creates new contacts on BOOKING_CREATED — a booking is a strong enough intent signal to bootstrap the contact. BOOKING_CANCELLED only updates existing contacts; it never creates one.