Skip to content
cascadehook.

ToolsFree tool

Webhook signature verifier

Check a Standard Webhooks signature and see why it fails. Works with Cascadehook and any sender that follows the spec.

Paste request headers

Paste the headers from a log, a request inspector, or curl -v, as Name: value lines or JSON. The matching fields below are filled in.

Runs entirely in your browser with Web Crypto. Nothing you paste is sent anywhere or saved.

The result shows up here

Paste the secret, the three headers, and the raw body from a request, then verify. To see how it works first, use Try an example.

What gets signed

HMAC-SHA256(key, id + "." + timestamp + "." + body)

The body was parsed before it was verified

The most common cause. Middleware such as express.json() turns the body into an object, and serializing it again changes key order, spacing, or number formatting. Verify the exact raw bytes first, then parse.

The secret is used as text

Passing the whsec_… string straight to your HMAC function uses its characters as the key. Strip the prefix and Base64-decode it first.

The wrong secret

Each endpoint has its own secret. After a rotation the old one stops working once the grace period ends, so make sure your receiver loads the new one.

The header is compared as a whole

The header can hold more than one signature. Split it on spaces and accept the request if any v1 entry matches.

The timestamp is out of range

Clock drift, or testing with a request captured earlier, fails the tolerance check even when the signature is correct. Keep your clock synced with NTP.

Sending webhooks yourself? Cascadehook signs every delivery this way, retries failures for up to 72 hours, and keeps every attempt for replay. Create a project or read the signature docs.