# Sanctions Screening List Change Monitor — CSL / OFAC Delta API (`malonestar/consolidated-screening-list-delta`) Actor

Sanctions screening list change monitor. Diffs the US Trade.gov Consolidated Screening List (OFAC SDN/Non-SDN, BIS Entity/Denied/Unverified/MEU, State DDTC/ISN) against the last run and emits added/removed/modified entries with field-level changes. Keyless. Monitoring tool, not compliance advice.

- **URL**: https://apify.com/malonestar/consolidated-screening-list-delta.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Lead generation, Developer tools, Agents
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 List Change Monitor — CSL / OFAC Delta API

Track **what changed** on the U.S. **Consolidated Screening List (CSL)** — the single feed
that merges **OFAC** (SDN & Non-SDN: SSI, CMIC, NS-MBS, PLC, CAPTA), **BIS** (Entity List,
Denied Persons, Unverified, Military End User) and the **State Department** (DDTC ITAR
Debarred, ISN nonproliferation) restricted-party lists.

Most sanctions actors screen *one name against the list*. This one treats **the list itself
as the object** and emits a **change feed**: on every run it diffs the current CSL against
the previous run and returns only the entries that were **added**, **removed**, or
**modified** — down to the field that changed (a new alias, a new address, a program change,
a delisting date). Keyless, official source.

> **Compliance note:** This is a **change-monitoring / research** tool over public U.S.
> government lists. It is **not** a certified sanctions-screening service and its output is
> **not** a compliance or licensing determination. Always confirm any hit against the
> official source and your compliance program before acting.

### Who it's for
- **Trade-compliance & export-control teams** who need a daily "what's new / what's gone"
  digest of the CSL instead of re-diffing a 15k-row file by hand.
- **KYB / AML / onboarding platforms** that want to re-screen only entities affected by
  *today's* designations and delistings.
- **RegTech / GRC builders** wiring an alerting pipeline (Slack, email, ticket) off new
  designations.
- **AI agents** doing due-diligence research that need a clean, chainable "recent sanctions
  changes" tool.

### What it does
1. **Normalizes** every CSL entry into a clean snake_case record (aliases, addresses,
   programs, IDs, dates all as arrays; a flattened `search_names` for easy matching).
2. **Delta / change engine (the core value):** keyed on each entry's stable id, it diffs the
   current list against the last run's snapshot (kept in the actor's key-value store) and
   sets `change_type` = `added` | `removed` | `modified` | `unchanged`. For `modified` it
   reports `changed_fields` and a field-level `changes` array (before/after, plus `added` /
   `removed` for list fields like aliases).
3. **Filters / resolution helpers:** optional `name` (fuzzy contains over name + aliases),
   `source`, `program`, and `country` filters.

### Example input
```json
{
  "mode": "delta",
  "source": "OFAC",
  "program": "RUSSIA",
  "country": "China",
  "maxResults": 5000,
  "monitor": true
}
````

Run it once to seed the baseline (first run reports every matching entry as `added`), then
schedule it daily — each later run returns only that day's added/removed/modified entries.
Set `mode` to `full` for a complete current snapshot.

### Output fields (per record)

- `change_type` — added | removed | modified | unchanged
- `changed_fields`, `changes` — the fields that changed and their before/after (modified only)
- `id`, `entity_number`, `type`, `name`, `title`
- `alt_names`, `search_names` (flattened, lower-cased name + aliases)
- `programs`, `addresses`, `nationalities`, `citizenships`, `places_of_birth`,
  `dates_of_birth`, `ids`
- `source`, `source_list_group` (OFAC / BIS / State), `source_list_url`,
  `source_information_url`
- `federal_register_notice`, `start_date`, `end_date`, `remarks`
- `source_system`

### Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, etc.) via **mcp.apify.com**. The
field-level output descriptions make it a clean, chainable tool: an agent can call it to pull
"recent sanctions-list changes", filter by program or country, then feed the resulting
entities into a downstream due-diligence step.

### Data source

US International Trade Administration — **Consolidated Screening List**, keyless CSV mirror:
`https://api.trade.gov/static/consolidated_screening_list/consolidated.csv`
(redirects to `data.trade.gov/downloadable_consolidated_screening_list/v1/consolidated.csv`).
No API key required. The list is refreshed by Trade.gov as its member agencies update.

### Pricing

Pay-per-result: you are billed per change (or snapshot) record returned. Runs with no changes
cost only the tiny actor-start — a cheap way to monitor daily.

### FAQ

**Is this an OFAC sanctions screening API?** It monitors the official OFAC + BIS + State
Consolidated Screening List for *changes*. It is a monitoring/research tool, not a certified
screening or compliance determination — verify hits against the official source.

**How do I get only new designations?** Use `mode: "delta"` (the default) on a schedule. The
first run seeds the baseline; every run after returns only added/removed/modified entries.

**Can I watch one company or person?** Yes — set `name` to a contains substring; it matches
the primary name and every alias.

**Which lists are covered?** The full CSL: OFAC SDN & Non-SDN (SSI, CMIC, NS-MBS, PLC,
CAPTA), BIS Entity List / Denied Persons / Unverified / Military End User, and State DDTC
(ITAR Debarred) / ISN.

**Do I need an API key?** No. The source is a keyless public government feed.

# Actor input Schema

## `mode` (type: `string`):

'delta' returns only entries that were ADDED, REMOVED, or MODIFIED since this actor's previous run (the change feed). 'full' returns the complete current list as a snapshot. On the very first delta run there is no prior snapshot, so every current entry is reported as 'added'.

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

Case-insensitive substring match against the primary name AND all aliases (alt\_names). Use to watch a specific person, company, or vessel. Empty = all entries.

## `source` (type: `string`):

Keep only entries whose source list or agency group matches this text. Matches the full list name or the coarse group, e.g. 'OFAC', 'Treasury', 'Entity List', 'BIS', 'Denied Persons', 'State', 'ITAR'. Empty = all lists.

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

Keep only entries tagged with a sanctions/control program containing this text, e.g. 'IRAN', 'RUSSIA', 'CMIC', 'SDGT', 'CAATSA'. Empty = all programs.

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

Keep only entries whose nationality, citizenship, place of birth, or address mentions this text, e.g. 'China', 'CN', 'Russia', 'Iran'. Empty = all countries.

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

Maximum number of change (or snapshot) records to emit after filtering. One record = one billable result.

## `monitor` (type: `boolean`):

When true, save the current full list to the actor's key-value store so the NEXT run can compute a delta against it. Keep true for scheduled change-monitoring. Set false for a one-off read that must not overwrite the stored baseline.

## Actor input object example

```json
{
  "mode": "full",
  "maxResults": 100,
  "monitor": true
}
```

# Actor output Schema

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

Added/removed/modified Consolidated Screening List entries (or a full snapshot), in the default dataset.

# 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 = {
    "mode": "full",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/consolidated-screening-list-delta").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 = {
    "mode": "full",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/consolidated-screening-list-delta").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "full",
  "maxResults": 100
}' |
apify call malonestar/consolidated-screening-list-delta --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/consolidated-screening-list-delta",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Sanctions Screening List Change Monitor — CSL / OFAC Delta API",
        "description": "Sanctions screening list change monitor. Diffs the US Trade.gov Consolidated Screening List (OFAC SDN/Non-SDN, BIS Entity/Denied/Unverified/MEU, State DDTC/ISN) against the last run and emits added/removed/modified entries with field-level changes. Keyless. Monitoring tool, not compliance advice.",
        "version": "1.0",
        "x-build-id": "0u2DnTwaTmqcWrBnP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~consolidated-screening-list-delta/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-consolidated-screening-list-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/malonestar~consolidated-screening-list-delta/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-consolidated-screening-list-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/malonestar~consolidated-screening-list-delta/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-consolidated-screening-list-delta",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "delta",
                            "full"
                        ],
                        "type": "string",
                        "description": "'delta' returns only entries that were ADDED, REMOVED, or MODIFIED since this actor's previous run (the change feed). 'full' returns the complete current list as a snapshot. On the very first delta run there is no prior snapshot, so every current entry is reported as 'added'.",
                        "default": "delta"
                    },
                    "name": {
                        "title": "Name filter (contains)",
                        "type": "string",
                        "description": "Case-insensitive substring match against the primary name AND all aliases (alt_names). Use to watch a specific person, company, or vessel. Empty = all entries."
                    },
                    "source": {
                        "title": "Source list filter",
                        "type": "string",
                        "description": "Keep only entries whose source list or agency group matches this text. Matches the full list name or the coarse group, e.g. 'OFAC', 'Treasury', 'Entity List', 'BIS', 'Denied Persons', 'State', 'ITAR'. Empty = all lists."
                    },
                    "program": {
                        "title": "Program filter",
                        "type": "string",
                        "description": "Keep only entries tagged with a sanctions/control program containing this text, e.g. 'IRAN', 'RUSSIA', 'CMIC', 'SDGT', 'CAATSA'. Empty = all programs."
                    },
                    "country": {
                        "title": "Country filter",
                        "type": "string",
                        "description": "Keep only entries whose nationality, citizenship, place of birth, or address mentions this text, e.g. 'China', 'CN', 'Russia', 'Iran'. Empty = all countries."
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 200000,
                        "type": "integer",
                        "description": "Maximum number of change (or snapshot) records to emit after filtering. One record = one billable result.",
                        "default": 5000
                    },
                    "monitor": {
                        "title": "Persist snapshot for next-run delta",
                        "type": "boolean",
                        "description": "When true, save the current full list to the actor's key-value store so the NEXT run can compute a delta against it. Keep true for scheduled change-monitoring. Set false for a one-off read that must not overwrite the stored baseline.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
