Signing only adds headers. The request body and
Content-Type are unchanged, so existing receivers keep working without changes.Headers
Signed Content
The signature is an HMAC-SHA256 over this string:- The HMAC key is the base64-decoded part of your secret after the
whsec_prefix. - The result is base64 encoded and prefixed with
v1,. - Use the raw request body exactly as received. Parsing and re-serializing the JSON changes the bytes and breaks the signature.
Get Your Signing Secret
Open Integrations & Apps in the dashboard, click the Webhooks tile and reveal the signing secret, or fetch it with an API key:Verify in Node.js
Replay Protection
Reject requests whosewebhook-timestamp is more than 5 minutes away from your server time, as the sample does. Store recent webhook-id values if you also need to reject a replay inside that window.
Rotating the Secret
Rotate the secret in the dashboard or with the API:previousSecretExpiresAt. For 24 hours every delivery carries two signatures, one per secret, so a receiver on either secret accepts it. Deploy the new secret within that time. After 24 hours only the new secret signs.