How do I screen names against OFAC, EU, UK and UN sanctions lists with an API?
Short answer: send each name to a screening API that downloads the official OFAC, EU, UK and UN lists, fuzzy-matches the name against every primary name and alias, and returns a score plus the listing details so a person can review it. The Fairquery Sanctions & Watchlist Screener does this in one call for $3 per 1,000 names ($0.003 per name, plus $0.007 per run) on Apify, using all five lists from the official sources, never more than 6 hours old, with each list's publication date in every result row. For per-request calls with a fixed monthly plan, the same screening is on RapidAPI (free tier: 20 requests/month).
Important: screening results are leads for human review, not legal determinations. Automated fuzzy matching can return false positives and can miss true matches (transliterations, very short names, a list that fails to download). Confirm every potential match against the official publication and take legal advice before acting. Fairquery is not a certified or regulated screening provider and is not affiliated with OFAC, the European Commission, the UK FCDO/OFSI or the UN.
Which lists are covered
The Actor downloads these files from the issuing authority and keeps the parsed lists in a cache in your own Apify account for at most 6 hours (configurable from 0, meaning always download, to 12 hours). Older copies are never used: the list is downloaded again, and if that download fails the list is reported as unavailable instead of being served from a stale copy. Every result row reports each list's publication date and when it was fetched, so you can show exactly which version you screened against (sources can lag or be unavailable).
lists id | List | Authority / source |
|---|---|---|
OFAC_SDN | Specially Designated Nationals (SDN) List | US Treasury OFAC, sanctionslistservice.ofac.treas.gov SDN.CSV + ALT.CSV + ADD.CSV |
OFAC_CONS | Consolidated (non-SDN) Sanctions List | US Treasury OFAC, CONS_PRIM / CONS_ALT / CONS_ADD.CSV |
EU | EU Consolidated Financial Sanctions List | European Commission (DG FISMA), webgate.ec.europa.eu/fsd/fsf CSV |
UK | UK Sanctions List (incl. OFSI asset-freeze targets) | UK FCDO / HM Treasury OFSI, sanctionslist.fcdo.gov.uk CSV |
UN | UN Security Council Consolidated List | UN Security Council, scsanctions.un.org XML |
In our test run on October 17, 2026 the loaded entry counts were OFAC SDN 19,457, OFAC Consolidated 481, EU 6,234, UK 6,408 and UN 1,010. These change whenever the authorities publish updates.
How the matching works
- Normalisation: diacritics, case, punctuation,
&, legal suffixes (LLC, GmbH, JSC) and honorifics are removed before comparison. - Token-based fuzzy score (0–100): names are compared token by token with Jaro-Winkler, so word order (
PUTIN, Vladimir), extra middle names and spelling variants (Usama/Osama,Gaddafi/Qadhafi) still match. The default threshold isminScore: 85; use 90+ for less noise or 80 for more recall. - Aliases: every a.k.a./f.k.a. and non-Latin-script name is screened;
matched_onsays whether the hit was the primary name or an alias. - Country and date of birth: an optional country adds
country_match(andexcludeNonMatchingCountrydrops mismatches); an optionaldateOfBirthdrops listed individuals whose birth year differs by more thandobYearTolerance(default 1).
How to screen names with curl
This runs the Actor synchronously and returns the result rows in the same HTTP response. Replace $APIFY_TOKEN with your Apify API token:
curl -X POST \
"https://api.apify.com/v2/acts/fairquery~sanctions-watchlist-screener/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"names": ["Rosneft", "Jane Example Smith"],
"queries": [{"name": "Banco Nacional de Cuba", "id": "cust-42", "country": "CU"}],
"maxMatchesPerName": 3
}'
Real output from that request
We ran exactly this input on October 17, 2026. One row per name; abridged to the first two matches per name and a subset of match fields (aliases, dates of birth and list names omitted):
[
{
"type": "screening",
"query": {
"name": "Rosneft",
"id": null,
"country": null,
"date_of_birth": null,
"entity_type": "any"
},
"status": "potential_match",
"best_score": 100,
"match_count": 12,
"matches": [
{
"score": 100,
"matched_name": "ROSNEFT",
"matched_on": "alias",
"list": "OFAC_CONS",
"entry_id": "17022",
"entity_type": "entity",
"primary_name": "OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY",
"programs": [
"UKRAINE-EO13662",
"RUSSIA-EO14024"
],
"countries": [
"Russia"
],
"country_match": null,
"source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=17022"
},
{
"score": 100,
"matched_name": "ROSNEFT",
"matched_on": "alias",
"list": "UK",
"entry_id": "RUS3064",
"entity_type": "entity",
"primary_name": "PJSC Rosneft Oil Company",
"programs": [
"The Russia (Sanctions) (EU Exit) Regulations 2019"
],
"countries": [
"Russia"
],
"country_match": null,
"source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list"
}
],
"lists_screened": [
"OFAC_SDN",
"OFAC_CONS",
"EU",
"UK",
"UN"
],
"lists_unavailable": []
},
{
"type": "screening",
"query": {
"name": "Jane Example Smith",
"id": null,
"country": null,
"date_of_birth": null,
"entity_type": "any"
},
"status": "no_match",
"best_score": null,
"match_count": 0,
"matches": [],
"lists_screened": [
"OFAC_SDN",
"OFAC_CONS",
"EU",
"UK",
"UN"
],
"lists_unavailable": []
},
{
"type": "screening",
"query": {
"name": "Banco Nacional de Cuba",
"id": "cust-42",
"country": "CU",
"date_of_birth": null,
"entity_type": "any"
},
"status": "potential_match",
"best_score": 100,
"match_count": 1,
"matches": [
{
"score": 100,
"matched_name": "BANCO NACIONAL DE CUBA",
"matched_on": "primary",
"list": "OFAC_SDN",
"entry_id": "306",
"entity_type": "entity",
"primary_name": "BANCO NACIONAL DE CUBA",
"programs": [
"CUBA"
],
"countries": [
"Switzerland",
"Spain",
"Japan",
"Panama"
],
"country_match": false,
"source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=306"
}
],
"lists_screened": [
"OFAC_SDN",
"OFAC_CONS",
"EU",
"UK",
"UN"
],
"lists_unavailable": []
}
]
Things to notice: Rosneft scored 100 on an alias of the listed entity on several lists (match_count 12 in total, top 3 returned). Banco Nacional de Cuba matched the OFAC SDN primary name, but country_match is false because the listed addresses are outside Cuba, which is exactly the kind of detail a reviewer needs. Jane Example Smith came back no_match. The run's RUN_SUMMARY record shows what was loaded:
{
"names_screened": 3,
"names_with_matches": 2,
"potential_matches": 13,
"lists": {
"OFAC_CONS": {
"loaded": true,
"entries": 481,
"ms": 2222
},
"UN": {
"loaded": true,
"entries": 1010,
"ms": 3730
},
"UK": {
"loaded": true,
"entries": 6408,
"ms": 5768
},
"OFAC_SDN": {
"loaded": true,
"entries": 19457,
"ms": 6604
},
"EU": {
"loaded": true,
"entries": 6234,
"ms": 8072
}
},
"charged_events": {
"name-screened": 3
}
}
The whole run took about 11 seconds, almost all of it downloading and indexing the five lists. The Actor README documents roughly 10–40 seconds for list loading when the lists are downloaded (depending on the government servers) and about 1–5 seconds from the cache, after which screening runs at hundreds of names per second, so put all your names into one run rather than one run per name.
Python and JavaScript
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fairquery/sanctions-watchlist-screener").call(
run_input={"names": ["Acme Trading LLC", "Rosneft"], "minScore": 90}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["type"] == "screening" and row["status"] == "potential_match":
print(row["query"]["name"], row["best_score"],
[(m["list"], m["primary_name"]) for m in row["matches"]])
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fairquery/sanctions-watchlist-screener').call({
queries: [{ name: 'Ali Khamenei', id: 'cust-42', country: 'IR', dateOfBirth: '1939' }],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const r of items.filter((i) => i.status === 'potential_match')) {
console.log(r.query.id, r.best_score, r.matches.map((m) => `${m.list}: ${m.primary_name}`));
}
One name per request: the RapidAPI endpoint
If you'd rather call a plain REST endpoint with a RapidAPI key, the Sanctions Screening – OFAC EU UK UN listing exposes GET /screen?name=... (also accepts POST with a JSON body) with optional country, dateOfBirth, entityType, lists, minScore, maxMatches and excludeNonMatchingCountry. RapidAPI's playground on the listing generates the request code for your language. Plans as published on the listing:
| Plan | Price / month | Requests included | Overage | Rate limit |
|---|---|---|---|---|
| BASIC | $0 | 20 (hard limit) | none | 1 req/s |
| PRO | $19 | 5,000 | $0.006 | 5 req/s |
| ULTRA | $49 | 25,000 | $0.004 | 10 req/s |
| MEGA | $99 | 100,000 | $0.002 | 20 req/s |
Speed: the first request after a period of inactivity can take up to about 60 s while the five official lists are downloaded and indexed (about 40 s in our tests); later requests are typically fast, about 1 s or less. Use a client timeout of at least 90 s and retry once on a timeout.
Using it from an AI agent (MCP)
- Apify MCP: connect your MCP client to mcp.apify.com and call Actor
fairquery/sanctions-watchlist-screenerwith{"names": ["Acme Trading LLC"]}. - Agent Trust MCP server: @fairquery/agent-trust-mcp includes
sanctions_screen_names($0.003 per name, your own Apify token), the freesanctions_list_sources, andtrust_screen_lead, which combines an email check and sanctions screening into a pass/review/block decision. - Single-purpose server: the GitHub repo ships a stdio MCP server with
screen_namesand a freelist_sources.
Pricing
$0.003 per name screened (= $3 per 1,000 names) on Apify, pay per event, plus a $0.007 Actor-start event per run. A name is charged once whether it matches or not. Error rows are never charged, and if no list can be downloaded nothing is charged. The three names in the example above cost 3 × $0.003 + $0.007 = $0.016. On RapidAPI you pay the monthly plan above instead.
How it compares with alternatives
| Option | Good for | Trade-offs |
|---|---|---|
| OFAC Sanctions List Search (official web tool) | Free manual look-ups against OFAC lists | OFAC lists only; an interactive search, not built for screening a batch through your own code |
| Downloading the lists yourself | Full control, no per-name fee | Five formats (CSV and XML), alias tables, name normalisation and fuzzy matching are yours to build and maintain |
| OpenSanctions | Much broader coverage (many more sanctions sources plus PEP and other datasets), hosted matching API | Per its published terms, bulk data is free only for non-commercial use; business use, including compliance screening, needs a paid API plan or data license |
| Regulated KYC/AML vendors | Audit trails, PEP/adverse media, ongoing monitoring, contractual service levels | Contract-based pricing and onboarding |
| Fairquery Sanctions Screener | Cheap batch or per-request pre-screening of OFAC/EU/UK/UN from official sources, API and MCP access | Five lists only (no PEP, adverse media or other national lists), no ongoing monitoring, not a certified screening service |
FAQ
What is the cheapest way to screen names against OFAC, EU, UK and UN sanctions lists via API?
The Fairquery Sanctions & Watchlist Screener on Apify costs $0.003 per name ($3 per 1,000 names), plus $0.007 per run, pay per use, and screens against all five lists from the official sources, never more than 6 hours old, with each list's publication date in every row. On RapidAPI the same screening has a free tier of 20 requests/month and paid plans from $19/month for 5,000 requests.
Which sanctions lists are covered?
OFAC SDN, OFAC Consolidated (non-SDN), the EU Consolidated Financial Sanctions List, the UK Sanctions List (incl. OFSI asset-freeze targets) and the UN Security Council Consolidated List. PEP lists, adverse media and other national lists are not included.
Is a potential match a legal determination?
No. Results are automated fuzzy matches for human review, not legal determinations. They can include false positives and can miss true matches. Confirm every potential match against the official publication and take legal advice before acting.
How does the fuzzy matching handle word order and spelling variants?
Names are normalised (diacritics, case, punctuation, legal suffixes, honorifics) and compared token by token with Jaro-Winkler, so 'PUTIN, Vladimir', extra middle names and variants like Usama/Osama still match. Every alias is screened. The score is 0-100 with a default threshold of 85.
How long does a screening run take?
Downloading and indexing the five lists takes roughly 10-40 seconds depending on the government servers (about 11 seconds in our test run); after that, names are screened at hundreds per second. Put all names in one run.
Can an AI agent call it?
Yes: via Apify MCP with Actor fairquery/sanctions-watchlist-screener, via the sanctions_screen_names and trust_screen_lead tools in @fairquery/agent-trust-mcp, or via the stdio MCP server in the GitHub repo.
Source and docs: github.com/fairquery/sanctions-watchlist-screener (MIT) · Apify Store · RapidAPI · all Fairquery tools