FairqueryBlogToolsAboutSecurityllms.txt

How do I screen names against OFAC, EU, UK and UN sanctions lists with an API?

Fairquery ·

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 idListAuthority / source
OFAC_SDNSpecially Designated Nationals (SDN) ListUS Treasury OFAC, sanctionslistservice.ofac.treas.gov SDN.CSV + ALT.CSV + ADD.CSV
OFAC_CONSConsolidated (non-SDN) Sanctions ListUS Treasury OFAC, CONS_PRIM / CONS_ALT / CONS_ADD.CSV
EUEU Consolidated Financial Sanctions ListEuropean Commission (DG FISMA), webgate.ec.europa.eu/fsd/fsf CSV
UKUK Sanctions List (incl. OFSI asset-freeze targets)UK FCDO / HM Treasury OFSI, sanctionslist.fcdo.gov.uk CSV
UNUN Security Council Consolidated ListUN 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

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:

PlanPrice / monthRequests includedOverageRate limit
BASIC$020 (hard limit)none1 req/s
PRO$195,000$0.0065 req/s
ULTRA$4925,000$0.00410 req/s
MEGA$99100,000$0.00220 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)

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

OptionGood forTrade-offs
OFAC Sanctions List Search (official web tool)Free manual look-ups against OFAC listsOFAC lists only; an interactive search, not built for screening a batch through your own code
Downloading the lists yourselfFull control, no per-name feeFive formats (CSV and XML), alias tables, name normalisation and fuzzy matching are yours to build and maintain
OpenSanctionsMuch broader coverage (many more sanctions sources plus PEP and other datasets), hosted matching APIPer 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 vendorsAudit trails, PEP/adverse media, ongoing monitoring, contractual service levelsContract-based pricing and onboarding
Fairquery Sanctions ScreenerCheap batch or per-request pre-screening of OFAC/EU/UK/UN from official sources, API and MCP accessFive 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