IRS 990 Nonprofit Officer Compensation Scraper avatar

IRS 990 Nonprofit Officer Compensation Scraper

Pricing

Pay per event

Go to Apify Store
IRS 990 Nonprofit Officer Compensation Scraper

IRS 990 Nonprofit Officer Compensation Scraper

Pull officer + director compensation from US nonprofit IRS Form 990 filings via the ProPublica Nonprofit Explorer API. We handle pagination, retries, and rate-limit pacing โ€” you get one clean typed row per officer with name, title, hours, base + bonus + benefits + total comp.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

IRS 990 Nonprofit Officer Compensation Scraper

IRS 990 Nonprofit Officer Compensation Scraper

We do the dirty work so your dataset stays clean. ๐Ÿ˜ˆ

$3.05 / 1,000 rows โ€” Export IRS Form 990 nonprofit officer compensation and key financial line items as structured rows, one per (EIN, tax year) filing. Bulk EIN lookup or name/state search, normalised across the three return types (990, 990EZ, 990PF). Sourced from ProPublica's Nonprofit Explorer API. Free, no API key, no login.

The IRS publishes Form 990 returns from ~1.6 million tax-exempt organisations, but each return is a deeply nested PDF and ProPublica's public API returns 60+ flat fields per filing wrapped in a verbose org envelope. The six existing Apify Actors for this API are thin wrappers that dump the raw JSON. This Actor structures the data: one row per filing year with the correct officer-comp field picked for each formtype, a computed total-compensation-and-benefits figure, organisational context (state, city, NTEE, subsection), and the surrounding financials (revenue, expenses, assets) for compensation-magnitude analysis.

๐ŸŽฏ What this scrapes

One ResultRow per (EIN, tax year) filing. Every row carries the same 21 columns regardless of which input mode you used. Data is published by ProPublica under their Terms of Use (IRS source data is public domain).

FieldTypeDescription
einstring9-digit IRS Employer Identification Number (zero-padded)
organization_namestringLegal name from ProPublica's organization.name
organization_urlstringNonprofit Explorer organisation page URL
statestring | nullUSPS 2-letter state of the organisation's principal address
citystring | nullCity of the organisation's principal address
ntee_codestring | nullNTEE (National Taxonomy of Exempt Entities) classification code
subsection_codeint | nullIRC subsection (3 = 501(c)(3), 4 = 501(c)(4), etc.)
tax_yearintFiling tax year (tax_prd_yr)
tax_period_endstring | nullFiscal-year end (YYYY-MM)
form_typestring990, 990EZ, or 990PF
pdf_urlstring | nullDirect link to the IRS-filed 990 PDF on ProPublica
officer_comp_usdint | nullAggregate officer/director/trustee compensation
other_salaries_wages_usdint | nullAll non-officer salaries and wages (null on 990PF)
payroll_taxes_usdint | nullPayroll taxes
pension_contributions_usdint | nullPension-plan contributions
other_employee_benefits_usdint | nullOther employee benefits
total_comp_and_benefits_usdint | nullComputed sum of the 5 comp/benefit fields
total_revenue_usdint | nullTotal revenue (context for compensation magnitude)
total_functional_expenses_usdint | nullTotal functional expenses
total_assets_end_usdint | nullTotal assets at year-end
scraped_atstringISO 8601 UTC datetime this row was written

๐Ÿ”ฅ Features

  • Two input modes โ€” eins (explicit list) and searchQuery (name search). Pydantic XOR validator enforces exactly one before any network call. EIN normaliser accepts 13-1684331, 131684331, or integer forms.
  • Formtype-correct field mapping โ€” the API returns the same formtype integer (0/1/2) for 990/990EZ/990PF, but officer comp lives in compnsatncurrofcr on 990/990EZ and compofficers on 990PF. We pick the right field for each form so you don't get null officer comp for private foundations.
  • Year-window filtering โ€” startYear and endYear default to the last 3 calendar years. Out-of-window filings are dropped silently.
  • Computed total compensation and benefits โ€” sum of officer comp + non-officer salaries + payroll tax + pension + other benefits, computed per filing so you don't have to. Null only when all 5 components are null (never falsely zero).
  • State filter (search mode) โ€” pass stateFilter=CA to scope a name search to a single state via search.json?state[id]=.
  • Multi-form support โ€” 990, 990EZ, and 990PF all return clean rows. Unknown formtypes are logged and dropped (forward-compatible with new IRS forms).
  • Exponential backoff with Retry-After honoured for 429 and 503 responses; max 5 attempts.
  • curl-cffi with Chrome 131 TLS impersonation (ADR-0002 house default) โ€” robust against any future ProPublica rate-limit tightening.
  • Apify Proxy support via the BUYPROXIES94952 group (opt-in via useProxy).
  • Pydantic v2 input + output models โ€” form_type is validated against the enum ("990" / "990EZ" / "990PF"); EINs are zero-padded to 9 digits.

๐Ÿ’ก Use cases

  • Nonprofit executive-pay benchmarking โ€” bulk-pull officer compensation for a list of 100-1000 peer organisations to benchmark CEO/CFO pay against revenue.
  • Investigative journalism โ€” flag nonprofits where officer comp is an outsized fraction of revenue or expenses; spot rapid year-over-year jumps.
  • Foundation due diligence โ€” research a foundation's officer payroll and asset trajectory before applying for a grant.
  • Charity-rating data pipelines โ€” feed a structured 990 dataset into your own scoring model without writing a ProPublica wrapper.
  • Academic research โ€” multi-year panel datasets on nonprofit sector compensation and finances for economics / public-policy papers.
  • State-level nonprofit-sector reports โ€” combine stateFilter with a broad searchQuery (e.g. "foundation") to enumerate a state's nonprofit landscape.

โš™๏ธ How to use it

  1. Open the Actor input form on the Apify Console.
  2. Pick exactly one input mode:
    • EINs โ€” supply a list of eins (hyphens optional, e.g. ["13-1684331"] or ["131684331"]) for direct lookup.
    • Search query โ€” set searchQuery to a name fragment (e.g. "community foundation"); optionally narrow with stateFilter=NY.
  3. Set startYear and endYear to scope the filing window. Defaults: current year minus 3 โ†’ current year.
  4. Set maxOrgs (1-5000) to cap the EIN list size in search mode. Ignored in eins mode.
  5. Toggle useProxy on if ProPublica starts returning 429. Default is off โ€” ProPublica does not currently rate-limit datacenter IPs.
  6. Click Start. Results stream into the default dataset as JSON / CSV / Excel / XML.

Single EIN, last 3 years (default window)

{
"eins": ["131684331"]
}

Multiple EINs, narrow window

{
"eins": ["131684331", "133871360", "530196605"],
"startYear": 2021,
"endYear": 2023
}

Name search in California, capped at 50 orgs

{
"searchQuery": "community foundation",
"stateFilter": "CA",
"maxOrgs": 50,
"startYear": 2022,
"endYear": 2023
}

Input reference

FieldTypeDefaultNotes
einsstring[]โ€”9-digit EINs; hyphens stripped. XOR with searchQuery.
searchQuerystringโ€”1-200 chars. XOR with eins.
stateFilterstringnullUSPS 2-letter (CA, NY, โ€ฆ). Search mode only.
startYearintcurrent-year - 3Inclusive lower bound.
endYearintcurrent-yearInclusive upper bound; must be >= startYear.
maxOrgsint1001-5000. Search mode only.
useProxyboolfalseApify Proxy (BUYPROXIES94952).

Pricing (Pay-per-event)

EventPrice
actor-start$0.05 (charged once per run)
result-row$0.003 per filing-year row written

A typical 100-EIN run averaging 3 filings each = 300 rows = $0.95 total.

What's out of scope

  • Per-officer breakdown (name / title / hours / individual comp from Part VII Section A) โ€” that detail lives only in the 990 PDF and is not exposed by ProPublica's structured API. v1 emits the aggregate Part IX line 5 / 990PF Part I line 15 officer-compensation total. Per-officer PDF parsing is on the v2 roadmap.
  • Compensation from related organisations (Schedule J Part II) โ€” same reason; PDF-only.
  • Filings older than ~2010 โ€” ProPublica's structured coverage doesn't extend earlier.

Data source

ProPublica's Nonprofit Explorer API v2, which mirrors IRS Form 990 returns. IRS data is public domain; ProPublica's API is subject to their Terms of Use.

Support

  • Author: DevilScrapes
  • Issues & feature requests: open an issue on the Apify Store listing.
  • Source-licensed under Apache 2.0.

SEO keywords

irs 990 scraper, nonprofit officer compensation, 990 form data, propublica nonprofit api, nonprofit executive pay data, irs form 990 export, 990pf scraper, charity compensation data, nonprofit financial data api