Contiguity-Signature header, and your webhook secret to verify each delivery.
Signing scheme
- Signed payload:
t + "." + raw_body(timestampt+.+ raw body string/bytes) - Algorithm: HMAC-SHA256
- Signature encoding: hex
t=<unix_timestamp>,v1=<hex_signature> (e.g. t=1707321600,v1=a1b2c3...). You verify by computing HMAC-SHA256 of the signed payload with your secret and comparing the result to v1 using a constant-time comparison.
Set up signing
- Open the Console.
- Go to Tokens → Webhook Signing.
- Generate a webhook secret. It will look like
whsec_9974ab26f9cfa06e.... Store it securely (e.g. in env vars) - Use this secret in your verification logic on the server.
Verification samples
Use the exact raw body bytes/string as received — never re-serialize parsed JSON (e.g. do not useJSON.stringify(req.body)). Each framework below shows how to read the raw body and verify.
- Express
- Hono
- Bun
- Flask
- FastAPI
Replay protection (optional)
Reject requests that are too old by checking the timestampt in the header. Require abs(now - t) to be within your tolerance (e.g. 300 seconds).
- JavaScript
- Python