# NCUA Credit Union Call Report Scraper (`goldenrod_serrano/ncua-call-report`) Actor

- **URL**: https://apify.com/goldenrod_serrano/ncua-call-report.md
- **Developed by:** [Paopao Studio](https://apify.com/goldenrod_serrano) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 credit unions

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

## NCUA Credit Union Call Report Scraper — 5300 Financials & Signals

Get the official **NCUA 5300 Call Report** numbers for every federally insured US credit union (≈4,300 per quarter) as clean JSON/CSV/Excel rows: total assets, loans, shares & deposits, members, net worth ratio, 60-day delinquency, ROA, charge-offs, allowance, branches, employees, website and main-office phone — plus **quarter-over-quarter and year-over-year growth**, **rule-based risk & growth signals**, **asset rank within the state** and **merger/exit detection**.

No login, no proxy, no browser. The Actor downloads NCUA's own public quarterly bulk file and does the joining, math and filtering for you.

### Who uses it

- **Fintech, core-banking and lending vendors** selling to credit unions: build a target list by state, asset size, growth or loan mix, with website and main-office phone.
- **Bank/CU analysts, consultants and M\&A advisors**: screen for thin capital, rising delinquency, shrinking members or fast growth; spot credit unions that disappeared (usually mergers).
- **Journalists and researchers**: one table per quarter, back to 2015, without wrangling 20 linked text files.

### Quick start

1. Click **Start** with an empty input → a **free sample** (5 largest credit unions of the latest quarter, not charged) so you can see the format.
2. Example paid input — California credit unions above $500M, with growth columns:

```json
{
  "quarter": "latest",
  "compare": "qoq_and_yoy",
  "states": ["CA"],
  "minAssets": 500000000,
  "maxResults": 20
}
```

3. Risk screen across the country:

```json
{ "signalsAny": ["net_worth_below_7pct", "high_delinquency"], "sortBy": "delinquency_rate_pct", "maxResults": 200 }
```

4. Watchlist, scheduled weekly, delivered once per new quarter:

```json
{ "cuNumbers": ["5536", "24212", "68490"], "onlyNewQuarter": true, "monitorName": "my-watchlist" }
```

### Input

| Field | What it does |
|---|---|
| `sampleMode` | Free 5-row sample of the latest quarter. An empty input does the same. |
| `quarter` | `latest` (default), `YYYY-MM` (03/06/09/12) or `YYYYQn`, e.g. `2025Q4`. Files go back to 2015-06. |
| `compare` | `qoq_and_yoy` (default), `yoy`, `qoq` or `none`. Adds growth/change columns vs. the prior quarter and the same quarter a year ago. |
| `states`, `charterTypes`, `nameContains`, `cuNumbers` | Filters. Charter types: `FCU` (federal), `FISCU` (state-chartered, federally insured), `NFICU` (non-federally insured, reported to NCUA). |
| `minAssets`, `maxAssets`, `minMembers` | Size filters (USD / members). |
| `signalsAny` | Keep rows that carry at least one of the selected signals. |
| `includeExits` | Add rows for credit unions that filed last quarter but not this one (`record_type = exited_since_prior_quarter`). |
| `includeContact` | Website, street, main-office phone and address (institution data only). Default on. |
| `sortBy`, `sortDescending` | Sort by assets, members, growth, net worth ratio, delinquency, ROA, loan/share or name. |
| `maxResults` | Cap on rows pushed (= cap on charged events). Default 100, max 6,000. |
| `onlyNewQuarter`, `monitorName` | Monitor mode for scheduled runs: rows are delivered only the first time a quarter appears for that monitor name; later runs push 0 rows and cost nothing beyond the platform's compute. A run stopped by your cost limit does **not** mark the quarter, so the next run retries it. |

### Output

One row per credit union. Main fields (full example in [`docs/example_output.json`](docs/example_output.json)):

| Group | Fields |
|---|---|
| Identity | `quarter`, `cycle_date`, `cu_number`, `cu_name`, `charter_type`, `city`, `state`, `zip_code`, `rssd_id`, `year_opened`, `peer_group_label`, `low_income_designation`, `minority_depository_institution` |
| Balance sheet | `total_assets`, `total_loans`, `loan_count`, `total_shares_deposits`, `members`, `potential_members`, `net_worth`, `credit_card_loans`, `new_vehicle_loans`, `allowance_for_loan_losses` |
| Performance | `net_income_ytd`, `charge_offs_ytd`, `recoveries_ytd`, `net_charge_offs_ytd`, `delinquent_loans_60d` |
| Ratios | `net_worth_ratio_pct`, `net_worth_category_simple`, `loan_to_share_pct`, `delinquency_rate_pct`, `roa_annualized_pct`, `net_charge_off_rate_annualized_pct`, `assets_per_member` |
| Growth (qoq / yoy) | `assets_*_pct`, `loans_*_pct`, `shares_*_pct`, `members_*_change`, `members_*_pct`, `net_worth_ratio_*_change_pp`, `delinquency_rate_*_change_pp`, `in_*_data` |
| Rank | `asset_rank_in_state`, `credit_unions_in_state` (among all credit unions of the quarter, before your filters) |
| Operations & contact | `branches`, `employees_full_time`, `employees_part_time`, `employees_total`, `website`, `street`, `main_office_phone`, `main_office_address` |
| Signals & source | `signals` (list), `source_zip_url` (the NCUA file the row came from) |

Dataset views: **Overview**, **Growth & risk signals**, **Contact & profile**. A `RUN_SUMMARY` record in the key-value store lists the quarter, comparison quarters, counts and charged events.

#### Signals (rule-based, from the reported numbers)

| Signal | Rule |
|---|---|
| `net_worth_below_7pct` | Net worth ratio < 7% (below "well capitalized") |
| `net_worth_ratio_down_1pp_yoy` | Net worth ratio down ≥ 1 percentage point vs. a year ago |
| `high_delinquency` | 60+ day delinquent loans ≥ 2% of loans |
| `delinquency_up_0_5pp_yoy` | Delinquency rate up ≥ 0.5 pp vs. a year ago |
| `net_loss_ytd` | Negative year-to-date net income |
| `assets_shrinking_yoy` | Total assets down ≥ 5% year over year |
| `fast_asset_growth_yoy` | Total assets up ≥ 15% year over year (often a merger) |
| `membership_decline_yoy` | Members down ≥ 3% year over year |
| `loan_to_share_above_100pct` | Loans exceed shares & deposits |
| `new_in_data_yoy` | No filing a year ago (new charter, conversion or renumbering) |
| `exited_since_prior_quarter` | Exit rows only: filed last quarter, not this one |

Signals are screening flags, not ratings or advice.

### Pricing (pay per event)

One event: **`credit-union`** — one row (credit union or exit row) pushed to your dataset. No start fee.

The price depends on your Apify plan (Store discount tiers):

| Your Apify plan tier | Price per row | Per 1,000 rows | Whole quarter (~4,300 rows) | 20-row example above |
|---|---|---|---|---|
| Free | $0.005 | $5.00 | ≈ $21.50 | $0.10 |
| Bronze (−10%) | $0.0045 | $4.50 | ≈ $19.35 | $0.09 |
| Silver (−20%) | $0.004 | $4.00 | ≈ $17.20 | $0.08 |
| Gold, Platinum, Diamond (−30%) | $0.0035 | $3.50 | ≈ $15.05 | $0.07 |

Not charged: the free sample, credit unions removed by your filters, downloads, runs that fail, and monitor-mode runs on an already-delivered quarter. `maxResults` and *Maximum cost per run* both cap the bill; the Actor stops cleanly at your limit. Platform compute is small (a full quarter with comparisons runs in about 10–20 s at 256 MB). Tier names and discounts are as shown on the Store pricing tab at the time of your run; the Store shows your effective price.

### Data source, legality and privacy

- Source: NCUA's public **Quarterly Call Report Data** page (`ncua.gov/analysis/credit-union-corporate-call-report-data/quarterly-data`) and the zip files it links. These are US federal government public data.
- ncua.gov `robots.txt` allows these paths. The Actor does **not** touch `mapping.ncua.gov` (its robots.txt disallows crawling), uses no proxy, sends a descriptive User-Agent and downloads at most three files per run.
- **No personal data is output.** The source files contain contact-person and preparer names; the Actor never reads those columns. Contact fields are institution-level only (website, main-office phone/address).

### Limits and definitions

- **Net worth ratio** is the ratio the credit union reported to NCUA (account 998). It can differ from net worth ÷ period-end assets because NCUA allows average-asset denominators. When it is not reported, the Actor computes it.
- `net_worth_category_simple` is a **simplified** prompt-corrective-action bucket from the net worth ratio only. Complex credit unions (> $500M) are also subject to risk-based capital / CCULR rules that this does not model. It is not NCUA's official classification.
- Income, charge-off and recovery fields are **year-to-date**; ROA and charge-off rates are annualized (× 12 / months in the year so far).
- Allowance uses the CECL allowance (AS0048) when reported, otherwise the legacy ALLL (719).
- NCUA publishes each quarter roughly two months after quarter end; `latest` picks the newest file actually posted. Data is as filed and can be amended by NCUA later.
- Exit rows say a filing is missing; the reason (merger, liquidation, conversion) is not in the file.

### FAQ

**How fresh is it?** As fresh as NCUA's file. Run monthly or weekly with `onlyNewQuarter` to get each new quarter once.

**Can I get older quarters?** Yes, any quarter NCUA links (2015-06 onward). Year-over-year fields need the year-ago file, which exists from 2016-06.

**What is the CU number?** NCUA's charter/identifier, e.g. 5536 = Navy Federal. Use it in `cuNumbers` for a watchlist.

### Related Actors by PaoPao Studio

- [SEC Form D Scraper — Startup Funding Data](https://apify.com/goldenrod_serrano/sec-form-d-funding-signals) — every new Reg D private round from EDGAR.
- [SEC Comment Letter Scraper](https://apify.com/goldenrod_serrano/sec-comment-letters) — SEC staff review letters and company responses.
- [ATS Jobs Monitor for Recruiter BD](https://apify.com/goldenrod_serrano/ats-hiring-signals) — new and closed jobs from Greenhouse, Lever, Ashby and more.
- [Shopify → QuickBooks Online Reconciliation](https://apify.com/goldenrod_serrano/shopify-qbo-reconciliation) — Shopify order/payout CSV vs QuickBooks Online export discrepancy report (finance ops).

### Changelog

- 1.0 (2026-11) — first release: quarters 2015-06 onward, QoQ/YoY growth, 11 signals, exits, monitor mode, contact fields.

# Actor input Schema

## `sampleMode` (type: `boolean`):

Return the 5 largest credit unions of the latest quarter for free, to check the output format. An empty input also runs the free sample.

## `quarter` (type: `string`):

Call report quarter: <code>latest</code> (newest file NCUA has published), <code>YYYY-MM</code> (e.g. 2026-06) or <code>2026Q2</code>. NCUA posts each quarter about 2 months after quarter end.

## `compare` (type: `string`):

Adds growth and change columns (assets, loans, shares, members, net worth ratio, delinquency) against earlier quarters.

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

Two-letter state codes of the credit union's address, e.g. CA, TX. Empty = all states.

## `charterTypes` (type: `array`):

Empty = all.

## `nameContains` (type: `array`):

Keep credit unions whose name contains any of these words (case-insensitive).

## `cuNumbers` (type: `array`):

Only these credit unions (NCUA charter / CU number, e.g. 5536 for Navy Federal). Good for a watchlist.

## `minAssets` (type: `integer`):

e.g. 100000000 for $100M.

## `maxAssets` (type: `integer`):

Keep only credit unions with total assets at or below this amount in US dollars (e.g. 1000000000 = $1B). Leave empty for no upper limit.

## `minMembers` (type: `integer`):

Keep only credit unions with at least this many members. Leave empty for no minimum.

## `signalsAny` (type: `array`):

Rule-based flags computed from the call report. Year-over-year signals need the year-ago comparison. Empty = no signal filter.

## `includeExits` (type: `boolean`):

Also output rows (record_type = exited_since_prior_quarter) for credit unions that filed last quarter but not this one - usually mergers or liquidations. Uses the prior-quarter file.

## `includeContact` (type: `boolean`):

Institution contact data from the call report and NCUA's branch file. No personal data is ever output.

## `sortBy` (type: `string`):

Field used to order the rows before Max rows is applied. Rows without a value for the field go last.

## `sortDescending` (type: `boolean`):

Largest values first (on), or smallest first (off). For credit union name, on means Z to A.

## `maxResults` (type: `integer`):

Each row pushed is one charged 'credit-union' event. About 4,300 credit unions file each quarter.

## `onlyNewQuarter` (type: `boolean`):

For a scheduled run (e.g. weekly): output rows only the first time a quarter appears for this monitor name; later runs on the same quarter push 0 rows and charge nothing.

## `monitorName` (type: `string`):

Separate monitors keep separate 'already delivered' quarter lists (e.g. one per watchlist).

## Actor input object example

```json
{
  "sampleMode": false,
  "quarter": "latest",
  "compare": "qoq_and_yoy",
  "includeExits": false,
  "includeContact": true,
  "sortBy": "total_assets",
  "sortDescending": true,
  "maxResults": 100,
  "onlyNewQuarter": false,
  "monitorName": "default"
}
```

# Actor output Schema

## `creditUnions` (type: `string`):

Financials, ratios, growth and signals (dataset view 'overview').

## `runSummary` (type: `string`):

Quarter, comparison quarters, counts and charged events.

# 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 = {
    "quarter": "latest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("goldenrod_serrano/ncua-call-report").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 = { "quarter": "latest" }

# Run the Actor and wait for it to finish
run = client.actor("goldenrod_serrano/ncua-call-report").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 '{
  "quarter": "latest"
}' |
apify call goldenrod_serrano/ncua-call-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,goldenrod_serrano/ncua-call-report"
        }
    }
}
```

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/Nc7Vwkam3IlfhEinJ/builds/PtE6JvsMPdw4NizUf/openapi.json
