Why verify?
Your webhook URL is a public endpoint, so anyone could attempt to send requests to it. Every request from Zivio is signed with your webhook’s signing secret. By verifying the signature before acting on a request, you can be confident it genuinely came from Zivio and was not tampered with in transit.Use a Standard Webhooks library (recommended)
Zivio signs requests following the Standard Webhooks specification. The easiest and safest way to verify is with one of the official open-source libraries, available for many languages. Pass your signing secret and the request headers, and the library handles verification — including protection against replay attacks — for you.How the signature works
If you prefer to verify manually, the scheme is straightforward:1
Build the signed content
Concatenate the
webhook-id, the webhook-timestamp, and the raw request body, separated by full stops:2
Compute an HMAC
Your signing secret is the part after the
whsec_ prefix, which is Base64-encoded. Base64-decode it to get the key, then compute an HMAC-SHA256 of the signed content using that key. Base64-encode the result.3
Compare against the header
The
webhook-signature header contains a space-separated list of signatures, each prefixed with a version, e.g. v1,<base64-signature>. Compare your computed value against the v1 signature using a constant-time comparison.4
Check the timestamp
Reject requests whose
webhook-timestamp is too far from the current time (a tolerance of around five minutes is typical) to defend against replay attacks.You must use the raw request body exactly as received to compute the signature. Re-serializing a parsed JSON object can change whitespace or key order and will cause verification to fail.
Manual verification example
Node.js

