# Sanctions Screening API: OFAC, UK, EU & US export lists (`bosco_labs/sanctions-screening`) Actor

Is this company, vessel or person sanctioned? Returns per name: match yes/no, the listed entry, aliases, programs, listing date, identifiers and a source link, from the official OFAC SDN and non-SDN, US Consolidated Screening List, UK Sanctions List and EU lists, with each list's date.

- **URL**: https://apify.com/bosco_labs/sanctions-screening.md
- **Developed by:** [Bosco Labs](https://apify.com/bosco_labs) (community)
- **Categories:** Business, AI, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 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.

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 Screening API: OFAC, UK, EU & US export lists

**Answers "is this company, vessel or person sanctioned?"** for one or many names, against the
official OFAC SDN and non-SDN lists, the US Consolidated Screening List (Commerce Entity List,
Denied Persons, State lists), the UK Sanctions List and the EU financial sanctions list. Every
answer says which lists were checked and how current they were, and every match links to its
official source. Built for **AI agents** doing KYB, compliance or procurement checks, and for
people who need a quick, sourced screen.

**Pricing (pay per event):** $0.01 per name screened, match or no match. A run that cannot
load any list fails and costs nothing.

### What you get

One row per name. Real output for `{"names": ["Sovcomflot", "Novo Nordisk A/S"]}` (run on
2026-11-05, shortened: `lists_checked` shown once, one match of three):

```json
{
  "schema_version": "1",
  "query": "Sovcomflot",
  "match_found": true,
  "match_count": 3,
  "best_score": 100,
  "summary": "3 possible match(es) >= 85; best 100 'JOINT STOCK COMPANY SOVCOMFLOT' on the OFAC SDN List. A name match alone does not confirm identity: compare countries, identifiers and dates before acting.",
  "matches": [
    {
      "list": "ofac_sdn",
      "list_name": "OFAC SDN List",
      "entry_id": "34741",
      "listed_name": "JOINT STOCK COMPANY SOVCOMFLOT",
      "matched_name": "JOINT STOCK COMPANY SOVCOMFLOT",
      "matched_alias": false,
      "match_type": "exact",
      "score": 100,
      "aliases": ["PAO SOVCOMFLOT", "JSC SOVCOMFLOT", "SCF GROUP", "SCF"],
      "entity_type": "organization",
      "programs": ["RUSSIA-EO14024", "UKRAINE-EO13662"],
      "listing_date": null,
      "end_date": null,
      "countries": ["RU"],
      "country_match": null,
      "identifiers": [
        {"type": "Tax ID No.", "value": "7702060116"},
        {"type": "Registration Number", "value": "1027739028712"},
        {"type": "Legal Entity Number", "value": "253400DYLWR5A6YAWJ69"}
      ],
      "birth_dates": [],
      "source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=34741",
      "list_version_date": "2026-11-05"
    }
  ],
  "warnings": [],
  "min_score": 85,
  "entity_type": "any",
  "country": null,
  "checked_at": "2026-11-05T21:47:49+00:00"
}
```

The other two matches are the UK listing (`RUS1097`, designated 2022-03-24) and the EU listing
(`EU.11824.28`, listed 2024-06-24, `source_url` = its Official Journal act). The no-match row
is just as explicit:

```json
{
  "query": "Novo Nordisk A/S",
  "match_found": false,
  "match_count": 0,
  "best_score": null,
  "summary": "No match >= 85 for 'Novo Nordisk A/S'. Checked: OFAC SDN List 2026-11-05, OFAC Consolidated (non-SDN) List 2026-11-04, US Consolidated Screening List (Commerce, State) 2026-11-05, UK Sanctions List 2026-11-03, EU Consolidated Financial Sanctions List 2026-10-23.",
  "matches": [],
  "lists_checked": [
    {
      "list": "ofac_sdn",
      "list_name": "OFAC SDN List",
      "version_date": "2026-11-05",
      "fetched_at": "2026-11-05T21:47:21.253058+00:00",
      "entries": 19555,
      "file_url": "https://sanctionslistservice.ofac.treas.gov/api/PublicationPreview/exports/SDN.XML"
    }
  ],
  "warnings": []
}
```

- **matches**: the top 5 listings at or above `minScore`, best first, with the name that
  matched (`matched_name`, `matched_alias`), how it matched (`match_type`: `exact`, `fuzzy` or
  `contains`), the programs or regimes, listing date, countries (ISO-2), identifiers and birth
  dates as the list publishes them, and the official `source_url`.
- **lists_checked**: every list behind the answer, with its publish date, download time and
  entry count. Put this in your audit trail.
- **warnings**: a list that could not be downloaded is named here (checked from a cached copy,
  or not checked at all). One list being down never fails the run.

### Input

```json
{ "names": ["Sovcomflot", "Huawei Technologies", "Petrel 8"], "entityType": "any", "minScore": 85 }
```

| Field | Meaning |
|---|---|
| `names` | 1-200 company, vessel or person names. Required |
| `country` | Optional ISO-2 code or English name (`RU`, `Russia`) of the party you screen. Never hides a match; listings in other countries go last with `country_match: false` |
| `entityType` | `any` (default), `organization`, `person` or `vessel`. Listings without a stated type are always kept |
| `minScore` | 50-100, default 85. 100 = same name after normalisation |
| `lists` | Any of `ofac_sdn`, `ofac_consolidated`, `us_csl`, `uk`, `eu`. Default all |

**How names are matched:** case, accents, punctuation, legal forms (Ltd, LLC, GmbH, PJSC,
"joint stock company", ...) and word order are ignored, and every alias the list gives is
checked. Score 100 = same words; 90-99 = small spelling differences, or the query is part of a
longer listed name (`contains`: "Huawei" finds "Huawei Technologies Co., Ltd."); lower scores
are looser variants. A one-word query only finds listed names that start with that word.

### Use from an AI agent (MCP)

Agents can call this Actor as a tool through the
[Apify MCP server](https://github.com/apify/apify-mcp-server). Add this server URL to your MCP
client (Claude, Cursor, VS Code, ...):

```text
https://mcp.apify.com?tools=bosco_labs/sanctions-screening
```

It loads this Actor as a tool, plus the tools that read its results (`get-actor-run`,
`get-dataset-items`). The hosted server signs you in with OAuth, or accepts your Apify token as
`Authorization: Bearer <APIFY_TOKEN>`.

Example prompt: *"Before we sign with these suppliers, check whether Sovcomflot or Novo Nordisk
A/S are on any sanctions list, and cite the lists you checked."* The agent passes:

```json
{ "names": ["Sovcomflot", "Novo Nordisk A/S"] }
```

**Output for agents:** one small row per name (typically 2-7 KB), stable `snake_case` fields,
ISO dates, `null` for unknown. `summary` is one sentence the agent can repeat; `match_found`
is the yes/no; `lists_checked` gives the dates for the citation. A cold run (lists downloaded
fresh) takes about 15-20 seconds; runs within an hour of the last one reuse the parsed lists and
take a few seconds.

**Cost:** $0.01 per name screened, billed to the Apify account the MCP server is signed in
with. Nothing is charged when no list can be loaded.

### FAQ

**Is this legal advice or a compliance decision?** No. It is a screening aid. Fuzzy name
matching produces false positives (a namesake) and can miss a party listed under a spelling or
script it doesn't recognise. Review every match against the official entry (`source_url`)
before acting, and use your own judgement or counsel for decisions. Only the official
publications are authoritative (for the EU, the Official Journal).

**Which lists are covered?**

| List | Publisher | Entries (2026-11-05) |
|---|---|---|
| `ofac_sdn` OFAC Specially Designated Nationals | US Treasury | 19,555 |
| `ofac_consolidated` OFAC non-SDN lists (SSI, NS-MBS, CMIC, PLC, ...) | US Treasury | 486 |
| `us_csl` Consolidated Screening List: Entity List, Denied Persons, Unverified, Military End User (Commerce/BIS); ITAR debarred, Nonproliferation (State) | US ITA | 6,213 |
| `uk` UK Sanctions List (replaced the OFSI list on 28 Jan 2026) | UK FCDO | 6,420 |
| `eu` EU Consolidated Financial Sanctions List | European Commission | 6,269 |

The CSL's Treasury sub-lists are skipped because the same entries come from OFAC directly.

**What is not covered?** The UN Security Council list is not used directly (its terms don't
allow redistribution), but UN designations are largely included in the UK and EU lists.
National lists of other countries, PEPs (politically exposed persons), adverse media,
ownership (the OFAC 50% rule: companies owned by listed parties are often not listed
themselves) and EU sectoral or vessel annexes outside the financial sanctions list are not
covered.

**How fresh is it?** Each run uses the lists as published at most 1 hour earlier; older copies
are downloaded again. `lists_checked` shows each list's own publish date. Agencies publish on
their own schedule (OFAC and the CSL often daily, the UK and EU when designations change).

**Why is `listing_date` null for OFAC?** OFAC's standard XML doesn't include designation dates
(only its 110 MB "enhanced" file does). Check the OFAC entry page in `source_url`.

**Personal data?** The lists name individuals. This Actor serves only per-name screening
results (at most 5 listings per name, no bulk export) for sanctions compliance, and keeps only
the fields needed to confirm or rule out a match. See `LEGAL.md`.

**Attribution.** OFAC and CSL data are US government works. This product uses the
International Trade Administration's Data API but is not endorsed or certified by the
International Trade Administration. Contains public sector information licensed under the
Open Government Licence v3.0 (UK Sanctions List). EU data: European Commission, Consolidated
list of persons, groups and entities subject to EU financial sanctions; reformatted for
matching, names as published. No endorsement by any publisher is implied.

# Actor input Schema

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

Company, vessel or person names to check, one per entry, as plain text, e.g. \["Sovcomflot", "Novo Nordisk A/S", "Vladimir Putin"]. Legal forms (Ltd, LLC, GmbH, PJSC), accents, punctuation and word order are ignored. 1-200 names; each name gives one result row and one charge; repeats are screened once. Required.

## `country` (type: `string`):

Country of the party you are screening, as an ISO 3166 alpha-2 code or English name, e.g. "RU" or "Russia". It never hides a match: listings that name other countries move to the end and get country_match false. Empty = no country ranking.

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

Only return listings of this type, e.g. "organization". Default "any". Listings whose type the list does not state (the US Commerce and State lists) are always kept.

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

Lowest similarity score (0-100) that counts as a match, e.g. 85 (default). 100 = same name after normalisation; 90-99 = small spelling differences or the name inside a longer listed name; lower values find more variants and more false positives. Range 50-100.

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

Which lists to check, any of "ofac_sdn", "ofac_consolidated", "us_csl", "uk", "eu", e.g. \["ofac_sdn", "uk"]. Default (or empty) = all five. The price is the same for any number of lists.

## Actor input object example

```json
{
  "names": [
    "Sovcomflot",
    "Novo Nordisk A/S"
  ],
  "entityType": "any",
  "minScore": 85
}
```

# Actor output Schema

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

No description

# 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": [
        "Sovcomflot",
        "Novo Nordisk A/S"
    ],
    "minScore": 85
};

// Run the Actor and wait for it to finish
const run = await client.actor("bosco_labs/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 = {
    "names": [
        "Sovcomflot",
        "Novo Nordisk A/S",
    ],
    "minScore": 85,
}

# Run the Actor and wait for it to finish
run = client.actor("bosco_labs/sanctions-screening").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": [
    "Sovcomflot",
    "Novo Nordisk A/S"
  ],
  "minScore": 85
}' |
apify call bosco_labs/sanctions-screening --silent --output-dataset

```

## MCP server setup

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

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/QzAOIqHa9a7x3kVSP/builds/7Uqwkc8ysRjJHwCXH/openapi.json
