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 / zip |
VARCHAR | Mailing address on the filing. | — |
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. Do not sell this column as broadly available. |
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; don't market this as a searchable field. |
filing_url |
VARCHAR | Link to the source filing document. | Populated for 9,183 of 18,829 (~49%). |
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 caveat (read before selling this as "officer compensation
data"): only 1,695 of the 18,829 organizations in the filings table
(~9%) have any officer rows at all. This isn't a join/pipeline defect —
the underlying Form 990 e-file data simply lacks Schedule J detail for
the large majority of organizations in this universe (many file the
simpler 990-EZ, or Schedule J wasn't captured/parsed for their filing).
An earlier attempt to join officers strictly to each org's latest filing
year (exact ein + tax_year match) cut this to 1,133 EINs / 23,741
rows — the current unfiltered export is more complete but 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;