GET /screen/entity
Screens a company or person name against the official designation lists in full: OFAC SDN and Consolidated, the EU financial sanctions list (FSF) and the UN Security Council list. Every name each list publishes is compared — primary names and aliases — and every hit carries the list that published it, its programmes and its designation date.
The lists are ingested into a local snapshot, so the lookup is purely local → response in milliseconds, no third-party call, no data about your counterparty leaving the service.
x402 golden rule: the agent pays for the answer to its question. “This name matches nothing on these lists, as of this date” is a successful answer → 200. The 4xx range is reserved for requests the service cannot answer.
Why this and not a free OFAC checker
Free checkers answer a narrower question. This endpoint answers the one an agent actually has to act on:
- All four lists, not just OFAC. An entity designated by the EU but not by OFAC is a hit here and a silence there.
- Aliases are first-class.
Europäisch-Iranische Handelsbankmatches the OFAC primary name and the EU alias — as two separate, separately sourced hits. - The match type is named, from a closed enumeration, never an opaque score. You can see whether the verdict rests on an exact primary name or on a token overlap, and decide accordingly.
- The comparison is reproducible. The normalized form that actually decided
the match is returned in
query.normalized.
Scope and limits
This endpoint answers one question: does this name appear on these designation lists, as of the snapshot date served in the same response?
- No cross-list reconciliation. An entity designated by two authorities returns two hits, each with its own programmes and date. Merging them is a judgement, not data.
- No PEP screening and no adverse media. Neither is a designation list.
- No transaction analysis and no risk score.
- A
no_hitis not a clearance certificate. It is a dated statement about four named lists, and it never replaces your own AML obligations.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Company or person name, 2 to 200 characters once whitespace is collapsed |
kind | string | no | person | entity — filter on the kind the list published |
country | string | no | ISO 3166-1 alpha-2 filter on the country the list published |
birth_year | int | no | 1800–2100, for persons; matched with a one-year tolerance either side |
include_weak | bool | no | Whether weak matches count towards the verdict; default false |
Matching is deterministic: no edit distance, no phonetics. The name is compared against every name each list publishes, on a normalized form (accents folded, case flattened, titles and legal forms dropped).
A filter only ever removes candidates, and only on data the list published in a comparable form. An entity that publishes no country, or publishes it in plain words, stays a candidate — a false negative costs more than one candidate too many.
include_weak changes the verdict, never the hits
Weak matches are always returned in hits[], so you can judge what was set
aside for you. The flag only decides whether they count towards verdict:
with the default false, a name matched only weakly gets weak_hit; with
true, the same name gets hit.
200 response — UnifiedResponse
{
"data": { ... },
"provenance": {
"source": "ofac-sdn+ofac-consolidated+eu-fsf+un-sc",
"fetched_at": "2026-07-30T06:56:09Z",
"freshness": { "kind": "snapshot", "as_of": "2026-07-28T00:00:00Z" }
}
}
freshness.as_of is the determining factor of the verdict: a hit — and just as
much a no_hit — reflects the lists as of this date.
Fields of data
| Field | Type | Description |
|---|---|---|
query | object | { "name": string, "normalized": string } — the form that actually decided the match |
verdict | string | hit | weak_hit | no_hit |
verdict_basis | string[] | Which match types counted towards the verdict, most severe first |
hits | array | Matched designations, capped at 50 per answer |
total_matches | int | Number of matches before the cap |
truncated | bool | Whether the cap applied |
lists_screened | array | { "list": string, "entities": int } — returned on every verdict, including no_hit |
limits | string | Fixed sentence stating scope, no reconciliation, no PEP/adverse media |
The verdict always covers all matches, never just the ones returned. Truncating an answer never softens its verdict:
total_matchessays how many there were,truncatedsays the cap applied.
Verdicts
verdict | Meaning |
|---|---|
hit | At least one full match: exact primary name, exact strong alias, or all query tokens present |
weak_hit | Only weak matches (an alias the source itself flags as weak, or a partial overlap), include_weak: false |
no_hit | Nothing matched, for the lists and snapshot date reported in the same answer |
Fields of a hit
| Field | Type | Description |
|---|---|---|
id | string | Stable identifier, prefixed by its list (OFAC-SDN:25684, EU:EU.13742.32) |
list_source | string | OFAC-SDN | OFAC-CONS | EU-FSF | UN — the authority that published it |
kind | string | person | entity, as the list published it |
matched_name | string | The published name that matched, verbatim |
match_type | string | Closed enumeration, see below |
programs | string[] | Sanctions programmes, as published (IFSR, IRAN, NPWMD, UKR, …) |
listed_on | string | null | Designation date, as published; null when the list publishes none |
birth_dates | array | For persons, as published |
nationalities | array | For persons, as published |
identifications | array | { "type": string, "number": string } — registration numbers, SWIFT/BIC, passports; type is the source’s own label |
remarks | string | null | The list’s own free-text remarks |
match_type, in severity order
| Value | Meaning |
|---|---|
exact | The list’s primary name |
exact_alias | A strong alias |
exact_weak_alias | An alias the source itself publishes as weak (OFAC does) |
all_tokens | Every query token present, order irrelevant |
partial_tokens | At least two shared tokens covering 60 % or more of the query |
Nothing else — there is no hidden score.
Case 1 — designated bank, two lists, two hits (hit)
GET /screen/entity?name=Europ%C3%A4isch-Iranische%20Handelsbank
{
"query": {
"name": "Europäisch-Iranische Handelsbank",
"normalized": "europaisch iranische handelsbank"
},
"verdict": "hit",
"verdict_basis": ["exact", "exact_alias"],
"hits": [
{
"id": "OFAC-SDN:25684",
"list_source": "OFAC-SDN",
"kind": "entity",
"matched_name": "EUROPAISCH-IRANISCHE HANDELSBANK AG",
"match_type": "exact",
"programs": ["IFSR", "IRAN", "NPWMD"],
"listed_on": "2018-11-05",
"birth_dates": [],
"nationalities": [],
"identifications": [
{ "type": "Registration Number", "number": "HRB 14604" },
{ "type": "SWIFT/BIC", "number": "EIHBDEHH" },
{ "type": "SWIFT/BIC", "number": "EIHBIRTH" },
{ "type": "Website", "number": "www.eihbank.de" }
],
"remarks": "All Offices Worldwide; (Linked To: BANK OF INDUSTRY AND MINE)"
},
{
"id": "EU:EU.13742.32",
"list_source": "EU-FSF",
"kind": "entity",
"matched_name": "Europäisch-Iranische Handelsbank",
"match_type": "exact_alias",
"programs": ["IRN"],
"listed_on": "2025-09-29",
"birth_dates": [],
"nationalities": [],
"identifications": [],
"remarks": null
}
],
"total_matches": 2,
"truncated": false,
"lists_screened": [
{ "list": "EU-FSF", "entities": 6017 },
{ "list": "OFAC-CONS", "entities": 481 },
{ "list": "OFAC-SDN", "entities": 19157 },
{ "list": "UN", "entities": 1011 }
],
"limits": "Screening covers the designation lists and snapshot date reported above. No cross-list reconciliation is performed: an entity designated by several authorities is returned once per list. Politically exposed persons (PEP) and adverse media are not covered."
}
The same institution, designated by two authorities on two different dates under two different programme codes: two hits, not one merged verdict.
Case 2 — nothing on any list (no_hit)
GET /screen/entity?name=Compagnie%20de%20Saint-Gobain
{
"query": {
"name": "Compagnie de Saint-Gobain",
"normalized": "compagnie de saint gobain"
},
"verdict": "no_hit",
"verdict_basis": [],
"hits": [],
"total_matches": 0,
"truncated": false,
"lists_screened": [
{ "list": "EU-FSF", "entities": 6017 },
{ "list": "OFAC-CONS", "entities": 481 },
{ "list": "OFAC-SDN", "entities": 19157 },
{ "list": "UN", "entities": 1011 }
],
"limits": "Screening covers the designation lists and snapshot date reported above. …"
}
lists_screened is returned here too: a paid answer must state what it was
rendered against.
Case 3 — weak overlap only (weak_hit)
GET /screen/entity?name=Melli%20Bank%20Investment%20Holding
{
"query": {
"name": "Melli Bank Investment Holding",
"normalized": "melli bank investment holding"
},
"verdict": "weak_hit",
"verdict_basis": ["partial_tokens"],
"hits": [
{
"id": "EU:EU.13724.92",
"list_source": "EU-FSF",
"kind": "entity",
"matched_name": "Bank Melli Iran Investment Company",
"match_type": "partial_tokens",
"programs": ["IRN"],
"listed_on": "2025-09-29",
"identifications": [
{ "type": "Registration Number", "number": "89584" }
],
"remarks": null
},
{
"id": "OFAC-SDN:25421",
"list_source": "OFAC-SDN",
"kind": "entity",
"matched_name": "BANK MELLI IRAN INVESTMENT COMPANY",
"match_type": "partial_tokens",
"programs": ["IFSR", "SDGT"],
"listed_on": "2018-11-05",
"remarks": "(Linked To: BANK MELLI IRAN)"
}
],
"total_matches": 2,
"truncated": false
}
The same call with include_weak=true returns the same two hits and the
verdict hit.
Case 4 — many matches, capped (truncated)
GET /screen/entity?name=Gazprom returns total_matches: 68, truncated: true
and 50 hits — one exact_alias on GAZPROM PAO (OFAC Consolidated,
RUSSIA-EO14024, UKRAINE-EO13662, listed 2014-09-12) plus all_tokens
matches on the EU-designated subsidiaries. The verdict is hit on the strength
of all 68, not of the 50 shown.
Case 5 — narrowing a common person name
GET /screen/entity?name=Kim%20Jong%20Un returns 10 all_tokens matches across
EU-FSF, OFAC-SDN and UN. Adding &birth_year=1984 brings it down to 3 — among
them Jong Un KIM (OFAC-SDN, DPRK3, listed 2016-07-06, birth date
08 Jan 1984). Persons whose birth date the list does not publish are never
removed by the filter.
Errors
| Status | code | Case |
|---|---|---|
| 400 | MISSING_PARAMETER | name missing or empty |
| 400 | INVALID_INPUT | name outside 2–200 chars, or a filter with an invalid value |
| 500 | INTERNAL | Internal error (detail logged, not exposed) |
{ "error": "parameter 'kind' must be one of: person, entity", "code": "INVALID_INPUT" }
See also
POST /screen/entity/batch— screen up to 200 names with a single x402 settlement.GET /screen/address— screen a crypto address against the same lists.GET /iban/screen— screen an IBAN’s bank and jurisdiction (a distinct question from the holder’s name).- For agents — discovery surfaces, the live
/catalogand how settlement works.