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.

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_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)

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, 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_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)