idcheck.now API Docs

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)

POST/v1/screen/ofacscope screen: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

FieldTypeDescription
namerequiredstringFull name to screen, 2–255 characters.
doboptionaldate | nullISO YYYY-MM-DD. Used to corroborate or downgrade fuzzy name matches.
curl
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"}'
JavaScript
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();
Python
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()
JSON200 OK
{
  "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

FieldTypeDescription
matchedrequiredbooleanTrue when confidence is strong or possible.
confidencerequiredstringstrong | possible | none. See confidence semantics below.
scorerequirednumberBest fuzzy name score, 0–1 (4 decimal places). Wallet matches are exactly 1.0.
queryrequiredstringThe normalized query that was screened (lowercased, punctuation stripped).
entityoptionalobject | nullMatched SDN entity: ent_num, name, type, program.
matched_nameoptionalstring | nullThe specific SDN name or alias that matched.
name_typeoptionalstring | nullprimary or alias — which name record matched.
dob_corroboratedoptionalboolean | nullDOB corroboration outcome; null when no DOB was supplied or the SDN has no full-DOB data.
reasonrequiredstringMachine explanation: match, below_threshold, no_trgm_candidates, query_too_short, no_wallet_match, wallet_match:<CURRENCY>.
impactrequiredstring | nullDecision impact: decline (strong), review (possible), null (none). Keyed endpoints only.

Confidence semantics

ConfidenceScore ruleDecision impact
strongscore ≥ 0.95 for individuals; ≥ 0.98 for non-individual entities (companies, vessels)decline
possible0.85 ≤ score < strong thresholdreview
nonescore < 0.85no 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 possible to strong; dob_corroborated: true.
  • Full DOB mismatch (the SDN has full DOBs and none equals yours) → downgrades strong to possible; dob_corroborated: false.
  • Partial data only (year-only entries like 1957-00-00, or no DOBs published) → no opinion; confidence unchanged; dob_corroborated: null.
Always send DOB when you have it

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

POST/v1/screen/walletscope screen:ofac

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

FieldTypeDescription
addressrequiredstringWallet address, 8–255 characters.
curl
curl -X POST https://idcheck.now/v1/screen/wallet -H "X-Api-Key: $IDCHECK_API_KEY" -H "Content-Type: application/json" -d '{"address": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C"}'
JavaScript
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();
Python
import os, requests

res = requests.post(
    "https://idcheck.now/v1/screen/wallet",
    headers={"X-Api-Key": os.environ["IDCHECK_API_KEY"]},
    json={"address": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C"},
)
JSON200 OK (no match)
{
  "matched": false,
  "confidence": "none",
  "score": 0.0,
  "query": "149w62rY42aZBox8fGcmqNsXUzSStKeq8C",
  "reason": "no_wallet_match",
  "impact": null
}

Data stats

GET/v1/screen/ofac/statsscope screen:ofac

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
curl https://idcheck.now/v1/screen/ofac/stats -H "X-Api-Key: $IDCHECK_API_KEY"
JSON200 OK
{
  "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.

POST/v1/free/ofacno auth

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
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: 29
JavaScript
const 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();
Python
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

FieldTypeDescription
confidencerequiredstringstrong | possible | none.
scorerequirednumberBest fuzzy name score, 0–1.
entityrequiredobject | nullMatched entity summary (name, type, program) or null.
matched_namerequiredstring | nullThe SDN name or alias that matched.
name_typerequiredstring | nullprimary or alias.
dob_corroboratedrequiredboolean | nullDOB corroboration outcome.
data_freshnessrequiredISO 8601 | nullTimestamp of the last SDN data refresh.
JSON200 OK
{
  "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"
}
GET/v1/free/ofac/statsno auth

Public, unauthenticated stats: table counts and the last refresh timestamp (ISO string or null).

JSONGET /v1/free/ofac/stats — 200 OK
{
  "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"
}