# Enforcement Actions Monitor - SEC, FCA, ASIC, CFTC, FinCEN (`datadeltas/enforcement-actions-monitor`) Actor

Unified regulatory enforcement change feed: SEC litigation releases and administrative proceedings, FCA news plus the FCA Warning List of unauthorised and clone firms, ASIC enforcement media releases, CFTC enforcement actions and FinCEN consent orders.

- **URL**: https://apify.com/datadeltas/enforcement-actions-monitor.md
- **Developed by:** [Daniel Matthee](https://apify.com/datadeltas) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 enforcement action detecteds

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

## Enforcement Actions Monitor — SEC, FCA, ASIC, CFTC & FinCEN

One unified, normalised feed of financial-regulator enforcement actions across
the US, UK and Australia, refreshed on every scheduled run. Seven official
regulator feeds, one consistent record shape, and only **new** actions are
emitted — so every dataset item is an actionable event, not a re-scrape.

### Sources (v1)

| Source key | Regulator | Region | What it covers | Depth of feed |
|---|---|---|---|---|
| `sec_litigation` | SEC | US | Litigation releases (civil court actions) | latest ~25 releases (≈3 weeks) |
| `sec_administrative` | SEC | US | Administrative proceedings & orders | latest ~25 releases (≈2-3 weeks) |
| `fca_news` | FCA | UK | News, press releases, statements (incl. fines & bans) | latest 20 items (≈1 month) |
| `fca_warnings` | FCA | UK | **Warning List** — unauthorised & clone firms | latest 20 warnings |
| `asic` | ASIC | AU | Enforcement-tagged media releases | back to 2000 (full archive) |
| `cftc` | CFTC | US | Enforcement actions & orders | latest 10 releases (≈3 months) |
| `fincen` | FinCEN | US | Enforcement actions & consent orders | back to 1999 (full table, 119 actions) |

Every source is a public, keyless regulator publication — no API keys, no
logins, no ToS risk in your compliance chain.

**Honest limits, so you can plan around them:**

- The SEC, FCA and CFTC publish only their most recent items in the feeds this
  actor reads. A `sinceDays` larger than the depth column above cannot invent
  history the regulator does not publish there. ASIC and FinCEN do reach back
  years.
- **SEC records carry no summary.** The SEC's feeds repeat the case name in the
  description field, so `summary` is `null` rather than a fake echo of the
  title. That also means `keywords` matches only the case name for SEC records
  — filter SEC by `actionTypes` and party names, not by topic words like
  "crypto". Fetching SEC detail pages for real summaries is on the v1.1
  roadmap.
- There is no keyless FCA *enforcement-only* feed: the FCA's filtered
  enforcement search sits behind bot protection. FCA enforcement reaches you
  through `fca_news` (its fines and bans are press releases) plus your
  `keywords` filter.
- `parties` is filled only where the regulator's title IS the party name (SEC,
  FinCEN, FCA Warning List). For narrative headlines (ASIC, CFTC, FCA news)
  `parties` is an empty array — a deliberately empty field beats a guessed
  entity in a compliance pipeline.

### Example output records

An FCA Warning List entry (the highest-value record type for KYC screening):

```json
{
  "source": "fca_warnings",
  "regulator": "FCA",
  "region": "UK",
  "sourceId": "173586|2026-08-28",
  "title": "reclaim-experts.com (Clone of FCA Authorised firm) (new)",
  "summary": "[Clone] Fraudsters copy the details of firms we authorise to try and convince people that their firm is genuine... This firm is not authorised by us but has been contacting people pretending to be an authorised firm.",
  "actionType": "warning",
  "parties": ["reclaim-experts.com"],
  "publishedDate": "2026-08-28",
  "url": "https://www.fca.org.uk/news/warnings/reclaim-expertscom-clone-fca-authorised-firm",
  "detectedAt": "2026-08-31T10:07:00Z"
}
```

A FinCEN consent order:

```json
{
  "source": "fincen",
  "regulator": "FinCEN",
  "region": "US",
  "sourceId": "2026-02",
  "title": "In the Matter of UBS Financial Services Inc.",
  "summary": "FinCEN enforcement action, matter 2026-02; financial institution type: Securities and Futures",
  "actionType": "administrative",
  "parties": ["UBS Financial Services Inc."],
  "publishedDate": "2026-08-03",
  "url": "https://www.fincen.gov/system/files/2026-07/UBS-Consent-Order.pdf",
  "detectedAt": "2026-08-31T10:07:00Z"
}
```

Notes on the shape: `sourceId` is stable per source and is the dedupe key
(SEC/CFTC use the regulator's own release number, FinCEN the matter number,
ASIC the `NN-NNNMR` document number). FCA Warning List ids carry the published
date, so a warning the FCA **updates** emits again — for a screening pipeline
an updated warning is a new event. `detectedAt` always tells you when the
monitor first saw the record.

### Input options

| Field | Type | Default | Description |
|---|---|---|---|
| `sources` | array | all seven | Which regulator feeds to monitor (keys in the table above) |
| `actionTypes` | array | `[]` (all) | `litigation`, `administrative`, `warning`, `media-release` |
| `keywords` | array | `[]` | Case-insensitive filter on title + summary; empty = everything |
| `sinceDays` | integer | `14` | Backfill window in days on the first run |
| `maxItems` | integer | `500` | Cap on records emitted per run (overflow emits next run) |
| `userAgent` | string | actor default | Declared contact string — the SEC's automated-access policy expects one. Set your own. |

`actionTypes` maps across regulators like this: `litigation` = SEC litigation
releases + CFTC enforcement actions; `administrative` = SEC administrative
proceedings + FinCEN consent orders; `warning` = FCA Warning List;
`media-release` = ASIC enforcement releases + FCA news.

### How to use it

Schedule the actor (daily is ideal). The first run backfills the last
`sinceDays` days; every later run emits only actions it has never seen before,
so you can wire the dataset straight into Slack, Zapier/Make, or your own
ingestion with no dedupe logic on your side.

### Use cases

- **KYC / onboarding screening** — "FCA warning list API", "unauthorised firms
  feed": pipe `fca_warnings` into onboarding checks so a clone or unauthorised
  firm is blocked the day the FCA names it, with `parties` giving you the
  domain or trading name to match on.
- **Compliance & AML monitoring** — "SEC enforcement actions monitor",
  "FinCEN consent orders feed": one scheduled feed replaces manually checking
  five regulator sites; filter `keywords` for your counterparties, or
  `actionTypes: ["administrative"]` for orders and consent decrees only.
- **Risk data & financial journalism** — "cross-border regulatory enforcement
  data": a single normalised stream of SEC, FCA, ASIC, CFTC and FinCEN actions
  with regulator, region and action type already tagged, ready for a database
  or a newsroom alert.

### Failure handling & update promise

- One regulator being down or redesigned never kills a run: that source is
  logged as degraded and every other source still delivers. If **every**
  source fails the run fails loudly rather than reporting a false quiet day.
- Schema drift is logged with the exact field that moved, never a crash — and
  ASIC's known dirty metadata values are normalised, not rejected.
- Records beyond `maxItems` are not marked as seen, so nothing is lost — they
  emit on the next run. The cap is shared out evenly between the sources that
  have records (with the unused remainder redistributed), so a busy regulator
  never starves a quiet one out of a capped run.
- Retries are spent only where they can help: a rate limit or a 5xx is retried
  with backoff, a moved page is not. If a regulator refuses the declared
  `userAgent` (HTTP 403) the run stops with that fix in the message rather than
  reporting seven dead feeds.
- Source markup and feed URLs are re-checked and test fixtures refreshed on a
  regular cadence; parser fixes ship as patch releases.

### Pricing events

| Event | Price | Charged |
|---|---|---|
| `actor-start` | $0.005 | once per run |
| `action-detected` | $0.02 | per NEW enforcement action emitted |

Low volume by design — you pay for coverage, not bulk. A 14-day backfill
across all seven sources measured 62 records on 2026-08-31; a typical quiet
day is a handful of events.

### Changelog

- **0.1.1** (2026-08-31) — `maxItems` is now split **fairly** across the
  sources that returned records (unused shares are redistributed), so a busy
  regulator can no longer consume the whole cap and leave the others at zero.
  A moved or missing page (404) fails immediately instead of being retried
  three times against the regulator's rate budget; only 429/5xx/timeouts are
  retried. A refused `User-Agent` (401/403) now fails the run with the exact
  fix in the message instead of being reported as "all sources failed".
- **0.1** (2026-08-31) — initial release: SEC litigation releases and
  administrative proceedings, FCA news and Warning List, ASIC enforcement
  media releases, CFTC enforcement actions, FinCEN consent orders. Monitor
  state in a named key-value store; keyword and action-type filters, backfill
  window, per-run item cap, per-source failure degradation.

# Actor input Schema

## `sources` (type: `array`):

Which official regulator feeds to monitor. Default: all seven. Every source is keyless official data. A source that is temporarily unreachable degrades to a warning - the others still emit.

## `actionTypes` (type: `array`):

Optional filter on the normalised action type. 'litigation' = SEC litigation releases and CFTC enforcement actions; 'administrative' = SEC administrative proceedings and FinCEN consent orders; 'warning' = FCA Warning List entries; 'media-release' = ASIC enforcement media releases and FCA news. Leave empty for all types.

## `keywords` (type: `array`):

Optional case-insensitive substring match on the action title and summary, e.g. "crypto", "insider trading", "clone", "Ponzi", or a specific firm name you are screening. An action is emitted when any keyword matches. Leave empty to monitor everything.

## `sinceDays` (type: `integer`):

The first run emits actions published within this many days; later runs emit only actions never seen before. NOTE: the SEC, FCA and CFTC feeds carry only their 10-25 latest items (roughly 2 weeks to 3 months), so a window larger than that is bounded by what the regulator publishes. ASIC and FinCEN reach back years.

## `maxItems` (type: `integer`):

Hard cap on action records emitted in one run (keeps test runs cheap). Records beyond the cap are NOT marked as seen, so they emit on the next run - nothing is lost.

## `userAgent` (type: `string`):

The SEC's automated-access policy expects a declared User-Agent with a contact address. Set your own, e.g. "MyCompany compliance monitor (contact: you@example.com)". Leave empty to use the actor default.

## Actor input object example

```json
{
  "sources": [
    "sec_litigation",
    "sec_administrative",
    "fca_news",
    "fca_warnings",
    "asic",
    "cftc",
    "fincen"
  ],
  "actionTypes": [],
  "keywords": [],
  "sinceDays": 14,
  "maxItems": 500
}
```

# Actor output Schema

## `records` (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 = {
    "actionTypes": [],
    "keywords": [],
    "userAgent": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("datadeltas/enforcement-actions-monitor").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 = {
    "actionTypes": [],
    "keywords": [],
    "userAgent": "",
}

# Run the Actor and wait for it to finish
run = client.actor("datadeltas/enforcement-actions-monitor").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 '{
  "actionTypes": [],
  "keywords": [],
  "userAgent": ""
}' |
apify call datadeltas/enforcement-actions-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datadeltas/enforcement-actions-monitor"
        }
    }
}

```

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/fkasuE1y8Th2D2fdu/builds/Z4e8EfUPJ2M7LYr39/openapi.json
