Skip to main content
Every delivery is signed. The X-Qint-Signature header carries:
To verify: compute HMAC-SHA256 over the raw request body using your endpoint’s signing secret, hex-encode it, prefix sha256=, and compare against the header with a constant-time comparison. Reject the request if they differ.
Two classic mistakes break verification:
  1. Re-serialized JSON. Frameworks love to parse the body before you see it. JSON.stringify(req.body) is not the raw body — key order and whitespace change the bytes. Always verify against the exact bytes received.
  2. == comparison. String equality short-circuits on the first mismatching byte, leaking timing information. Use your platform’s constant-time comparison.

Working examples

Each of these verifies the signature, dedupes on X-Qint-Event-Id, and acknowledges before doing real work.

Verify your verifier

Use the dashboard’s Send test event button (overview) — it delivers a signed ping event through the production pipeline. If your handler accepts it (2xx in the delivery log) and rejects a request with a tampered body (401), you’re done.
The webhook signing secret (whsec_…) and your API key (qk_live_…) are different credentials with different jobs. Never use one where the other belongs.