Screening
OFAC SDN sanctions screening with fuzzy name matching and DOB corroboration, plus exact-match crypto wallet screening — refreshed from live treasury.gov data. The same engine runs automatically inside every verification, and is also available as standalone endpoints (and a free, keyless tier).
Screen a name (OFAC)
To screen a person or entity against the OFAC SDN list, POST /v1/screen/ofac with a
name and optional dob. Names are normalized (lowercase, punctuation
stripped) and fuzzy-matched against all primary names and aliases using trigram candidates plus
token-sort scoring. Supplying a date of birth materially reduces false positives — see
DOB corroboration.
Request body
| Field | Type | Description |
|---|---|---|
| namerequired | string | Full name to screen, 2–255 characters. |
| doboptional | date | null | ISO YYYY-MM-DD. Used to corroborate or downgrade fuzzy name matches. |
curl -X POST https://idcheck.now/v1/screen/ofac -H "X-Api-Key: $IDCHECK_API_KEY" -H "Content-Type: application/json" -d '{"name": "Joaquin Guzman Loera", "dob": "1957-04-04"}'const res = await fetch("https://idcheck.now/v1/screen/ofac", {
method: "POST",
headers: { "X-Api-Key": process.env.IDCHECK_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ name: "Joaquin Guzman Loera", dob: "1957-04-04" }),
});
const { confidence, impact, entity, dob_corroborated } = await res.json();import os, requests
res = requests.post(
"https://idcheck.now/v1/screen/ofac",
headers={"X-Api-Key": os.environ["IDCHECK_API_KEY"]},
json={"name": "Joaquin Guzman Loera", "dob": "1957-04-04"},
)
result = res.json(){
"matched": true,
"confidence": "strong",
"score": 1.0,
"query": "joaquin guzman loera",
"entity": {"ent_num": 3011, "name": "GUZMAN LOERA, Joaquin", "type": "Individual", "program": "SDNTK"},
"matched_name": "GUZMAN LOERA, Joaquin",
"name_type": "primary",
"dob_corroborated": true,
"reason": "match",
"impact": "decline"
}Response body
| Field | Type | Description |
|---|---|---|
| matchedrequired | boolean | True when confidence is strong or possible. |
| confidencerequired | string | strong | possible | none. See confidence semantics below. |
| scorerequired | number | Best fuzzy name score, 0–1 (4 decimal places). Wallet matches are exactly 1.0. |
| queryrequired | string | The normalized query that was screened (lowercased, punctuation stripped). |
| entityoptional | object | null | Matched SDN entity: ent_num, name, type, program. |
| matched_nameoptional | string | null | The specific SDN name or alias that matched. |
| name_typeoptional | string | null | primary or alias — which name record matched. |
| dob_corroboratedoptional | boolean | null | DOB corroboration outcome; null when no DOB was supplied or the SDN has no full-DOB data. |
| reasonrequired | string | Machine explanation: match, below_threshold, no_trgm_candidates, query_too_short, no_wallet_match, wallet_match:<CURRENCY>. |
| impactrequired | string | null | Decision impact: decline (strong), review (possible), null (none). Keyed endpoints only. |
Confidence semantics
| Confidence | Score rule | Decision impact |
|---|---|---|
strong | score ≥ 0.95 for individuals; ≥ 0.98 for non-individual entities (companies, vessels) | decline |
possible | 0.85 ≤ score < strong threshold | review |
none | score < 0.85 | no impact (impact: null) |
Non-individual entities need a near-exact match to be strong — a person whose name
resembles a sanctioned company is not a hard decline. Inside a verification, these impacts
act as overrides on the final decision (see the decision
object).
DOB corroboration
When you pass dob and the best-matching SDN entity has published date-of-birth data,
the confidence is adjusted:
- Full DOB match against any published SDN DOB → upgrades
possibletostrong;dob_corroborated: true. - Full DOB mismatch (the SDN has full DOBs and none equals yours) → downgrades
strongtopossible;dob_corroborated: false. - Partial data only (year-only entries like
1957-00-00, or no DOBs published) → no opinion; confidence unchanged;dob_corroborated: null.
Corroboration only ever makes the result more accurate: it confirms true positives and clears false ones. If you already ran a verification, the document DOB is screened automatically at submit time.
Screen a crypto wallet
To screen a crypto address against SDN digital-currency addresses, POST
/v1/screen/wallet. Matching is exact (case-insensitive), so any hit is
strong with score 1.0 and impact decline. The response
reason names the currency, e.g. wallet_match:XMR.
Request body
| Field | Type | Description |
|---|---|---|
| addressrequired | string | Wallet address, 8–255 characters. |
curl -X POST https://idcheck.now/v1/screen/wallet -H "X-Api-Key: $IDCHECK_API_KEY" -H "Content-Type: application/json" -d '{"address": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C"}'const res = await fetch("https://idcheck.now/v1/screen/wallet", {
method: "POST",
headers: { "X-Api-Key": process.env.IDCHECK_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ address: "149w62rY42aZBox8fGcmqNsXUzSStKeq8C" }),
});
const { matched, impact, reason } = await res.json();import os, requests
res = requests.post(
"https://idcheck.now/v1/screen/wallet",
headers={"X-Api-Key": os.environ["IDCHECK_API_KEY"]},
json={"address": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C"},
){
"matched": false,
"confidence": "none",
"score": 0.0,
"query": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C",
"reason": "no_wallet_match",
"impact": null
}Data stats
To check the freshness and size of the sanctions data, GET /v1/screen/ofac/stats.
It returns row counts for every OFAC table and the most recent refresh record
(null if no refresh has run yet).
curl https://idcheck.now/v1/screen/ofac/stats -H "X-Api-Key: $IDCHECK_API_KEY"{
"tables": {
"ofac_sdn_entities": 19482,
"ofac_sdn_names": 52107,
"ofac_sdn_wallets": 612,
"ofac_sdn_dobs": 14890
},
"last_refresh": {
"refreshed_at": "2026-07-26T06:00:14.552011",
"entities": 19482,
"names": 52107,
"wallets": 612,
"dobs": 14890,
"duration_seconds": 42.17,
"source": "treasury.gov"
}
}Free tier
The free tier powers the public tool at
idcheck.now/tools/ofac-lookup and needs
no API key. It is a deliberately reduced contract: confidence, score, match detail
and data freshness — no impact field and no normalized-query internals. Rate limit:
30 lookups per hour per client IP.
To run a free OFAC lookup, POST /v1/free/ofac with a name (2–200
chars) and optional dob. Every response carries
X-RateLimit-Limit: 30 and X-RateLimit-Remaining headers. When the
allowance is exhausted the API returns 429 with a Retry-After header
(seconds until the window reopens).
curl -i -X POST https://idcheck.now/v1/free/ofac -H "Content-Type: application/json" -d '{"name": "Joaquin Guzman Loera", "dob": "1957-04-04"}'
# HTTP/1.1 200 OK
# X-RateLimit-Limit: 30
# X-RateLimit-Remaining: 29const res = await fetch("https://idcheck.now/v1/free/ofac", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Joaquin Guzman Loera", dob: "1957-04-04" }),
});
console.log(res.headers.get("X-RateLimit-Remaining"));
const { confidence, score, entity, dob_corroborated } = await res.json();import requests
res = requests.post(
"https://idcheck.now/v1/free/ofac",
json={"name": "Joaquin Guzman Loera", "dob": "1957-04-04"},
)
print(res.headers["X-RateLimit-Remaining"])
result = res.json()200 OK — response body
| Field | Type | Description |
|---|---|---|
| confidencerequired | string | strong | possible | none. |
| scorerequired | number | Best fuzzy name score, 0–1. |
| entityrequired | object | null | Matched entity summary (name, type, program) or null. |
| matched_namerequired | string | null | The SDN name or alias that matched. |
| name_typerequired | string | null | primary or alias. |
| dob_corroboratedrequired | boolean | null | DOB corroboration outcome. |
| data_freshnessrequired | ISO 8601 | null | Timestamp of the last SDN data refresh. |
{
"confidence": "strong",
"score": 1.0,
"entity": {"name": "GUZMAN LOERA, Joaquin", "type": "Individual", "program": "SDNTK"},
"matched_name": "GUZMAN LOERA, Joaquin",
"name_type": "primary",
"dob_corroborated": true,
"data_freshness": "2026-07-26T06:00:14.552011"
}Public, unauthenticated stats: table counts and the last refresh timestamp (ISO string or null).
{
"tables": {
"ofac_sdn_entities": 19482,
"ofac_sdn_names": 52107,
"ofac_sdn_wallets": 612,
"ofac_sdn_dobs": 14890
},
"last_refresh": "2026-07-26T06:00:14.552011"
}