# Sanctions Screening API (`sourcing-data-studio/sanctions-screening-api`) Actor

Unofficial sanctions screening API: checks supplier and company names against the US Consolidated Screening List (BIS Entity List, OFAC SDN and more) and the UK Sanctions List. One row per name with match, possible match or no match and scores. Screening aid only.

- **URL**: https://apify.com/sourcing-data-studio/sanctions-screening-api.md
- **Developed by:** [Sourcing Data Studio](https://apify.com/sourcing-data-studio) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
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

Screen a new supplier before you pay a deposit. Sanctions Screening API checks company, vessel and aircraft names against the US Consolidated Screening List, which includes the OFAC SDN and BIS Entity Lists, and the UK Sanctions List, and returns one row per name: match, possible match or no match, a score and the entries that matched. Screening aid only. You pay per name screened: $0.005 per screened name on the Free tier, so a typical query (a supplier list of 50 company names) costs $0.25.

Unofficial: not affiliated with or endorsed by the U.S. Department of Commerce, OFAC or the UK Foreign, Commonwealth and Development Office.

Source: Consolidated Screening List, International Trade Administration, U.S. Department of Commerce.

Contains public sector information licensed under the Open Government Licence v3.0.

Screening aid only. A match needs further due diligence against the official publication; no match is not a clearance.

Sanctions Screening API is also used for denied party screening and restricted party screening of customers, freight partners and banks named on an invoice, and as a supplier sanctions check inside an onboarding workflow.

### What does Sanctions Screening API do?

- Downloads the current US Consolidated Screening List from trade.gov and the current UK Sanctions List, once per run each.
- Covers the lists inside the US file: BIS Entity List, Military End User List, Unverified List and Denied Persons List, the OFAC SDN list and other OFAC lists, and State Department lists. One run is a BIS Entity List check, an OFAC SDN check and a UK sanctions list check at the same time.
- Compares each name with the primary names and the aliases of the list entries. Legal forms such as "Co., Ltd.", "LLC" or "GmbH", capital letters, accents and punctuation do not prevent a match.
- Returns one row per name with a status, a confidence band, the best score and the matching entries: list, programme, country, city, listing date, end date and a link to the official list.
- Returns a row for a name without a match too. A "no_match" row with the list dates is the record that you screened the name on that date; it is not a clearance.
- Screens organisations, vessels and aircraft only. Every entry that a list types as an organisation, a vessel or an aircraft is screened and shown, with its type on the row (`entityType`), also when the name of the company or ship contains a person's name, for example a trading company named after its owner or a ship named after a person. Private individuals are never shown: an entry that a list types as an individual is left out before matching and never appears in the output. Where a list gives no type (parts of the US list), an entry is kept only when its name is clearly an organisation (see Limits).
- Charges one event per screened name. If a list you selected cannot be downloaded, the run fails and nothing is charged for names.
- Says so when your **Maximum names screened** limit leaves names out: the status message and the run summary give "N of M names were NOT screened (limit X)".
- Writes a run summary with totals, list dates, record counts and your feedback to the key-value store.
- Works from Apify Console, the Apify API, n8n, Make and AI agents through the Apify MCP server, as a sanctions screening API and a consolidated screening list API.

### Output example

These rows come from a real run.

```json
[
  {
    "queryName": "Huawei Technologies Co., Ltd.",
    "status": "match",
    "confidenceBand": "match",
    "bestScore": 1,
    "matchCount": 37,
    "matches": [
      {
        "name": "Huawei Technologies Co., Ltd.",
        "matchedOn": "name",
        "matchedName": "Huawei Technologies Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Entity List (EL) - Bureau of Industry and Security",
        "jurisdiction": "US",
        "programs": [],
        "country": "HK",
        "city": null,
        "startDate": "2019-05-21",
        "endDate": null,
        "sourceListUrl": "https://www.bis.gov/regulations/ear/744#supplement-4-744",
        "sourceInformationUrl": "https://www.bis.gov/licensing/guidance-on-end-user-and-end-use-controls-and-us-person-controls"
      },
      {
        "name": "HUAWEI TECHNOLOGIES CO., LTD.",
        "matchedOn": "name",
        "matchedName": "HUAWEI TECHNOLOGIES CO., LTD.",
        "score": 1,
        "entityType": "organisation",
        "list": "Non-SDN Chinese Military-Industrial Complex Companies List (CMIC) - Treasury Department",
        "jurisdiction": "US",
        "programs": [
          "CMIC-EO13959"
        ],
        "country": "CN",
        "city": null,
        "startDate": null,
        "endDate": null,
        "sourceListUrl": "https://sanctionslist.ofac.treas.gov/Home/ConsolidatedList",
        "sourceInformationUrl": "https://ofac.treasury.gov/other-ofac-sanctions-lists"
      },
      {
        "name": "Huawei Technologies Co., Ltd. (Huawei)",
        "matchedOn": "alias",
        "matchedName": "Huawei Technologies Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Entity List (EL) - Bureau of Industry and Security",
        "jurisdiction": "US",
        "programs": [],
        "country": "CN",
        "city": "Shenzhen",
        "startDate": "2019-05-21",
        "endDate": null,
        "sourceListUrl": "https://www.bis.gov/regulations/ear/744#supplement-4-744",
        "sourceInformationUrl": "https://www.bis.gov/licensing/guidance-on-end-user-and-end-use-controls-and-us-person-controls"
      },
      {
        "name": "Huawei Technologies Co., Ltd. (Huawei). Affiliated Entity: Beijing Huawei Longshine Information Technology Co., Ltd.",
        "matchedOn": "alias",
        "matchedName": "Huawei Technologies Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Entity List (EL) - Bureau of Industry and Security",
        "jurisdiction": "US",
        "programs": [],
        "country": "CN",
        "city": "Beijing",
        "startDate": "2019-05-21",
        "endDate": null,
        "sourceListUrl": "https://www.bis.gov/regulations/ear/744#supplement-4-744",
        "sourceInformationUrl": "https://www.bis.gov/licensing/guidance-on-end-user-and-end-use-controls-and-us-person-controls"
      },
      {
        "name": "Huawei Technologies Co., Ltd. (Huawei). Affiliated Entity: Hangzhou Huawei Communication Technology Co., Ltd.",
        "matchedOn": "alias",
        "matchedName": "Huawei Technologies Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Entity List (EL) - Bureau of Industry and Security",
        "jurisdiction": "US",
        "programs": [],
        "country": "CN",
        "city": "Hangzhou",
        "startDate": "2019-05-21",
        "endDate": null,
        "sourceListUrl": "https://www.bis.gov/regulations/ear/744#supplement-4-744",
        "sourceInformationUrl": "https://www.bis.gov/licensing/guidance-on-end-user-and-end-use-controls-and-us-person-controls"
      }
    ],
    "listsChecked": [
      "US",
      "UK"
    ],
    "listDates": {
      "US": "2026-10-06T03:15:00.016Z",
      "UK": "2026-10-02"
    },
    "disclaimer": "Screening aid only. A match needs further due diligence against the official publication; no match is not a clearance.",
    "retrievedAt": "2026-10-06T03:59:58.272Z"
  },
  {
    "queryName": "Hangzhou Hikvision Digital Technology Co., Ltd.",
    "status": "match",
    "confidenceBand": "match",
    "bestScore": 1,
    "matchCount": 2,
    "matches": [
      {
        "name": "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "matchedOn": "name",
        "matchedName": "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Entity List (EL) - Bureau of Industry and Security",
        "jurisdiction": "US",
        "programs": [],
        "country": "CN",
        "city": "Hangzhou",
        "startDate": "2019-10-09",
        "endDate": null,
        "sourceListUrl": "https://www.bis.gov/regulations/ear/744#supplement-4-744",
        "sourceInformationUrl": "https://www.bis.gov/licensing/guidance-on-end-user-and-end-use-controls-and-us-person-controls"
      },
      {
        "name": "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "matchedOn": "name",
        "matchedName": "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "score": 1,
        "entityType": "organisation",
        "list": "Non-SDN Chinese Military-Industrial Complex Companies List (CMIC) - Treasury Department",
        "jurisdiction": "US",
        "programs": [
          "CMIC-EO13959"
        ],
        "country": "CN",
        "city": "Hangzhou",
        "startDate": null,
        "endDate": null,
        "sourceListUrl": "https://sanctionslist.ofac.treas.gov/Home/ConsolidatedList",
        "sourceInformationUrl": "https://ofac.treasury.gov/other-ofac-sanctions-lists"
      }
    ],
    "listsChecked": [
      "US",
      "UK"
    ],
    "listDates": {
      "US": "2026-10-06T03:15:00.016Z",
      "UK": "2026-10-02"
    },
    "disclaimer": "Screening aid only. A match needs further due diligence against the official publication; no match is not a clearance.",
    "retrievedAt": "2026-10-06T03:59:58.272Z"
  },
  {
    "queryName": "ZTE Corporation",
    "status": "no_match",
    "confidenceBand": "none",
    "bestScore": null,
    "matchCount": 0,
    "matches": [],
    "listsChecked": [
      "US",
      "UK"
    ],
    "listDates": {
      "US": "2026-10-06T03:15:00.016Z",
      "UK": "2026-10-02"
    },
    "disclaimer": "Screening aid only. A match needs further due diligence against the official publication; no match is not a clearance.",
    "retrievedAt": "2026-10-06T03:59:58.272Z"
  }
]
```

### What data can you get with Sanctions Screening API?

One row per screened name:

| Field | Type | Description |
|---|---|---|
| `queryName` | string | The company name you asked to screen, as you wrote it. |
| `status` | string | match: the best score is 0.95 or more. possible_match: the best score is between your minimum score and 0.95. no_match: no list entry reached your minimum score on the lists in listsChecked; it is not a clearance. |
| `confidenceBand` | string | The best score in one word, for filters and agents. match: the best score is 0.95 or more. possible: the best score is at or above your minimum score and below 0.95. none: no list entry reached your minimum score (bestScore is null); it is not a clearance. It ranks the row exactly as status does. |
| `bestScore` | number | Highest similarity score among the matches, from 0 to 1. 1 means the normalised names are identical. Null when no list entry reached your minimum score. |
| `matchCount` | integer | Number of list entries at or above your minimum score. Can be larger than the number of entries in matches. |
| `matches` | array | The matching list entries, best score first, cut to your maximum matches per name. Empty when no list entry reached your minimum score. Each entry has name, matchedOn (name or alias), matchedName, score, entityType (organisation, vessel or aircraft), list, jurisdiction (US or UK), programs, country, city, startDate, endDate, sourceListUrl and sourceInformationUrl. |
| `listsChecked` | array | Lists this name was screened against. This is always every list you selected: when a selected list cannot be downloaded, the run fails and no row is saved or charged. |
| `listDates` | object | Date of each checked list, as stated in the downloaded file: for US the time the file was generated, for UK the date the list was generated. |
| `disclaimer` | string | Always this text: Screening aid only. A match needs further due diligence against the official publication; no match is not a clearance. |
| `retrievedAt` | string | ISO 8601 time when the names were screened. |

Each entry in `matches` has these fields:

| Field | Type | Description |
|---|---|---|
| `name` | string | Primary name of the list entry. When an entry names a person and an organisation together, only the organisation is given. When an entry gives a former or other name in the same field ("f.k.a.", "a.k.a."), the first name is given. |
| `matchedOn` | string | `name` or `alias`: which name of the entry matched. |
| `matchedName` | string | The primary name or alias that produced the score. |
| `score` | number | Similarity score from 0 to 1. Only an identical normalised name scores 1. |
| `entityType` | string | What the list says the entry is: `organisation` (a company, group or other organisation), `vessel` or `aircraft`. Private individuals are never in the results. A company or ship that carries a person's name is shown with its type, so you can see that the entry is a company or a ship. For an entry on a US list that gives no type, `organisation` is read from its name. |
| `list` | string | Name of the list the entry is on. |
| `jurisdiction` | string | `US` or `UK`. |
| `programs` | array | Sanctions programmes or regimes the list names for the entry. |
| `country` | string, optional | Country as the list gives it: mostly a two-letter code on the US list, a country name on the UK list. |
| `city` | string, optional | City, when the list gives one. A province or region in the place of the city is left out. No street address. |
| `startDate` | string, optional | Date the entry was listed (YYYY-MM-DD), when the list gives one. |
| `endDate` | string, optional | End date of the entry (YYYY-MM-DD) as the list publishes it, mostly on US denial orders. A date in the past does not mean the entry has ended: some orders are renewed while the published date stays old. |
| `sourceListUrl` | string, optional | Official page of the list. |
| `sourceInformationUrl` | string, optional | Official page with more information. |

#### How the score works

Names are put in lower case, accents and punctuation are removed and spaces are collapsed. An identical name scores 1. Otherwise the score is the larger of two measures: shared letter pairs, and shared words. Both are also tried with the legal form removed from both names. A score below 1 is never above 0.99.

One more rule helps with full legal names. When one name is the other with only generic words added, such as a province, a city or "Technology", the score is at least 0.90. Example: "Zhejiang Dahua Technology Co., Ltd." against the list entry "Dahua Technology". This gives a `possible_match`, never a `match`, and it needs a distinctive part of at least 5 characters and a list name of at least two words.

- `match`: best score 0.95 or more.
- `possible_match`: best score between your **Minimum score** (default 0.85) and 0.95.
- `no_match`: no entry reached your minimum score.

Every row also has a `confidenceBand`, the same ranking in one word for filters and agents: `match` (best score 0.95 or more), `possible` (best score at or above your **Minimum score** and below 0.95) or `none` (no entry reached your minimum score).

Very short names (fewer than 8 characters after cleaning) match only when they are identical to a list name or alias, with or without the legal form. This keeps a common word such as "Star" from matching unrelated entries. Generic words such as "Trading", "Technology" or a city name never make two names similar on their own: the part that tells one business from another must be similar too.

### How to use Sanctions Screening API

1. Click **Try for free** on this page.
2. Enter the **Company names**, one per line. Use the full legal name as written on the invoice or contract.
3. Keep **Minimum score** at 0.85, or lower it to catch more spelling variants. Leave **Maximum names screened** at 200 to screen every name; lower it only to cap your spending.
4. Click **Start**. A run takes about one minute, because both lists are downloaded fresh. Results appear in the **Output** tab.
5. Read the `status` of each row. For a `match` or `possible_match`, open `sourceListUrl` and check the entry in the official publication.
6. Download the results as JSON, CSV or Excel, or read them through the API. The **Matches, one per row** view gives one line per matching entry.

### Input examples

#### Quick test

```json
{
  "companyNames": [
    "Huawei Technologies Co., Ltd.",
    "Hangzhou Hikvision Digital Technology Co., Ltd.",
    "ZTE Corporation",
    "Anker Innovations Limited",
    "Example Trading LLC"
  ]
}
```

#### One list with a strict score

```json
{
  "companyNames": [
    "Semiconductor Manufacturing International Corporation",
    "SZ DJI Technology Co., Ltd.",
    "Shenzhen Example Electronics Co., Ltd."
  ],
  "lists": [
    "US"
  ],
  "minScore": 0.95,
  "maxMatchesPerName": 3
}
```

#### Supplier batch with spelling variants

```json
{
  "companyNames": [
    "Hikvision Digital Technology",
    "Dahua Technology Co Ltd",
    "Yangtze Memory Technologies",
    "Ningbo Example Plastic Products Factory"
  ],
  "minScore": 0.75,
  "maxMatchesPerName": 10,
  "maxItems": 50,
  "feedback": "Example: please add the EU consolidated sanctions list."
}
```

### How much does Sanctions Screening API cost?

| Event | You pay for | Free | Bronze | Silver | Gold |
|---|---|---|---|---|---|
| Name screened | One company name screened against the selected lists, with all matches found or a no-match result. Names are not charged when a selected list could not be downloaded. | $0.005 | $0.005 | $0.0045 | $0.004 |

Prices are per event. Your tier follows your Apify subscription plan.

On the Free tier, $0.005 per screened name means:

- 100 screened names cost $0.50.
- 1,000 screened names cost $5.00.
- A typical query (a supplier list of 50 company names) is 50 screened names and costs $0.25.

The price is per screened name, not per match. A name with five matches and a name with no match cost the same. Repeated names in one run are screened and charged once.

Apify also charges a tiny start fee per run (apify-actor-start, $0.00005 per GB of memory). Names that cannot be screened (no letters or digits) are not charged. If a list you selected cannot be downloaded, the run fails and no name is charged. To cap your spending, set **Maximum names screened** in the input or **Maximum cost per run** in the run options; the run stops cleanly when that budget is used. Names left out by **Maximum names screened** are neither screened nor charged, and the status message and the run summary say how many: "N of M names were NOT screened (limit X)".

### Use Sanctions Screening API from the API, n8n, Make or an AI agent

#### Apify API

Run the Actor and get the screening rows in one call:

**curl**

```bash
curl -X POST "https://api.apify.com/v2/acts/sourcing-data-studio~sanctions-screening-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyNames":["Huawei Technologies Co., Ltd.","Hangzhou Hikvision Digital Technology Co., Ltd.","ZTE Corporation","Anker Innovations Limited","Example Trading LLC"]}'
```

**JavaScript** (Node.js, `npm install apify-client`)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const input = {
    "companyNames": [
        "Huawei Technologies Co., Ltd.",
        "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "ZTE Corporation",
        "Anker Innovations Limited",
        "Example Trading LLC"
    ]
};

const run = await client.actor('sourcing-data-studio/sanctions-screening-api').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python** (`pip install "apify-client>=3"`, Python 3.11 or later)

```python
import os

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run_input = {
    "companyNames": [
        "Huawei Technologies Co., Ltd.",
        "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "ZTE Corporation",
        "Anker Innovations Limited",
        "Example Trading LLC"
    ]
}

run = client.actor("sourcing-data-studio/sanctions-screening-api").call(run_input=run_input)

for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

#### n8n and Make

Use an HTTP request module with the same URL, method POST and a JSON body like the input examples above. Store your Apify API token as a credential, never in the workflow itself. A typical flow: a new supplier is added to a sheet, the Actor screens the name, and a `match` or `possible_match` status sends a message to the buyer.

#### AI agents through the Apify MCP server

Connect your agent to the Apify MCP server and call `sourcing-data-studio/sanctions-screening-api` with the same input. Tell the agent to quote the `disclaimer` field and to treat `no_match` as "not found on these lists on this date", never as an approval. Agents can use the **Feedback for the developer** field to report missing fields or problems.

### For AI agents

- Minimal input: `{"companyNames": ["Huawei Technologies Co., Ltd."]}`. At the Free price this call costs $0.005 (one screened name) plus the platform's start fee; 10 names cost $0.05.
- Read these fields first in each dataset row: `status`, `confidenceBand`, `bestScore`, `matches` (list, programs, country, `entityType`, `sourceListUrl`) and `listsChecked`. Quote `disclaimer`: `no_match` is not a clearance.
- Outcomes are in the run status message and in the `RUN_SUMMARY` record of the run's key-value store: `status` (the run: SUCCEEDED, FAILED or ABORTED), `message`, `totals` and `lists`, where each list has the status `ok`, `failed`, `blocked` or `invalid`. A selected list that is not `ok` fails the run, and nothing is charged for names.
- Do not use it to screen private individuals, to check lists other than the US Consolidated Screening List and the UK Sanctions List, or as a clearance or legal advice.
- This Actor is callable through the Apify MCP server as the tool `sourcing-data-studio/sanctions-screening-api` and through the Apify API.

### Limits

- At most 200 names per run, which costs at most $1.00 at the Free price of $0.005 per name, plus the platform's start fee. For more, run the Actor several times.
- Two lists only: the US Consolidated Screening List and the UK Sanctions List. EU, UN and other national lists are not checked.
- Organisations, vessels and aircraft only. Private individuals are never shown: an entry that a list types as an individual is left out before matching, so you cannot screen a private person with this Actor.
- Companies, groups and ships that carry a person's name are shown. Every entry that a list types as an organisation, a vessel or an aircraft is screened and shown with all its names and aliases, also when a name contains the full name of an individual on either list: a trading company named after its listed owner, a sole trader listed under the owner's name, a group known under the name of its leader, a ship named after a person. The row says what the list calls the entry in `entityType`. Because of this, screening the plain name of a listed person can bring up the company or ship that is named after that person: it is the entry of the company or ship, not of the person. Check such an entry in the official publication behind `sourceListUrl`.
- Some US lists do not say whether an entry is a company or a person. Such an entry is kept only when its name, or an alias that contains its name, carries a clear organisation word (Co, Ltd, LLC, Bank, Institute, University and similar) and the name does not read like the name of a person. An organisation with an unusual name on those lists can be left out. On such an entry a name or alias that reads like the name of a person, or that contains the full name of a listed individual, is left out; when an entry names a person and a company together, only the company is kept; when in doubt, a name is left out. The run summary reports how many records each list kept and left out.
- Both list files are downloaded in every run. A list you did not select is used only to recognise the private individuals it names; no name is screened against it. If that file cannot be downloaded, the run continues and the run summary says so.
- End dates are shown as published. An entry is never left out because its end date has passed: some orders, for example temporary denial orders against airlines, are renewed while the published date stays old. `endDate` gives the date; check in the official publication whether the entry still applies. Many old denial orders with an end date years ago are in the results for the same reason.
- Matching works on the name only. It does not compare addresses, registration numbers or owners, and it does not apply the OFAC 50 percent ownership rule.
- Names are compared in Latin letters. A name written only in Chinese, Arabic or Cyrillic characters is matched only when a list entry carries the same spelling.
- The lists are as fresh as the files published on the day of the run. `listDates` shows the date of each file.
- A downloaded list that is empty or far smaller than usual is treated as not downloaded.
- A list you selected that cannot be downloaded (after the retries) fails the run: no name is screened, no row is saved and nothing is charged for names. The failure message and `listsFailed` in the run summary name the missing list. Run again later, or select only the list that works. Every row is therefore screened against all the lists you selected, and `listsChecked` in the row says which.
- A source that refuses a download is not asked again from another address. HTTP 401, 403 and 407 are final: the list is recorded as `blocked` in the run summary, and the run fails when you selected that list. After HTTP 429 the Actor waits the time the source asks for (up to 60 seconds) and asks again from the same address; it gives up when the source asks for more or says its limit is used up. It does not use another proxy of yours to get around a refusal, and that includes a proxy that refuses to open the connection itself. It never tries to solve a verification page.

### FAQ

#### Is a "no_match" result a clearance?

No. It means that no entry on the checked lists reached your minimum score on that date. It is not legal advice and not a clearance. The same applies in the other direction: a match is a reason to look closer, not a finding that your supplier is sanctioned. Many companies share similar names.

#### Which data does Sanctions Screening API collect, and which data does it NOT collect?

It reads two public government files that anyone can download without an account. From an entry it keeps the name, aliases, list, programme, country, city, listing date, end date and two official links.

It does NOT collect or output: private individuals (entries that a list types as individuals are removed before matching), dates of birth, passport or identity numbers, street addresses, phone numbers, email addresses or contact persons. A company or ship that a list types as an organisation, vessel or aircraft is shown with all its names, also when a name contains a person's name (see Limits). It does not log in anywhere and uses no API key.

#### Where do the lists come from?

The US list is the Consolidated Screening List published by the International Trade Administration: [trade.gov/consolidated-screening-list](https://www.trade.gov/consolidated-screening-list). The UK list is the UK Sanctions List published by the Foreign, Commonwealth and Development Office: [gov.uk, the UK Sanctions List](https://www.gov.uk/government/publications/the-uk-sanctions-list). The UK list is used under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

#### Why is a company I expected missing?

Check the spelling and try the full legal name. Lower **Minimum score** to 0.75 to see weaker candidates. Some well-known companies are not on these two lists at all, or are listed under a subsidiary or a different legal name. Short brand names match only when they are identical to a list name or alias, with or without the legal form. An entry on a US list that gives no type is kept only when its name is clearly an organisation (see Limits). A missing company is never proof that it is not listed: check the official publications.

#### Why do I get a match for a company that is clearly a different one?

Scores compare names, and unrelated companies can have nearly the same name. Use `country`, `city` and the official entry behind `sourceListUrl` to tell them apart. Raise **Minimum score** to 0.95 to see near-identical names only.

#### Why does the run say that some names were NOT screened?

Your **Maximum names screened** limit was lower than the number of names. Names are taken in the order given, the names beyond the limit are skipped and not charged, and the status message and the run summary say how many: "N of M names were NOT screened (limit X)". Leave the limit at 200 to screen every name, or run the Actor again with the names that were left out.

#### What does Sanctions Screening API do when a source refuses the download?

It does not try to get around the refusal. HTTP 401, 403 and 407 are final and recorded as `blocked`. After HTTP 429 it waits the time the source asks for (up to 60 seconds) and asks again from the same address. It never moves on to another proxy, and it never tries to solve a verification page. A run in which a selected list is blocked fails and charges nothing for names: run it again later.

#### Can I schedule Sanctions Screening API?

Yes. Save your supplier list as a task and add a schedule in Apify Console, for example a monthly re-screening of all active suppliers.

### Feedback

Tell us which list or field to add next in the **Feedback for the developer** input field, or open an issue in the **Issues** tab. Feedback is saved with the run summary.

# Changelog

This Actor's version history is a separate document: https://apify.com/sourcing-data-studio/sanctions-screening-api/changelog.md

# Actor input Schema

## `companyNames` (type: `array`):

Names of the suppliers or companies to screen, one per line, 1 to 200 per run. Use the full legal name as written on the invoice or contract, for example "Huawei Technologies Co., Ltd.". Names of organisations, vessels and aircraft only: private individuals are never screened. Each name returns one row and is charged once, whether or not a match is found. Repeated names are screened once.

## `minScore` (type: `number`):

Lowest similarity score, from 0.5 to 1, that counts as a match. 1 means the normalised names are identical. A best score of 0.95 or more gives status "match"; a best score between this value and 0.95 gives "possible_match"; nothing at or above this value gives "no_match". Default 0.85. Lower it (for example 0.75) to catch more spelling variants at the cost of more false alarms; raise it to see near-exact matches only.

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

Which lists to screen against. "US" is the US Consolidated Screening List (BIS Entity List, Military End User List, Unverified List, Denied Persons List, OFAC SDN and other OFAC lists, State Department lists). "UK" is the UK Sanctions List. Default: both. Every row reports which lists were actually checked in "listsChecked". If a list you select cannot be downloaded, the run fails and nothing is charged for names. Both files are downloaded in every run: a list you leave out is used only to recognise the private individuals it names, and no name is screened against it.

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

How many matching list entries to return for one name, best score first, from 1 to 20. Default 5. "matchCount" in the row always reports the total number of entries found, also when it is larger than this limit. This setting does not change the price.

## `maxItems` (type: `integer`):

Maximum number of names to screen and pay for in this run. Leave it at 200 to screen every name; lower it only to cap your spending. Names are taken in the order given; names beyond this number are skipped and not charged, and the run says so in its status message and its run summary: "N of M names were NOT screened (limit X)". A name that cannot be screened (no letters or digits) does not count towards this number.

## `proxyConfiguration` (type: `object`):

Proxy servers used for the two list downloads. Both lists are public government files, so no proxy is needed and the default is none. Set one only if your own network requires it. A proxy is never used to get around a refusal: when a source answers HTTP 401, 403, 407 or 429, a new try leaves from the same address, never from another proxy of your list. A proxy that itself refuses the connection with one of these answers is not followed by the next proxy either.

## `maxRequestRetries` (type: `integer`):

How many times a failed list download is retried, with exponential backoff, from 0 to 6. Default 3. A refusal is not retried from another address: HTTP 401, 403 and 407 are final and the list is recorded as blocked; after HTTP 429 the Actor waits the time the source asks for (up to 60 seconds) and tries again from the same address, and it gives up when the source asks for more or says its limit is used up. If a list you selected still cannot be downloaded, the run fails: no name is screened and nothing is charged for names. Run again later, or select only the other list.

## `debugLog` (type: `boolean`):

Print detailed debug messages to the run log.

## `feedback` (type: `string`):

Optional. Tell us which list or field you need next, or what went wrong. It is saved with the run summary. Do not include personal data. AI agents may also use this field to report problems.

## Actor input object example

```json
{
  "companyNames": [
    "Huawei Technologies Co., Ltd.",
    "Hangzhou Hikvision Digital Technology Co., Ltd.",
    "ZTE Corporation",
    "Anker Innovations Limited",
    "Example Trading LLC"
  ],
  "minScore": 0.85,
  "lists": [
    "US",
    "UK"
  ],
  "maxMatchesPerName": 5,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxRequestRetries": 3,
  "debugLog": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "companyNames": [
        "Huawei Technologies Co., Ltd.",
        "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "ZTE Corporation",
        "Anker Innovations Limited",
        "Example Trading LLC"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourcing-data-studio/sanctions-screening-api").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 = {
    "companyNames": [
        "Huawei Technologies Co., Ltd.",
        "Hangzhou Hikvision Digital Technology Co., Ltd.",
        "ZTE Corporation",
        "Anker Innovations Limited",
        "Example Trading LLC",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("sourcing-data-studio/sanctions-screening-api").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 '{
  "companyNames": [
    "Huawei Technologies Co., Ltd.",
    "Hangzhou Hikvision Digital Technology Co., Ltd.",
    "ZTE Corporation",
    "Anker Innovations Limited",
    "Example Trading LLC"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call sourcing-data-studio/sanctions-screening-api --silent --output-dataset

```

## MCP server setup

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

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/1yO4GwVTI0TTuaShC/builds/qHUljC8BpxaEJTh34/openapi.json
