# Bank Failures Scraper & API - FDIC Failed Bank List (`neverempty/us-bank-failures`) Actor

Every US bank failure since 1934 from the official FDIC list: the date it failed, what happened to it, who acquired it, and its assets, deposits and estimated cost to the insurance fund - converted from FDIC thousands into US dollars. No API key. Filter by state, year or name.

- **URL**: https://apify.com/neverempty/us-bank-failures.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Developer tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.60 / 1,000 bank failures

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

## Bank Failures Scraper & API - FDIC Failed Bank List

Every US bank failure since **1934** from the FDIC's own list - 4,117 of them - as structured rows.
No API key, no scraping of a web page: this reads the official `banks.data.fdic.gov` service.

### What one row carries

| Field | Example |
|---|---|
| `name` | `FIRST REPUBLIC BANK` |
| `cert` | FDIC certificate number |
| `city` / `state` | `SAN FRANCISCO` / `CA` |
| `failDate` | `2023-05-01` (ISO; the FDIC returns `5/1/2023`) |
| `resolutionCode` / `resolution` | `PA` / *"Purchase and assumption - another bank took the deposits and some assets"* |
| `acquiringInstitution` | `JPMORGAN CHASE BANK, N.A.` |
| `totalAssetsUsd` | `212638872000` |
| `totalDepositsUsd` | `176436706000` |
| `estimatedLossToFundUsd` | `15495761533` |
| `estimatedLossNote` | why the loss is `null`, when it is |
| `sourceUrl` | the FDIC page for this failure |

### Two things this gets right that are easy to get wrong

**1. The FDIC reports money in thousands.**
`QBFASSET` for Silicon Valley Bank is `209026000`. That is **$209 billion**, not $209 million.
Every amount here is multiplied out to whole US dollars, and the conversion is checked against
SVB and First Republic in the test suite.

**2. A cost of `0` does not mean the failure was free.**
Signature Bank comes back with `COST: 0` in this dataset, and the FDIC's own published estimate
for it is around $2.4 billion. So `0` means *"this table does not carry the number"*, not *"no loss"*.
Rows like that get `estimatedLossToFundUsd: null` **and** a one-line `estimatedLossNote` saying why.
A scraper that prints `$0` there is quietly wrong.

### Input

```json
{
  "states": ["CA", "NY"],
  "fromYear": 2008,
  "toYear": 2012,
  "nameContains": "First",
  "maxRecords": 1000
}
```

| Field | Default | Meaning |
|---|---|---|
| `states` | *(all)* | Two-letter codes. Anything else is dropped, and the run says which |
| `fromYear` / `toYear` | *(none)* | Failure year range. The list starts in 1934 |
| `nameContains` | *(none)* | Keep only banks whose name contains this text, in any letter case. `BANK OF` matches 666 of the 4,117 |
| `maxRecords` | `1000` | Stop after this many rows (whole list ≈ 4,100) |
| `maxRetries` | `3` | Retries on timeout, 429 and 5xx only. A 4xx is the API's answer, not a hiccup |

### No result is still an answer

If nothing matches, you get **one row** with `rowType: "no-match"`, the reason, and the query that was
used - not an empty dataset that could equally mean "the API broke". Errors come back the same way,
with `rowType: "error"`, and neither is charged.

### Typical uses

- Bank risk and counterparty monitoring: which institutions failed in a state, and who absorbed them
- Research on the 2008-2011 wave (over 400 failures) and on 2023
- Teaching material and dashboards that need real, citable numbers
- Enriching a bank list with "did this charter end in failure, and when"

### Pricing

Charged per delivered row. Rows that carry no answer - `no-match` and `error` - are not charged.

### Checks

**36 automated checks**, and a mutation run that breaks the source in **15 deliberate defects** to confirm
the checks actually fail when they should: wrong money unit, `0` printed as a loss, invalid dates accepted,
filters silently dropped, 4xx retried, non-JSON responses passed through. All 15 are caught.
Fixtures are real FDIC responses recorded on 2026-09-02, not hand-written.

Fixtures prove what the API *answered*, not that the query was *right*. So the name filter is checked
separately against the live API: `test/verify-name-filter.mjs` counts all 4,117 names locally and compares
that count with what the filter returns. Eight terms match exactly (`First` 772, `BANK OF` 666,
`FIRST NATIONAL` 163, `n.a.` 89, and four more), and the recorded result ships in
`test/_name-filter-verified.json`.

### Other tools by NeverEmpty

Every NeverEmpty Actor follows the same rule: it never returns an empty result to mean two different
things, and it only charges for rows that actually carry an answer.

- **[us-import-tariff-api](https://apify.com/neverempty/us-import-tariff-api)** - USITC duty rates by HTS code
- **[fda-recalls-api](https://apify.com/neverempty/fda-recalls-api)** - food, drug and device enforcement reports
- **[sanctions-screening-official](https://apify.com/neverempty/sanctions-screening-official)** - OFAC, EU and UN lists

### Source

`https://banks.data.fdic.gov/api/failures` - FDIC BankFind Suite. Public data, no key.

# Actor input Schema

## `states` (type: `array`):

Two-letter state codes such as "TX", "CA". Leave empty for the whole country. Codes that are not two letters are ignored, and the run tells you which ones.

## `fromYear` (type: `integer`):

First failure year to include. The FDIC list starts in 1934. Leave 0 for no lower bound.

## `toYear` (type: `integer`):

Last failure year to include. Leave 0 for no upper bound.

## `nameContains` (type: `string`):

Keep only banks whose name contains this text, for example "First". Case does not matter.

## `maxRecords` (type: `integer`):

Stop after this many failed banks. The whole list is about 4,100 rows since 1934.

## `maxRetries` (type: `integer`):

How many times to retry a temporary failure (timeout, 429, 5xx). Errors from the API itself are not retried.

## Actor input object example

```json
{
  "states": [],
  "fromYear": 0,
  "toYear": 0,
  "nameContains": "",
  "maxRecords": 1000,
  "maxRetries": 3
}
```

# Actor output Schema

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

One row per failed bank: name, FDIC certificate number, city and state, the date it failed, what happened to it, who acquired it, and its assets, deposits and estimated cost to the insurance fund in US dollars.

# 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("neverempty/us-bank-failures").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("neverempty/us-bank-failures").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 neverempty/us-bank-failures --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/us-bank-failures"
        }
    }
}

```

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/LurNkAWfbY8Oep5uc/builds/7bO3GczEmpDbMYwAH/openapi.json
