# OFAC Supplier & Customer Sanctions Match (`afkdigital/ofac-supplier-customer-sanctions-match`) Actor

Screen customer or supplier names against official OFAC SDN and consolidated non-SDN files. Explain name, alias and address-country match evidence. One event per unique screened input, including no-match.

- **URL**: https://apify.com/afkdigital/ofac-supplier-customer-sanctions-match.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 unique 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

## OFAC Supplier & Customer Sanctions Match

Screen a list of supplier or customer names against OFAC's official **SDN and Consolidated non-SDN** published CSV files. This is a name-screening aid, not a decision on whether a person is sanctioned, a compliance clearance, or legal advice. It does not infer ownership, control, indirect sanctions, or coverage by other governments' lists. OFAC non-SDN lists have different legal effects from the SDN list.

### Input

Provide `names` as an array of strings or objects such as `{"input_id":"vendor-1","name":"AEROCARIBBEAN AIRLINES","country":"Cuba"}`. Alternatively upload a UTF-8 `csvFile` through Apify's file upload field. CSV requires a `name` column; `input_id` and `country` are optional. Names and a CSV can be combined. `optionalCountry` fills absent row countries; `minMatchScore` defaults to 80; `maxResults` defaults to five candidates **per input**.

A unique input is a normalized name plus its supplied country. Duplicates in one run are screened and billed once; all original IDs are retained in `input_ids`. Maximum 1,000 unique names, 2,000 input rows, 2 MB CSV, and $5 in event charges per run. `maxCostUsd` is checked before screening, while Apify's own per-run charge limit can halt output earlier.

### Output and price

One dataset item per successfully screened unique input. The leading candidate fills `matched_name`, `list_name`, `list_entry_id`, `country`, `match_score`, `match_reasons`, `source_date`, and `source_url`. `matches` holds all returned candidates (including name variants and alias type). A no-candidate row has null match fields and `status=no_candidate_above_threshold`.

**$0.005 per successfully screened unique input ($5 per 1,000).** A successfully checked name is charged even when it has no candidate. Multiple candidates and retry attempts do not add charges. No charge for invalid inputs rejected before screening or failed source refresh. Platform usage is included in the event price. Download the dataset as JSON or CSV from the Output tab. Apify's CSV export expands nested `matches` values into numbered columns.

The 0–100 `match_score` describes string similarity and address-country context. It is **not the probability of being sanctioned**. Full name and aliases are scored separately. The optional country is compared only with countries in OFAC address records; a mismatch deducts 15 points, an absent country remains unverified. Weak alias labels receive a conservative adjustment. Review every candidate against the original OFAC record and independent identifiers. No candidate does **not** establish compliance or absence of risk.

### Source and update method

Official files: `sdn.csv`, `alt.csv`, `add.csv`, `sdn_comments.csv`, `cons_prim.csv`, `cons_alt.csv`, `cons_add.csv`, `cons_comments.csv` from [OFAC SLS](https://ofac.treasury.gov/sanctions-list-service), downloaded at each run from `https://sanctionslistservice.ofac.treas.gov/api/PublicationPreview/exports/`. Primary records link to aliases and addresses by OFAC UID. Comments are downloaded and hashed but are not interpreted as names or countries. The Actor checks a complete fresh snapshot, refuses inconsistent publication times, and stores URL, Last-Modified, byte length, and SHA-256 for each file in `SOURCE_MANIFEST`. It uses an in-run cache only and never substitutes old data when a source fails. Each HTTP request has a timeout and limited retries; runs have a 230-second work deadline and a 300-second platform timeout.

Source details: [OFAC CSV relationship tutorial](https://ofac.treasury.gov/sdn-list-data-formats-data-schemas/tutorial-on-the-use-of-list-related-legacy-flat-files), [OFAC list format/update FAQ](https://ofac.treasury.gov/faqs/topic/1641), and [SLS redirect notice](https://ofac.treasury.gov/sdn-list-data-formats-data-schemas/ofac-technical-actions-in-reverse-chronological-order/20240516_44). OFAC publishes these files for public download and screening. This product adds a screening service and returns candidate references; it does not sell a repackaged bulk OFAC list. Verify current data, identity, and applicable rules before acting.

Customer lists are not printed to logs. Apify stores the supplied input, uploaded CSV and resulting dataset according to the customer's platform retention and access settings. Avoid submitting information you cannot lawfully process.

# Actor input Schema

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

Company/person names as strings or objects with name, input_id, country. Upload a CSV instead or combine them.

## `csvFile` (type: `string`):

Upload a UTF-8 CSV to an Apify key-value store. Header: name; optional input_id and country. Maximum 2 MB.

## `optionalCountry` (type: `string`):

Country context for entries lacking a row-level country; compared only to listed address country. Mismatch lowers score but does not prove identity.

## `minMatchScore` (type: `integer`):

0–100 name similarity with address-country context; not a sanctions probability.

## `maxResults` (type: `integer`):

One dataset item and charge per unique input; candidates appear in matches array.

## `maxCostUsd` (type: `number`):

Preflight bound at $0.005 per unique input; Apify per-run maximum charge also applies.

## Actor input object example

```json
{
  "names": [
    "AEROCARIBBEAN AIRLINES",
    "AERO-CARIBBEAN",
    "ANGLO-CARIBBEAN CO., LTD.",
    "ABU TEIR, Mohammed",
    "Example Clean Widgets LLC"
  ],
  "minMatchScore": 80,
  "maxResults": 5,
  "maxCostUsd": 5
}
```

# Actor output Schema

## `resultsJson` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

## `sourceManifest` (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 = {
    "names": [
        "AEROCARIBBEAN AIRLINES",
        "AERO-CARIBBEAN",
        "ANGLO-CARIBBEAN CO., LTD.",
        "ABU TEIR, Mohammed",
        "Example Clean Widgets LLC"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/ofac-supplier-customer-sanctions-match").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": [
        "AEROCARIBBEAN AIRLINES",
        "AERO-CARIBBEAN",
        "ANGLO-CARIBBEAN CO., LTD.",
        "ABU TEIR, Mohammed",
        "Example Clean Widgets LLC",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/ofac-supplier-customer-sanctions-match").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": [
    "AEROCARIBBEAN AIRLINES",
    "AERO-CARIBBEAN",
    "ANGLO-CARIBBEAN CO., LTD.",
    "ABU TEIR, Mohammed",
    "Example Clean Widgets LLC"
  ]
}' |
apify call afkdigital/ofac-supplier-customer-sanctions-match --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/ofac-supplier-customer-sanctions-match"
        }
    }
}
```

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/K4ilUvyZn1PE7mOht/builds/YEaCm2Qfi8RTl0RkZ/openapi.json
