DEV Community

Cover image for How to Screen Companies Against Sanctions Lists Without a Paid API
Tim Zinin
Tim Zinin

Posted on Originally published at apify.com

How to Screen Companies Against Sanctions Lists Without a Paid API

The problem

Anyone onboarding clients, running KYC/KYB, or vetting a new counterparty needs a sanctions check before money or goods move. Doing it by hand means downloading the US Treasury OFAC SDN list and the EU consolidated list, then string-matching each name — including the alias spellings that sanctioned parties are actually listed under.

Commercial screening tools (the README names Refinitiv World-Check, Dow Jones and ComplyAdvantage) run hundreds to thousands of dollars a month and are built for compliance teams, not for a one-off check or a lightweight internal tool. Yet the underlying data — OFAC's own SDN.CSV and ALT.CSV exports and the EU's public CSV export — is free and public.

What the actor does

The Sanctions Screening API screens up to 100 person or company names against both official lists, fetched fresh at the start of every run — never a stale cache. Per the README:

  • Two official lists, screened together: OFAC SDN (primary names plus OFAC's published a.k.a./f.k.a./n.k.a. aliases) and the EU consolidated financial sanctions list (names and aliases), straight from sanctionslistservice.ofac.treas.gov and webgate.ec.europa.eu — no unofficial mirrors.
  • Explainable matching. Names are normalized (uppercase, diacritics stripped, punctuation removed) and scored by token overlap: the fraction of the query's words found in a candidate's primary name or any alias. The default minScore: 0.5 is deliberately soft — a missed hit is worse than a false one — and tunable.
  • Ranked candidates, not one silent guess. Up to 25 candidates above the threshold, each with list attribution, entity type, sanction program(s), the matched name, whether the hit came via a primary name or an alias, and the score.
  • Honest partial coverage. If one list fails to load, every row carries listsComplete: false, and a "no match" verdict in that state is not billed — an unverifiable clean result is free. If both lists fail, every name returns found: false and nothing is charged.

The README is blunt about the boundary: this is a preliminary screening tool that builds the human review list, not a compliance determination, legal advice, identity verification or sanctions clearance. Every row carries that disclaimer and safeToAutomate: false.

Example: input and output

{
  "names": ["Rosneft", "ROSNEFT"],
  "minScore": 0.5,
  "maxConcurrency": 1
}
Enter fullscreen mode Exit fullscreen mode

A real row from a real run, quoted from the README (matches trimmed to the top entries):

{
  "input": "Yevgeniy Prigozhin",
  "found": true,
  "match": true,
  "matchCount": 25,
  "matches": [
    { "listName": "OFAC SDN", "entityName": "PRIGOZHIN, Yevgeniy Viktorovich", "entityType": "individual", "program": "UKRAINE-EO13661, CYBER2, ELECTION-EO13848, RUSSIA-EO14024", "matchedNameType": "primary", "score": 1 },
    { "listName": "EU Consolidated", "entityName": "Yevgeniy Viktorovich PRIGOZHIN", "entityType": "individual", "program": "UKR", "matchedNameType": "primary", "score": 1 },
    { "listName": "OFAC SDN", "entityName": "BALYTSKYI, Yevhen Vitaliiovych", "entityType": "individual", "program": "RUSSIA-EO14024", "matchedName": "BALITSKIY, Yevgeniy", "matchedNameType": "aka", "score": 0.5 }
  ],
  "highestScore": 1,
  "matchedName": "PRIGOZHIN, Yevgeniy Viktorovich",
  "matchedNameType": "primary",
  "listsChecked": ["OFAC SDN", "EU Consolidated"],
  "listsComplete": true,
  "disclaimer": "Screening signal only — NOT a legal/compliance determination; verify against official sources.",
  "checkedAt": "2026-07-26T15:09:32.370Z"
}
Enter fullscreen mode Exit fullscreen mode

Pricing and the free limit

Pay-per-event: $0.005 per run start plus $0.005 per delivered screening row. Normalized duplicates, source-failure advisories, and incomplete no-match rows are not result-billed. A run delivering 100 screened names costs $0.005 + 100 × $0.005 = $0.505. Apify's free plan gives $5 of usage credits per month, so $5 covers about 9 such runs — roughly 900 screened names.

Try it

Paste names one per row, press Start, and route the ranked matches to a human reviewer: Sanctions Screening API

For AI agents and MCP

A standard Apify actor with JSON input and structured rows, callable from the Apify API, the SDKs, or the hosted Apify MCP server documented in the README. An agent can branch on found, match and listsComplete — and must treat every match: true as a review candidate with matchedNameType, programs and source lists attached, never as an automated "blocked" verdict.

Top comments (0)