# Bank Branch Closings & Merger Radar (FDIC) (`lukehunter/bank-branch-merger-radar`) Actor

Find new US bank branch closings, openings, relocations and mergers from the FDIC, filterable by event type and state, with acquirer/target, branches transferred and local branch-count context. No FDIC key needed.

- **URL**: https://apify.com/lukehunter/bank-branch-merger-radar.md
- **Developed by:** [Luke Hunter](https://apify.com/lukehunter) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 bank events

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?

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 Branch Closings & Merger Radar (FDIC)

**For CRE brokers, competing banks/credit unions and core-banking/fintech vendors who need to know the moment a bank branch closes, opens or a bank gets acquired.** One run returns a clean, priced event feed straight from the FDIC — no FDIC key, no scraping, no manual "bank mergers this month" searches.
Pay-per-result: **$0.015 per event — 100 events = $1.50.**
Try it free with Apify's monthly platform credit.

This Actor calls the FDIC's own BankFind Suite API (`api.fdic.gov`, public and keyless) and turns its raw structure-change log into a clean, priced event feed: which branch closed or opened, which bank acquired which bank, how many branches moved in that merger, and how the branch-count in that ZIP and county looks right now.

### Quick start (2 minutes)

1. Open the **Input** tab (no FDIC key or account needed — the source is public).
2. Use this prefill, adjusted to your states and asset threshold:

```json
{
  "eventTypes": ["BRANCH_CLOSING", "MERGER"],
  "states": ["TX", "IL"],
  "sinceDays": 30,
  "minBankAssetsUsd": 10000000000,
  "fullServiceOnly": true,
  "includeBranchCounts": true,
  "maxItems": 200
}
```

3. Click **Start**. The dataset is ready in seconds — export to CSV/JSON or pull it via API into your CRM or territory list.

### Bank branch closings list, bank mergers this month

If you have ever wanted "a list of bank branches that just closed" or "bank mergers this month" without reading FDIC press releases one at a time, this is that list, refreshed on demand:

- **Branch closings and openings** (FDIC change codes 721 / 711), with the branch's address, city, county and whether it was a full-service branch or a drive-through/loan-production office.
- **Bank mergers without FDIC assistance** (code 223), with acquirer, target, total assets on both sides, and how many branches transferred in that single transaction.
- **Branch/main-office relocations** (code 520) — filtered to real address changes only; a ZIP+4 records correction is not sold as a relocation.

### Use cases

- **Commercial real-estate brokers** tracking newly vacated bank branch space as it's announced, before it hits a listing site.
- **Competing banks and credit unions** targeting the ZIP/county of a closure to capture deposits the closing bank leaves behind.
- **Core-banking, fintech and compliance vendors** who sell into a bank right after it acquires another — a merger is a known trigger for new vendor evaluations.
- **Market researchers and analysts** tracking branch-network consolidation trends by state or asset tier.

### Run it weekly

1. Set your filters, then click **Schedule** on the run page (or create one under **Schedules** in the Apify Console).
2. Run it weekly with `sinceDays: 7` (or daily with `sinceDays: 1`) so each run mostly returns new events, not repeats.
3. Use `eventId` as your dedupe key — it's stable across runs, so a scheduled pull never double-charges or double-lists an event you already have.
4. Route `BRANCH_CLOSING` events to your prospecting list and `MERGER` events to your vendor/account-team alert channel separately, since they call for different outreach.

### Example output

A branch closing:

```json
{
  "eventId": "fdic-2719260ea84a1fb3d80630e26e4e49f6",
  "eventType": "BRANCH_CLOSING",
  "changeDescription": "Branch Closing",
  "effectiveDate": "2026-09-10",
  "processedDate": "2026-09-17",
  "isBackdated": false,
  "institutionName": "JPMorgan Chase Bank, National Association",
  "officeName": "OAK LAWN 95TH STREET BANKING CENTER BRANCH",
  "address": "5705 W 95TH ST", "city": "OAK LAWN", "state": "IL", "zip": "60453",
  "branchesInZip": 18, "sameBankBranchesInZip": 2, "bankExitedZip": false
}
```

A merger, with its branch-transfer roll-up (real output, captured live):

```json
{
  "eventId": "fdic-2026025588_223_16132_41323_16132",
  "eventType": "MERGER",
  "changeDescription": "Merger -Without Assistance",
  "acquirerName": "Banner Bank", "acquirerState": "WA", "acquirerTotalAssetsUsd": 16586212000,
  "targetName": "Bank of the Pacific", "targetState": "WA", "targetTotalAssetsUsd": 1263711000,
  "branchesTransferred": 20,
  "transferredBranchStates": ["OR", "WA"],
  "targetsInTransaction": 1
}
```

Every field above came from a live run against `api.fdic.gov` on 2026-09-24; none is invented.

| Field | Closing example | Merger example |
|---|---|---|
| `eventType` | `BRANCH_CLOSING` | `MERGER` |
| `institutionName` / `acquirerName` | `JPMorgan Chase Bank, National Association` | `Banner Bank` |
| `targetName` | — | `Bank of the Pacific` |
| `officeName` | `OAK LAWN 95TH STREET BANKING CENTER BRANCH` | — |
| `city` / `state` | `OAK LAWN`, `IL` | — |
| `branchesInZip` / `bankExitedZip` | `18` / `false` | — |
| `branchesTransferred` | — | `20` |
| `transferredBranchStates` | — | `["OR", "WA"]` |

### Why one merger is one charge, not twenty

The FDIC logs a merger's branch handoff as a *separate history row per branch* (change code 713 — "Branch Acquired in Merger/Consolidation/Failure"). A naive feed would turn a 20-branch acquisition into 20 billable rows. This Actor fetches every 713 row for the merger's transaction number and rolls it into the merger event as `branchesTransferred` and `transferredBranchStates` — **one merger, one charge**, however many branches moved.

### Input

| Field | Default | Meaning |
|---|---:|---|
| `eventTypes` | `["BRANCH_CLOSING","MERGER"]` | Any of `BRANCH_CLOSING` (721), `BRANCH_OPENING` (711), `MERGER` (223, unassisted only), `RELOCATION` (520) |
| `states` | `[]` (all US) | Two-letter state codes. Branch events match the branch's state; mergers match the acquirer's, target's or any transferred branch's state |
| `sinceDays` | 30 | Events the FDIC **processed** in the last 1–90 days |
| `minBankAssetsUsd` | 0 | Only events whose bank (the acquirer, for mergers) reports at least this much in total assets |
| `fullServiceOnly` | false | Skip drive-throughs, loan-production and administrative offices |
| `includeBranchCounts` | true | Add how many FDIC-insured branches are currently listed in the event's ZIP and county |
| `maxItems` | 500 | Hard cap on events delivered and charged this run (newest-processed first) |

### Output fields

| Field | Meaning |
|---|---|
| `eventId`, `eventType`, `changeCode`, `changeDescription` | FDIC record identity and the exact FDIC change-code description |
| `effectiveDate`, `processedDate`, `processingLagDays`, `isBackdated` | When it happened vs. when the FDIC recorded it — see Limitations |
| `institutionName`, `cert`, `institutionTotalAssetsUsd`, `institutionAssetsAsOf` | The bank (the acquirer, for a merger) and its latest reported total assets |
| `officeName`, `officeServiceType`, `isMainOffice`, `address`, `city`, `state`, `zip`, `county`, `countyFips` | The branch (branch/opening/relocation events only) |
| `previousAddress`/`previousCity`/`previousState`/`previousZip` | Prior location (relocation events only) |
| `acquirerName`/`acquirerCert`/`acquirerCity`/`acquirerState`/`acquirerTotalAssetsUsd`, `targetName`/`targetCert`/... | Merger acquirer and target (merger events only) |
| `branchesTransferred`, `transferredBranchStates` | **Derived**: count and states of branches rolled up from the merger's 713 rows. `null` if the count could not be confirmed (never a guessed number) |
| `targetsInTransaction` | How many targets this FDIC transaction number covers (almost always 1) |
| `branchesInZip`, `branchesInCounty`, `sameBankBranchesInZip`, `bankExitedZip` | **Derived**, current-snapshot FDIC branch counts, not historical — see Limitations |
| `sourceUrl`, `retrievedAt` | The exact FDIC API query used and when this row was fetched |

### Limitations — read before you build automation on this

- **Processing lag.** `sinceDays` filters on `PROCDATE` (when the FDIC recorded the change), not `effectiveDate` (when it happened). The FDIC sometimes processes an event weeks after the fact; `isBackdated` is `true` when the gap exceeds 60 days, and `processingLagDays` gives the exact number. A monitor that only trusts `effectiveDate` will miss late-processed rows.
- **Backdated corrections.** `effectiveDate` can occasionally be a correction to a much older record. Treat `isBackdated: true` rows as historical corrections, not fresh news.
- **Branch counts are a snapshot, not history.** `branchesInZip`/`branchesInCounty`/`sameBankBranchesInZip` reflect the FDIC's *current* `/locations` index, refreshed roughly weekly (`branchCountsAsOf` gives the exact index timestamp) — they are not recomputed as of the event's effective date. On a very recent closing the closed branch itself may still or no longer appear in that snapshot depending on when the index last refreshed.
- **`bankExitedZip` is derived, not an FDIC field.** It is `true` only when a closing's own bank shows zero remaining branches in that ZIP in the current snapshot; it is `null` for anything other than a closing.
- **Mergers are unassisted only.** FDIC-assisted (failed-bank) mergers use different change codes and are out of scope; this Actor is about ordinary consolidation, not failures.
- **`branchesTransferred: null`** means the count could not be confirmed within this run's lookup limits — it is left blank rather than under-reported as zero.
- **Cosmetic relocations are dropped.** A "relocation" row whose address, city, state and ZIP are unchanged (e.g. a ZIP+4 correction) is not delivered or charged.

### Pricing and cost control

Pay-per-event: **$0.015 per delivered bank event**. Benchmarked against the closest live comparables on the Apify Store — `malonestar/fdic-structure-change-delta-monitor` ($0.015), `malonestar/fdic-branch-network-churn-rollup` ($0.015) and `scrapesignal_labs/fdic-bank-branch-change-monitor` ($0.0025) — all of which charge per raw dataset row with no merger roll-up or asset/branch-count enrichment. This Actor matches the better-featured comparables rather than racing to the lowest price.

- `maxItems` is a hard cap on both delivered rows and total charge for the run.
- Delivered rows always equal charged rows: if your run's own "Maximum cost per run" budget runs out mid-run, the Actor stops, finishes `SUCCEEDED`, and its status message says exactly how many of the matching events were delivered and that only those were charged — never a silent under-charge or a failed run.
- If the Actor is not monetized (e.g. running it yourself), every matching row is delivered free.

### FAQ

**Do I need an FDIC API key?** No. `api.fdic.gov/banks` is public and keyless.

**Does this include credit unions?** No — FDIC BankFind covers FDIC-insured banks only (not NCUA-insured credit unions).

**Does "merger" include bank failures?** No. This Actor reports unassisted mergers (ordinary acquisitions), not FDIC-assisted failed-bank transactions.

**Why did a branch I know closed not show up?** Either it processed outside your `sinceDays` window, or it was recorded under a code this Actor doesn't request (e.g. an assisted transaction). Widen `sinceDays` (up to 90) and re-run.

**Can I get everything since a specific date?** `sinceDays` covers up to 90 days per run; for a longer backfill, run it repeatedly with different windows, or schedule it daily and store the results yourself — each event's `eventId` is stable, so de-duplication is straightforward.

**Why do some rows have null branch counts?** Either `includeBranchCounts` is off, the event is a merger (branch counts apply to physical branches, not the merger itself), or this run's lookup cap was reached (rare; a warning is logged when it happens).

### Related Actors

Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.

- **[Federal Register Rule Effective-Date Radar](https://apify.com/lukehunter/federal-rule-effective-date-radar)**: final federal rules about to take effect, with citations, dockets and urgency.
- **[Chicago Contract Recompete & Extension Radar](https://apify.com/lukehunter/chicago-contract-expiration-radar)**: expiring City of Chicago contracts with extension history, for recompete prospecting.
- **[Chicago New Business License Radar](https://apify.com/lukehunter/chicago-new-business-license-radar)**: newly licensed Chicago businesses as opening leads, grouped by category.
- **[NYC FDNY Contractor Leads & Hearing Radar](https://apify.com/lukehunter/fdny-violation-radar)**: fresh NYC fire-code summonses routed by remediation trade, with hearing dates.
- **[RCRA Enforcement Response Leads](https://apify.com/lukehunter/rcra-enforcement-radar)**: new EPA hazardous-waste (RCRA) enforcement actions and penalties, by state.
- **[Emerging Federal Contractor Radar](https://apify.com/lukehunter/emerging-federal-contractor-radar)**: companies that just won their first federal contracts, from USAspending.gov.
- **[Hospital Price Transparency Enforcement Leads](https://apify.com/lukehunter/hospital-price-transparency-enforcement-leads)**: hospitals with recent CMS price transparency warning notices, CAP requests and CMP notices.
- **[Hospital Ownership Change Radar](https://apify.com/lukehunter/hospital-chow-radar)**: hospitals that just changed owner, with buyer, seller and effective date from CMS filings.
- **[New Healthcare Organization NPI Radar](https://apify.com/lukehunter/new-healthcare-organization-npi-radar)**: newly registered healthcare organizations from CMS's weekly NPI file, by provider type.
- **[County Multifamily Building Permits Surge Radar](https://apify.com/lukehunter/county-multifamily-permit-surge-radar)**: U.S. counties where 5+ unit apartment permits are surging year over year.
- **[Zillow ZIP Code Property Search Scraper](https://apify.com/lukehunter/zillow-zip-scraper)**: for-sale listings by ZIP code with prices, price cuts and days on Zillow.
- **[Walmart Category Scraper](https://apify.com/lukehunter/walmart-category-scraper)**: product names, prices, was-prices and ratings from Walmart category pages.

# Actor input Schema

## `eventTypes` (type: `array`):

Which FDIC structure changes to return. A merger is ONE event (its transferred branches are rolled up into it, not listed separately).

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

Optional two-letter US state codes (e.g. TX, IL). Branch events match on the branch's state; mergers match on the acquirer's, the target's, or any transferred branch's state. Leave empty for the whole US.

## `sinceDays` (type: `integer`):

Return events the FDIC PROCESSED in this many days (1-90). Processing date, not effective date: the FDIC sometimes records events months or years after they happened; those rows are flagged isBackdated.

## `minBankAssetsUsd` (type: `integer`):

Only events whose bank (the acquirer, for mergers) reports at least these total assets, e.g. 10000000000 for $10B+. 0 = no filter.

## `fullServiceOnly` (type: `boolean`):

Skip limited-service offices (drive-throughs, loan production and administrative offices) for branch events.

## `includeBranchCounts` (type: `boolean`):

Add how many FDIC-insured branches are currently listed in the event's ZIP and county, and how many the same bank still has in that ZIP.

## `maxItems` (type: `integer`):

Hard cap on events delivered and charged in this run, 1-1000, default 500 (newest-processed first).

## Actor input object example

```json
{
  "eventTypes": [
    "BRANCH_CLOSING",
    "MERGER"
  ],
  "states": [],
  "sinceDays": 30,
  "minBankAssetsUsd": 0,
  "fullServiceOnly": false,
  "includeBranchCounts": true,
  "maxItems": 15
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "eventTypes": [
        "BRANCH_CLOSING",
        "MERGER"
    ],
    "sinceDays": 30,
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("lukehunter/bank-branch-merger-radar").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 = {
    "eventTypes": [
        "BRANCH_CLOSING",
        "MERGER",
    ],
    "sinceDays": 30,
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("lukehunter/bank-branch-merger-radar").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 '{
  "eventTypes": [
    "BRANCH_CLOSING",
    "MERGER"
  ],
  "sinceDays": 30,
  "maxItems": 15
}' |
apify call lukehunter/bank-branch-merger-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lukehunter/bank-branch-merger-radar"
        }
    }
}
```

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/5t23jNByMAvYlKFKF/builds/z0zYefkguBmNFcaDs/openapi.json
