# OFAC Sanctions Screening API - KYC AML Compliance (`pink_comic/ofac-sanctions-screening`) Actor

Screen names and counterparties against the official OFAC SDN List. Returns possible substring matches with aliases, IDs, official record URLs, retrieval time, and scope caveats for KYC/AML review, trade compliance, vendor due diligence, and fintech onboarding. SDN-only; not identity verification.

- **URL**: https://apify.com/pink\_comic/ofac-sanctions-screening.md
- **Developed by:** [Ava Torres](https://apify.com/pink_comic) (community)
- **Categories:** Automation, Business, AI
- **Stats:** 7 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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?

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

## OFAC Sanctions Screening API - KYC AML Compliance

Screen names and counterparties against the official U.S. Treasury Office of Foreign Assets Control **Specially Designated Nationals and Blocked Persons List (SDN List)**. Search primary names and OFAC-listed aliases, then filter by country, sanctions program, or entity type.

Every found row is labeled `POSSIBLE_MATCH`, includes the official OFAC detail URL and retrieval time, and remains explicitly **not identity-verified**. No API key is required.

> **Scope:** This actor searches the SDN List only. It does not search OFAC's non-SDN consolidated lists, resolve ownership under OFAC's 50 Percent Rule, perform fuzzy identity resolution, or make a legal/compliance decision.

### Fast first run

The default screens `Wagner Group` and returns one source-linked possible match for at most **$0.0021** (`$0.0001` start + `$0.002` result).

```json
{
  "searchTerm": "Wagner Group",
  "maxResults": 1
}
```

### What you get

Each found item contains stable screening, source, and evidence fields:

| Field | Description |
|---|---|
| `outcome` | `POSSIBLE_MATCH`, `NO_MATCH`, `INVALID_INPUT`, or `SOURCE_UNAVAILABLE` |
| `possibleMatch` | `true` only for a possible matching SDN record |
| `identityVerified` | Always `false`; this actor does not establish identity |
| `matchMethod` | `case_insensitive_substring` |
| `matchBasis` | Matching supplied fields such as `primary_name`, `alias_name`, `country`, `program`, or `entity_type` |
| `searchTerm`, `countryFilter`, `programFilter`, `entityTypeFilter` | Submitted screening criteria |
| `uid` | OFAC record identifier |
| `name`, `title`, `sdnType` | Primary source-reported identity fields |
| `programs`, `remarks` | OFAC programs and remarks |
| `aliases` | OFAC-listed AKA/FKA names and alias strength |
| `addresses` | OFAC-listed addresses |
| `ids` | Source-reported passports, national IDs, tax IDs, digital-currency addresses, and other identifiers |
| `dateOfBirth`, `placeOfBirth` | Source-reported birth evidence when available |
| `nationalities`, `citizenships` | Source-reported values when available |
| `sourceName`, `sourceList`, `sourceUrl` | Official-source provenance |
| `sourceRecordUrl` | Official OFAC record detail page |
| `sourceRetrievedAt` | UTC retrieval time |
| `sourceScope`, `evidenceNotice` | Mandatory coverage and interpretation boundaries |

Arrays remain arrays even when empty. No-match and source-unavailable runs return explicit evidence rows instead of silently producing an empty dataset, unless the buyer's total charge cap permits zero results.

### Example possible match

```json
{
  "outcome": "POSSIBLE_MATCH",
  "possibleMatch": true,
  "identityVerified": false,
  "matchMethod": "case_insensitive_substring",
  "matchBasis": ["alias_name"],
  "searchTerm": "Wagner Group",
  "countryFilter": "",
  "programFilter": "",
  "entityTypeFilter": "",
  "uid": 22543,
  "name": "PRIVATE MILITARY COMPANY 'WAGNER'",
  "sdnType": "Entity",
  "programs": ["UKRAINE-EO13660", "RUSSIA-EO14024", "CAR", "TCO"],
  "aliases": [
    {
      "uid": 62960,
      "type": "a.k.a.",
      "category": "strong",
      "lastName": "WAGNER GROUP"
    }
  ],
  "sourceName": "U.S. Department of the Treasury, Office of Foreign Assets Control",
  "sourceList": "Specially Designated Nationals and Blocked Persons List (SDN List)",
  "sourceRecordUrl": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=22543",
  "sourceRetrievedAt": "2026-07-26T12:00:00Z",
  "evidenceNotice": "Possible case-insensitive substring match to an official OFAC SDN record. This is not identity verification or a final sanctions determination; compare identifiers and review the official record."
}
```

### Inputs

| Parameter | Type | Default | Description |
|---|---|---:|---|
| `searchTerm` | string | `Wagner Group` | Case-insensitive substring search across primary names and OFAC-listed aliases |
| `country` | string | blank | Substring filter across listed addresses, ID countries, nationalities, and citizenships |
| `program` | string | blank | Sanctions-program substring, such as `SDGT`, `IRAN`, `DPRK`, or `RUSSIA-EO14024` |
| `entityType` | string | blank | `Individual`, `Entity`, or blank |
| `maxResults` | integer | `1` | Total paid dataset-item cap, from 1 to 1,000 |

All non-empty filters must match the same source record. If raw API input contains no screening criteria, the actor uses the bounded `Wagner Group` / one-result fallback. A substantive API request that omits `maxResults` defaults to 100.

#### Country-filtered individual search

```json
{
  "searchTerm": "Ivan",
  "country": "Russia",
  "entityType": "Individual",
  "maxResults": 25
}
```

#### Program sweep

```json
{
  "program": "DPRK",
  "entityType": "Entity",
  "maxResults": 100
}
```

#### Charge-capped run

Set Apify's **Maximum total charge** when starting a run. At `$0.002` per result, a `$0.004` cap permits at most two dataset items. The actor applies the limit before downloading and screening.

### Matching and interpretation limits

- Name matching is **case-insensitive substring matching**, not fuzzy, phonetic, transliteration, or probabilistic identity resolution.
- Aliases are matched only when OFAC lists them in the SDN publication.
- `POSSIBLE_MATCH` does not establish that your subject is the listed party. Compare date of birth, address, IDs, nationality, and other identifiers.
- `NO_MATCH` means only that no record met every supplied filter in this SDN snapshot. It is not sanctions clearance.
- This actor does not search OFAC's non-SDN consolidated lists or other US/international watchlists.
- An entity can be blocked under OFAC's **50 Percent Rule** without appearing by name on the SDN List.
- Source records can change. Use `sourceRetrievedAt` and re-screen according to your compliance program.
- Output is screening evidence, not legal advice or a substitute for a risk-based compliance process.

Review OFAC's official [Sanctions List Search guidance](https://ofac.treasury.gov/faqs/topic/1631) and [50 Percent Rule guidance](https://ofac.treasury.gov/faqs/401) when designing a screening workflow.

### Reliability

The actor downloads the official SDN XML ZIP directly from OFAC on each run. It retries transport errors, body-read failures, HTTP 408/429/5xx responses, and malformed archive responses with bounded backoff. If the source remains unavailable, it returns `SOURCE_UNAVAILABLE` rather than treating the outage as a clean result.

### Pricing

| Component | Price |
|---|---:|
| Actor start | `$0.0001` |
| Dataset item | `$0.002` |

Examples:

- Default one-item run: up to `$0.0021`
- 10 items: up to `$0.0201`
- 100 items: up to `$0.2001`

### Integrations

Export JSON, CSV, or Excel from Apify, call the actor through the Apify API, attach webhooks, or use it as an MCP tool:

```json
{
  "mcpServers": {
    "ofac-screening": {
      "url": "https://mcp.apify.com/?tools=pink_comic/ofac-sanctions-screening"
    }
  }
}
```

# Actor input Schema

## `searchTerm` (type: `string`):

Name of an individual or entity to screen. Uses case-insensitive substring matching against primary names and OFAC-listed aliases; this is not fuzzy identity resolution.

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

Filter results by country (e.g. "Iran", "Russia", "North Korea"). Matches against address and ID country fields.

## `program` (type: `string`):

Filter by OFAC sanctions program (e.g. "SDGT", "IRAN", "UKRAINE-EO13661", "RUSSIA-EO14024", "DPRK"). Partial match.

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

Filter by entity type: "Individual" or "Entity".

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

Maximum paid dataset items to return. The default returns one possible-match record for at most $0.0021 including the start fee.

## Actor input object example

```json
{
  "searchTerm": "Wagner Group",
  "country": "",
  "program": "",
  "entityType": "",
  "maxResults": 1
}
```

# 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 = {
    "searchTerm": "Wagner Group",
    "country": "",
    "program": "",
    "maxResults": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("pink_comic/ofac-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 = {
    "searchTerm": "Wagner Group",
    "country": "",
    "program": "",
    "maxResults": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("pink_comic/ofac-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 '{
  "searchTerm": "Wagner Group",
  "country": "",
  "program": "",
  "maxResults": 1
}' |
apify call pink_comic/ofac-sanctions-screening --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pink_comic/ofac-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/a6CiUxiZkNEw3uvoP/builds/Ru7C7XNcTczrPVyec/openapi.json
