Skip to main content
Glama
fairquery

fairquery-sanctions-screener

Official

Sanctions & Watchlist Screener (OFAC, EU, UK, UN)

Fairquery Apify Actor that screens people and company names against the main public sanctions lists, downloaded fresh from the official sources on every run: OFAC SDN and Consolidated (US), EU Consolidated Financial Sanctions, the UK Sanctions List (FCDO / OFSI), and the UN Security Council Consolidated List. Each name gets a potential_match / no_match status, a 0–100 fuzzy score, and the matching entries with aliases, programs, countries and dates of birth.

Not a certified screening service. This is automated fuzzy matching against public lists. It can return false positives and can miss true matches (transliterations, very short names, lists that fail to download). Review every potential match manually against the official source, and get legal advice before acting on results. It does not replace a regulated KYC/AML provider.

When to use this Actor (LLM / tool selection)

Use it when an agent or workflow needs to:

  • Pre-screen a new customer, supplier, vendor or marketplace seller against sanctions lists (KYB / onboarding)

  • Re-screen a counterparty list in bulk (thousands of names per run)

  • Check whether a company or person is on OFAC, EU, UK or UN lists and see the program and listing details

  • Add a sanctions check step to an export, payments or procurement workflow

Related MCP server: Sanctions Screening MCP Server

Lists and sources

lists id

List

Source (downloaded each run)

OFAC_SDN

OFAC Specially Designated Nationals

sanctionslistservice.ofac.treas.gov SDN.CSV + ALT.CSV + ADD.CSV

OFAC_CONS

OFAC Consolidated (non-SDN: SSI, NS-MBS, FSE, …)

CONS_PRIM / CONS_ALT / CONS_ADD.CSV

EU

EU Consolidated Financial Sanctions List

webgate.ec.europa.eu/fsd/fsf CSV 1.1 (falls back to CSV 1.0)

UK

UK Sanctions List (incl. OFSI asset-freeze targets)

sanctionslist.fcdo.gov.uk CSV

UN

UN Security Council Consolidated List

scsanctions.un.org XML

Lists are cached in memory for the run only and never stored. If a source is down, the run continues with the other lists and every row reports it in lists_unavailable; per-list entry counts, download times and errors are in RUN_SUMMARY.

Matching

  • Names are normalised (diacritics, case, punctuation, &, legal suffixes such as LLC/GmbH/JSC, honorifics) and compared token by token with Jaro-Winkler, so word order (PUTIN, Vladimir), extra middle names, and spelling variants (Poutine, Usama/Osama, Gaddafi/Qadhafi) still match.

  • Every alias (a.k.a., f.k.a., non-Latin script names) is screened; matched_on tells you whether the hit was the primary name or an alias.

  • Optional country (ISO-2 or name) adds country_match; excludeNonMatchingCountry drops mismatches.

  • Optional dateOfBirth drops individuals whose listed birth years differ by more than dobYearTolerance; entries without a DOB are kept.

Input

Field

Type

Default

Description

names

string[]

example

One name per line

queries

object[]

[]

{name, id?, country?, dateOfBirth?, entityType?}

lists

string[]

all five

OFAC_SDN, OFAC_CONS, EU, UK, UN

minScore

int

85

60–100

maxMatchesPerName

int

10

Top matches per name

entityType

any | individual | entity

any

country

string

–

Default country for all names

excludeNonMatchingCountry

bool

false

dobYearTolerance

int

1

listDownloadTimeoutSecs

int

60

Per list file

maxNames

int

10000

Safety cap

{
  "names": ["Banco Nacional de Cuba", "Jane Example Smith"],
  "queries": [{ "name": "Ali Khamenei", "id": "cust-42", "country": "IR", "dateOfBirth": "1939" }]
}

Output

{
  "schema_version": "1.0.0", "type": "screening",
  "query": { "name": "Ali Khamenei", "id": "cust-42", "country": "IR", "date_of_birth": "1939", "entity_type": "any" },
  "status": "potential_match", "best_score": 92.5, "match_count": 1,
  "matches": [{
    "score": 92.5, "matched_name": "KHAMENEI, Ali Husseini", "matched_on": "primary",
    "list": "OFAC_SDN", "list_name": "OFAC Specially Designated Nationals (SDN) List", "entry_id": "…",
    "entity_type": "individual", "primary_name": "KHAMENEI, Ali Husseini", "aliases": ["…"], "programs": ["IRAN-EO13876"],
    "countries": ["Iran"], "dates_of_birth": ["19 Apr 1939"], "listed_on": null,
    "country_match": true, "dob_match": true, "source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=…"
  }],
  "lists_screened": ["OFAC_SDN", "OFAC_CONS", "EU", "UK", "UN"], "lists_unavailable": [],
  "min_score": 85, "disclaimer": "Not a certified screening service. …"
}

Error rows (type: "error", never charged): INPUT_EMPTY, MAX_NAMES_EXCEEDED, LISTS_UNAVAILABLE (no list could be downloaded).

Pricing

Pay per event: name-screened, once per name that gets a screening row (match or no match). If no list can be downloaded, nothing is charged. See the pricing tab.

Memory / runtime

Default 512 MB. Downloading and indexing all five lists (about 30k entries, 100k+ names) takes roughly 10–40 s, depending on the government servers; after that screening runs at hundreds of names per second. Put all names into one run rather than one run per name.

MCP / Apify tools

Call from agents via Apify MCP with Actor fairquery/sanctions-watchlist-screener:

{ "actor": "fairquery/sanctions-watchlist-screener", "input": { "names": ["Acme Trading LLC"] } }

Local stdio MCP server

The mcp/ folder is a stdio MCP server (TypeScript, @modelcontextprotocol/sdk) with two tools, both with annotations and output schemas:

Tool

What it does

Cost

screen_names

Runs this Actor and returns the rows

Needs APIFY_TOKEN, billed per name

list_sources

Lists covered lists, source URLs, score scale, disclaimer

Free, local, no token

cd mcp && npm install && npm run build
node scripts/smoke-test.mjs                          # initialize + tools/list + free tool, no token
APIFY_TOKEN=... node scripts/smoke-test.mjs --call   # real call
{ "mcpServers": { "fairquery-sanctions-screener": { "command": "node", "args": ["/path/to/sanctions-watchlist-screener/mcp/dist/index.js"], "env": { "APIFY_TOKEN": "<your Apify token>" } } } }

Docker: the root Dockerfile builds the MCP server image (docker build -t fairquery-sanctions-screener-mcp .); it is also the Dockerfile for Glama. The Actor image is .actor/Dockerfile. glama.json lists fairquery as maintainer.

Local development

npm install
npx apify run      # input from storage/key_value_stores/default/INPUT.json
npm test

Kits & templates

Optional guides from Fairquery for wiring this Actor into agents and automations (the Actor works fine without them):

Disclaimer

Not a certified screening service. Results come from automated fuzzy matching against public lists downloaded at run time and are provided as is, without warranty. They may be incomplete, out of date or wrong. Always confirm potential matches with the official publication of the relevant authority (OFAC, European Commission, UK FCDO/OFSI, UN Security Council) and take legal advice before making compliance decisions. Data comes from public government sources; Fairquery is not affiliated with any of them.

  • License: MIT

Available Tools

2 tools
list_sourcesList covered sanctions sources (free)A
Read-onlyIdempotent

Free, local, no token: the official lists screen_names checks (id, name, authority, download URL), the score scale and the disclaimer. Use it to pick the lists parameter or to cite sources.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourcesYes
disclaimerYes
score_scaleYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful context beyond annotations: it is free, local, requires no token, and describes what data is returned (id, name, authority, download URL, score scale, disclaimer). Annotations already cover readOnly/idempotent safety, so this fills in the auth/cost/return-content gaps well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the key traits (free, local, no token) and then the return contents and the use case. No padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a zero-param, read-only discovery tool with an output schema. It covers cost, auth, return fields, and the downstream action, leaving nothing an agent needs missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so baseline is 4. The description consistently reflects that no input is needed, reinforcing the zero-param nature without wasted explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (sanctions sources), and clarifies it returns metadata about the lists that screen_names checks. It is distinguishable from its sibling screen_names by being the discovery/metadata tool, though the phrasing is somewhat compressed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it: to pick the lists parameter for screen_names, or to cite sources. It also names the sibling screen_names and frames this tool as the prerequisite for using it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screen_namesScreen names against sanctions listsA
Read-onlyIdempotent

Fuzzy-match people or company names against OFAC SDN + Consolidated, EU, UK and UN sanctions lists downloaded fresh from the official sources. One row per name: status potential_match/no_match, best_score (0-100), matches with list, entry id, primary name, aliases, programs, countries, DOB, country_match/dob_match. Optional per-name country and dateOfBirth filters. Runs Apify Actor fairquery/sanctions-watchlist-screener; requires APIFY_TOKEN, billed per name. Not a certified screening service. Automated fuzzy matching against public lists downloaded at run time; results can contain false positives and miss matches. Review every potential match manually and consult official sources and legal counsel before acting.

ParametersJSON Schema
NameRequiredDescriptionDefault
listsNoDefault: all five
namesNoNames to screen
queriesNoNames with optional country (ISO-2 or name), dateOfBirth (YYYY or YYYY-MM-DD), entityType
minScoreNoDefault 85
entityTypeNo
maxMatchesPerNameNo
excludeNonMatchingCountryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
itemsYesDataset rows: type=screening or type=error

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/open-world safety, and the description goes well beyond them: it discloses the APIFY_TOKEN requirement, per-name billing, that lists are downloaded fresh at run time, that the underlying Actor is fairquery/sanctions-watchlist-screener, and that results can contain false positives and miss matches. This is exactly the extra operational context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and dense throughout, but the sentence enumerating output fields (status, best_score, matches, aliases, programs, countries, DOB) is largely redundant since an output schema exists. Otherwise every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter screening tool with an output schema, it covers the essentials an agent needs — auth, cost model, data freshness, accuracy limits, and the matching semantics. The remaining gap is that undocumented parameters (minScore, maxMatchesPerName, excludeNonMatchingCountry) are left to the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 57%, so the schema documents part of the surface (lists, names, queries, minScore default). The description adds the per-name country/DOB filter concept and notes entity type usage, but says nothing about minScore, maxMatchesPerName, or excludeNonMatchingCountry. Baseline 3 fits given partial coverage and partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Fuzzy-match people or company names against OFAC SDN + Consolidated, EU, UK and UN sanctions lists' — with named data sources and scoring semantics. An agent can separate this from the sibling list_sources (which merely enumerates sources) without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it names the inputs (names, optional per-name country and dateOfBirth filters) but never says when to choose this tool over list_sources or when screening is inappropriate. The warning to 'Review every potential match manually and consult official sources and legal counsel' is a caveat, not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.1.0
    • First observedlist_sources
    • First observedscreen_names

TDQS

A4.2/5.0

Scored across 2 tools

Disambiguation5/5

The two tools serve clearly different purposes: list_sources is a metadata/discovery call (available lists, scoring scale, disclaimer), while screen_names performs the actual fuzzy-match screening. There is no overlap or risk of misselection.

Naming Consistency5/5

Both names follow a consistent verb_noun snake_case pattern (list_sources, screen_names). The convention is predictable and readable.

Tool Count3/5

Two tools is minimal for the stated purpose; it covers discovery plus screening but leaves no room for per-entry detail or batch/export operations. It is borderline thin rather than clearly right-sized.

Completeness4/5

Core workflow is covered: discover authoritative sources and screen names with detailed per-match output (scores, programs, countries, DOB). Minor gaps exist, such as retrieving a single list entry or exporting/batch-result retrieval, but agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers