Bank Failures Scraper & API - FDIC Failed Bank List
Pricing
from $5.60 / 1,000 bank failures
Bank Failures Scraper & API - FDIC Failed Bank List
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.
Pricing
from $5.60 / 1,000 bank failures
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 hours ago
Last modified
Categories
Share
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
{"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 - USITC duty rates by HTS code
- fda-recalls-api - food, drug and device enforcement reports
- sanctions-screening-official - OFAC, EU and UN lists
Source
https://banks.data.fdic.gov/api/failures - FDIC BankFind Suite. Public data, no key.