Skip to main content
Every webhook sent from Account → Webhooks is signed, so you can prove a request really came from CloudTalk and wasn’t tampered with. Verify the signature before trusting any payload: an unverified webhook endpoint will accept requests from anyone who discovers its URL. Each endpoint has its own signing secret. To see it, open the endpoint under Account → Webhooks in your Dashboard and reveal the secret on the endpoint’s page. It looks like whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw. This scheme covers the account-level webhooks only. Other CloudTalk features that call an endpoint you own (the Call Flow Designer Webhook step, an AI Voice Agent’s Send via Webhook option, Workflow Automation actions) are not signed this way; authenticate those the way their own setup screen describes.

Signature headers

Every delivery carries three headers:

Verify with a library

CloudTalk signatures follow the widely-used Svix webhook signature scheme, so you can verify with the open-source Svix libraries: available for JavaScript, Python, PHP, Go, Ruby, Java, C#, and Rust.
Always verify against the raw request body, exactly as received. Parsing the JSON and re-serializing it (even changing whitespace) breaks the signature.

Verify manually

If you’d rather not add a dependency:
  1. Build the signed content by joining three values with dots: {svix-id}.{svix-timestamp}.{raw body}.
  2. Take the part of your signing secret after the whsec_ prefix and Base64-decode it: that’s your HMAC key.
  3. Compute HMAC-SHA256(key, signed_content) and Base64-encode the result.
  4. svix-signature can contain several space-delimited signatures (this enables zero-downtime secret rotation). Strip the v1, prefix from each and compare your computed signature against every one using a constant-time comparison. A single match means the webhook is authentic.
  5. Reject requests whose svix-timestamp is more than 5 minutes from your server’s time: this blocks replay attacks. Make sure your server clock is NTP-synced.
Manual verification (Node.js)

Rotating your secret

If a signing secret leaks, open the endpoint under Account → Webhooks and click Rotate secret. During rotation, deliveries are signed with both the old and the new secret (that’s why svix-signature can hold multiple signatures) so a correctly implemented verifier keeps working with zero downtime.