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 Handelsbank matches 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_hit is not a clearance certificate. It is a dated statement about four named lists, and it never replaces your own AML obligations.

Parameters

ParameterTypeRequiredDescription
namestringyesCompany or person name, 2 to 200 characters once whitespace is collapsed
kindstringnoperson | entity — filter on the kind the list published
countrystringnoISO 3166-1 alpha-2 filter on the country the list published
birth_yearintno1800–2100, for persons; matched with a one-year tolerance either side
include_weakboolnoWhether 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

FieldTypeDescription
queryobject{ "name": string, "normalized": string } — the form that actually decided the match
verdictstringhit | weak_hit | no_hit
verdict_basisstring[]Which match types counted towards the verdict, most severe first
hitsarrayMatched designations, capped at 50 per answer
total_matchesintNumber of matches before the cap
truncatedboolWhether the cap applied
lists_screenedarray{ "list": string, "entities": int } — returned on every verdict, including no_hit
limitsstringFixed 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_matches says how many there were, truncated says the cap applied.

Verdicts

verdictMeaning
hitAt least one full match: exact primary name, exact strong alias, or all query tokens present
weak_hitOnly weak matches (an alias the source itself flags as weak, or a partial overlap), include_weak: false
no_hitNothing matched, for the lists and snapshot date reported in the same answer

Fields of a hit

FieldTypeDescription
idstringStable identifier, prefixed by its list (OFAC-SDN:25684, EU:EU.13742.32)
list_sourcestringOFAC-SDN | OFAC-CONS | EU-FSF | UN — the authority that published it
kindstringperson | entity, as the list published it
matched_namestringThe published name that matched, verbatim
match_typestringClosed enumeration, see below
programsstring[]Sanctions programmes, as published (IFSR, IRAN, NPWMD, UKR, …)
listed_onstring | nullDesignation date, as published; null when the list publishes none
birth_datesarrayFor persons, as published
nationalitiesarrayFor persons, as published
identificationsarray{ "type": string, "number": string } — registration numbers, SWIFT/BIC, passports; type is the source’s own label
remarksstring | nullThe list’s own free-text remarks

match_type, in severity order

ValueMeaning
exactThe list’s primary name
exact_aliasA strong alias
exact_weak_aliasAn alias the source itself publishes as weak (OFAC does)
all_tokensEvery query token present, order irrelevant
partial_tokensAt 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

StatuscodeCase
400MISSING_PARAMETERname missing or empty
400INVALID_INPUTname outside 2–200 chars, or a filter with an invalid value
500INTERNALInternal error (detail logged, not exposed)
{ "error": "parameter 'kind' must be one of: person, entity", "code": "INVALID_INPUT" }

See also