Skip to main content

Signature header

Every delivery carries an HMAC-SHA256 of the raw request body, keyed with the webhook’s secret:
The other headers on a delivery are listed in the overview. Two matter for security: X-Orbit-Timestamp (when the event happened) and X-Orbit-Event-ID (stable across retries of the same event).

Verification example

Here’s how to verify the signature in Node.js:
ImportantAlways verify the signature before processing webhook data. Never trust webhook payloads without verification.
Deliveries that failed are retried for up to about 20 minutes, so a replay window of 10 minutes rejects a retry the sender legitimately delayed. Use 30 minutes if your endpoint is often down for a while, or skip the timestamp check and rely on de-duplicating X-Orbit-Event-ID.

Webhook secret

Your webhook secret is shown once, when the webhook is created, in the dashboard under Integrations → Webhooks or in the response of POST /api/v1/webhooks. To rotate it without missing a delivery, call POST /api/v1/webhooks/:id/rotate-secret. The response carries the new secret (once) and previous_secret_expires_at, 24 hours later. Until then every delivery carries two signatures: X-Orbit-Signature with the new secret and X-Orbit-Signature-Previous with the old one. Verify against whichever secret you hold, store the new one, and the previous header stops after the grace period. If you suspect the secret has been compromised, rotate it and switch immediately: once you hold the new secret, treat a delivery that only the old one verifies as unverified.
  • Store the secret in environment variables
  • Never commit secrets to version control
  • Rotate secrets periodically for security

What is never sent

A delivery never carries a submitter’s IP address, a call’s Twilio recording URL, or a call transcript’s text. Fetch recordings and transcripts with the Dialer API using a credential with dialer:read. Next: Embed Script →