IRS Nonprofit 990 Scraper - Charities, Revenue & Officer Pay
Pricing
from $3.50 / 1,000 results
IRS Nonprofit 990 Scraper - Charities, Revenue & Officer Pay
Scrape US nonprofits and charities from official IRS Form 990 data: name, EIN, address, NTEE cause area, 501(c) type, revenue, expenses, assets, surplus/deficit, officer pay and year-over-year growth. Filter by state, cause, 501(c) type and minimum revenue. Export CSV/JSON/Excel. No API key.
Pricing
from $3.50 / 1,000 results
Rating
0.0
(0)
Developer
Flash Scrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
IRS Nonprofit 990 Scraper — Charities, Revenue & Officer Pay
Turn the US nonprofit sector into a spreadsheet. Search official IRS Form 990 data by keyword, state, cause area and 501(c) type, and get one clean row per organization: name, EIN, address, cause area, 501(c) type, and — straight from the organization's own filings — total revenue, expenses, end-of-year assets, surplus/deficit, operating margin, officer compensation and year-over-year revenue growth, plus a link to the source 990 PDF.
No API key, no login, no proxy. Public IRS data via ProPublica's free Nonprofit Explorer API.
What you can do with it
- 💰 Qualify prospects by size —
minRevenue+ thesize_tiercolumn ("mid ($1M-10M)") give you only the nonprofits big enough to be worth a pitch. - 🎯 Build a targeted list — every food bank in Texas, every health charity in Wyoming, every 501(c)(6) chamber of commerce in your state.
- 📈 Spot who is growing —
revenue_growth_pctcompares the latest filing to the prior year, so you can find organizations whose budgets are expanding. - 🔎 Check financial health —
surplusandoperating_margin_pctshow at a glance who runs a deficit and who does not. - 🧾 Research officer pay —
officer_compensationcomes from the filing itself. - 🗂️ Export to CSV, JSON or Excel.
Built for fundraising consultants, grant writers, nonprofit-sector vendors, researchers and journalists who need the whole segment rather than one EIN lookup at a time.
Input
| Field | Type | Description |
|---|---|---|
searchTerms | array | Keywords matched against organization names, e.g. food bank, animal rescue. Leave empty to browse a whole state or cause area. |
states | array | Two-letter US state codes, e.g. ["TX","CA"]. Empty = all states. |
causeArea | select | One NTEE major group — Arts, Education, Environment & Animals, Health, Human Services, International, Public Benefit, Religion, Mutual Benefit, Unclassified. |
subsectionCode | select | One 501(c) type. 3 is the classic tax-deductible public charity. |
includeFinancials | boolean | Fetch each organization's filing history for revenue/assets/officer pay. Default true. Turn off for a fast name-and-address list. |
minRevenue | integer | Drop organizations below this latest reported revenue. 0 = no filter. |
minAssets | integer | Drop organizations below this latest reported end-of-year assets. 0 = no filter. |
onlyWithFilings | boolean | Skip organizations with no 990 data on record. |
maxItems | integer | Max organizations per run (1–1000). |
Every search term is combined with every state, so ["food bank"] × ["TX","CA"] runs two
queries and merges the results, deduplicated by EIN.
Examples
Qualified prospects — Texas food banks over $1M revenue:
{ "searchTerms": ["food bank"], "states": ["TX"], "minRevenue": 1000000, "maxItems": 100 }
Browse a whole segment — every 501(c)(3) health nonprofit in Wyoming, no keyword needed:
{ "searchTerms": [], "states": ["WY"], "causeArea": "4", "subsectionCode": "3", "maxItems": 200 }
Output (one row per organization)
ein, ein_formatted, name, also_known_as, city, state, address, zipcode,
care_of_name, ntee_code, cause_area, subsection_code, organization_type, is_501c3,
ruling_date, tax_period, has_filings, filing_count, filing_years,
latest_fiscal_year, total_revenue, total_expenses, total_assets, surplus,
operating_margin_pct, officer_compensation, revenue_growth_pct, size_tier,
irs_revenue_amount, irs_income_amount, irs_asset_amount, latest_filing_pdf,
propublica_url, matched_search_term.
Sample row
{"ein": "742181456","name": "Houston Food Bank","city": "Houston","state": "TX","ntee_code": null,"cause_area": null,"organization_type": "501(c)(3) charitable / educational","latest_fiscal_year": 2023,"total_revenue": 298504285,"total_expenses": 314899919,"total_assets": 154916055,"surplus": -16395634,"operating_margin_pct": -5.49,"officer_compensation": 1538220,"revenue_growth_pct": -20.69,"size_tier": "very large ($50M+)","filing_count": 13}
Note the null cause_area above: the IRS search index carries no NTEE code for this
organization, so the actor reports null rather than guessing a category. Most rows do have one.
Results are sorted largest revenue first when financials are on, so the best-qualified prospects are at the top.
Honest notes
- Financial fields can legitimately be
null. An organization can sit in the IRS master file with no Form 990 data at all — usually very small or newly registered ones. UseonlyWithFilings: trueto exclude them. Nothing is guessed or filled in. latest_fiscal_yearis the filing's tax year, not today. IRS 990 data runs a year or two behind by nature; the actor reports the most recent filing that exists.- Two sets of money fields, on purpose.
total_revenue/total_expenses/total_assetscome from the organization's own filings. Theirs_*_amountfields come from the IRS master file and can differ or lag — both are exposed rather than silently picked. minRevenue/minAssetsneed financials, so setting either switchesincludeFinancialson automatically and says so in the log.- Cause area is labelled per row from its own NTEE letter, which is more precise than the numeric group you searched under (group 3 covers both Environment and Animal-Related, for instance).
- Broad queries top out around 1,000 organizations per query — that is the API's practical paging limit, not a cap this actor adds. Narrow by state or cause area to go deeper.
- Requests are paced and retried automatically. An unknown state code is reported as a fixable input problem, never as an outage, and nothing is charged for it.