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;