Skip to main content

Python client for the BankRegReports Data API — regulatory data on every US bank, credit union, and holding company.

Project description

bankregreports — BankRegAPI Python SDK

PyPI version Python 3.8+ Typed Swagger Docs Docs

Python client for the BankRegReports Data API — clean, validated, cross-source regulatory data on every US bank, credit union, and holding company, sourced from FFIEC Call Reports, UBPR, FDIC, Federal Reserve, NCUA, and SEC EDGAR.

Full SDK docs  ·  Swagger / OpenAPI  ·  Get API key  ·  bankregreports.com


Why BankRegReports

Raw US bank regulatory data is public but arrives as pipe-delimited bulk files with cryptic MDRM codes, four competing unit conventions, silent schema changes between quarters, and no linkage between FDIC, FFIEC, Federal Reserve, and SEC identifiers. Cleaning it to a usable state takes months. Enterprise data platforms solve this — at $20K–$200K+/year with multi-year contracts.

BankRegReports is the middle ground: the same cleaned, validated, cross-source-linked data through a modern REST API with a Python SDK, at a fraction of the cost. Built by practitioners who have been in ALCO, been through regulatory exams, and needed this data to actually exist.

Read the full background: Why We Built BankRegReports →


Installation

pip install bankregreports
# with pandas (recommended)
pip install "bankregreports[pandas]"

Requires: Python 3.8+ · requests>=2.25


Quick start

import bankregreports

# Set BANKREG_API_TOKEN env var, or pass the token directly
brr = bankregreports.BankReg("brr_xxx")

# Screen every US bank — returns a pandas DataFrame
df = brr.screener(state="GA", min_assets=500_000)
print(df[["legal_name", "total_assets", "cet1_ratio", "roa"]].head(10))

Works as a context manager:

with bankregreports.BankReg("brr_xxx") as brr:
    df_banks = brr.screener(state="TX")
    df_rates = brr.rates("mortgage")

Authentication

Get a free API key at bankregreports.com/api. All keys begin with brr_.

# Explicit token
brr = bankregreports.BankReg("brr_xxx")

# Environment variable (recommended)
# export BANKREG_API_TOKEN=brr_xxx
brr = bankregreports.BankReg()

Coverage — 101 datasets across 16 domains

Domain What you get
Banks — snapshot & trends Latest metrics, 20-quarter time series, full Call Report/UBPR detail
Banks — scores & peers CAMELS-style scores, percentile ranks, peer benchmarks
Banks — sub-books Deposits, securities (HTM/AFS/unrealized G/L), loans, HMDA
Banks — structure Parent chain, subsidiaries, NIC events, FDIC history, FRY-15
Branches FDIC SoD + NIC combined, rollup stats, map-ready lat/lon
Risk & compliance ML failure prediction + feature attribution, enforcement actions, CFPB complaints
Screeners Full-universe filter, M&A target scoring, CRE concentration, growth
SEC / EDGAR 10-K/10-Q/8-K, XBRL facts, insider Form-4, exec comp, 13D/G, 13F
Industry & macro Aggregates, rate environment, credit spreads, VIX
Rates & yield curve Mortgage, T-bill, real yield, consumer, FDIC national deposit rates
Failures & events FDIC failure feed, M&A/charter events, enforcement feed
Credit unions (NCUA) 5300 Call Report, trends, branches, ATMs, peer benchmarks
Holding companies Y-9C BHC snapshot and quarterly trends
CECL & analytics Macro-conditioned lifetime ECL, DFAST scenarios
Watchlist & alerts Track institutions, threshold alerts on any metric
Reference & catalog MDRM definitions, metric catalog with formulas

API reference (selected methods)

# ── Banks ──────────────────────────────────────────────────────────────────
brr.bank(852218)                                # latest snapshot
brr.bank_trends(852218, quarters=12)            # quarterly time series
brr.bank_deep_dive(852218)                      # full Call Report/UBPR detail (~150 fields)
brr.bank_profile(852218)                        # snapshot + scorecard + ranks + ML prediction
brr.bank_compare([852218, 480228, 37])          # side-by-side comparison
brr.screener(state="GA", min_assets=500_000)    # filter the full ~4,400-bank universe
brr.scorecard(852218)                           # CAMELS-style letter grade + component scores
brr.peer_comparison(852218)                     # bank vs. peer benchmarks

# ── Sub-books ──────────────────────────────────────────────────────────────
brr.bank_deposits(852218, trends=True)          # deposit composition trends
brr.bank_securities(852218)                     # HTM/AFS, unrealized G/L, OTTI
brr.loan_portfolio(852218)                      # CRE, C&I, consumer, ag concentrations
brr.bank_hmda(852218)                           # HMDA mortgage lending

# ── Risk & analytics ───────────────────────────────────────────────────────
brr.prediction(852218, detail=True)             # ML failure probability + feature attribution
brr.ma_screener()                               # M&A target scoring + valuation
brr.enforcement_actions(852218)                 # FDIC/OCC/FRB/CFPB enforcement history

# ── SEC / EDGAR ────────────────────────────────────────────────────────────
brr.sec_filings(852218)                         # 10-K, 10-Q, 8-K, proxy index
brr.sec_insider_txns(852218)                    # Form-4 insider buy/sell
brr.sec_13f(852218)                             # institutional holdings
brr.executive_comp(852218)                      # NEO compensation from proxy

# ── Credit unions (NCUA) ───────────────────────────────────────────────────
brr.credit_union(5536, trends=True)             # 5300 Call Report snapshot + trends
brr.cu_peer_benchmarks()                        # CU peer benchmarks by asset tier

# ── Rates & macro ──────────────────────────────────────────────────────────
brr.rates("mortgage")                           # Freddie Mac 30yr/15yr series
brr.yield_curve(latest=True)                    # current yield curve snapshot
brr.industry(trends=True, quarters=20)          # 20-quarter industry aggregate trend

# ── Generic accessor ───────────────────────────────────────────────────────
brr.list_datasets()                             # all 101 datasets: name, path, tier
brr.dataset("screener", state="GA")             # forward-compatible generic accessor

Full reference: www.bankregreports.com/api/  ·  Interactive REST docs: api.bankregreports.com/api/v1/docs/


Pagination

import pandas as pd

# Iterate pages, 200 rows at a time
for page in brr.pages("screener", page_size=200, state="CA"):
    process(page)

# Collect all pages into one DataFrame
all_banks = pd.concat(brr.pages("screener", page_size=500))

Error handling

All errors subclass BankRegError. GET requests auto-retry with exponential backoff on 429 and 5xx (default 3 retries).

from bankregreports import (
    BankReg, BankRegError,
    AuthenticationError, UpgradeRequiredError, NotFoundError,
    RateLimitError, ValidationError, ServerError,
)

try:
    df = brr.ma_screener()
except UpgradeRequiredError:
    print("Upgrade at bankregreports.com/api/")
except RateLimitError as e:
    time.sleep(e.retry_after)
except NotFoundError:
    print("Institution not found")
Exception HTTP Meaning
AuthenticationError 401 Missing or revoked API key
UpgradeRequiredError 403 Plan doesn't cover this dataset
NotFoundError 404 Institution or resource not found
ValidationError 422 Invalid parameters
RateLimitError 429 Throttled — check e.retry_after
ServerError 5xx Server error (auto-retried)

Configuration

brr = bankregreports.BankReg(
    token="brr_xxx",               # or BANKREG_API_TOKEN env var
    base_url="http://localhost:8000",
    timeout=30,
    max_retries=3,
)

Response format

All list-returning methods return a pandas.DataFrame by default (requires pandas extra). Date columns are coerced to datetime64. The server response envelope is available on df.attrs["meta"].

Pass as_dataframe=False to any method for raw decoded JSON with no pandas dependency.


Resources

Platform bankregreports.com
API sign-up bankregreports.com/api
Swagger / REST docs api.bankregreports.com/api/v1/docs/
SDK docs www.bankregreports.com/api/
Changelog CHANGELOG.md
Support admin@bankregreports.com

License

Copyright © 2024–2026 BankRegReports LLC. Proprietary — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bankregreports-0.2.0.tar.gz (23.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bankregreports-0.2.0-py3-none-any.whl (22.6 kB view details)

Uploaded Python 3

File details

Details for the file bankregreports-0.2.0.tar.gz.

File metadata

  • Download URL: bankregreports-0.2.0.tar.gz
  • Upload date:
  • Size: 23.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.13

File hashes

Hashes for bankregreports-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8a9922ac11d592f6e0a0a7b4e3973f93d879e2bd8228d32acbf0e52a22af4718
MD5 969f3067123f342c54d0dae91f070f7e
BLAKE2b-256 d68123d0121481e474af76e0f70f4fed5094c6f420523bfd604fa5881caceb95

See more details on using hashes here.

File details

Details for the file bankregreports-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: bankregreports-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.13

File hashes

Hashes for bankregreports-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f0ac05e54ebb25409a6e9b31c3164018fa3a7c7ac0d2ca3084dd507c18985aed
MD5 9cebc763ec246931ccfd142e5f026549
BLAKE2b-256 20140716f51d685a0a461687f72ac2ab83fa9fe5d87fc14f613bbc2dadaac68c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page