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:Build the signed content
Concatenate the
webhook-id, the webhook-timestamp, and the raw request body, separated by full stops: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.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.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

