Skip to content

🏛️ 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_class string yes FDIC charter class code (e.g. NM, SM, N, SB)
charter_agency string yes Chartering agency
regulator string yes Primary federal regulator
city string yes Main office city
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
zip string yes Main office ZIP code
county_fips 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 date yes Date the institution was established
effective_date date yes Date the current institution record became effective
inactive_date 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_assets_thousands long yes Total assets as of the latest call report (USD thousands)
total_deposits_thousands long yes Total deposits as of the latest call report (USD thousands)
webaddr string yes Institution website
specialization_group string yes FDIC specialization group description
report_date 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_name string yes Office name
is_main_office boolean yes Whether this office is the institution's main office
service_type string yes Office service type description
address string yes Street address
city string yes City
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
zip string yes ZIP code
county_fips 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_name string yes Core-based statistical area name
latitude double yes Office latitude
longitude double yes Office longitude
established_date date yes Date the office was established
acquired_date 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_name string yes Institution name at time of the event
changecode integer yes FDIC change-event code
changecode_label string yes Human-readable changecode label, e.g. 'Branch Closing', 'Branch Opening', 'Branch Acquired in Merger/Consolidation/Failure'.
effective_date date yes Effective date of the change (drives the year partition)
office_name string yes Office name
office_city string yes Office city
office_state_abbr string yes Office 2-char state abbreviation (FK to geo.state_ref.state_abbr)
office_county_name string yes Office county name
county_fips 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 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_name string yes Failed institution name
city string yes Failed institution city
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
fail_date date yes Date of failure (drives the year partition)
resolution_type string yes FDIC resolution type code
deposits_at_failure_thousands long yes Deposits at time of failure (USD thousands)
assets_at_failure_thousands long yes Assets at time of failure (USD thousands)
acquirer_name string yes Acquiring institution name (null if no acquirer / deposit payoff)
acquirer_city string yes Acquiring institution city
acquirer_state_abbr string yes Acquiring institution 2-char state abbreviation
cost_thousands 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 date no Effective date of the action
termination_date date yes Date the action was terminated/lifted, if any
individual_name string yes Named individual subject to the action (blank when the action targets an institution, not a person)
individual_affiliation 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_organization 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_type 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_url 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_name 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_name string yes Branch office name
address string yes Branch street address
city string yes Branch city
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
county_fips 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_branch_thousands long yes Deposits held at this branch as of June 30 (USD thousands)
deposits_institution_total_thousands 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_assets_thousands long yes Total assets (USD thousands)
domestic_deposits_thousands long yes Domestic office deposits (USD thousands)
net_income_thousands long yes Net income for the reporting period (USD thousands)
total_liabilities_thousands long yes Total liabilities (USD thousands)
num_employees integer yes Full-time-equivalent employee count
equity_to_assets_pct double yes Equity capital / total assets (%)
net_interest_margin_pct double yes Net interest margin, annualized (%)
interest_expense_thousands long yes Total interest expense (USD thousands)
cre_nonfarm_nonresidential_thousands long yes Loans secured by nonfarm nonresidential (commercial) real estate — Call Report item LNRENRES (USD thousands)
cre_construction_land_dev_thousands long yes Construction and land development loans — Call Report item LNRECONS (USD thousands)
cre_multifamily_thousands long yes Multifamily residential real estate loans — Call Report item LNREMULT (USD thousands)
total_risk_based_capital_thousands 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_tier1_capital_thousands 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_abbr 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_banks integer yes Number of FDIC-insured institutions
net_income_thousands long yes Aggregate net income (USD thousands)
total_interest_income_thousands long yes Aggregate total interest income (USD thousands)
total_liabilities_thousands long yes Aggregate total liabilities (USD thousands)
total_equity_thousands 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_id long no CFPB complaint id (PK)
date_received date yes Date CFPB received the complaint (drives the year partition)
date_sent_to_company date yes Date the complaint was sent to the company
product string yes Product category (drives the product partition)
sub_product string yes Sub-product category
issue string yes Complaint issue category
sub_issue string yes Complaint sub-issue category
company string yes Company the complaint is against
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
zip_code string yes Consumer-reported ZIP code
submitted_via string yes Complaint submission channel (Web, Phone, Referral, etc.)
company_response string yes Company's public response to the complaint
timely_response string yes Whether the company responded within the CFPB timeliness standard
has_narrative 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_number long yes NCUA credit union charter number (join key across NCUA tables)
site_id long yes NCUA branch/site identifier
cu_name string yes Credit union name
site_name string yes Branch/site name
site_type_name string yes Site type (e.g. Corporate Office, Branch)
is_main_office boolean yes Whether this site is the credit union's main/corporate office
address string yes Street address
city string yes City
state_abbr string yes 2-char USPS state abbreviation (FK to geo.state_ref.state_abbr)
zip string yes ZIP code
county_name string yes County name (as reported by NCUA, not FIPS-coded)
country string yes Country
phone string yes Phone number
has_atm boolean yes Whether this site has an ATM
has_drive_thru 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_year integer yes CRA reporting (activity) year
state_fips string yes 2-digit state FIPS code with leading zero, or blank for totals across all states
county_code 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_fips 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_md 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_tract 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_county string yes 'Y' if this row's tract is split by an MSA/MD boundary, 'N' if not, blank on total rows
population_classification string yes 'S' for counties with <500,000 population, 'L' for >=500,000, blank on total rows
income_group_total 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_level 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_lt_100k_count long yes Number of small-business loans originated with amount at origination < $100,000
loans_lt_100k_amount long yes Total dollar amount of small-business loans originated with amount at origination < $100,000 (USD thousands)
loans_100k_to_250k_count long yes Number of small-business loans originated with amount at origination >= $100,000 and < $250,000
loans_100k_to_250k_amount long yes Total dollar amount of small-business loans originated with amount at origination >= $100,000 and < $250,000 (USD thousands)
loans_250k_to_1m_count long yes Number of small-business loans originated with amount at origination >= $250,000 and < $1,000,000
loans_250k_to_1m_amount long yes Total dollar amount of small-business loans originated with amount at origination >= $250,000 and < $1,000,000 (USD thousands)
loans_to_small_biz_lt_1m_rev_count 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_to_small_biz_lt_1m_rev_amount 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)