IRS 990 Nonprofit Officer Compensation Scraper
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
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).
| Field | Type | Description |
|---|---|---|
ein | string | 9-digit IRS Employer Identification Number (zero-padded) |
organization_name | string | Legal name from ProPublica's organization.name |
organization_url | string | Nonprofit Explorer organisation page URL |
state | string | null | USPS 2-letter state of the organisation's principal address |
city | string | null | City of the organisation's principal address |
ntee_code | string | null | NTEE (National Taxonomy of Exempt Entities) classification code |
subsection_code | int | null | IRC subsection (3 = 501(c)(3), 4 = 501(c)(4), etc.) |
tax_year | int | Filing tax year (tax_prd_yr) |
tax_period_end | string | null | Fiscal-year end (YYYY-MM) |
form_type | string | 990, 990EZ, or 990PF |
pdf_url | string | null | Direct link to the IRS-filed 990 PDF on ProPublica |
officer_comp_usd | int | null | Aggregate officer/director/trustee compensation |
other_salaries_wages_usd | int | null | All non-officer salaries and wages (null on 990PF) |
payroll_taxes_usd | int | null | Payroll taxes |
pension_contributions_usd | int | null | Pension-plan contributions |
other_employee_benefits_usd | int | null | Other employee benefits |
total_comp_and_benefits_usd | int | null | Computed sum of the 5 comp/benefit fields |
total_revenue_usd | int | null | Total revenue (context for compensation magnitude) |
total_functional_expenses_usd | int | null | Total functional expenses |
total_assets_end_usd | int | null | Total assets at year-end |
scraped_at | string | ISO 8601 UTC datetime this row was written |
๐ฅ Features
- Two input modes โ
eins(explicit list) andsearchQuery(name search). Pydantic XOR validator enforces exactly one before any network call. EIN normaliser accepts13-1684331,131684331, or integer forms. - Formtype-correct field mapping โ the API returns the same
formtypeinteger (0/1/2) for 990/990EZ/990PF, but officer comp lives incompnsatncurrofcron 990/990EZ andcompofficerson 990PF. We pick the right field for each form so you don't get null officer comp for private foundations. - Year-window filtering โ
startYearandendYeardefault 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=CAto scope a name search to a single state viasearch.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-Afterhonoured for429and503responses; max 5 attempts. curl-cffiwith Chrome 131 TLS impersonation (ADR-0002 house default) โ robust against any future ProPublica rate-limit tightening.- Apify Proxy support via the
BUYPROXIES94952group (opt-in viauseProxy). - Pydantic v2 input + output models โ
form_typeis 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
stateFilterwith a broadsearchQuery(e.g."foundation") to enumerate a state's nonprofit landscape.
โ๏ธ How to use it
- Open the Actor input form on the Apify Console.
- 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
searchQueryto a name fragment (e.g."community foundation"); optionally narrow withstateFilter=NY.
- EINs โ supply a list of
- Set
startYearandendYearto scope the filing window. Defaults: current year minus 3 โ current year. - Set
maxOrgs(1-5000) to cap the EIN list size in search mode. Ignored ineinsmode. - Toggle
useProxyon if ProPublica starts returning429. Default is off โ ProPublica does not currently rate-limit datacenter IPs. - 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
| Field | Type | Default | Notes |
|---|---|---|---|
eins | string[] | โ | 9-digit EINs; hyphens stripped. XOR with searchQuery. |
searchQuery | string | โ | 1-200 chars. XOR with eins. |
stateFilter | string | null | USPS 2-letter (CA, NY, โฆ). Search mode only. |
startYear | int | current-year - 3 | Inclusive lower bound. |
endYear | int | current-year | Inclusive upper bound; must be >= startYear. |
maxOrgs | int | 100 | 1-5000. Search mode only. |
useProxy | bool | false | Apify Proxy (BUYPROXIES94952). |
Pricing (Pay-per-event)
| Event | Price |
|---|---|
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