SFOLN

Catalogue / Compliance & public records

Sanctions Screening – OFAC, EU, UK, UN Lists

sfoln/sanctions-screening · Automation, Developer tools, AI

Screen people, companies, vessels and aircraft against the official OFAC SDN and Consolidated, UN Security Council, EU and UK sanctions lists. Fuzzy, alias-aware matching with transliteration, date-of-birth and country checks, and list versions stamped on every result. $3 per 1,000 names.

About

What it does

Sanctions Screening – OFAC, EU, UK, UN Lists checks names of people, companies, vessels and aircraft against the official sanctions lists (OFAC SDN, OFAC Consolidated non-SDN, UN Security Council Consolidated List, EU Consolidated Financial Sanctions List and UK Sanctions List) and returns one record per name: potential_match or no_match, the best score and the matching list entries with their programs, aliases, dates of birth and nationalities. Built for onboarding, payment and vendor checks, compliance tools and AI agents. $0.003 per screened name; lists are downloaded straight from the publishers and every record carries the list versions it was screened against.

Price

Price per delivered record

EventPricePer 1,000Charged for
Screened name
name-screened
$0.003$3 / 1,000One name screened against the selected official sanctions lists (OFAC SDN and Consolidated, UN, EU, UK), whether it is a potential match or not.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~sanctions-screening/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"names":["AEROCARIBBEAN AIRLINES","Acme Bakery Ltd"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/sanctions-screening"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~sanctions-screening/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Screen "AEROCARIBBEAN AIRLINES" and "Acme Bakery Ltd" against the OFAC, UN, EU and UK sanctions lists and tell me which ones are potential matches.

Input

Input fields

Names of people, companies, vessels or aircraft to screen against the official OFAC, UN, EU and UK sanctions lists. Each name produces one dataset record with matchStatus potential_match or no_match.

FieldTypeDefaultMeaning
namesarray—Names
Names to screen, one per line ("AEROCARIBBEAN AIRLINES", "PUTIN, Vladimir", "Acme Trading GmbH"). Any script works: non-Latin names are transliterated. Accounts on the Apify free plan can process up to 10 names per run.
entitiesarray—Names with details (JSON)
Optional: names with secondary identifiers, e.g. [{"name": "Ivan Petrov", "type": "person", "dateOfBirth": "1960-03-12", "country": "RU"}]. type is person, entity, vessel or aircraft; dateOfBirth is YYYY-MM-DD, YYYY-MM or YYYY; country is an ISO code or a name. Matching dates of birth and countries raise the score, distant dates of birth lower it.
entityTypestring"any"Type of the names
Which list entries the names are compared with: any (default), person (individuals only), entity (companies and organisations, incl. vessels and aircraft), vessel or aircraft. An entity type in "Names with details" overrides it. One of "any", "person", "entity", "vessel", "aircraft".
listsarray["ofac-sdn","ofac-cons","un","eu","uk"]Sanctions lists
Lists to screen against (default: all five). ofac-sdn = OFAC Specially Designated Nationals, ofac-cons = OFAC Consolidated non-SDN lists, un = UN Security Council Consolidated List, eu = EU Consolidated Financial Sanctions List, uk = UK Sanctions List.
thresholdnumber0.85Match threshold
Minimum score (0.5–1) for a list entry to be reported as a potential match. Lower finds more spelling variants and more false positives; 1 reports exact name matches only. Range 0.5–1.
maxMatchesPerNameinteger5Max matches per name
How many matching list entries are returned per name, best first. Range 1–25.
includeWeakAliasesbooleantrueInclude weak aliases
Also compare with low-quality aliases ("weak a.k.a." on the lists). Their matches score 5% lower.
cacheMaxAgeHoursinteger24List cache age (hours)
Reuse lists this run's account downloaded within this many hours (kept in the key-value store "sanctions-screening-cache"); 0 downloads fresh copies. Every record shows the list versions it was screened against. Range 0–24.
maxItemsinteger10000Max names
Safety cap on how many names are screened in this run; further names are ignored and counted in the OUTPUT record. Range 1–100000.
includeRawbooleanfalseInclude full list entries
Attach the complete list entries of the reported matches (all names, remarks) under raw.
Example input
{
  "names": [
    "AEROCARIBBEAN AIRLINES",
    "Acme Bakery Ltd"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The name (or the object from "entities") this record corresponds to.
statusstringStatus
ok | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged).
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; this Actor: invalid_name, lists_incomplete (no match on the lists that loaded, but a selected list was unavailable: not cleared, not charged), timeout, internal.
warningsarrayWarnings
Notes about this record, e.g. a list that was unavailable in this run or an ignored date of birth.
namestringName
The screened name as given.
entityTypestringType
any | person | entity | vessel | aircraft: which list entries the name was compared with.
dateOfBirthstring | nullDate of birth
The date of birth given for the name (YYYY-MM-DD, YYYY-MM or YYYY), if any.
countrystring | nullCountry
The country given for the name, if any.
normalizedNamestringNormalized name
The name as compared: transliterated to ASCII, upper case, punctuation and legal forms removed.
matchStatusstring | nullMatch status
potential_match (at least one list entry scored at or above the threshold) or no_match; null when the name was not screened (invalid name) or not cleared (lists_incomplete).
bestScorenumberBest score
Highest score among the list entries compared (0–1), also when below the threshold; entries that cannot reach the threshold or 0.7, whichever is lower, are not compared.
thresholdnumberThreshold
The threshold used for this name.
matchCountintegerMatches
Number of potential matches returned (at most maxMatchesPerName).
totalMatchesintegerTotal matches
All list entries scoring at or above the threshold, also those beyond maxMatchesPerName.
topMatchNamestring | nullTop match
Primary name of the best-scoring list entry, if any.
topMatchListstring | nullTop match list
List of the best-scoring entry: ofac-sdn, ofac-cons, un, eu or uk.
topMatchScorenumber | nullTop match score
Score of the best-scoring entry.
matchesarrayPotential matches
List entries scoring at or above the threshold, best first: list, listName, entryId, name, matchedName, matchedNameType (primary | alias | weak_alias | former | non_latin), aliases, type, programs, dateOfBirth, nationalities, countries, listedOn, ids, remarks, score, nameScore, reasons, sourceUrl.
listsCompletebooleanLists complete
true when every selected list was screened; false on a potential match while a selected list could not be loaded in this run.
listsStalebooleanLists stale
true when a selected list was screened against an older cached copy (up to 7 days) because its download failed in this run.
listsScreenedarrayLists screened
Lists this name was screened against (selected lists that were available in this run).
listsVersionobjectList versions
Per list: name, status (ok | stale | unavailable), sourceUrls, fetchedAt, publishedAt, recordCount, fromCache.
screenedAtstringScreened at
ISO timestamp of the screening.
rawarrayRaw list entries
Complete list entries of the matches (only with includeRaw).
Example record
{
  "input": "AEROCARIBBEAN AIRLINES",
  "status": "ok",
  "charged": true,
  "chargedEvent": "name-screened",
  "source": "sanctions-lists",
  "fetchedAt": "2026-10-14T22:40:00.000Z",
  "name": "AEROCARIBBEAN AIRLINES",
  "entityType": "any",
  "dateOfBirth": null,
  "country": null,
  "normalizedName": "AEROCARIBBEAN AIRLINES",
  "matchStatus": "potential_match",
  "bestScore": 1,
  "threshold": 0.85,
  "matchCount": 1,
  "totalMatches": 1,
  "topMatchName": "AEROCARIBBEAN AIRLINES",
  "topMatchList": "ofac-sdn",
  "topMatchScore": 1,
  "matches": [
    {
      "list": "ofac-sdn",
      "listName": "OFAC Specially Designated Nationals (SDN) List",
      "entryId": "36",
      "name": "AEROCARIBBEAN AIRLINES",
      "matchedName": "AEROCARIBBEAN AIRLINES",
      "matchedNameType": "primary",
      "aliases": [
        "AERO-CARIBBEAN"
      ],
      "type": "entity",
      "programs": [
        "CUBA"
      ],
      "dateOfBirth": [],
      "nationalities": [],
      "countries": [
        "CU"
      ],
      "listedOn": null,
      "ids": [],
      "remarks": null,
      "score": 1,
      "nameScore": 1,
      "reasons": [
        "name_exact"
      ],
      "sourceUrl": "https://sanctionssearch.ofac.treas.gov/"
    }
  ],
  "listsComplete": true,
  "listsStale": false,
  "listsScreened": [
    "ofac-sdn",
    "ofac-cons",
    "un",
    "eu",
    "uk"
  ],
  "listsVersion": {
    "ofac-sdn": {
      "list": "ofac-sdn",
      "name": "OFAC Specially Designated Nationals (SDN) List",
      "status": "ok",
      "sourceUrls": [
        "https://sanctionslistservice.ofac.treas.gov/api/PublicationPreview/exports/SDN.CSV"
      ],
      "fetchedAt": "2026-10-14T22:39:12.000Z",
      "publishedAt": "2026-10-14T14:02:30.000Z",
      "recordCount": 19430,
      "fromCache": false
    }
  },
  "screenedAt": "2026-10-14T22:40:00.000Z"
}

FAQ

Questions

Which sanctions lists are included?
OFAC Specially Designated Nationals (SDN), the OFAC Consolidated (non-SDN) lists, the UN Security Council Consolidated List, the EU Consolidated Financial Sanctions List and the UK Sanctions List, downloaded from the official publishers. Every record shows each list's source URL, download time, publication date and record count (listsVersion).
How does the matching work?
Names are transliterated to ASCII (Cyrillic, Arabic, Greek and other scripts), normalised (case, punctuation, legal forms such as LLC or OOO) and compared with every primary name and alias using a weighted token-set and Jaro-Winkler score that tolerates word order, missing middle names and spelling variants. A date of birth or country raises the score when the list entry agrees; a distant date of birth lowers it.
Is a potential match a confirmed sanctions hit?
No. A potential match means a list entry's name is similar enough to need a review; compare the date of birth, nationality, programs and remarks in the match before deciding.
How fresh are the lists?
Lists are downloaded at most once every 24 hours per Apify account (set List cache age to 0 to always download). OFAC and the UN publish daily; the EU and UK update on each new designation.

Machine-readable

This page for agents