clear / review / hit verdict and tune fuzzy-match sensitivity with threshold_review and threshold_hit.data + meta envelope described in the Quickstart. Replace YOUR_API_KEY with your key.{
"data": {
"lists": [
{"key": "ofac_sdn", "loaded": true, "age_hours": 1.0, "stale": false, "max_age_hours": 24},
{"key": "eu_consolidated", "loaded": true, "age_hours": 2.66, "stale": false, "max_age_hours": 12},
{"key": "un_sc", "loaded": true, "age_hours": 4.75, "stale": false, "max_age_hours": 72}
]
}
}loaded, its age and the max_age_hours freshness budget it is held to. The screening endpoints are fail-closed: if the required sanctions corpus is unavailable they return 503 rather than a hollow clear, and a well-formed as_of date whose point-in-time snapshot is missing is also a 503, never a silent fallback to today's lists.{
"data": {
"entity": {
"name": "DEUTSCHE BANK AKTIENGESELLSCHAFT",
"country": "DE", "type": "company", "status": "ACTIVE",
"field_provenance": {"name": "gleif", "country": "gleif", "status": "gleif", "type": "gleif"}
},
"screening": {"status": "review"}
},
"meta": {
"screening_id": "7fbd1ad9-778e-4321-b706-226447698696",
"disclaimer": "Screening signal, not a compliance determination. ..."
}
}ACTIVE, and field_provenance names the upstream (GLEIF) for every field. Store meta.screening_id with the case file - it is the stable audit identifier for this check.POST /api/v1/entity/screen runs the same check standalone, for names that have no LEI yet. Optional country, dob and nationality sharpen matching, and POST /api/v1/entity/screen/batch takes a list.{
"data": {
"screening": {
"status": "review",
"matches": [
{"list": "ofac_sdn", "restriction_type": "block", "score": 0.855,
"matched_name": "NDA Nord-Deutsche Industrieanlagenbau GmbH", "match_type": "name_fuzzy",
"rationale": ["composite 0.855 (shared: ['deutsche'])"], "list_published": "2026-07-17"}
]
}
},
"meta": {"stale_screening": false, "coverage_degraded": false, "lists_missing": []}
}threshold_review (0.70) but below threshold_hit (0.90), so the verdict is review and the rationale shows why - a single shared token, "deutsche". Route review verdicts to a human, and note that meta confirms no list was missing or stale when this verdict was produced.review. If such candidates are drowning your review queue, raise threshold_review.{"data": {"screening": {"status": "clear", "matches": []}}}review on one 0.75 candidate (shared token "analytics"); at 0.8 it is clear - no candidate reached the threshold on any loaded list. A clear is only trustworthy because the coverage guard from step 1 is fail-closed. Treat threshold changes as policy decisions and record them alongside each verdict.{
"data": {
"screening": {
"status": "hit",
"matches": [
{"list": "ofac_sdn", "restriction_type": "block", "matched_name": "Lazarus Group",
"score": 1.0, "match_type": "wallet",
"rationale": ["exact wallet match", "symbol=ETH"], "list_published": "2026-07-17"}
],
"fifty_percent_rule": {"triggered": false, "ambiguous": false}
}
}
}hit with restriction_type block: stop the transaction and escalate. The fifty_percent_rule block additionally flags exposure through sanctioned ownership, not just direct listings.| Outcome | Meaning | Pipeline action |
|---|---|---|
clear | no candidate at or above threshold_review on any loaded list | proceed; keep the response for the audit trail |
review | best candidate between threshold_review and threshold_hit | human review of matches[].rationale |
hit | candidate at or above threshold_hit, or an exact wallet or identifier match | block and escalate |
HTTP 503 | required sanctions corpus unavailable, or the requested as_of snapshot is missing | retry later; never treat as clear |
as_of point-in-time replays and the GLEIF corporate registry surface.429 and 503 correctly.