Webhook Signature Verifier

Check that a webhook really came from the sender: paste the shared secret, the raw request body and the signature header to verify an HMAC-SHA256 signature, or generate one for a test request.

For Edesy missed call webhooks, see verify the signature with Node.js, Python and PHP code.

Runs in your browser with Web Crypto. Nothing is sent anywhere.

Paste the body exactly as received, before any JSON parsing. Prefilled with a sample Edesy call.missed event.

For example the X-Edesy-Signature or X-Hub-Signature-256 value. Bare hex also works.

Receiving missed calls as signed webhooks?Get a Missed Call Number

How to verify a webhook signature

Step 1

Paste the secret

Enter the webhook secret you set with the sender.

Step 2

Paste the raw body

Copy the request body exactly as received, before any JSON parsing.

Step 3

Paste the signature header

Add the received value, like sha256=<hex> from X-Edesy-Signature or X-Hub-Signature-256.

Step 4

Read the result

See valid or invalid, and copy the computed signature for a test request.

Why signatures fail: raw bodies and constant-time checks

Sign the raw bytes, not parsed JSON. The sender signs the exact bytes it sent. If your framework parses the JSON and you re-serialise it, spacing, key order, unicode escapes or a trailing newline can change, and the HMAC no longer matches. Read the raw body (for example express.raw() in Express or request.get_data() in Flask) and verify before parsing.

Compare in constant time. A normal string comparison stops at the first different character, so its timing can leak how much of a guessed signature was right. Use crypto.timingSafeEqual (Node.js), hmac.compare_digest (Python) or hash_equals (PHP). This tool compares the decoded bytes the same way.

Match the format. Some senders prefix the hex digest with sha256=, others send bare hex or base64. This tool accepts sha256=<hex> and bare hex.

Reject and log. Answer 401 when the check fails, and keep secrets out of logs. Rotate the secret on both sides at the same time.

Webhook signature FAQ

What is an HMAC-SHA256 webhook signature?

The sender computes HMAC-SHA256 of the request body with a secret only you and it know, and sends the result in a header. You compute the same value on your side; if they match, the request came from the sender and the body was not changed.

Why does my signature check fail when the secret is right?

Almost always because the body was changed before verifying: parsed and re-serialised JSON, a trailing newline, a different character encoding or a proxy that rewrites the body. Verify against the raw bytes you received.

Is it safe to paste my secret here?

The tool runs entirely in your browser with the Web Crypto API and makes no network requests with your data. Even so, prefer a test or staging secret, and rotate any secret you have shared.

Which header does Edesy use?

Edesy missed call webhooks send X-Edesy-Signature: sha256=<hex>, the HMAC-SHA256 of the raw body keyed with your webhook secret. Without a secret the header is not sent. Retries and replays carry the same call_sid, so you can drop duplicates.

Does this work for GitHub and other providers?

Yes, for any provider that signs the raw body with HMAC-SHA256 and sends hex, like GitHub's X-Hub-Signature-256. Providers that sign a timestamp plus the body (for example Stripe's t=...,v1=... scheme) need the signed string built first: paste that string as the body and the v1 value as the signature.

What is constant-time comparison?

A comparison that takes the same time whether the first or the last character differs, so an attacker cannot guess a valid signature one character at a time from response timing.

Features

  • HMAC-SHA256 with Web Crypto in your browser

  • Accepts sha256=<hex> or bare hex

  • Shows the computed signature to copy

  • Constant-time comparison

  • Prefilled with a sample call.missed event

  • Nothing is sent to a server

Who it's for

Developers integrating webhooks

Debug a failing signature check by comparing the expected and received values.

QA and support teams

Create a correctly signed test request for a staging endpoint.

Missed call and CRM integrations

Check X-Edesy-Signature on call.missed events before trusting a lead.

Build on missed calls

Get a number, add your webhook URL and secret, and send a test event before you go live.

Get a Missed Call Number