# FDIC Bank Data Scraper (`devilscrapes/fdic-bank-data-scraper`) Actor

Query the FDIC BankFind Suite API by state, active status, asset size, or name and get one flat row per FDIC-insured institution — name, city, state, active status, and total assets — plus optional recent financials, ready for JSON, CSV, or Excel export.

- **URL**: https://apify.com/devilscrapes/fdic-bank-data-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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

<p align="center">
  <img src=".actor/icon.svg" width="160" alt="FDIC Bank Data Scraper — Devil Scrapes">
</p>

## FDIC Bank Data Scraper

**$0.20 per run + $0.002 per row — about $2.20 per 1,000 results.**
Pay only for results that land, no credit card required to try.

The FDIC's own BankFind Suite API is public and keyless, but it answers in
a nested JSON envelope with undocumented paging and no full-text search —
every buyer ends up writing the same offset-loop, field-mapping, and
client-side filtering code from scratch. We already wrote it. Point this
Actor at a state, an asset-size floor, or a name fragment, and get back
one flat row per FDIC-insured institution, plus optional recent
financials, ready for a spreadsheet, a CRM import, or a compliance list.

### 🏦 What this scrapes

The FDIC's public **BankFind Suite API** (`api.fdic.gov/banks`) — the
same data that powers the FDIC's own BankFind web tool. Every matched
institution carries its FDIC certificate number, name, city, state,
active status, and total assets. When requested, a sibling row per
institution adds the most recent quarterly financials on file.

### 🔥 Features

- **Filter by state, active status, minimum assets, or a name fragment**
  — combine any subset in a single run.
- **Optional financials rows** — enable `include_financials` and get one
  extra row per institution with its most recent reported total assets,
  not just the headline institution record.
- **Flat, typed output** — a fixed row schema (`cert`, `name`, `city`,
  `state`, `active`, `total_assets_thousands`, and more), not the FDIC's
  raw `{"meta": ..., "data": [{"data": {...}}]}` envelope re-wrapped.
- 🛡️ **We rotate browser fingerprints** (curl-cffi impersonation across
  Chrome and Firefox profiles) on every request.
- 🔁 **We retry with exponential backoff** on `408/429/5xx` and honour
  `Retry-After`, up to 5 attempts per page — a busy FDIC endpoint never
  costs you a failed run.
- 🧱 **We never crash on a bad record.** A financials lookup that fails
  for one institution is skipped with a logged warning; the institution
  row itself still lands in the dataset.
- 🧊 **A zero-match search still succeeds.** A narrow filter combination
  that matches nothing finishes with a clear status message, not a
  failed run and a wasted charge.

### 💡 Use cases

- **Fintech vendors** building a bank-directory feature that needs the
  canonical, up-to-date list of FDIC-insured institutions.
- **Bank-vendor sales teams** prospecting by state and asset-size tier to
  build a target account list.
- **M\&A and equity-research analysts** screening the FDIC-insured
  universe by asset size and status.
- **Compliance teams** needing the authoritative active/inactive
  institution list for a state or the whole country.

### ⚙️ How to use it

1. Optionally set `state` (2-letter USPS code) to narrow the search — or
   leave it blank for the whole country.
2. Optionally set `active_only`, `min_assets_thousands`, or
   `name_contains` to narrow further.
3. Set `max_results` to cap how many rows you're billed for.
4. Enable `include_financials` if you also want a recent-financials row
   per institution.
5. Run the Actor — the dataset fills with one row per matching
   institution (plus financials rows, if enabled).
6. Export as JSON, CSV, or Excel straight from the Console, or pull it
   via the API.

No API key. No account. Just a set of filters.

### 📥 Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `state` | string | no | `TX` | 2-letter USPS state code. Leave blank for no state filter. |
| `active_only` | boolean | no | `true` | Only currently-active institutions when enabled. |
| `min_assets_thousands` | integer | no | — | Drop institutions below this total-assets floor, in $ thousands. |
| `name_contains` | string | no | — | Case-insensitive substring match against the institution name. |
| `max_results` | integer | no | `100` | Hard cap on rows returned (1–5000). |
| `include_financials` | boolean | no | `false` | Also emit a recent-financials row per matched institution. |

Example input:

```json
{
  "state": "TX",
  "active_only": true,
  "max_results": 25,
  "include_financials": false
}
```

### 📤 Output

One row per matched institution (`row_type: "institution"`), plus one
optional row per institution when `include_financials` is enabled
(`row_type: "financials"`):

```json
{
  "row_type": "institution",
  "cert": 10327,
  "name": "Citizens State Bank of Luling",
  "city": "Luling",
  "state": "TX",
  "active": true,
  "total_assets_thousands": 73820,
  "report_date": null,
  "financials_total_assets_thousands": null,
  "scraped_at": "2026-09-04T12:00:00.000Z"
}
```

```json
{
  "row_type": "financials",
  "cert": 3510,
  "name": null,
  "city": null,
  "state": null,
  "active": null,
  "total_assets_thousands": null,
  "report_date": "19840630",
  "financials_total_assets_thousands": 108020000,
  "scraped_at": "2026-09-04T12:00:00.000Z"
}
```

Fields that don't apply to a given `row_type` come back as `null` — never
a missing key, never a crashed row.

### 💰 Pricing

This Actor bills **Pay-Per-Event**, so the invoice matches what you
actually received:

| Event | Price |
|---|---|
| Actor start | **$0.20** per run |
| Result emitted | **$0.002** per row written to the dataset (institution or financials) |

That works out to roughly **$2.20 per 1,000 results**. A run that finds
nothing costs you the start fee and nothing else — no data, no per-row
charge.

### 🚧 Limitations

- Name search is a client-side substring match, not full-text search —
  the FDIC API's own `filters` grammar is field:value equality, not a
  search engine.
- Asset-size filtering (`min_assets_thousands`) is applied client-side
  after the API call, not as a server-side range query.
- Financials are limited to the single most-recent report per
  institution — historical time-series across multiple report dates
  isn't exposed in v1.
- Branch-level location data isn't included — this Actor covers
  institutions and their financials only.

### ❓ FAQ

**Do I need an FDIC API key?** No — the BankFind Suite API is public and
keyless. You don't need an account either.

**What happens if my search matches nothing?** The run finishes
successfully with zero rows and a status message describing exactly what
was searched — you're never charged a per-row fee for zero rows, and the
run never fails just because a narrow filter combination matched
nothing.

**Can I get financials for every historical quarter?** Not in v1 — each
institution's financials row reflects only the most recent report date
on file. A historical time-series mode is a possible future addition.

**Why did my run fail instead of just returning nothing?** A run fails
loud only when the FDIC API itself is unreachable or returns something
we can't parse after retries — that's a real error, not an empty
result, and we never disguise the difference.

**Can I search the whole country instead of one state?** Yes — leave
`state` blank to remove the state filter entirely.

### 🙌 Your feedback

Found an issue or have a feature request for the FDIC Bank Data Scraper?
Reach out via
<https://apify.com/DevilScrapes> — we
read every message and ship fixes fast.

# Actor input Schema

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

2-letter USPS state code (e.g. <code>TX</code>). Filters institutions to this state. Leave blank for no state filter.

## `active_only` (type: `boolean`):

When enabled, only currently-active FDIC-insured institutions are returned.

## `min_assets_thousands` (type: `integer`):

Drop institutions reporting total assets below this amount, in US dollar thousands. Leave blank for no minimum.

## `name_contains` (type: `string`):

Case-insensitive substring match against the institution name (e.g. <code>State Bank</code>). Leave blank for no name filter.

## `max_results` (type: `integer`):

Hard cap on the number of institution rows returned, independent of how many rows FDIC reports matching.

## `include_financials` (type: `boolean`):

When enabled, also emit one financials row per matched institution with the most recent quarterly total assets on file.

## Actor input object example

```json
{
  "state": "TX",
  "active_only": true,
  "max_results": 25,
  "include_financials": false
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "state": "TX",
    "active_only": true,
    "max_results": 25,
    "include_financials": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/fdic-bank-data-scraper").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 = {
    "state": "TX",
    "active_only": True,
    "max_results": 25,
    "include_financials": False,
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/fdic-bank-data-scraper").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 '{
  "state": "TX",
  "active_only": true,
  "max_results": 25,
  "include_financials": false
}' |
apify call devilscrapes/fdic-bank-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devilscrapes/fdic-bank-data-scraper"
        }
    }
}

```

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/9PmRwO0njCrju0F3O/builds/NMSTgTPowleeCMxx8/openapi.json
