Sanctions Screening Check: OFAC, EU and UK Lists avatar

Sanctions Screening Check: OFAC, EU and UK Lists

Pricing

from $8.00 / 1,000 entity screeneds

Go to Apify Store
Sanctions Screening Check: OFAC, EU and UK Lists

Sanctions Screening Check: OFAC, EU and UK Lists

Screen people and company names against three official sanctions lists: US Treasury OFAC (SDN), the EU consolidated list and the UK Sanctions List. Screen a supplier list, or check a person with a date of birth. Aliases and scored reasons, to Google Sheets. A screening aid, not a compliance verdict.

Pricing

from $8.00 / 1,000 entity screeneds

Rating

0.0

(0)

Developer

Adriana Voss

Adriana Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Screen a list of people or company names against three official sanctions lists at once, and get back the reason behind every score. Each run downloads the US Treasury OFAC lists (SDN plus the consolidated non-SDN list), the EU consolidated financial sanctions list, and the UK Sanctions List straight from the issuing authority, compares every name you give it against each list's primary names and its aliases, and returns one row per name with the candidate matches, their scores, and a plain-English breakdown of how each score was reached.

This is a screening aid that surfaces candidate matches for human review, not a compliance determination. It tells you which published list entries resemble the names you hold. Deciding whether a candidate match is in fact the same person or company, and what to do about it, is work for a human with the underlying evidence in front of them.

How to use

  1. In the Apify Console. Open the actor page and click Start — the entities field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~sanctions-screening-check/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"entities":["Rosneft Oil Company","Gazprombank","Acme Office Supplies Ltd"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"entities": [
"Rosneft Oil Company",
"Gazprombank",
"Acme Office Supplies Ltd"
]
}

One name per line — a person or an organisation, exactly as you hold it (registered company name, full legal name). Up to 1,000 per run. Every name is compared against the primary names AND the aliases on each list you select. Accepted formats: Rosneft Oil Company, Aiman Muhammed Rabi Al-Zawahiri, Gazprombank Joint Stock Company.

Everything else is optional:

FieldDefaultWhat it does
entityTypeanyindividual, organisation, or any. Narrows which list entries can match, and picks the normalisation: legal forms (Ltd, LLC, OOO, GmbH) come off organisation names, honorifics (Dr, Shaykh, General) off people's names.
listsallall, ofac, eu or uk. The price per name is the same either way.
minScore85Candidates below this are not reported.
maxMatchesPerEntity5How many candidates to show per name. The full count is always reported in matchCount.
country—A 2-letter ISO code for the entity you are screening. Agreement raises the score slightly; a contradiction lowers it by 10 and says so.
dateOfBirth—YYYY or YYYY-MM-DD, people only. Agreement raises the score slightly; a contradiction lowers it by 15 and says so.

There is no API key anywhere in this actor, optional or otherwise. All three exports are free and unauthenticated, and no proxy is used.

Output

One row per name screened, for example:

queryfoundstatusinputscreeningStatusmatchCountbestScorematchesnotesdisclaimerscreenedAtlistsCheckedentityCountscreenedCountpossibleMatchCountresultsscrapedAt
Rosneft Oil CompanytrueOK<all results (full list)>1970-01-01T00:00:00.000Z

screeningStatus is one of:

  • CLEAR — no candidate scored at or above minScore on any list that was checked.
  • POSSIBLE_MATCH — one or more candidates are worth a human look. matches holds them, each with list, listEntryId, matchedName, matchedOn (primary name or alias), entryType, programs, nationalities, datesOfBirth, listedOn, score, scoreReasons and sourceUrl.
  • PARTIAL — at least one requested list could not be downloaded, so this name was not fully screened. A PARTIAL row is never charged.

listsChecked carries each list's own publication date, as stamped on the file by the authority that published it, so a row is always auditable back to a specific edition of a specific list.

Pricing

  • Entity screened: $16 per 1,000 entitys

Plus a $0.01 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

You are charged once per name fully screened, whichever lists you select and however many candidates come back. A CLEAR result is a delivered answer and is charged; a PARTIAL row is not.

Example runs

Paste any of these into the Input tab and press Start. All three return rows with no key, no token and no proxy.

1. Screen a supplier list against all three lists. The everyday run: paste your supplier or counterparty names, get one row each.

{
"entities": ["Rosneft Oil Company", "Gazprombank", "Acme Office Supplies Ltd"],
"entityType": "organisation",
"lists": "all"
}

2. OFAC SDN check only, for US-facing compliance. Same screening, scoped to the US Treasury lists, with more candidates shown per name.

{
"entities": ["Rosneft Oil Company", "Gazprombank", "Sovcomflot"],
"entityType": "organisation",
"lists": "ofac",
"maxMatchesPerEntity": 10
}

3. Screen a person, with a date of birth to separate namesakes. The date is compared against each list entry's own published date, and the comparison is spelled out in scoreReasons.

{
"entities": ["Aiman Muhammed Rabi Al-Zawahiri"],
"entityType": "individual",
"dateOfBirth": "1951-06-19"
}

Where the data comes from

Every file is the issuing authority's own machine-readable export. Nothing here comes from an aggregator, a mirror, or a third-party API.

ListFileFormatSizeEntries / names
OFAC (US Treasury)SDN.CSV, ALT.CSV, CONS_PRIM.CSV, CONS_ALT.CSV from sanctionslistservice.ofac.treas.govheaderless CSV5.7 / 1.1 / 0.26 / 0.07 MB19,452 SDN + 481 non-SDN rows, 21,330 alias rows
EU (European Commission, DG FISMA)the consolidated financial sanctions list CSV linked from data.europa.eusemicolon CSV, 118 columns25 MB43,891 rows, about 11,000 entities
UK (FCDO)UK-Sanctions-List.csv, the CSV attachment of the gov.uk publication The UK Sanctions ListCSV with a leading report-date line50 MB58,499 name rows across 6,370 designations

Measured 2026-10-01. Each list is downloaded once per run and cached for 24 hours in a named key-value store keyed by list and date, so a second run the same day starts from the cache instead of re-downloading 82 MB.

Dates of birth and nationalities are structured columns on the EU and UK lists. OFAC's CSV export has no such columns — it publishes them as free text inside Remarks ("DOB 19 Jun 1951; POB Giza, Egypt") — so they are parsed out of there rather than from the much larger SDN XML.

How matching works

Deterministic and explained. No machine learning, no external API, no randomness: the same name against the same edition of a list always produces the same score.

Both names are first normalised — case folded, accents removed (NFKD), punctuation dropped, legal forms stripped from organisations and honorifics from people. Three independent comparisons then run, and the score is the highest of them:

  1. Exact normalised — 100 when the two normalised strings are identical.
  2. Word overlap, in any order — a Dice overlap of the two token sets. Deliberately not "intersection over the smaller set", which would score a one-word query 100 against every long entry containing that word.
  3. Transliteration-tolerant — the same shape, over tokens folded through a fixed transliteration map (KH/H, PH/F, W/V, Y/I, doubled letters, vowel-skeleton equality), so Ayman Mohammad al-Zawahari reaches Aiman Muhammed Rabi Al-Zawahiri.

Then the context fields adjust the number, and every adjustment is written into scoreReasons:

  • a date of birth that matches adds 3 (1 if only the year matches); one that contradicts the entry subtracts 15.
  • a country that matches adds 3; one that contradicts the entry subtracts 10.
  • an entry that publishes no date of birth or nationality is never penalised for it, and the row says the field could not be checked either way.

A candidate whose name alone scored 95 or more is always reported, even when a conflict pushed its final score below your minScore. Contradicting evidence lowers a score and is shown; it never silently deletes a near-identical name.

False-positive guard. A candidate whose entire overlap with your input is made of generic business words — general, trading, international, group, holdings, company — is suppressed rather than shown at a low score, and the count of suppressions is reported in notes. Screening "General Trading Company Ltd" returns CLEAR with an explanation, not the several hundred sanctioned entities that also call themselves a general trading company.

What this actor is not

  • Not a compliance determination. It surfaces candidates. A human decides.
  • Not a PEP list. Politically exposed persons are a separate, mostly commercial dataset. This actor screens sanctions lists only.
  • Not every sanctions list. OFAC, EU and UK only. UN, Canadian, Australian, Swiss and Japanese lists are not covered, though the UN designations that the EU and UK have implemented do appear through those lists.
  • Not real time. Each list changes on its own publication schedule, and a run reads whatever edition was published when it downloaded. listsChecked[].publicationDate always says which one.

Limits and known gaps

  • Blocking. The three lists hold roughly 120,000 names; scoring every one of them against every input with an edit-distance comparison would take minutes of CPU per run. A candidate is only scored when it shares at least one folded word with your input (the same transliteration map the scorer uses, so Mohammad and Muhammed block together). A listed name that shares no word at all with your input is therefore never scored, and so can never be reported.
  • Non-Latin scripts. All three lists carry non-Latin spellings; names are compared after folding to ASCII, so a query written in Arabic or Cyrillic is normalised to nothing useful. Screen the Latin transliteration.
  • Vessels and aircraft appear on the OFAC and UK lists and are matched under entityType: organisation, labelled vessel in entryType.
  • 1,000 names per run. Longer lists should be split across runs.
  • One row per list entry, not per alias. An entity with nine aliases is reported once, under its best-scoring name, with a primary-name match winning a tie.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~sanctions-screening-check/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"entities":["Rosneft Oil Company","Gazprombank","Acme Office Supplies Ltd"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~sanctions-screening-check/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"entities":["Rosneft Oil Company","Gazprombank","Acme Office Supplies Ltd"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~sanctions-screening-check/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"entities":["{{screening run}}"]}, mapping the row's screening run into the entities array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "OFAC EU UK sanctions screening check" — the agent will find and run this actor.