990Health Nonprofit Finances

Description

IRS Form 990 nonprofit hospital/health-system finances: latest filing per EIN (one row per organization, the most recent tax year with usable financial data) plus officer/key-employee compensation detail (Schedule J) across all tax years available. Two files, not unioned — filings and officers are different grains (one row per org vs. one row per org-person-year) that don't share a row shape.

  • Source: IRS Form 990 e-filed data, via ProPublica Nonprofit Explorer + IRS Exempt Organizations Master File (EIN universe/NTEE codes) + IRS 990 e-File XML.
  • Refresh cadence: annual, as tax-year filings post (990s file with a lag of a year or more after the tax year ends).
  • Row count: 140,512 across 2 files (18,829 filings + 121,683 officer rows).
  • Vintage: 2024 (max tax year observed for both files at export time).

Table: nonprofit_finances_filings

One row per EIN — the latest filing with a non-null total_revenue, falling back to the most recent filing on record if every filing for that EIN has a null revenue.

Snowflake: HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_FILINGS — 18,829 rows

Column Type Description Notes
ein VARCHAR Employer Identification Number, 9 digits, no dash. Primary key of this table.
org_name VARCHAR Organization legal name as filed. —
city / state VARCHAR Mailing address on the filing, as filed. —
zip VARCHAR Verified 5-digit US ZIP, or NULL (see the zip section of the dictionaries README). Format change on 2026-09-11: this column shipped as ZIP+4 (02114-2696) on 18,823 of 18,829 rows and now ships the 5-digit prefix only (02114), so it joins cleanly to every other ZIP in the catalogue. 18,811 rows populated; 100% are a real ZIP consistent with state. 18 NULL: 6 blank at source, 8 with no state to check against, 4 whose ZIP prefix exists in no state. NULL means "not verified", never "no address".
ntee_code VARCHAR National Taxonomy of Exempt Entities code (e.g. E20/E22 for general hospitals). Populated for 18,820 of 18,829 (~99.95%) — near-universal.
classification VARCHAR Free-text classification (e.g. "Hospital", "Health Care", "Nursing Home"). Populated for only 1,808 of 18,829 (~9.6%) — sparse; ntee_code is the more reliable field to filter/segment on.
tax_year SMALLINT The tax year this filing's financials represent. This is the year selected by the "latest usable filing" logic described above — not necessarily the same tax year across every EIN in the table.
total_revenue / total_expenses DOUBLE Total revenue and total expenses reported for the tax year. —
net_income DOUBLE total_revenue - total_expenses. —
total_assets / total_liabilities DOUBLE Year-end balance sheet totals. —
charity_care_cost DOUBLE Cost of charity care provided, from Schedule H (hospital-specific community-benefit schedule). Populated for only 345 of 18,829 (~1.8%) — most organizations either don't file Schedule H or the field wasn't captured for their filing. It is not broadly available; size any analysis accordingly.
unreimbursed_medicaid DOUBLE Unreimbursed cost of care provided to Medicaid patients, from Schedule H. Populated for only 323 of 18,829 (~1.7%) — same sparsity caveat as charity_care_cost.
community_health_improvement DOUBLE Cost of community health improvement services/community-benefit operations, from Schedule H. Populated for only 278 of 18,829 (~1.5%).
mission_statement VARCHAR Organization's mission statement text, when captured. Populated for only 23 of 18,829 (~0.1%): effectively not available at scale in this export, and not usable as a searchable field.
filing_url VARCHAR Link to the source filing document. Populated for 9,183 of 18,829 (~49%).

Table: nonprofit_finances_filings_history

Every filing on record per organisation, rather than the single latest one. Same columns as nonprofit_finances_filings, but one row per EIN per tax year, so a margin or balance-sheet series can be built per organisation.

  • Row count: 85,160 filings across 18,687 organisations, tax years 2019 to 2024.
  • Rows per tax year: 2019: 15,496 · 2020: 16,087 · 2021: 16,687 · 2022: 17,449 · 2023: 17,568 · 2024: 1,873.
  • Known limit: tax year 2024 is thin, at about 11% of a normal year, because Form 990 filings arrive a year or more after the tax year ends and most 2024 returns have not yet been published. Treat the latest year as incomplete rather than as a decline.
  • Availability: included in evaluation packages and on request. It is not one of the standing marketplace tables.

Table: nonprofit_finances_officers

One row per (EIN × tax year × person) — officer, director, key-employee, and highest-compensated-employee detail from Schedule J. Exported unfiltered across all tax years, not joined to each org's latest filing year — buyers get the full officer history per EIN and can join to whichever filing year they want via ein.

Snowflake: HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_OFFICERS — 121,683 rows

Coverage limit: officer coverage is about 9% of organizations; size any analysis accordingly. Only 1,695 of the 18,829 organizations in the filings table have any officer rows at all. This is not a join or pipeline defect: the underlying Form 990 e-file data lacks Schedule J detail for the large majority of organizations in this universe (many file the simpler 990-EZ, or Schedule J was not captured for their filing). Because the export is unfiltered across tax years, it is more complete than a year-aligned join would be, but it is not necessarily year-aligned with nonprofit_finances_filings for most EINs.

Column Type Description Notes
ein VARCHAR Employer Identification Number. Joins to nonprofit_finances_filings.ein — but see the coverage caveat above; most EINs there have zero matching rows here.
tax_year SMALLINT Tax year this compensation record applies to. Not guaranteed to match the tax_year selected in nonprofit_finances_filings for the same EIN — join on ein alone if you want all available officer history, or add AND tax_year = ... if you specifically need a year-aligned view (expect far fewer matches).
person_name VARCHAR Officer/director/employee name as filed. —
title VARCHAR Position title (e.g. "PRESIDENT", "TREASURER", "CEO"). Free text, not standardized — expect variants for the same functional role across organizations.
hours_per_week DOUBLE Reported hours per week devoted to the organization. Populated for 120,384 of 121,683 (~99%).
base_compensation / bonus_incentive / other_compensation / retirement_benefits / nontaxable_benefits DOUBLE Schedule J compensation components, in dollars. 0 is a common and valid value (no compensation of that type), not necessarily missing data.
total_compensation DOUBLE Sum of the above components as reported on Schedule J. —
reportable_from_related DOUBLE Compensation reportable from a related organization (e.g. a health system's foundation or affiliated entity), per Schedule J Part II. —
is_officer / is_director / is_key_employee BOOLEAN Which Schedule J category this person is flagged under (not mutually exclusive — a person can be both an officer and a director). —
is_highest_compensated BOOLEAN Whether this person is flagged as one of the organization's highest-compensated employees. Populated (non-null) for only 21,135 of 121,683 rows (~17%) — this flag is frequently absent rather than explicitly false; treat null as "not reported," not "no."

Example queries (Snowflake)

-- 1. Largest nonprofit hospital systems by revenue, latest filing per EIN.
SELECT "ein", "org_name", "state", "tax_year", "total_revenue", "net_income", "total_assets"
FROM HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_FILINGS
ORDER BY "total_revenue" DESC
LIMIT 25;

-- 2. Top-paid executives at nonprofit hospitals in a state (officer data
--    only exists for ~9% of EINs — expect a small result set outside
--    the largest systems).
SELECT f."org_name", o."person_name", o."title", o."tax_year", o."total_compensation"
FROM HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_OFFICERS o
JOIN HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_FILINGS f
  ON o."ein" = f."ein"
WHERE f."state" = 'CA'
ORDER BY o."total_compensation" DESC
LIMIT 25;

-- 3. Community-benefit reporting: charity care as a percent of total
--    expenses, for the (small) subset of orgs that report it.
SELECT "ein", "org_name", "charity_care_cost", "total_expenses",
       "charity_care_cost" / NULLIF("total_expenses", 0) AS charity_care_pct
FROM HEALTHPARSE_DATA.NONPROFIT_FINANCES.NONPROFIT_FINANCES_FILINGS
WHERE "charity_care_cost" IS NOT NULL
ORDER BY charity_care_pct DESC
LIMIT 25;