# OFAC Sanctions Screening: SDN Check for Names + Crypto Wallets (`sefran1/ofac-sanctions-screen`) Actor

Screen person and company names (fuzzy, aliases included) and crypto wallet addresses (BTC, ETH, TRX, USDT and more) against the live OFAC SDN sanctions list, downloaded fresh from U.S. Treasury every run. $0.02 per screen. Potential matches only, not a clearance.

- **URL**: https://apify.com/sefran1/ofac-sanctions-screen.md
- **Developed by:** [Iberia Channel Desk](https://apify.com/sefran1) (community)
- **Categories:** Developer tools, AI, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 ofac screens

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 Sanctions Screen: Names + Crypto Wallets

Screen **person and company names** and **crypto wallet addresses** against the **live U.S. OFAC SDN sanctions list** in one run. The list is downloaded fresh from U.S. Treasury every run, so you never screen against a stale copy. You get one JSON result per name or wallet that an AI agent, payment flow or script can read straight away.

### Sample output (real run of the default input, 4 s)

| type | query | verdict | summary |
|---|---|---|---|
| name | Sberbank of Russia | POTENTIAL_MATCH | {"potential_match":true,"hit_count":3,"top_score":1,"top_name":"PUB... |
| name | Siemens AG | NO_MATCH | {"potential_match":false,"hit_count":0,"top_score":null,"top_name":... |
| wallet | 0x098B716B8Aaf21512996dC57EB0615e2383E2f96 | SANCTIONED_ADDRESS | {"potential_match":true,"hit_count":1,"top_score":1,"top_name":"LAZ... |

<details><summary>One full JSON row</summary>

```json
{
  "type": "name",
  "status": "ok",
  "query": "Sberbank of Russia",
  "verdict": "POTENTIAL_MATCH",
  "summary": {
    "potential_match": true,
    "hit_count": 3,
    "top_score": 1,
    "top_name": "PUBLIC JOINT STOCK COMPANY SBERBANK OF RUSSIA",
    "top_matched_name": "SBERBANK OF RUSSIA",
    "top_programs": [
      "UKRAINE-EO13662",
      "RUSSIA-EO14024"
    ],
    "top_country_match": null,
    "note": "Potential OFAC SDN name match(es): review manually against official Treasury data."
  },
  "options": {
    "country": null,
    "threshold": 0.55,
    "limit": 10
  },
  "hits": [
    {
      "score": 1,
      "match_via": "alias",
      "country_match": null,
      "entity": {
        "ent_num": "17018",
        "name": "PUBLIC JOINT STOCK COMPANY SBERBANK OF RUSSIA",
        "matched_name": "SBERBANK OF RUSSIA",
        "sdn_type": null,
        "program": "UKRAINE-EO13662] [RUSSIA-EO14024",
        "programs": [
          "UKRAINE-EO13662",
          "RUSSIA-EO14024"
        ],
        "aliases": [
          {
            "alt_type": "aka",
            "alt_name": "SBERBANK ROSSII"
          },
          {
            "alt_type": "fka",
            "alt_name": "SBERBANK ROSSII OAO"
          },
          {
            "alt_type": "fka",
            "alt_name": "OTKRYTOE AKTSIONERNOE OBSHCHESTVO SBERBANK ROSSII"
          },
          {
            "alt_type": "aka",
            "alt_name": "SBERBANK OF RUSSIA"
          },
          {
            "alt_type": "aka",
            "alt_name": "PJSC SBERBANK"
          },
          {
            "alt_type": "fka",
            "alt_name": "OPEN JOINT STOCK COMPANY SBERBANK OF RUSSIA"
          },
          {
            "alt_type": "fka",
            "alt_name": "OJSC SBERBANK OF RUSSIA"
          },
          {
            "alt_type": "fka",
            "alt_name": "JOINT STOCK COMMERCIAL SAVINGS BANK OF THE RUSSIAN FEDERATION"
          },
          {
            "alt_type": "fka",
            "alt_name": "JOINT STOCK COMMERCIAL SAVINGS BANK OF THE RUSSIAN SOVIET FEDERATIVE SOCIALIST REPUBLIC"
          },
          {
            "alt_type": "fka",
            "alt_name": "SBERBANK OF RSFSR"
          }
        ],
        "addresses": [
          {
            "address": "19 ul. Vavilova",
            "city": "Moscow 117312",
            "country": "Russia"
          },
          {
            "address": "C305/306A Lufthansa Centre 50 Liangmaqiao Rd., Chaoyang District",
            "city": "Beijing 100027",
            "country": "China"
          },
          {
            "address": "upper ground floor and fourth floor, Birla Tower, 25-Barakhamba Road",
            "city": "New Delhi 110001",
            "country": "India"
          }
        ],
        "source": "OFAC_SDN"
      }
    },
    {
      "score": 0.884,
      "match_via": "alias",
      "country_match": null,
      "entity": {
        "ent_num": "18715",
        "name": "JOINT STOCK COMPANY SBERBANK",
        "matched_name": "JSC SBERBANK OF RUSSIA",
        "sdn_type": null,
        "program": "UKRAINE-EO13662] [RUSSIA-EO14024",
        "programs": [
          "UKRAINE-EO13662",
          "RUSSIA-EO14024"
        ],
        "aliases": [
          {
            "alt_type": "aka",
            "alt_name": "SUBSIDIARY BANK SBERBANK OF RUSSIA PUBLIC JOINT STOCK COMPANY"
          },
          {
            "alt_type": "aka",
            "alt_name": "SBERBANK OF RUSSIA SUBSIDIARY BANK PUBLIC JOINT STOCK COMPANY"
  
...
```

</details>

> **Directional screening only, not a clearance.** Name results are *potential* matches with similarity scores; wallet results are exact matches against addresses OFAC publishes. This is not a legal or compliance determination, clearance, certification or attestation. It is not OFAC and not a bank substitute. False positives and false negatives are possible. Verify against official U.S. Treasury / OFAC publications and your own counsel.

### What it does

- **Names** (people, companies, vessels, aircraft): fuzzy-matches each name against every SDN primary name, alias and "a.k.a." in the remarks, with a 0–1 score. An optional country hint flags hits with an SDN address in that country; hits elsewhere are **still returned**, never hidden.
- **Crypto wallets**: exact match against every "Digital Currency Address" OFAC lists on the SDN (about 1,000 addresses: BTC (listed by OFAC as XBT), ETH and other EVM chains, TRX, USDT, USDC, XMR, LTC, SOL, BCH, ZEC and more), including the overflow remarks file where most wallets live. EVM (`0x…`) and bech32 (`bc1…`) addresses are compared case-insensitively; base58 addresses exactly.

Typical uses: pre-payment checks in crypto or agent-payment flows, onboarding counterparties, batch re-screening a customer list after an SDN update.

### Pricing

Pay per event: **$0.02 per `ofac-screen`** (that is $20 per 1,000 screens), meaning one name or one wallet screened and one dataset item saved. A run with 3 names and 2 wallets costs $0.10.

- Invalid input (for example a 1-letter name or a wallet with spaces) is **not charged**.
- If the Treasury download fails, the run stops before screening anything and **nothing is charged**.
- If you set a maximum cost per run, the Actor stops cleanly at that limit and does not screen or charge the rest.

### Input

```json
{
  "names": ["Sberbank of Russia", "Siemens AG"],
  "wallets": ["0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "bc1q..."],
  "country": "RU"
}
```

Single item (handy for agents):

```json
{ "wallet": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96" }
```

| Field | Type | Notes |
|---|---|---|
| `names` | array | Names to screen (2–256 characters each). Strings, or objects `{ "name": "...", "country": "RU" }`. |
| `wallets` | array | Crypto addresses (10–128 letters/digits, no `ethereum:` prefix). |
| `name` / `wallet` | string | Convenience single-item fields; added to the lists above. |
| `country` | string | Optional default 2-letter ISO country hint for names. |
| `threshold` | number | Name similarity threshold, 0–1, default `0.55`. |
| `limit` | integer | Max hits per name, 1–50, default `10`. |

Up to 500 names + wallets per run.

### Output

One dataset item per name or wallet. Wallet hit (abbreviated):

```json
{
  "type": "wallet",
  "status": "ok",
  "query": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96",
  "verdict": "SANCTIONED_ADDRESS",
  "summary": { "potential_match": true, "hit_count": 1, "top_name": "LAZARUS GROUP", "top_asset": "ETH", "top_programs": ["DPRK3"] },
  "hits": [ { "match_type": "exact_address", "asset": "ETH", "listed_address": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "entity": { "ent_num": "…", "name": "LAZARUS GROUP", "programs": ["DPRK3"] } } ],
  "list_as_of": "2026-10-07",
  "charged": true
}
```

Name hit (abbreviated):

```json
{
  "type": "name",
  "status": "ok",
  "query": "Sberbank of Russia",
  "verdict": "POTENTIAL_MATCH",
  "summary": { "potential_match": true, "hit_count": 3, "top_score": 1, "top_name": "PUBLIC JOINT STOCK COMPANY SBERBANK OF RUSSIA", "top_programs": ["UKRAINE-EO13662", "RUSSIA-EO14024"] },
  "hits": [ { "score": 1, "match_via": "alias", "country_match": true, "entity": { "ent_num": "…", "name": "…", "programs": ["…"], "aliases": ["…"], "addresses": ["…"] } } ],
  "list_as_of": "2026-10-07",
  "banner": "DIRECTIONAL ONLY — not clearance/attestation; not OFAC; false positives/negatives possible; potential_matches_only.",
  "charged": true
}
```

`verdict` is `NO_MATCH` when nothing is found, with the note *"This is NOT a clearance."* Items that weren't charged have `"status": "invalid_input"` or `"upstream_error"`, an `error` message, and `"charged": false`. The run's `OUTPUT` record has counts and the SDN list date.

### Use from an AI agent

Built for agent use: pay-per-event, one result per item, no browser and no proxy, runs in a few seconds. Agents can call it through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) or the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/sefran1~ofac-sanctions-screen/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"wallet":"0x098B716B8Aaf21512996dC57EB0615e2383E2f96"}'
```

**MCP:** add `https://mcp.apify.com?tools=sefran1/ofac-sanctions-screen` to Claude, Cursor, VS Code or any MCP client; the tool appears as `sefran1--ofac-sanctions-screen`. Example prompt: *"Check if wallet 0x098B…2f96 is on the OFAC SDN list."*

Need an LEI lookup on companies too? See [KYB Company Check](https://apify.com/sefran1/kyb-company-check).

### Data source

Public U.S. Treasury OFAC files `sdn.csv`, `alt.csv`, `add.csv` and `sdn_comments.csv`, fetched at run start. `list_as_of` is the date of the Treasury file.

Not affiliated with, endorsed by or certified by the U.S. Treasury or OFAC.

### Limits

- SDN list only. No Consolidated (non-SDN) list, no EU, UK or UN lists, no ownership (50% rule) checks, no adverse media.
- Wallet screening is an exact address match. There is no chain analysis: an address that received funds from a sanctioned wallet is not flagged.
- Name matching is fuzzy. Transliterations and very short or common names can produce false positives or misses.

### FAQ

**Is this an OFAC SDN check API?** Yes: one call screens names or crypto wallets against the current Specially Designated Nationals (SDN) list, returning JSON.

**Can I use it for crypto sanctions screening / wallet compliance?** It flags exact matches with addresses OFAC publishes (Tornado Cash, Lazarus, Garantex and other designations). It does not trace funds.

**How much does it cost?** $0.02 per name or wallet ($20 per 1,000). Invalid input is free.

**How often is the list updated?** Every run downloads the SDN files from U.S. Treasury, so results reflect the latest designations.

# Actor input Schema

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

Person or company names, e.g. "Sberbank of Russia". Each name is one $0.02 screen. You can also pass objects: {"name": "...", "country": "RU"}.

## `wallets` (type: `array`):

Crypto addresses (BTC, ETH/EVM, TRX, USDT, XMR, LTC, SOL and others OFAC lists). Exact match against SDN Digital Currency Addresses; EVM and bech32 are case-insensitive. Each wallet is one $0.02 screen.

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

2-letter ISO country code, e.g. "RU". Flags name hits whose SDN address is in that country (country_match). Hits elsewhere are still returned.

## `threshold` (type: `number`):

Minimum name-similarity score (0 to 1) for a potential match. Lower finds more, with more false positives.

## `limit` (type: `integer`):

Maximum SDN hits returned per name (1 to 50).

## `name` (type: `string`):

Convenience field for API/agent callers: one name to screen. Added to the names list.

## `wallet` (type: `string`):

Convenience field for API/agent callers: one wallet to screen. Added to the wallets list.

## Actor input object example

```json
{
  "names": [
    "Sberbank of Russia",
    "Siemens AG"
  ],
  "wallets": [
    "0x098B716B8Aaf21512996dC57EB0615e2383E2f96"
  ],
  "threshold": 0.55,
  "limit": 10
}
```

# 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 = {
    "names": [
        "Sberbank of Russia",
        "Siemens AG"
    ],
    "wallets": [
        "0x098B716B8Aaf21512996dC57EB0615e2383E2f96"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sefran1/ofac-sanctions-screen").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": [
        "Sberbank of Russia",
        "Siemens AG",
    ],
    "wallets": ["0x098B716B8Aaf21512996dC57EB0615e2383E2f96"],
}

# Run the Actor and wait for it to finish
run = client.actor("sefran1/ofac-sanctions-screen").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": [
    "Sberbank of Russia",
    "Siemens AG"
  ],
  "wallets": [
    "0x098B716B8Aaf21512996dC57EB0615e2383E2f96"
  ]
}' |
apify call sefran1/ofac-sanctions-screen --silent --output-dataset

```

## MCP server setup

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

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/43cl4DwMAMO9fZmyc/builds/MFCG0Eg8W4NTzn4SG/openapi.json
