Integration · Webhooks
Nothing is dropped because your endpoint had a bad afternoon.
Delivery is attempted five times with growing gaps. After the last one the event waits in the journal, and a missed webhook becomes a pull rather than a loss.
- 5attempts
- 2 hlongest gap
- 30 daysjournal retention
Payload
What a decision looks like on your endpoint
check.decided
POST https://your-endpoint.example/hooks
X-NNW-Signature: t=1792…,v1=4f3a…
{
"event": "check.decided",
"check_id": "chk_3Qv8ks2mPb",
"reference": "signup-55218",
"verdict": "review",
"reasons": [
{ "code": "name_match_soft", "signal": "identity", "score": 0.81 },
{ "code": "pep_tier_3", "signal": "sanctions" }
],
"evidence_bundle_id": "evb_7t2Kd9",
"policy_version": "2026-09-01",
"occurred_at": "2026-10-20T09:14:48Z"
} Signatures are HMAC over the timestamp and body. Reject anything whose timestamp is more than five minutes from your clock, which is the whole replay defence.
Events
What is emitted
| Event | When | Carries |
|---|---|---|
check.decided | A verdict is reached | verdict, reasons, evidence bundle id |
check.expired | Collection was never completed | last state, reason |
monitoring.hit | A list or register change affects an existing player | signal, original check id |
evidence.sealed | A bundle is closed and immutable | bundle id, retention clock start |
policy.published | A new policy version takes effect | market, version, effective from |
Every event carries your own reference, so correlation never depends on storing our identifiers.