Every webhook delivery Off the Hook sends is signed with HMAC-SHA256. Verifying the signature before processing an event confirms the delivery came from Off the Hook and that the payload has not been tampered with in transit. Skipping this step makes your endpoint vulnerable to spoofed requests.Documentation Index
Fetch the complete documentation index at: https://docs.offthehook.dev/llms.txt
Use this file to discover all available pages before exploring further.
Signature headers
Each delivery includes three headers that you use together to verify the signature:| Header | Example | Description |
|---|---|---|
webhook-id | evt_8xN9kP2QbA... | The event ID; stays the same across retries |
webhook-timestamp | 1730000000 | Unix timestamp as a string |
webhook-signature | v1,<base64-hmac-sha256> | One or more space-separated signatures |
Verify with the Svix library
Off the Hook implements the Standard Webhooks specification, so the Svix verification library works without modification. Your signing secret starts withwhsec_ — pass it as-is; the library handles base64 decoding internally.
Secret rotation and multiple signatures
During a secret rotation grace period, thewebhook-signature header contains multiple space-separated v1, values — one computed with the new secret and one with the old. The Svix library accepts any valid signature in the header automatically, so no code changes are required during a rotation.
Manual verification
If no Svix library is available for your language, you can implement verification directly:Decode the secret
Your secret starts with
whsec_. Base64-decode the part after whsec_ to get the raw key bytes.