Skip to main content
Every delivery carries an X-Webhook-Signature header:
  • t is the Unix time, in seconds, when the request was signed.
  • v1 is a hex HMAC-SHA256 of {t}.{raw request body}, keyed with the endpoint’s signing secret.
During a secret rotation the header carries two v1 values, one per secret. Accept the request if either one matches.

Steps

1

Read the raw body

Use the exact bytes you received. Parsing and re-encoding the JSON changes the bytes and breaks the signature.
2

Check the timestamp

Reject the request if t is more than 5 minutes away from your server’s clock.
3

Compute and compare

Compute HMAC-SHA256(secret, t + "." + body) as lowercase hex and compare it with each v1 value using a constant-time comparison.
4

Deduplicate

Store the X-Webhook-Delivery ID and skip deliveries you have already processed.

Examples

Rotating the secret

Rotate a secret from the endpoint’s settings or with the rotate-secret endpoint.
  • With overlap (default): both the old and new secret sign deliveries for 24 hours. Update your receiver, then let the old one expire.
  • Immediately: the old secret stops working at once. Use this if a secret has leaked.
The signing secret is separate from your API keys. Revoking an API key does not stop webhook deliveries.