# Bank Enforcement Action Tracker — OCC/FDIC/Fed API (`malonestar/bank-enforcement-tracker`) Actor

Bank enforcement action tracker: merges US federal bank & credit-union enforcement actions into one normalized feed. Tags each action by type (Cease & Desist, Civil Money Penalty, BSA/AML, PCA) and severity, resolves the institution to an FDIC CERT, and supports delta monitoring. Keyless.

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

## Pricing

from $4.40 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Bank Enforcement Action Tracker — OCC / FDIC / Fed enforcement API

A **bank enforcement action API** that merges US **federal bank & credit-union
enforcement actions** into ONE normalized, entity-resolved feed. It tags every
action by **type** (Cease & Desist, Civil Money Penalty, BSA/AML, Fair Lending,
Prompt Corrective Action, Written Agreement, Removal/Prohibition, Termination)
and by **severity**, resolves the institution to its **FDIC certificate (CERT)**,
and can emit **only the new actions since your last run**. The raw orders are
public but scattered across regulators — this actor builds the transform layer.

### Who it's for

- **AML / BSA & compliance teams** monitoring enforcement risk across banks.
- **Bank & fintech risk / vendor-due-diligence** analysts screening counterparties.
- **KYB / onboarding** platforms enriching institutions with enforcement history.
- **Bank & regulatory lawyers, journalists, and researchers** tracking actions.
- **AI agents** needing a "bank enforcement action" lookup tool.

### What it does

Pulls enforcement actions from the enabled regulators, **normalizes** each to a
unified record, **classifies** action type + severity (a monetary penalty floors
severity to critical), best-effort **resolves the institution to an FDIC CERT**
via the keyless FDIC BankFind API, **dedups** on a stable action id, and sorts by
severity then date. Use **monitor** mode on a schedule for a new-action alert.

### Regulators

- **FRB** — Federal Reserve Board enforcement actions (`enforcementactions.csv`).
  **Live**: 2,884 actions back to 1989, refreshed as the Fed publishes.
- **OCC** — Office of the Comptroller of the Currency. **Currently unavailable
  upstream**: since roughly 2026-07, OCC's EASearch application answers
  `302 → /EASearch/404.htm` on every data route, including the JSON export this
  actor reads. It is still attempted on every run, so the feed recovers by itself
  the moment OCC restores the route. Until then OCC appears in each row's
  `sources_failed` and its actions are **absent**, which is a different fact from
  "OCC had none".
- **FDIC** — used for entity resolution (institution name → CERT / state / city).
- **NCUA / CFPB** — config blocks are scaffolded and ship disabled; they turn on as
  each regulator's keyless machine-readable feed is verified.

#### How to read `sources_ok` / `sources_failed`

Every row carries both. A regulator listed in `sources_failed` was **not consulted
successfully**, so the absence of one of its actions proves nothing. If *every*
requested regulator fails, the run **fails loudly and bills nothing** rather than
returning an empty dataset that looks like an answer. Asking for only a regulator
this build cannot serve also fails, rather than quietly answering with a different
regulator's actions.

### Example input

```json
{
  "regulators": ["FRB", "OCC"],
  "sinceDate": "2024-01-01",
  "actionTypes": ["Civil Money Penalty", "BSA/AML"],
  "institutionName": "",
  "state": "",
  "resolveEntities": true,
  "maxResults": 500,
  "monitor": false
}
```

### Output (per action)

`institution_name`, `regulator`, `institution_id`, `id_type`, `fdic_cert`,
`fdic_matched_name`, `action_type`, `severity`, `severity_rank`, `penalty_amount`,
`action_date`, `title`, `url`, `source_system`, `docket_number`, `location`,
`subject_matters[]`, `termination_date`, `action_id`, `sources_ok[]`,
`sources_failed[]`.

### Use as an MCP tool

Available to AI agents via `mcp.apify.com` as a "bank enforcement action tracker"
tool — filters in, classified + entity-resolved enforcement records out. The
field-level descriptions make it a clean, chainable tool for agent workflows.

### FAQ

**Which regulators are covered?** Federal Reserve enforcement actions today, with
FDIC-based entity resolution. OCC is wired and attempted every run but its export
is broken upstream (see Regulators). NCUA and CFPB are scaffolded for a future
release.
**How is severity decided?** Heuristic: monetary penalties and Cease & Desist / PCA
rank highest, written agreements medium, terminations low; any real penalty floors
severity to critical. **Can I track only new actions?** Yes — `monitor: true` on a
schedule. **Is it keyless?** Yes — the Fed CSV and FDIC BankFind need no key or account.
**How do you resolve institutions?** Fuzzy name match against FDIC BankFind, gated
by name-token overlap and (when available) state agreement.

### Source

**Federal Reserve** enforcement actions
(`federalreserve.gov/supervisionreg/files/enforcementactions.csv`) + **FDIC
BankFind** institutions API (`banks.data.fdic.gov`), with the **OCC** EASearch
export (`apps.occ.gov/EASearch`) attempted on every run. Official, keyless, no
anti-bot.

### Pricing (Pay Per Result)

Billed per enforcement-action record returned. Empty searches cost nothing.

# Actor input Schema

## `regulators` (type: `array`):

Subset of federal financial regulators to include. Allowed codes: FRB (Federal Reserve, live), OCC (attempted every run; OCC's own EASearch export has been returning a 404 redirect since ~2026-07, so OCC actions are currently reported in sources\_failed rather than returned), NCUA and CFPB (scaffolded, pending a verified keyless feed). Empty = all currently-enabled regulators. Requesting only unavailable regulators fails the run rather than substituting a different one.

## `sinceDate` (type: `string`):

Only return enforcement actions dated on or after this day (matches the action's start/effective date). Use for recurring monitoring windows. Empty = no lower bound.

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

Keep only these unified action types. Allowed values: Cease & Desist, Civil Money Penalty, BSA/AML, Fair Lending, Prompt Corrective Action, Written Agreement, Removal/Prohibition, Termination, Other. Empty = all types.

## `institutionName` (type: `string`):

Case-insensitive substring filter on the institution / party name (e.g. 'wells fargo', 'century bank'). Empty = all institutions.

## `state` (type: `string`):

Filter to actions whose institution is located in this US state (2-letter code, e.g. CA, TX). Derived from the action's location / resolved FDIC record. Empty = all states.

## `resolveEntities` (type: `boolean`):

Best-effort match each institution name to an FDIC certificate (CERT) via the keyless FDIC BankFind API, adding fdic\_cert / fdic\_matched\_name. Turn off to skip the extra lookups and run faster.

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

Maximum number of enforcement-action records to return after merging, filtering, dedup, and severity sort.

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

When scheduled, emit only actions whose stable action id was not seen in previous runs - a recurring new-enforcement-action alert. State is kept in the actor's key-value store.

## Actor input object example

```json
{
  "regulators": [
    "FRB",
    "OCC"
  ],
  "sinceDate": "2024-01-01",
  "actionTypes": [
    "Civil Money Penalty",
    "BSA/AML"
  ],
  "resolveEntities": true,
  "maxResults": 500,
  "monitor": false
}
```

# Actor output Schema

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

Normalized, entity-resolved bank/credit-union enforcement actions, 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 = {
    "regulators": [
        "FRB",
        "OCC"
    ],
    "sinceDate": "2024-01-01",
    "actionTypes": [
        "Civil Money Penalty",
        "BSA/AML"
    ],
    "maxResults": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/bank-enforcement-tracker").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 = {
    "regulators": [
        "FRB",
        "OCC",
    ],
    "sinceDate": "2024-01-01",
    "actionTypes": [
        "Civil Money Penalty",
        "BSA/AML",
    ],
    "maxResults": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/bank-enforcement-tracker").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 '{
  "regulators": [
    "FRB",
    "OCC"
  ],
  "sinceDate": "2024-01-01",
  "actionTypes": [
    "Civil Money Penalty",
    "BSA/AML"
  ],
  "maxResults": 500
}' |
apify call malonestar/bank-enforcement-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/I3nJoO7HB0WeedQ7R/builds/ooJMxaUCDylhRUBOO/openapi.json
