# Sanctions & Watchlist Screening — Risk-Scored Decisions (`maximedupre/sanctions-screening`) Actor

Screen up to 500 names against OFAC, EU, UK OFSI, and UN sanctions lists. Get possible matches, risk levels, review steps, source links, and clear outcomes without a separate data API key.

- **URL**: https://apify.com/maximedupre/sanctions-screening.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (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.35 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🛡️ Screen names against global sanctions lists

Built for compliance teams, risk analysts, and developers, this Actor screens up to 500 people or organizations against official OFAC, EU, UK OFSI, and UN lists. It returns one clear outcome per name, possible matches, risk levels, source evidence, and next review steps. No separate data API key is needed.

- Check names with **[OFAC sanctions screening](https://apify.com/maximedupre/sanctions-screening/examples/ofac-sanctions-screening)** before onboarding.
- Run **[global sanctions screening](https://apify.com/maximedupre/sanctions-screening/examples/global-sanctions-screening)** across all four supported authorities.
- Add recurring checks to an **[AML sanctions screening](https://apify.com/maximedupre/sanctions-screening/examples/aml-sanctions-screening)** workflow.
- Check political exposure with the **[PEP screening tool](https://apify.com/maximedupre/sanctions-screening/examples/pep-screening-tool)** option.
- Search one authority with **[UN sanctions screening](https://apify.com/maximedupre/sanctions-screening/examples/un-sanctions-screening)**.
- Review names and source evidence with the **[sanctions list search tool](https://apify.com/maximedupre/sanctions-screening/examples/sanctions-list-search-tool)** task.
- Compare possible hits with an **[OFAC screening tool](https://apify.com/maximedupre/sanctions-screening/examples/ofac-screening-tool)** run.
- Add a ready-made **[sanctions screening tool](https://apify.com/maximedupre/sanctions-screening/examples/sanctions-screening-tool)** to a compliance process.

#### 📦 What data does the Actor return?

Each dataset row covers one submitted name. It gives a `potential-match` or `clear` outcome, a risk level, reasons, review readiness, and source coverage. Possible matches can include aliases, authorities, programs, countries, birth facts, identifiers, addresses, remarks, listing dates, and official source links.

A possible match is not identity proof or legal advice. Check the source evidence and use human review before you act.

#### ▶️ How to run the Actor

1. Add one or more people or organizations under **Names to screen**.
2. Add a date of birth, country, or identifier when you know it.
3. Choose the authorities, entity types, and name matching policy.
4. Turn on PEP data or recurring review options when needed.
5. Click **Start** and open the dataset when the run ends.

#### 📥 Input

| Field | Type | What it does |
|---|---|---|
| `subjects` | object\[] | Adds 1 to 500 names to screen. |
| `subjects[].name` | string | Gives the required full name. |
| `subjects[].dateOfBirth` | string | Adds a known birth date for match checks. |
| `subjects[].country` | string | Adds a known country, nationality, or place of birth. |
| `subjects[].identifier` | string | Adds a passport, national ID, company number, vessel ID, or aircraft ID. |
| `authorities` | string\[] | Chooses OFAC, EU, UK OFSI, or UN lists. All four are used when omitted. |
| `includePepWatchlists` | boolean | Also checks PEP and related watchlist data. |
| `entityTypes` | string\[] | Limits matches to people, organizations, vessels, or aircraft. All kinds are used when omitted. |
| `matchingPolicy` | string | Uses `strict`, `balanced`, or `broad` name matching. |
| `monitorName` | string | Gives a recurring screen a stable name for change tracking. |
| `previousRunDataset` | string | Selects an earlier Apify dataset for match comparison and review history. |
| `reviewDecisions` | object\[] | Adds past analyst decisions to this review. |
| `reviewDecisions[].matchId` | string | Gives the stable match ID from an earlier result. |
| `reviewDecisions[].decision` | string | Sets `cleared-false-positive`, `needs-review`, or `confirmed-match`. |
| `reviewDecisions[].reason` | string | Adds a short reason for the decision. |
| `suppressClearedMatches` | boolean | Hides past cleared false positives while still counting them. |

This example is the public input from a successful default-input run:

```json
{
  "subjects": [
    {
      "name": "Vladimir Putin",
      "dateOfBirth": "1952-10-07",
      "country": "Russia"
    }
  ],
  "authorities": [
    "ofac",
    "eu",
    "ofsi",
    "un"
  ],
  "includePepWatchlists": false,
  "entityTypes": [
    "person",
    "organization",
    "vessel",
    "aircraft"
  ],
  "matchingPolicy": "balanced",
  "suppressClearedMatches": false
}
```

#### 📤 Output

The dataset has one output shape. Optional fields appear when you submit extra details or use recurring review.

| Field | Type | What it does |
|---|---|---|
| `screenedName` | string | Shows the submitted name. |
| `outcome` | string | Shows `potential-match` or `clear`. |
| `riskLevel` | string | Gives the human-review priority level. |
| `recommendedAction` | string | Gives the suggested next review step. |
| `reasons` | string\[] | Explains the outcome and risk. |
| `submittedDetails` | object | Shows submitted facts used for checks. |
| `submittedDetails.dateOfBirth` | string | Shows the submitted birth date. |
| `submittedDetails.country` | string | Shows the submitted country detail. |
| `submittedDetails.identifier` | string | Shows the submitted official ID. |
| `reviewReadiness` | object | Says whether the facts are enough for useful review. |
| `reviewReadiness.level` | string | Gives `ready`, `limited`, or `insufficient`. |
| `reviewReadiness.missingDetails` | string\[] | Lists details that could improve confidence. |
| `matches` | object\[] | Lists possible matches in review order. |
| `matches[].matchId` | string | Gives a stable subject-and-source match ID. |
| `matches[].matchedName` | string | Shows the source record's main name. |
| `matches[].aliases` | string\[] | Lists other published names. |
| `matches[].entityType` | string | Shows the matched entity kind. |
| `matches[].score` | number | Gives name match strength from 0 to 100. |
| `matches[].matchStrength` | string | Groups the score as `exact`, `strong`, or `possible`. |
| `matches[].categories` | string\[] | Shows whether sanctions, PEP, or watchlist data caused the hit. |
| `matches[].authorities` | string\[] | Lists authorities that published the record. |
| `matches[].programs` | string\[] | Lists linked sanctions or watchlist programs. |
| `matches[].countries` | string\[] | Lists linked countries. |
| `matches[].nationalities` | string\[] | Lists published nationalities. |
| `matches[].datesOfBirth` | string\[] | Lists published birth dates. |
| `matches[].placesOfBirth` | string\[] | Lists published birth places. |
| `matches[].identifiers` | object\[] | Lists published official IDs. |
| `matches[].identifiers[].type` | string | Names the ID kind. |
| `matches[].identifiers[].value` | string | Gives the published ID value. |
| `matches[].identifiers[].country` | string | Gives the issuing country when known. |
| `matches[].addresses` | string\[] | Lists published addresses. |
| `matches[].remarks` | string\[] | Lists source authority notes. |
| `matches[].listingDates` | string\[] | Lists dates when authorities added the entity. |
| `matches[].sourceIds` | string\[] | Lists official record IDs. |
| `matches[].sourceLinks` | string\[] | Links to official pages or files used for review. |
| `matches[].corroboration` | object\[] | Compares submitted facts with source facts. |
| `matches[].corroboration[].field` | string | Names the checked fact. |
| `matches[].corroboration[].result` | string | Gives `agree`, `conflict`, or `unknown`. |
| `matches[].corroboration[].reason` | string | Explains the check result. |
| `matches[].changeStatus` | string | Shows how a recurring match changed. |
| `matches[].changeReason` | string | Explains a material change. |
| `matches[].reviewDecision` | object | Shows a carried-forward analyst decision. |
| `matches[].reviewDecision.decision` | string | Gives the saved decision. |
| `matches[].reviewDecision.reason` | string | Gives the saved reason when present. |
| `suppressedMatchCount` | integer | Counts earlier cleared false positives hidden from this row. |
| `monitorName` | string | Shows the recurring screen name. |
| `sourceCoverage` | object\[] | Shows whether each requested list was checked. |
| `sourceCoverage[].authority` | string | Names the requested authority. |
| `sourceCoverage[].status` | string | Gives `covered`, `failed`, or `unavailable`. |
| `sourceCoverage[].message` | string | Explains a source gap or failure. |

Full row from the successful default-input run:

```json
{
  "screenedName": "Vladimir Putin",
  "outcome": "potential-match",
  "riskLevel": "high",
  "recommendedAction": "Review this match now.",
  "reasons": [
    "3 possible matches were found."
  ],
  "submittedDetails": {
    "dateOfBirth": "1952-10-07",
    "country": "Russia"
  },
  "reviewReadiness": {
    "level": "ready",
    "missingDetails": [
      "identifier"
    ]
  },
  "matches": [
    {
      "matchId": "a1dcfce3de5113025d0c1f32",
      "matchedName": "Vladimir Putin",
      "aliases": [
        "Vladimir Vladimirovich PUTIN",
        "Vladimir Putin",
        "владимир владимирович путин"
      ],
      "entityType": "person",
      "score": 100,
      "matchStrength": "exact",
      "categories": [
        "sanctions"
      ],
      "authorities": [
        "ofsi",
        "ofac"
      ],
      "programs": [],
      "countries": [
        "ru"
      ],
      "nationalities": [
        "ru"
      ],
      "datesOfBirth": [
        "1952-10-07"
      ],
      "placesOfBirth": [
        "St Petersburg (then Leningrad)",
        "Russia"
      ],
      "identifiers": [],
      "addresses": [
        "Moscow, Russia"
      ],
      "remarks": [
        "The Director Disqualification Sanction was imposed on 09/04/2025."
      ],
      "listingDates": [],
      "sourceIds": [
        "Q7747"
      ],
      "sourceLinks": [
        "https://www.gov.uk/government/publications/the-uk-sanctions-list",
        "https://sanctionssearch.ofac.treas.gov/",
        "https://www.opensanctions.org/entities/Q7747/",
        "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=35096"
      ],
      "corroboration": [
        {
          "field": "dateOfBirth",
          "result": "agree",
          "reason": "The submitted detail agrees with the source."
        },
        {
          "field": "country",
          "result": "agree",
          "reason": "The submitted detail agrees with the source."
        }
      ]
    },
    {
      "matchId": "d1ff4e2e79f2b697e42075e5",
      "matchedName": "Vladimir Anatolyevich Tyurin",
      "aliases": [
        "Vladimir Anatolyevich Tyurin",
        "ВЛАДИМИР АНАТОЛЬЕВИЧ ТЮРИН",
        "Vladimir Turiyan",
        "Aleksei Vladimirovich Pugachev",
        "Volodya Tyurin",
        "Alexei Pavlovich Pugachev",
        "Vladimir Tiurin",
        "Vladimir Tiorine",
        "АЛЕКСЕЙ ВЛАДИМИРОВИЧ ПУГАЧЕВ",
        "Anatoly Tyurine",
        "Anatoly Tyurin",
        "Vladimir Tiurine",
        "Vladimir Turin",
        "Vladimir Tiourine",
        "Vladimir Tyurine",
        "Wladimir Tjurin",
        "Vladimir Pavlovich Gromov",
        "Anatolievich Turin",
        "ВЛАДИМИР ПАВЛОВИЧ ГРОМОВ",
        "Vladimir Tjrurin",
        "Vladimir Anatolievich Tyurin",
        "Alexey Pugachev"
      ],
      "entityType": "person",
      "score": 86,
      "matchStrength": "strong",
      "categories": [
        "sanctions"
      ],
      "authorities": [
        "ofac"
      ],
      "programs": [],
      "countries": [
        "be",
        "ru"
      ],
      "nationalities": [],
      "datesOfBirth": [
        "1958-11-25",
        "1958-12-20"
      ],
      "placesOfBirth": [
        "Bratsk, Russia",
        "Irkutsk, Russia",
        "Tirlyan, Beloretskiy Rayon, Bashkiria, Russia"
      ],
      "identifiers": [
        {
          "type": "passportNumber",
          "value": "410579055"
        },
        {
          "type": "passportNumber",
          "value": "432062125"
        },
        {
          "type": "passportNumber",
          "value": "4511264874"
        },
        {
          "type": "passportNumber",
          "value": "EA804478"
        }
      ],
      "addresses": [
        "Moscow"
      ],
      "remarks": [],
      "listingDates": [],
      "sourceIds": [
        "Q4467629"
      ],
      "sourceLinks": [
        "https://sanctionssearch.ofac.treas.gov/",
        "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=23243",
        "https://www.opensanctions.org/entities/Q4467629/"
      ],
      "corroboration": [
        {
          "field": "dateOfBirth",
          "result": "conflict",
          "reason": "The submitted detail differs from the source."
        },
        {
          "field": "country",
          "result": "conflict",
          "reason": "The submitted detail differs from the source."
        }
      ]
    },
    {
      "matchId": "b06d96a9f1d384daf70d0256",
      "matchedName": "Владимир Иванович ШАСТИН",
      "aliases": [
        "Vladimir Ivanovich SHASTIN",
        "Владимир Иванович ШАСТИН",
        "Vladimir Šastin"
      ],
      "entityType": "person",
      "score": 80,
      "matchStrength": "possible",
      "categories": [
        "sanctions"
      ],
      "authorities": [
        "eu"
      ],
      "programs": [],
      "countries": [],
      "nationalities": [
        "ru"
      ],
      "datesOfBirth": [],
      "placesOfBirth": [],
      "identifiers": [
        {
          "type": "idNumber",
          "value": "253606386404"
        }
      ],
      "addresses": [],
      "remarks": [],
      "listingDates": [],
      "sourceIds": [
        "NK-BVtC79976DQPuMFyxZpPcK"
      ],
      "sourceLinks": [
        "https://data.europa.eu/data/datasets/consolidated-list-of-persons-groups-and-entities-subject-to-eu-financial-sanctions",
        "https://www.opensanctions.org/entities/NK-BVtC79976DQPuMFyxZpPcK/"
      ],
      "corroboration": [
        {
          "field": "dateOfBirth",
          "result": "unknown",
          "reason": "The source does not publish this detail."
        },
        {
          "field": "country",
          "result": "conflict",
          "reason": "The submitted detail differs from the source."
        }
      ]
    }
  ],
  "suppressedMatchCount": 0,
  "sourceCoverage": [
    {
      "authority": "ofsi",
      "status": "covered"
    },
    {
      "authority": "eu",
      "status": "covered"
    },
    {
      "authority": "ofac",
      "status": "covered"
    },
    {
      "authority": "un",
      "status": "covered"
    }
  ]
}
```

#### 💳 Pricing

You pay once for each submitted name screened against the selected sanctions and watchlists. A screen is charged even when it has no possible match. Apify shows the current event price before you start a run.

#### 🔌 Integrations

Send dataset rows to Google Sheets, Slack, webhooks, Make, Zapier, or your own app with the Apify API. You can also schedule recurring screens in Apify.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What is sanctions screening?

Sanctions screening checks a person or organization name against lists published by authorities. This Actor checks supported OFAC, EU, UK OFSI, and UN lists and returns evidence for human review.

##### Does a potential match prove identity?

No. Name similarity is not identity proof. Use birth facts, country details, identifiers, and official source links to review each hit.

##### Can I screen many names at once?

Yes. One run accepts from 1 to 500 subjects under one shared set of list and matching settings.

##### Can I check PEP data?

Yes. Turn on `includePepWatchlists`. Each hit shows the category that caused it.

##### Can I track changes over time?

Yes. Use a stable `monitorName` and select `previousRunDataset`. Later runs can show new, changed, and resolved matches and carry forward analyst decisions.

##### Is a separate sanctions API key needed?

No. Core screening does not ask you for a third-party data API key.

### 📝 Changelog

#### 0.0: Initial release

- Screen names against OFAC, EU, UK OFSI, UN, PEP, and related watchlists with risk-scored matches, source evidence, and recurring review support.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~sanctions-screening/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [GLEIF LEI Lookup](https://apify.com/maximedupre/gleif-lei-lookup) — verify company identity and ownership data before a sanctions review.
- [Sanctions & Watchlist Screening — Risk-Scored Decisions](https://apify.com/ryanclinton/opensanctions-search) — use OpenSanctions for an adjacent sanctions and watchlist workflow.
- [OFAC Sanctions List Search — SDN Screening with Fuzzy Matching](https://apify.com/ryanclinton/ofac-sanctions-search) — focus a review on the US OFAC SDN list.
- [Interpol Red Notice & Wanted Persons Search](https://apify.com/ryanclinton/interpol-red-notices) — add wanted-person checks to due diligence.
- [EU Consolidated Sanctions List Tracker API](https://apify.com/nexgendata/eu-consolidated-sanctions-tracker) — inspect normalized EU sanctions records and list updates.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `subjects` (type: `array`):

Add up to 500 people or organizations. A name is required. Date of birth, country, and an official identifier can help check a possible match.

## `authorities` (type: `array`):

Choose the official lists to check. All four are checked when this field is omitted.

## `includePepWatchlists` (type: `boolean`):

Also check PEP and related watchlist data. Results show which category caused each hit.

## `entityTypes` (type: `array`):

Limit results to these kinds of entities. All kinds are checked when this field is omitted.

## `matchingPolicy` (type: `string`):

Balanced works well for most screens. Strict finds closer names. Broad finds more spelling and transliteration variants but may need more review.

## `monitorName` (type: `string`):

Give a recurring screen a stable name so later runs can report new, changed, and resolved matches.

## `previousRunDataset` (type: `string`):

Choose the Apify dataset from the earlier screen. This lets the Actor compare matches and keep review history.

## `reviewDecisions` (type: `array`):

Add past decisions to keep with this review. Use the match ID from an earlier result.

## `suppressClearedMatches` (type: `boolean`):

Hide matches marked as cleared in past decisions. The result still reports how many were hidden.

## `__isDebug` (type: `boolean`):

Internal debug setting.

## `__concurrency` (type: `integer`):

Internal concurrency setting.

## Actor input object example

```json
{
  "subjects": [
    {
      "name": "Vladimir Putin",
      "dateOfBirth": "1952-10-07",
      "country": "Russia"
    }
  ],
  "authorities": [
    "ofac",
    "eu",
    "ofsi",
    "un"
  ],
  "includePepWatchlists": false,
  "entityTypes": [
    "person",
    "organization",
    "vessel",
    "aircraft"
  ],
  "matchingPolicy": "balanced",
  "suppressClearedMatches": false
}
```

# Actor output Schema

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

One result for each screened name, with the outcome, risk, review steps, and possible matches.

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

A JSON summary with totals, the highest risk, covered lists, source gaps, and the top matches to review.

# 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 = {
    "subjects": [
        {
            "name": "Vladimir Putin",
            "dateOfBirth": "1952-10-07",
            "country": "Russia"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/sanctions-screening").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 = { "subjects": [{
            "name": "Vladimir Putin",
            "dateOfBirth": "1952-10-07",
            "country": "Russia",
        }] }

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

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

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

```

## CLI example

```bash
echo '{
  "subjects": [
    {
      "name": "Vladimir Putin",
      "dateOfBirth": "1952-10-07",
      "country": "Russia"
    }
  ]
}' |
apify call maximedupre/sanctions-screening --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/sanctions-screening",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/VWBKcb03eA3znxZVu/builds/gqyQdWNUpvYyRj25Q/openapi.json
