# Sanctions Screening API — OFAC, UK & UN (`soilair/official-sanctions-screening-api`) Actor

Screen names against current official OFAC SDN and non-SDN, UK Sanctions List, and UN Security Council data. Get ranked candidate matches, aliases, programs, identifiers, ambiguity states, and source-backed records. Name matching is screening assistance only and always requires review.

- **URL**: https://apify.com/soilair/official-sanctions-screening-api.md
- **Developed by:** [Salih Can Kurnaz](https://apify.com/soilair) (community)
- **Categories:** Business, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 sanctions screenings

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?

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

## Sanctions Screening API — OFAC, UK & UN

Screen person and organization names against current official sanctions-list data from **OFAC**, the **UK Sanctions List**, and the **UN Security Council Consolidated List**. The Actor returns ranked candidate records, aliases, identifiers, programs or regimes, and explicit ambiguity states for manual review.

> **Important:** this Actor provides candidate-screening assistance only. It does not decide whether a person or organization is legally sanctioned. Every result sets `reviewRequired=true`; consequential decisions require verification against the underlying official record and appropriate human/legal review.

### What this Actor checks

The Actor normalizes and indexes four official datasets:

- **OFAC SDN** — U.S. Treasury Sanctions List Service SDN XML
- **OFAC consolidated non-SDN** — U.S. Treasury Sanctions List Service consolidated XML
- **UK Sanctions List** — official FCDO CSV
- **UN Security Council Consolidated List** — official UN XML

The normalized cache retains source URLs and SHA-256 provenance for each refresh.

### Input

```json
{
  "queries": ["Example Person", "Example Trading Company"],
  "maxCandidatesPerQuery": 5
}
```

`queries` accepts 1–50 names. `maxCandidatesPerQuery` accepts 1–10.

Operational cache controls are hidden from the Store form. Under Apify limited permissions, the Actor creates and maintains its own per-user named cache.

### Output

Each query produces one Dataset row with `resolutionState`, optional `preferredCandidateStableId`, match scores, ranked candidates, source metadata, aliases, programs/regimes, identifiers, addresses, `reviewRequired=true`, and a decision disclaimer.

Resolution states:

- `exact_unique_candidate`
- `exact_ambiguous`
- `fuzzy_unique_candidate`
- `fuzzy_ambiguous`
- `no_candidate`

`no_candidate` does **not** mean “not sanctioned”; it only means the name-only matcher did not return a candidate above its configured floor.

### Matching behavior

The operating policy was selected on a deterministic development split and validated on a separate test split:

- candidate floor: `0.70`
- fuzzy candidate score: `>= 0.90`
- minimum top-1 / top-2 margin: `>= 0.01`
- exact normalized names shared by multiple official stable IDs always return `exact_ambiguous`

The Actor never converts these states into a binary sanctions/legal conclusion.

### Freshness and cache

The Actor creates `official-sanctions-screening-runtime-cache-v2` under Apify **LIMITED\_PERMISSIONS**. Apify retains access to Actor-created named storage for later runs by the same user.

Default cache TTL: **12 hours**.

A refresh downloads the official files, normalizes them, stores an integrity-checked compressed snapshot, and rebuilds the exact/trigram index. Warm-cache runs are much faster.

### Pricing

Primary PPE event: `screening-result`.

One event is charged for **one input name screened**, regardless of how many candidates are returned.

- FREE: **$0.0050 / screening** ($5.00 / 1K)
- BRONZE: **$0.0045 / screening**
- SILVER: **$0.0040 / screening**
- GOLD / PLATINUM / DIAMOND: **$0.0035 / screening**
- Actor start: **$0.00005**

The Actor respects the run's maximum-charge budget and conservatively bounds screenings before charging custom events.

### Safety and review guidance

Use this Actor to prioritize official records for review, not to make automatic adverse decisions.

For consequential workflows:

1. Review the returned official-source candidate.
2. Compare identifiers, aliases, addresses, entity type, and programs/regimes.
3. Confirm the current official source directly.
4. Escalate ambiguous or high-impact cases to a qualified reviewer.

Name-only similarity cannot establish identity.

### Data sources

- OFAC Sanctions List Service: `https://ofac.treasury.gov/sanctions-list-service`
- UK Sanctions List: `https://www.gov.uk/government/publications/the-uk-sanctions-list`
- UN Security Council Consolidated List: `https://main.un.org/securitycouncil/en/content/un-sc-consolidated-list`

### Limits

- Maximum 50 names per Store run.
- Name matching alone cannot resolve every transliteration, alias, or identity collision.
- Official lists change over time; use fresh source records for consequential review.
- This Actor is not legal advice, KYC certification, AML certification, or a substitute for a compliance program.

# Actor input Schema

## `queries` (type: `array`):

Enter 1–50 person or organization names. Each name is screened against normalized official OFAC, UK, and UN lists and returns ranked candidate records. Results are screening assistance, not legal determinations.

## `maxCandidatesPerQuery` (type: `integer`):

Return 1–10 ranked official-source candidate records for each name. More candidates can help manual review when names are ambiguous.

## `forceRefreshCache` (type: `boolean`):

Administrative/private-test option. When true, bypasses a fresh persistent cache and rebuilds it from all official sources.

## `cacheTtlHours` (type: `number`):

Maximum age of the persistent normalized official-source cache before a refresh is attempted.

## `allowStaleCache` (type: `boolean`):

If a scheduled refresh fails, permits an integrity-verified older cache to be used and explicitly marked STALE\_FALLBACK.

## Actor input object example

```json
{
  "queries": [],
  "maxCandidatesPerQuery": 5,
  "forceRefreshCache": false,
  "cacheTtlHours": 12,
  "allowStaleCache": true
}
```

# Actor output Schema

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

One Dataset row per screened input name with ambiguity-aware resolution state, ranked official-source candidates, scores, identifiers, and review-required metadata.

## `runSummary` (type: `string`):

Machine-readable run summary with official-source/cache provenance, performance metrics, and PPE evidence.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("soilair/official-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("soilair/official-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 '{}' |
apify call soilair/official-sanctions-screening-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,soilair/official-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/8fiTyGXStBHFuHNpf/builds/gW2sj9QHtdrDe46dQ/openapi.json
