X-Webhook-Signature header:
tis the Unix time, in seconds, when the request was signed.v1is a hex HMAC-SHA256 of{t}.{raw request body}, keyed with the endpoint’s signing secret.
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.