Skip to content

Verify webhook signatures

Every outbound webhook Harmon POSTs to your endpoint carries three headers:

X-Harmon-Event:     order.confirmed
X-Harmon-Delivery:  <uuid>
X-Harmon-Signature: sha256=<hex hmac>

The signature is an HMAC-SHA256 of the exact request-body bytes, keyed by the signing_secret Harmon returned when you created the subscription (revealed once). Verify it over the raw bytes you received - don't re-serialize the JSON first, or the bytes (and the HMAC) won't match.

Verify before you parse

Compute the expected signature and reject the delivery on a mismatch before you json.loads the body. A request that fails verification is not from Harmon.

Try it

Paste a signing secret and a body to see the signature Harmon would send, then verify a signature against them. Everything runs locally - your secret never leaves the browser.

Tamper with a single character of the body (or the secret) after computing, then re-verify: the result flips to Invalid. That's exactly the check your receiver must perform.

Verify in your stack

# Recompute the signature over the EXACT received bytes and compare.
BODY="$(cat webhook-body.json)"
EXPECTED="sha256=$(printf '%s' "$BODY" \
  | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -hex | sed 's/^.* //')"
# Reject unless "$EXPECTED" equals the X-Harmon-Signature header you received.
echo "$EXPECTED"

Next steps

Built on the Harmon platform — the storefront API for merchants.