🏛️ banking¶
U.S. banking-sector data: FDIC-insured institution and branch registries, branch-network change history, bank failures, branch-level deposit summaries, call-report financials, and industry-wide summaries, plus CFPB consumer complaints against financial companies. Each institution/branch row carries a county_fips/state_abbr for joins to geo (states/counties), and complaint rows join to institutions/companies by name for consumer-protection research.
10 datasets · 144 columns
institutions · table¶
Snapshot of every FDIC-insured institution, active and inactive — charter class, chartering/regulating agency, main-office location, and total_assets_thousands / total_deposits_thousands as of the latest call report. One row per institution; PK is cert. Joins to locations, history, failures, sod, and financials by cert. Source: api.fdic.gov/banks/institutions.
| Column | Type | Null | Description |
|---|---|---|---|
cert |
long | no | FDIC certificate number (PK) |
name |
string | no | Institution legal name |
active |
boolean | yes | Whether the institution is currently FDIC-insured and active |
charter_ |
string | yes | FDIC charter class code (e.g. NM, SM, N, SB) |
charter_ |
string | yes | Chartering agency |
regulator |
string | yes | Primary federal regulator |
city |
string | yes | Main office city |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
zip |
string | yes | Main office ZIP code |
county_ |
string | yes | 5-digit state+county FIPS of the main office (FK to geo.counties) |
latitude |
double | yes | Main office latitude |
longitude |
double | yes | Main office longitude |
established_ |
date | yes | Date the institution was established |
effective_ |
date | yes | Date the current institution record became effective |
inactive_ |
date | yes | Date the institution ceased to be FDIC-insured. The sentinel 9999-12-31 is FDIC's own "still open" marker (carried through as a real, very-large date, not nulled), meaning the institution is still active. |
total_ |
long | yes | Total assets as of the latest call report (USD thousands) |
total_ |
long | yes | Total deposits as of the latest call report (USD thousands) |
webaddr |
string | yes | Institution website |
specialization_ |
string | yes | FDIC specialization group description |
report_ |
date | yes | Date of the latest call report reflected in this snapshot |
locations · table¶
Snapshot of every FDIC-insured institution's branch/office locations — main-office flag, service type, and geocoded address. One row per office; PK is uninum. Joins to institutions by cert and to sod (branch-level deposits) by uninum. Source: api.fdic.gov/banks/locations.
| Column | Type | Null | Description |
|---|---|---|---|
uninum |
long | no | FDIC unique office number (PK) |
cert |
long | yes | FK to banking.institutions.cert |
office_ |
string | yes | Office name |
is_ |
boolean | yes | Whether this office is the institution's main office |
service_ |
string | yes | Office service type description |
address |
string | yes | Street address |
city |
string | yes | City |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
zip |
string | yes | ZIP code |
county_ |
string | yes | 5-digit county FIPS code (FK to geo.counties). NULL for a foreign branch/office (FDIC's own STCNTY/STCNTYBR carries the literal "00" for one, with no US state at all — not a real county) rather than passing the sentinel through. |
cbsa_ |
string | yes | Core-based statistical area name |
latitude |
double | yes | Office latitude |
longitude |
double | yes | Office longitude |
established_ |
date | yes | Date the office was established |
acquired_ |
date | yes | Date the office was acquired (nullable — FDIC often returns JSON null) |
history · table¶
Branch-network change events (opening / closing / acquired-in-merger, etc.) — the branch open/close/merger event log. One row per transaction; PK is transnum. Windowed by EFFYEAR (effective year of the change). Joins to institutions by cert. Source: api.fdic.gov/banks/history.
| Column | Type | Null | Description |
|---|---|---|---|
transnum |
long | no | FDIC transaction number (PK) |
cert |
long | yes | FK to banking.institutions.cert |
institution_ |
string | yes | Institution name at time of the event |
changecode |
integer | yes | FDIC change-event code |
changecode_ |
string | yes | Human-readable changecode label, e.g. 'Branch Closing', 'Branch Opening', 'Branch Acquired in Merger/Consolidation/Failure'. |
effective_ |
date | yes | Effective date of the change (drives the year partition) |
office_ |
string | yes | Office name |
office_ |
string | yes | Office city |
office_ |
string | yes | Office 2-char state abbreviation (FK to geo.state_ref.state_abbr) |
office_ |
string | yes | Office county name |
county_ |
string | yes | 5-digit county FIPS, derived from office_county_name/office_state_abbr via exact match against the Census county-name crosswalk (the same lookup energy.eia_power_plants uses) — FDIC reports the county as free text and never carries a native FIPS code. NULL where the name cannot be resolved: Puerto Rico and US Virgin Islands county-equivalents are not in the crosswalk at all (a real gap in that reference, not a spelling mismatch — do not expect these to resolve without adding PR/VI reference data first), and DC branches genuinely have no county subdivision to report. A bare name shared by both a Virginia independent city and a same-named Virginia county (Fairfax, Richmond) also stays NULL rather than guessing which one a branch belongs to. |
latitude |
double | yes | Office latitude |
longitude |
double | yes | Office longitude |
proc_ |
date | yes | Date FDIC processed the change record |
failures · table¶
Bank failure resolutions — resolution type, deposits/assets at failure, and the acquiring institution (when any). One row per failure; PK is id. Windowed by FAILYR. cert is nullable — some very old records have no CERT. Joins to institutions by cert. Source: api.fdic.gov/banks/failures.
| Column | Type | Null | Description |
|---|---|---|---|
id |
integer | no | FDIC failure record id (PK) |
cert |
long | yes | FK to banking.institutions.cert (nullable — some very old records have no CERT) |
institution_ |
string | yes | Failed institution name |
city |
string | yes | Failed institution city |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
fail_ |
date | yes | Date of failure (drives the year partition) |
resolution_ |
string | yes | FDIC resolution type code |
deposits_ |
long | yes | Deposits at time of failure (USD thousands) |
assets_ |
long | yes | Assets at time of failure (USD thousands) |
acquirer_ |
string | yes | Acquiring institution name (null if no acquirer / deposit payoff) |
acquirer_ |
string | yes | Acquiring institution city |
acquirer_ |
string | yes | Acquiring institution 2-char state abbreviation |
cost_ |
double | yes | Estimated cost to the Deposit Insurance Fund (USD thousands) |
sod · table¶
Annual branch-level deposit totals from FDIC's Summary of Deposits survey — deposits_branch_thousands per branch plus the owning institution's deposits_institution_total_thousands. One row per (branch, year); windowed by the literal YEAR field (a plain equality filter, not a range). Joins to locations by uninum and to institutions by cert. Source: api.fdic.gov/banks/sod.
| Column | Type | Null | Description |
|---|---|---|---|
uninum |
long | no | FDIC unique office number (FK to banking.locations.uninum) |
cert |
long | yes | FK to banking.institutions.cert |
office_ |
string | yes | Branch office name |
address |
string | yes | Branch street address |
city |
string | yes | Branch city |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
county_ |
string | yes | 5-digit county FIPS code (FK to geo.counties). NULL for a foreign branch/office (FDIC's own STCNTY/STCNTYBR carries the literal "00" for one, with no US state at all — not a real county) rather than passing the sentinel through. |
zip |
string | yes | Branch ZIP code |
latitude |
double | yes | Branch latitude |
longitude |
double | yes | Branch longitude |
deposits_ |
long | yes | Deposits held at this branch as of June 30 (USD thousands) |
deposits_ |
long | yes | Total deposits across the owning institution's entire branch network (USD thousands) |
financials · table¶
Quarterly call-report financials — total assets/liabilities, domestic deposits, net income, employee count, key ratios (equity/assets, net interest margin), CRE loan balances by property type (nonfarm-nonresidential, construction/land development, multifamily), and total risk-based capital, per institution per report date. One row per (cert, repdte). VERY LARGE (millions of rows all-history). Windowed by a REPDTE date range covering the calendar year. Joins to institutions by cert. The CRE fields let a caller compute a standard CRE-concentration ratio (CRE loans / total risk-based capital) directly, joined against institutions' charter-city geography, without relaying a third-party screener's numbers. Source: api.fdic.gov/banks/financials.
| Column | Type | Null | Description |
|---|---|---|---|
cert |
long | no | FK to banking.institutions.cert |
repdte |
date | no | Call-report date (part of the PK together with cert) |
total_ |
long | yes | Total assets (USD thousands) |
domestic_ |
long | yes | Domestic office deposits (USD thousands) |
net_ |
long | yes | Net income for the reporting period (USD thousands) |
total_ |
long | yes | Total liabilities (USD thousands) |
num_ |
integer | yes | Full-time-equivalent employee count |
equity_ |
double | yes | Equity capital / total assets (%) |
net_ |
double | yes | Net interest margin, annualized (%) |
interest_ |
long | yes | Total interest expense (USD thousands) |
cre_ |
long | yes | Loans secured by nonfarm nonresidential (commercial) real estate — Call Report item LNRENRES (USD thousands) |
cre_ |
long | yes | Construction and land development loans — Call Report item LNRECONS (USD thousands) |
cre_ |
long | yes | Multifamily residential real estate loans — Call Report item LNREMULT (USD thousands) |
total_ |
long | yes | Total risk-based capital (Tier 1 + Tier 2) — Call Report item RBC (USD thousands). Confirmed live against api.fdic.gov/banks/financials: 0 (not null, not missing) for roughly 39% of institutions in a typical quarter, stable across at least the last two years — these are institutions that elected the Community Bank Leverage Ratio (CBLR) framework and are not required to compute the standard risk-based ratios at all; RBCT2 and the risk-based ratio RBCRWAJ are 0 for the exact same institutions, while total_tier1_capital_thousands (RBCT1, below) still reports a real value for them since Tier 1 is what CBLR's own simplified leverage ratio uses. A caller computing a risk-based-capital ratio (e.g. CRE concentration) should use total_tier1_capital_thousands as the denominator when this column is 0, not filter the institution out. |
total_ |
long | yes | Tier 1 risk-based capital — Call Report item RBCT1 (USD thousands). Populated for every institution regardless of CBLR election (see total_risk_based_capital_thousands above) — the correct capital denominator for a CBLR-electing bank, whose total RBC reports 0. |
summary · table¶
Annual FDIC industry summary — bank count, net income, interest income, liabilities, and equity, either per-state or (when state_abbr is absent) a nationwide rollup. One row per (year, state_abbr); windowed by the literal YEAR field. Small table (~8K rows nationwide). Many fields are legitimately null in 1930s-40s records because call reports genuinely did not collect them then — real historical sparsity, not an ETL defect. Source: api.fdic.gov/banks/summary.
| Column | Type | Null | Description |
|---|---|---|---|
year |
integer | no | Report year. Source YEAR field arrives as a string (e.g. "1934"); parsed to int. |
state_ |
string | yes | 2-char USPS state abbreviation. Null/absent means a nationwide rollup row, not a per-state one — FDIC's own aggregation grain, not a data defect. |
num_ |
integer | yes | Number of FDIC-insured institutions |
net_ |
long | yes | Aggregate net income (USD thousands) |
total_ |
long | yes | Aggregate total interest income (USD thousands) |
total_ |
long | yes | Aggregate total liabilities (USD thousands) |
total_ |
long | yes | Aggregate total equity capital (USD thousands) |
consumer_complaints · table¶
CFPB Consumer Complaint Database — one row per consumer complaint against a financial company, with product/issue taxonomy and company response. Fanned out over year x state x product (5 products) to keep each fetch unit under CFPB's 10,000-row page cap; the aggregations endpoint has no equivalent, so this is a genuine per-complaint fetch, not an aggregate. PK is complaint_id. Different host and response shape from the FDIC tables above (OpenSearch hits.hits[]._source; ISO-8601 dates). Source: consumerfinance.gov/data-research/consumer-complaints/search/api/v1.
| Column | Type | Null | Description |
|---|---|---|---|
complaint_ |
long | no | CFPB complaint id (PK) |
date_ |
date | yes | Date CFPB received the complaint (drives the year partition) |
date_ |
date | yes | Date the complaint was sent to the company |
product |
string | yes | Product category (drives the product partition) |
sub_ |
string | yes | Sub-product category |
issue |
string | yes | Complaint issue category |
sub_ |
string | yes | Complaint sub-issue category |
company |
string | yes | Company the complaint is against |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
zip_ |
string | yes | Consumer-reported ZIP code |
submitted_ |
string | yes | Complaint submission channel (Web, Phone, Referral, etc.) |
company_ |
string | yes | Company's public response to the complaint |
timely_ |
string | yes | Whether the company responded within the CFPB timeliness standard |
has_ |
boolean | yes | Whether the consumer opted to publish a complaint narrative |
ncua_branch_locations · table¶
NCUA-insured credit union branch/office locations, one row per office per quarterly cycle — main-office flag, address, and ATM/drive-thru flags. Together with banking.locations (FDIC bank branches), a UNION ALL on (state_abbr, county_name) with a literal institution_type discriminant answers any bank-vs-credit-union comparison natively. Source: ncua.gov quarterly 5300 Call Report bulk zip, "Credit Union Branch Information.txt" member.
| Column | Type | Null | Description |
|---|---|---|---|
cycle |
string | no | Report cycle, YYYY-MM (calendar quarter-end; partition column) |
cu_ |
long | yes | NCUA credit union charter number (join key across NCUA tables) |
site_ |
long | yes | NCUA branch/site identifier |
cu_ |
string | yes | Credit union name |
site_ |
string | yes | Branch/site name |
site_ |
string | yes | Site type (e.g. Corporate Office, Branch) |
is_ |
boolean | yes | Whether this site is the credit union's main/corporate office |
address |
string | yes | Street address |
city |
string | yes | City |
state_ |
string | yes | 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr) |
zip |
string | yes | ZIP code |
county_ |
string | yes | County name (as reported by NCUA, not FIPS-coded) |
country |
string | yes | Country |
phone |
string | yes | Phone number |
has_ |
boolean | yes | Whether this site has an ATM |
has_ |
boolean | yes | Whether this site has a drive-thru |
cra_small_business_lending · table¶
Community Reinvestment Act aggregate small-business lending, from FFIEC's 2024 Aggregate flat file table A1-1 ("Small Business Loans by County -- Originations"). One record per (activity_year, state, county, msa_md, census_tract, income_group_total, report_level) reporting the number and dollar volume of small-business loans originated in that geography-and- income cell across all reporting institutions, broken out by loan-size bucket (<$100k, $100k-$250k, $250k-$1M) and separately for loans made to small businesses with gross annual revenues under $1M. Grain is set by report_level: NULL rows are the tract-x-income-group subtotals, '100' rows are the county-x-income-group totals, '200' rows are the county totals across all income groups, and '210' rows are the MSA/MD totals. Loan amounts arrive in thousands of USD from the source and are carried through unchanged. Joins to geo.counties via county_fips. Source: ffiec.gov/sites/default/files/data/cra/flat-files/{yy}exp_aggr.zip (one ZIP per activity year, extracting the cra{year}_Aggr_A11.dat fixed-width member; 145-char record layout parsed directly by CraSmallBusinessLendingTransformer — see that class for why this table cannot use the shared file/etl HTTP+FIXED_WIDTH path).
| Column | Type | Null | Description |
|---|---|---|---|
activity_ |
integer | yes | CRA reporting (activity) year |
state_ |
string | yes | 2-digit state FIPS code with leading zero, or blank for totals across all states |
county_ |
string | yes | 3-digit within-state county FIPS code (concat state_fips + this to get the 5-digit county_fips), or blank for totals across all counties |
county_ |
string | yes | 5-digit state+county FIPS derived from state_fips || county_code (FK to geo.counties.county_fips); NULL on total rows that span all counties in a state or MSA |
msa_ |
string | yes | 5-digit MSA/MD code as defined by OMB (right-justified with leading zeros), or 'NA' for tracts outside any MSA/MD |
census_ |
string | yes | Census tract number as reported by the Census Bureau (e.g. '0301.01'), or blank for rows that are totals across all tracts in the county or MSA/MD |
split_ |
string | yes | 'Y' if this row's tract is split by an MSA/MD boundary, 'N' if not, blank on total rows |
population_ |
string | yes | 'S' for counties with <500,000 population, 'L' for >=500,000, blank on total rows |
income_ |
string | yes | Median-family-income bucket of the tract, kept as string because the field mixes fine-grained deciles (values '1'-'15', with '1' meaning <10% of MFI and '14' meaning MFI unknown) with coarse tiers ('101' Low, '102' Moderate, '103' Middle, '104' Upper, '105' Income Not Known, '106' Tract Not Known); blank on total rows |
report_ |
string | yes | Grain marker: '100' = income-group total within a county, '200' = county total across all income groups, '210' = MSA/MD total, blank = tract-x-income-group subtotal (the finest grain, one row per (state, county, census_tract, income_group_total)) |
loans_ |
long | yes | Number of small-business loans originated with amount at origination < $100,000 |
loans_ |
long | yes | Total dollar amount of small-business loans originated with amount at origination < $100,000 (USD thousands) |
loans_ |
long | yes | Number of small-business loans originated with amount at origination >= $100,000 and < $250,000 |
loans_ |
long | yes | Total dollar amount of small-business loans originated with amount at origination >= $100,000 and < $250,000 (USD thousands) |
loans_ |
long | yes | Number of small-business loans originated with amount at origination >= $250,000 and < $1,000,000 |
loans_ |
long | yes | Total dollar amount of small-business loans originated with amount at origination >= $250,000 and < $1,000,000 (USD thousands) |
loans_ |
long | yes | Number of loans originated to small businesses with gross annual revenues < $1,000,000 (subset of the above counts by loan size) |
loans_ |
long | yes | Total dollar amount of loans originated to small businesses with gross annual revenues < $1,000,000 (USD thousands; subset of the amount-by-loan-size columns above) |