# Sanctions Screener: OFAC, UN, EU & UK Lists (`swillz/sanctions-screener`) Actor

Screen people and companies against the official OFAC SDN and Consolidated, UN, EU and UK sanctions lists, refreshed from official sources every 6h. Fuzzy matching handles aliases and spelling variants. Returns list, program, country, DOB. From $1.50/1k.

- **URL**: https://apify.com/swillz/sanctions-screener.md
- **Developed by:** [William Jin](https://apify.com/swillz) (community)
- **Categories:** Business, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 name screeneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Sanctions Screener: OFAC, UN, EU & UK Lists

Screen people and companies against the five main official sanctions lists in one run: the **OFAC SDN List**, the **OFAC Consolidated (non-SDN) List**, the **UN Security Council Consolidated List**, the **EU Consolidated Financial Sanctions List** and the **UK Sanctions List**. Lists come straight from the government sources and are refreshed every 6 hours (or downloaded live in your run if you prefer), so results are never weeks out of date.

Fuzzy name matching handles spelling variants (Osama / Usama), word order ("PUTIN, Vladimir"), diacritics, legal suffixes (LLC, GmbH, PJSC) and every listed alias. Each name comes back as `clear` or `potential_match`, with the list, program, countries and date of birth needed for a quick manual review.

### What can Sanctions Screener do?

- Screen a list of names, or a dataset from another Actor (CRM export, supplier list, scraped leads), against 5 official lists at once.
- Match aliases, transliterations and reordered names with a tunable 0-100 score.
- Flag country matches when you pass a country with the name ("John Doe | RU").
- Restrict matching to individuals or to entities.
- Report list record counts, publication dates and download times in the run summary, as an audit trail.
- Never charge for empty names, duplicate names or names screened while a list was down.

### What data does it return?

| Field | Example |
|---|---|
| `name` | Rosneft |
| `status` | potential_match |
| `topScore` | 100 |
| `matchCount` | 3 |
| `matches[].list` / `listName` | uk / UK Sanctions List (FCDO) |
| `matches[].listedName` / `matchedName` | OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY / ROSNEFT |
| `matches[].programs` | \["UKRAINE-EO13662", "RUSSIA-EO14024"] |
| `matches[].countries` / `countryMatch` | \["RU"] / true |
| `matches[].datesOfBirth` | \["07 Oct 1952"] |
| `listsChecked` / `listsNotChecked` | all five / \[] |

### How much does it cost?

You pay per name screened (`clear` or `potential_match`). Invalid inputs, duplicates, outage rows and names over your cost limit are free. The price per 1,000 names goes down on higher Apify plans; see the Pricing tab. Set `maxTotalChargeUsd` on the run to cap the cost.

### Input example

```json
{
  "names": ["Vladimir Putin | RU", "Rosneft", "Acme Trading LLC"],
  "lists": ["ofac_sdn", "ofac_consolidated", "un", "eu", "uk"],
  "minScore": 85
}
```

### Output example

```json
{
  "name": "Vladimir Putin",
  "countryHint": "RU",
  "status": "potential_match",
  "topScore": 100,
  "matchCount": 3,
  "matches": [
    {"score": 100, "list": "uk", "listedName": "Vladimir Vladimirovich PUTIN", "type": "individual", "programs": ["Russia"], "countries": ["RU"], "countryMatch": true, "datesOfBirth": ["07/10/1952"]},
    {"score": 99, "list": "ofac_sdn", "listedName": "PUTIN, Vladimir Vladimirovich", "programs": ["RUSSIA-EO14024"], "datesOfBirth": ["07 Oct 1952"]}
  ],
  "listsChecked": ["ofac_sdn", "ofac_consolidated", "un", "eu", "uk"],
  "listsNotChecked": []
}
```

The `OUTPUT` record holds the run summary: counts by status, the record count and date of each list, `zeroResultsReason` and `nextSteps`.

### Use cases

- **Customer and supplier onboarding:** screen new accounts before the first payment.
- **Periodic re-screening:** schedule a weekly run over your customer dataset.
- **Lead and marketplace hygiene:** screen scraped company lists before outreach.
- **Payments and invoicing:** check beneficiaries before sending money abroad.

### Use with AI agents (MCP, ChatGPT, Claude, Cursor, n8n)

AI agents can run this Actor through the [Apify MCP server](https://mcp.apify.com):

```json
{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=swillz/sanctions-screener"}}}
```

Or run it locally with `npx -y @apify/actors-mcp-server --tools swillz/sanctions-screener` and `APIFY_TOKEN` set.

Example prompts:

- "Is Acme Trading LLC on any sanctions list?"
- "Screen these 50 suppliers against OFAC, EU and UK sanctions and show me only potential matches."

Minimal input: `{"names": ["Acme Trading LLC"]}`. Every row has a `status`, and a run with no screened names explains why in `zeroResultsReason`.

### Integrations and API

Call it from the Apify API, the JavaScript or Python client, Make, Zapier, n8n or a webhook. To chain it after another Actor, pass that run's `datasetId` (or use an Actor-to-Actor integration). The name field is auto-detected, or set `nameField`.

### FAQ

**Is this legal or compliance advice?** No. This is a screening aid built on the official public lists. Review every `potential_match` by comparing dates of birth, countries and programs before you act, and follow your own compliance procedures.

**How fresh are the lists?** Each list is downloaded from OFAC, the UN, the European Commission or the UK FCDO at most `maxListAgeHours` ago (default 24; the copy is refreshed every 6 hours). Set `alwaysDownloadFresh` to download all lists live in your run. The summary shows each list's publication date, download time and source.

**What if a government site is down?** The run continues with the other lists. Affected rows get a `_incomplete` status, `listsNotChecked` names the missing list, and those rows are not charged.

**Too many matches?** Raise `minScore` to 92 or set `entityType`. To catch more spelling variants, lower it to 80.

**Does it cover PEPs?** No. It covers the five official sanctions lists only.

### Related tools

More tools from the same developer, built to work together:

- [Career Site Jobs Scraper](https://apify.com/swillz/career-site-jobs-scraper): jobs from Greenhouse, Lever, Ashby, Workable and Recruitee boards, with salary fields, as a jobs API or CSV.
- [Workday Jobs Scraper](https://apify.com/swillz/workday-jobs-scraper): every job from any myworkdayjobs.com career site, past the 2,000-result cap.
- [Company Website Enrichment](https://apify.com/swillz/company-website-enrichment): turn a list of domains into company name, emails, phones, social links and tech stack.
- [AI Extract](https://apify.com/swillz/ai-extract): structured JSON from any web page with a plain-English prompt or a JSON schema. AI included.
- [Google Sheets Import & Export](https://apify.com/swillz/google-sheets-import-export): send any Apify dataset to a Google Sheet (append, replace or dedupe) or read a sheet as JSON.
- [XML Sitemap URL Extractor & Sitemap to CSV](https://apify.com/swillz/sitemap-url-extractor): every URL from a website's sitemap, with lastmod, HTTP status and new-page monitoring.
- [AI Brand Visibility Tracker](https://apify.com/swillz/ai-brand-visibility-tracker): track whether ChatGPT mentions, ranks and cites your brand vs competitors (GEO).
- [Email Provider Detector](https://apify.com/swillz/email-provider-detector): bulk check whether domains use Google Workspace, Microsoft 365, Proofpoint or Mimecast, plus SPF, DMARC and DKIM.
- [Hiring Signals by Company Domain](https://apify.com/swillz/hiring-signals-by-domain): from a list of company domains, find which ATS each uses and how many open roles, by department and location.
- [EU VAT Number Validator (VIES)](https://apify.com/swillz/eu-vat-validator): bulk check EU VAT numbers against official VIES, with company name and address.
- [EORI Number Validator](https://apify.com/swillz/eori-validator): bulk check EU and UK EORI numbers for customs, with trader name where published.
- [LEI Lookup (GLEIF)](https://apify.com/swillz/lei-lookup): find a company's Legal Entity Identifier, legal name, address, status and parent from official GLEIF data.

**Popular workflows**

- **B2B customer onboarding (KYB):** validate the VAT number with [EU VAT Number Validator (VIES)](https://apify.com/swillz/eu-vat-validator) and the EORI with [EORI Number Validator](https://apify.com/swillz/eori-validator), confirm the legal entity with [LEI Lookup (GLEIF)](https://apify.com/swillz/lei-lookup), and screen the name with this Actor.

Source code: https://github.com/williamjin02/apify-actors/tree/main/actors/sanctions-screener

# Actor input Schema

## `names` (type: `array`):

Required unless datasetId is set. People or company names, e.g. \["Rosneft","Acme Trading LLC"]. Add " | Country" to flag country matches, e.g. "Vladimir Putin | RU". Objects work too: {"name":"...","country":"IR","type":"entity"}.

## `lists` (type: `array`):

Which official lists to check (default: all). Each is downloaded fresh from the government source on every run.

## `minScore` (type: `integer`):

0-100 similarity needed to report a match (default 85). 92+ gives fewer, closer matches; 80 catches more spelling variants. Range 70-100.

## `entityType` (type: `string`):

Only match listed individuals, only entities (companies, vessels, aircraft), or any (default).

## `maxMatchesPerName` (type: `integer`):

How many listed records to return per name, best first (default 5, max 25). matchCount always shows the total.

## `defaultCountry` (type: `string`):

Optional country (2-letter code or name) used as the hint for names without " | Country". It only sets countryMatch; it never hides matches.

## `maxNames` (type: `integer`):

Screen at most this many unique names per run (default 10000). Aliases: maxItems, limit.

## `datasetId` (type: `string`):

Optional. Read names from another run's dataset, e.g. a supplier or customer export. In an integration the triggering run's dataset is used automatically.

## `nameField` (type: `string`):

Field with the name. Auto-detected from name, fullName, companyName, company, legalName, title and more. Dot paths work, e.g. "owner.name".

## `countryField` (type: `string`):

Optional field with a country (code or name). Auto-detected from country, countryCode, nationality, location.

## `datasetMaxItems` (type: `integer`):

Read at most this many items from datasetId (default 1000).

## `alwaysDownloadFresh` (type: `boolean`):

Off (default): use the copy of each list downloaded from the official source within the last maxListAgeHours (refreshed every 6 hours), which makes runs fast. On: download every list from the government sites in this run (adds 1-2 minutes).

## `maxListAgeHours` (type: `integer`):

Use the cached copy of a list only if it was downloaded from the official source within this many hours (default 24, min 1). Older lists are downloaded live.

## `downloadTimeoutSecs` (type: `integer`):

Per-file timeout for downloading a list (default 150). A list that cannot be downloaded is reported in listsNotChecked and its rows are not charged.

## Actor input object example

```json
{
  "names": [
    "Vladimir Putin | RU",
    "Rosneft",
    "Bank Melli Iran",
    "Microsoft Corporation"
  ],
  "lists": [
    "ofac_sdn",
    "ofac_consolidated",
    "un",
    "eu",
    "uk"
  ],
  "minScore": 85,
  "entityType": "any",
  "maxMatchesPerName": 5,
  "defaultCountry": "",
  "maxNames": 10000,
  "datasetMaxItems": 1000,
  "alwaysDownloadFresh": false,
  "maxListAgeHours": 24,
  "downloadTimeoutSecs": 150
}
```

# Actor output Schema

## `results` (type: `string`):

One row per name. Example: {"name":"Rosneft","status":"potential_match","topScore":100,"matches":\[{"list":"uk","listedName":"ROSNEFT"}]}. Clear: {"name":"Acme Ltd","status":"clear","matchCount":0}.

## `summary` (type: `string`):

JSON: namesRequested, screened, clear, potentialMatches, byStatus, lists (records and list date per source), listsNotChecked, zeroResultsReason, nextSteps.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "names": [
        "Vladimir Putin | RU",
        "Rosneft",
        "Bank Melli Iran",
        "Microsoft Corporation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("swillz/sanctions-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "names": [
        "Vladimir Putin | RU",
        "Rosneft",
        "Bank Melli Iran",
        "Microsoft Corporation",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("swillz/sanctions-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "names": [
    "Vladimir Putin | RU",
    "Rosneft",
    "Bank Melli Iran",
    "Microsoft Corporation"
  ]
}' |
apify call swillz/sanctions-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,swillz/sanctions-screener"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/o0puhFPXhW9Bx1tD3/builds/14oeokt6DcRc0ShhH/openapi.json
