Webhook Signature Verifier
Stripe, GitHub, Slack, Shopify and other HMAC signatures.
Result
Valid Too old Invalid
- Expected
- Timestamp
Why signatures usually fail
About the Webhook Signature Verifier
Webhook providers sign each request with a shared secret so your endpoint can prove it came from them and wasn't changed. This tool recomputes the HMAC in your browser with Web Crypto and compares it with the signature header. The secret and body never leave the page.
Presets cover the common schemes:
- Stripe:
Stripe-Signature: t=…,v1=…, HMAC-SHA256 hex oftimestamp.body, with a timestamp tolerance (300 seconds by default). - GitHub:
X-Hub-Signature-256: sha256=…, HMAC-SHA256 hex of the body (legacysha1=too). - Shopify:
X-Shopify-Hmac-Sha256, base64 HMAC-SHA256 of the body. - Slack:
X-Slack-Signature: v0=…overv0:timestamp:body. - Twilio:
X-Twilio-Signature, base64 HMAC-SHA1 of the full URL followed by the POST parameters sorted by name. JSON requests sign the URL and carry abodySHA256parameter, which is checked too. - Standard Webhooks (Svix, Resend, Clerk and others):
webhook-signature: v1,…overid.timestamp.bodywith awhsec_secret. - Generic HMAC: SHA-1, SHA-256 or SHA-512, hex or base64, an optional prefix and an optional timestamp-plus-separator scheme.
When a signature doesn't match, the tool retries the usual mistakes (a trailing newline, other line endings, minified or pretty-printed JSON, spaces around the secret) and tells you if one of them verifies.
How to use it
- Choose the provider, or paste all the request headers and let it pick.
- Enter the signing secret.
- Paste the raw body exactly as received, before any JSON parsing.
From the Webhook Inspector, select Verify signature on a captured request to load its body and headers here. They are handed over in this tab's session storage, never in the URL, and the timestamp is checked against when the request arrived.
Examples
- Capture a test event in the Webhook Inspector, then select Verify signature and add your secret.
Common questions
Why does my signature check fail in code but pass here?
Most frameworks parse JSON before your handler runs. Re-serializing it changes spacing and key order, so verify against the raw bytes.
Why is a valid signature rejected as too old?
Timestamped schemes refuse old requests to stop replays. Check the server clock, or that you aren't replaying a stored event.
Related tools
- Hash Generator: compute any HMAC by hand.
- JWT Decoder: inspect signed tokens.