🏛️ 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.
11 datasets · 153 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). Carried as published by FDIC: a literal 0 means FDIC's failures API publishes COST=0 for that record (e.g. Signature Bank, 2023), not a computed zero. Missing values load as null. Do not rank or sum failures by cost without excluding these zero-published records. |
enforcement_actions · table¶
Federal Reserve enforcement actions against state member banks, bank holding companies, and individuals under Fed jurisdiction — cease-and- desist orders, written agreements, civil money penalties, prohibitions from banking, and prompt corrective action notices. Board of Governors bulk CSV, full history back to 1989, refetched and overwritten in full each cycle (the source carries no per-row last-modified field, so an incremental append could miss a later-added termination_date on an already-seen row). Covers Federal Reserve-supervised entities only: OCC-regulated national banks and FDIC-regulated state non-member banks are NOT covered here, since neither publishes a bulk enforcement feed (OCC's EASearch is a search-only web form; FDIC's BankFind Suite API has no enforcement endpoint). No natural primary key: effective_date + banking_organization is not unique (the source legitimately carries multiple concurrent actions against the same organization on the same date), and there is no cert number to join against banking.institutions — individual_affiliation/banking_organization are free-text name and location strings only. Source: federalreserve.gov/supervisionreg bulk CSV.
| Column | Type | Null | Description |
|---|---|---|---|
effective_ |
date | no | Effective date of the action |
termination_ |
date | yes | Date the action was terminated/lifted, if any |
individual_ |
string | yes | Named individual subject to the action (blank when the action targets an institution, not a person) |
individual_ |
string | yes | Free-text institution name and location the individual was affiliated with at the time of the action (not normalized — no join key to banking.institutions) |
banking_ |
string | yes | Free-text banking organization name and location subject to the action (blank when the action targets an individual rather than the institution itself) |
action_ |
string | yes | Type of enforcement action (e.g. Cease and Desist Order, Written Agreement, Civil Money Penalty — a dollar amount is sometimes appended into this same field by the source); blank for press-release-only entries with no formal action recorded |
source_ |
string | yes | Relative path under federalreserve.gov to the source press release or order document; literal "DNE" when the source has no linkable document |
document_ |
string | yes | Source document label (e.g. "Press Release") |
note |
string | yes | Free-text note from the source, usually blank |
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; 2016+ zips carry the per-table member cra{year}_Aggr_A11.dat, earlier years a single combined exp_aggr.dat holding every aggregate table — CraSmallBusinessLendingTransformer handles both and filters the combined stream to A1-1 records; 116-char fixed-width record layout parsed directly by that class — see it 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) |