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;