# Bank Health Check: FDIC Bank Data, Ratios & Enforcement (`reliable_tools/bank-health-check`) Actor

Bank health check for US banks from official FDIC BankFind data: status, failures and mergers, capital ratios, NPL, ROA, uninsured deposits, 8-quarter trend, Fed and OCC enforcement actions, LEI and a rule-based health signal.

- **URL**: https://apify.com/reliable_tools/bank-health-check.md
- **Developed by:** [Reliable Tools](https://apify.com/reliable_tools) (community)
- **Categories:** Developer tools, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 bank profiles

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bank Health Check: FDIC Bank Data, Ratios & Enforcement

Not investment, credit or legal advice; rule-based screen, not a supervisory rating. Not affiliated with or endorsed by
FDIC, Fed or OCC.

This bank health check looks up US banks in the official FDIC BankFind data and returns one counterparty profile per
bank: legal name, FDIC certificate, RSSD ID and LEI, active or inactive status, failure and merger history, total
assets, deposits and equity, capital ratios, noncurrent loans, return on assets, the estimated uninsured deposit share,
an 8-quarter trend, open Federal Reserve and OCC enforcement actions, and a transparent health signal (sound, watch or
weak) with every reason spelled out. Give banks by name and state, FDIC cert number, RSSD ID, LEI or website, one or
thousands at a time.

This is information from official public sources, not investment, credit or legal advice. Every row carries a
`disclaimer` field saying so.

### What does Bank Health Check do?

1. **Finds the bank.** By FDIC certificate number, Federal Reserve RSSD ID (a holding company RSSD returns its bank
   subsidiaries), LEI, website, or name with state. For names that are not an exact match, an AI match score decides
   whether an FDIC institution is the bank you mean. Unclear names, and names shared by several active or closed
   banks that your state or city does not separate, come back as `ambiguous` with the candidates and are not charged. For this step the bank name, city, state and website from your input and the FDIC record are sent to an
   external AI service for this one fixed comparison only. Turn off **AI match score for bank names** to keep it off.
2. **Tells you if it still exists.** Active or inactive, the date it closed, and for failed banks the failure date,
   the acquiring bank, the resolution type and the FDIC's estimated loss to the deposit insurance fund. For merged
   banks, the institution it merged into.
3. **Reads the latest call report figures** published by the FDIC: total assets, deposits, equity, tier 1 leverage,
   tier 1 and total risk-based capital, CET1, noncurrent loans, net charge-offs, loan loss reserve, ROA, ROE, net
   interest margin, efficiency ratio, loans to deposits, estimated uninsured deposits, brokered deposits and unrealized
   losses on held-to-maturity securities.
4. **Shows the trend** over the last 8 quarters with year on year changes.
5. **Checks enforcement actions** published by the Federal Reserve Board and the OCC against the bank and its holding
   company: cease and desist orders, written and formal agreements, prompt corrective action directives and civil
   money penalties, open or terminated.
6. **Adds the LEI record** from GLEIF: registration status, next renewal date and the ultimate parent.
7. **Gives a health signal** from fixed, published rules (listed below). Every row says which rule fired, with the
   value and the threshold. No black box.

### Who uses it?

- **Treasury teams** placing deposits above the insured limit and checking counterparty banks every quarter.
- **Fintechs and BaaS programs** choosing or monitoring a sponsor bank: open consent orders, brokered and uninsured
  deposit concentration, capital and growth.
- **Stablecoin, tokenized fund and RWA issuers** documenting the quality of the banks that hold reserves.
- **B2B credit, procurement and KYB teams** verifying that a customer's or supplier's bank is real, insured and active.
- **Analysts and journalists** pulling failure history and ratios for many banks at once.

### What data you get

| Field | What it is |
|---|---|
| `status` | `matched`, `ambiguous`, `not_found`, `invalid_input` or `unavailable` |
| `fdicCert`, `rssdId`, `lei` | FDIC certificate number, Federal Reserve RSSD ID, Legal Entity Identifier |
| `name`, `city`, `state`, `website` | As registered with the FDIC |
| `institutionStatus`, `inactiveSince` | `active` or `inactive`, and the date it became inactive |
| `charterClass`, `primaryRegulator`, `holdingCompany` | Charter type, supervisor (OCC, FDIC, FED) and holding company |
| `latestFinancials` | Latest quarter: assets, deposits, equity, net income, capital ratios, asset quality, earnings and funding ratios (USD and percent) |
| `trend` | Up to 8 quarters of key figures, plus year on year and full-period changes |
| `failure` | Failure date, acquirer, resolution, assets and deposits at failure, estimated loss to the fund |
| `successor` | The event that ended the institution and the institution it went to |
| `history` | Mergers, acquisitions, name, charter and regulator changes |
| `enforcementActions` | Fed and OCC actions: type, dates, open or terminated, penalty amount, link |
| `enforcementSummary` | Open and total actions, sources checked and sources not checked, and the note that the OCC lists are not guaranteed to be comprehensive |
| `leiRecord` | GLEIF legal name, entity and registration status, renewal date, ultimate parent |
| `healthSignal` | `sound`, `watch`, `weak`, `not_rated` or `inactive`, the estimated capital category and every reason |
| `nameMatch` | For banks given by name: method (rules or AI match score), the score and the evidence |
| `candidates` | For ambiguous names: the possible banks with cert number, name, city, state, active or inactive, established and inactive-since dates and assets, so you can rerun with the cert |
| `summary` | One sentence for a quick review |
| `disclaimer` | Not investment, credit or legal advice; rule-based screen, not a supervisory rating |
| `bankFindUrl` | The bank's official FDIC BankFind page |

Amounts are in US dollars (the FDIC publishes thousands; the Actor converts them). Ratios are percentages.

### How the health signal works

The signal is a screen, not a rating. Supervisory CAMELS ratings are confidential and are never published. The Actor
applies these rules to the latest quarter and the year on year change:

| Rule | Watch | Weak |
|---|---|---|
| Estimated capital category (prompt corrective action thresholds, or the community bank leverage ratio) | adequately capitalized | undercapitalized or worse |
| Noncurrent loans to loans | 3% or more | 5% or more |
| Return on assets, year to date | below 0% | below -1% |
| Estimated uninsured share of domestic deposits | 75% or more | 60% or more together with held-to-maturity losses of 40% of equity or more |
| Unrealized held-to-maturity losses to equity | 50% or more | see above |
| Brokered deposits to deposits | 25% or more | |
| Noncurrent loans, year on year | up 1.5 points or more | |
| Tier 1 leverage ratio, year on year | down 1.5 points or more | |
| Total deposits, year on year | down 25% or more | |
| Total assets, year on year | up 50% or more | |
| Open formal enforcement action against the bank | cease and desist order, written or formal agreement, consent order | prompt corrective action or capital directive |

`sound` means no rule fired. An open action against the holding company only is listed as information. A bank whose
latest report is older than the latest published quarter is `not_rated`. Inactive banks get `inactive`, plus the
signal their last report would have produced (`signalOnLastReport`). With an as-of quarter, a bank that was still open
at that date is rated as it was then (`statusAtAsOfQuarter: active`), and enforcement actions count as they stood at
that date. Run Silicon Valley Bank with the as-of quarter 2022-12-31 to see the rules flag it as `weak`.

The capital category is an estimate from the reported ratios, not the official designation, which only the
supervisor makes.

### How to run a bank health check

1. Open the Actor and put your banks into **Banks to check**, for example
   `{"name": "Frost Bank", "state": "TX"}` or `{"cert": "628"}`.
2. Or link a CSV file with columns such as name, state, cert, rssd, lei, website.
3. Optional: set **As of quarter** to see the banks as they were at a past quarter end.
4. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API.

### Example output (shortened)

```json
{
  "reference": "B-1",
  "status": "matched",
  "matchedBy": "name",
  "fdicCert": 5510,
  "rssdId": "682563",
  "lei": "G5AHTAP80NWA3Q8RDC78",
  "name": "Frost  Bank",
  "city": "San Antonio",
  "state": "TX",
  "institutionStatus": "active",
  "primaryRegulator": "FED",
  "latestFinancials": {
    "quarter": "2026-06-30",
    "totalAssetsUsd": 53950075000,
    "tier1LeverageRatioPct": 9.08,
    "totalRiskBasedRatioPct": 15.42,
    "noncurrentLoansPct": 0.55,
    "roaPct": 1.31,
    "uninsuredDepositSharePct": 52.16
  },
  "healthSignal": {
    "signal": "sound",
    "capitalCategoryEstimate": {"category": "well_capitalized"},
    "reasons": [{"rule": "all_clear", "level": "info", "text": "No rule fired: capital, asset quality, earnings, funding and enforcement checks passed."}]
  },
  "enforcementSummary": {"open": 0, "total": 0, "sourcesChecked": ["Federal Reserve", "OCC"]},
  "bankFindUrl": "https://banks.data.fdic.gov/bankfind-suite/bankfind/details/5510"
}
```

These are the figures for the 2026-06-30 report; run the Actor for current values.

### Use it from the API, Python, n8n, Make or an AI agent

Start the Actor through the Apify API, the Apify Python or JavaScript client, n8n, Make, Zapier or the Apify MCP
server for AI agents. Send `{"banks": [...]}` as input and read the default dataset. The `SUMMARY` record in the
key-value store lists the counts, the health rules, the sources and the data dates of the run.

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("reliable_tools/bank-health-check").call(run_input={"banks": [{"cert": "628"}, {"name": "Lead Bank", "state": "MO"}]})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["name"], row["healthSignal"]["signal"])
```

### How much does it cost?

Pay per result, no subscription:

| Event | Price |
|---|---|
| Bank profile (identifiers, status, history, failure, latest figures, enforcement, LEI) | $0.004 per bank |
| Trend and health signal (8 quarters, changes, signal with reasons) | $0.006 per bank |
| Actor start | $0.00005 per run |

A full check is $0.01 per bank, or $10 per 1,000 banks. Turn off **8-quarter trend and health signal** to pay only
$0.004 per bank. Not found, ambiguous, invalid and unavailable rows are free.

### Data sources and licences

| Source | What it gives | Licence |
|---|---|---|
| FDIC BankFind Suite API (api.fdic.gov) | Institutions, quarterly financials, structure history, failures | US government work, public domain (17 U.S.C. §105) |
| Federal Reserve Board enforcement actions file | Fed actions against banks and holding companies | US government work, public domain |
| OCC enforcement actions search | OCC actions against national banks and federal savings associations | US government work, public domain. The OCC says its lists are not guaranteed to be comprehensive |
| GLEIF LEI API | LEI records and parent relationships | CC0 1.0 |

Only records about institutions are used. Actions against individual people are skipped.

### FAQ

#### Where does the data come from?

Data from the FDIC's public BankFind API; not affiliated with or endorsed by FDIC, Fed or OCC. The BankFind Suite API
publishes the quarterly call report data of all FDIC-insured institutions. The Actor adds the calculations (uninsured
share, held-to-maturity losses to equity, trends) and the health rules, and says so in each field.

#### How current is the data?

The FDIC publishes call report data about two months after each quarter end. The run summary shows the latest
quarter available. Enforcement lists are refreshed at least once a day.

#### How long does a run take?

The FDIC API limits how fast anyone can query it, so the Actor paces its requests. In our tests 35 banks took about
one to two minutes and 150 banks about four to eight minutes. A free FDIC API key in **FDIC API key** can help with
large lists.

#### Can I look up a bank by routing number?

No. There is no open official source that maps ABA routing numbers to banks for reuse: the Federal Reserve's routing
directory comes with terms that limit redistribution, and the FFIEC registry blocks automated access. Use the bank
name and state, the FDIC cert, the RSSD ID or the LEI instead.

#### Does it check FDIC enforcement orders?

No. The FDIC publishes its orders in a search application without an open data file. The Actor checks the
Federal Reserve and the OCC and lists the FDIC search as not checked in every row. State regulator actions are not
covered either.

#### Is a "sound" signal a guarantee that a bank is safe?

No. The signal is a transparent screen of published figures. It does not know confidential supervisory ratings,
off-balance-sheet risks or events after the report date. Use it to decide where to look closer.

#### What does the as-of quarter change?

The financial figures, the trend, the health signal and the open or terminated state of enforcement actions are taken
as of the quarter you choose. Names, holding company and LEI status are today's.

#### Does it work for banks outside the US?

No. It covers US FDIC-insured banks and savings institutions only.

#### Why is my bank "ambiguous"?

Many banks share names such as First National Bank, and a closed bank often carries the same name as an active one
(for example Signature Bank: one active bank in Ohio and nine closed ones, including the bank in New York that failed in
2023\). A name is only matched when one institution is clearly the best fit. If any other institution, active or closed,
carries the same name and your state or city does not rule it out, the row is `ambiguous` and lists every such bank in
`candidates` with its cert number, state, active or closed status and dates. Add the state and, if needed, the city, or
rerun with the FDIC cert number. Ambiguous rows are free.

#### Is it legal to use this data?

The FDIC, Federal Reserve and OCC data are US government works in the public domain (17 U.S.C. §105), and GLEIF data
is CC0. The Actor uses official public APIs and files, follows their access rules and sends an honest user agent. It is
not affiliated with or endorsed by FDIC, Fed, OCC or GLEIF.

### About Reliable Tools

This Actor is made by [Reliable Tools](https://apify.com/reliable_tools). We build tools that return clean data from
official sources plus an AI label with a confidence score where it helps, so you can filter and act on the results
straight away. Our focus is compliance, company verification and trade data.

If a field is missing or a bank doesn't match the way you expect, open an issue on the Issues tab. We read every one
and usually reply within a day. You can find our other Actors on our [profile page](https://apify.com/reliable_tools).

# Actor input Schema

## `banks` (type: `array`):

One entry per bank. Give any one of: "cert" (FDIC certificate number), "rssd" (Federal Reserve RSSD ID; a holding company RSSD returns its bank subsidiaries), "lei", "website", or "name" with "state" (and "city" for common names). Add "reference" to carry your own ID. A plain string also works: a cert number, an LEI, a website or a bank name. US FDIC-insured banks and savings institutions only.

## `csvUrl` (type: `string`):

Optional: a link to a CSV file with a header row. Recognised columns: reference, name (or bank name), state, city, cert (or FDIC cert), rssd, lei, website.

## `asOfQuarter` (type: `string`):

Optional: run the check as it looked at the end of a past quarter, for example 2022-12-31 or 2022Q4. Leave empty for the latest published quarter.

## `trendAndSignal` (type: `boolean`):

Adds the last 8 quarters of key figures, year on year changes and the rule-based health signal (sound, watch, weak) with the reasons. Charged as a separate event.

## `enforcementActions` (type: `boolean`):

Looks up enforcement actions published by the Federal Reserve Board and the OCC against the bank or its holding company.

## `leiRecord` (type: `boolean`):

Adds the Legal Entity Identifier, its registration status, renewal date and ultimate parent from GLEIF.

## `aiNameMatch` (type: `boolean`):

When you give a bank by name and the name is not an exact match, an AI match score decides whether an FDIC institution is the bank you mean. Without it, unclear names come back as ambiguous with the candidates.

## `fdicApiKey` (type: `string`):

Optional free key from the FDIC API portal for higher rate limits. Not needed for normal use.

## `maxBanks` (type: `integer`):

Stops after this many input rows.

## Actor input object example

```json
{
  "banks": [
    {
      "reference": "B-1",
      "name": "Frost Bank",
      "state": "TX"
    },
    {
      "reference": "B-2",
      "cert": "628"
    },
    {
      "reference": "B-3",
      "name": "Silicon Valley Bank",
      "state": "CA"
    },
    {
      "reference": "B-4",
      "lei": "KB1H1DSPRFMYMCUFXT09"
    }
  ],
  "trendAndSignal": true,
  "enforcementActions": true,
  "leiRecord": true,
  "aiNameMatch": true,
  "maxBanks": 1000
}
```

# Actor output Schema

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

Dataset in the banks view.

## `summary` (type: `string`):

Counts per status and signal, health rules, sources and data dates.

# 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 = {
    "banks": [
        {
            "reference": "B-1",
            "name": "Frost Bank",
            "state": "TX"
        },
        {
            "reference": "B-2",
            "cert": "628"
        },
        {
            "reference": "B-3",
            "name": "Silicon Valley Bank",
            "state": "CA"
        },
        {
            "reference": "B-4",
            "lei": "KB1H1DSPRFMYMCUFXT09"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("reliable_tools/bank-health-check").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 = { "banks": [
        {
            "reference": "B-1",
            "name": "Frost Bank",
            "state": "TX",
        },
        {
            "reference": "B-2",
            "cert": "628",
        },
        {
            "reference": "B-3",
            "name": "Silicon Valley Bank",
            "state": "CA",
        },
        {
            "reference": "B-4",
            "lei": "KB1H1DSPRFMYMCUFXT09",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("reliable_tools/bank-health-check").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 '{
  "banks": [
    {
      "reference": "B-1",
      "name": "Frost Bank",
      "state": "TX"
    },
    {
      "reference": "B-2",
      "cert": "628"
    },
    {
      "reference": "B-3",
      "name": "Silicon Valley Bank",
      "state": "CA"
    },
    {
      "reference": "B-4",
      "lei": "KB1H1DSPRFMYMCUFXT09"
    }
  ]
}' |
apify call reliable_tools/bank-health-check --silent --output-dataset

```

## MCP server setup

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

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/R25IEGUpG2f9MHqkC/builds/HqlBdeVawuiJUYdAg/openapi.json
