If you sell anything to nonprofits — software, fundraising services, consulting — you have one segmentation question that matters more than all others: can this organization afford me? Unusually, the answer is public. Every US nonprofit above a minimal size files a Form 990 with the IRS, and the filings carry total revenue, expenses, and assets.
The friendly way in is ProPublica's Nonprofit Explorer API. No key, no registration.
Search, then enrich
GET https://projects.propublica.org/nonprofits/api/v2/search.json
?q=food+bank&state[id]=TX&ntee[id]=5
Returns organizations with EIN, name, city, state, and NTEE category (1=Arts through 9=Mutual Benefit), paginated 25 at a time. Then per organization:
GET https://projects.propublica.org/nonprofits/api/v2/organizations/{ein}.json
The filings_with_data array is the payoff — one entry per e-filed 990, each with tax_prd_yr, totrevenue, totfuncexpns, totassetsend, and a link to the filing PDF. Sort by year descending and you have the latest financials plus a multi-year trend for free.
The three moves that turn data into leads
-
Filter by revenue band.
totalRevenue >= 1_000_000removes the all-volunteer organizations that can't buy anything. This single filter is most of what expensive sector databases sell — GuideStar/Candid Pro starts around $2k/year. -
Read the trend, not the snapshot. Five years of
totrevenuedistinguishes a growing organization (hiring, buying tools) from a shrinking one (cutting).{"2023": 401M, "2022": 388M, "2021": 421M}tells you more than any firmographic field. - Treat missing filings as signal, not noise. Small organizations file postcard 990-Ns with no financial data. If your product needs a real budget behind it, the absence of filing data is the disqualification — skip them (and if you're billing per row like I do, make them free).
The workflow
Search fan-out (terms × states × categories) → dedupe by EIN → enrich → filter by band → export. Add a store of seen EINs and a weekly schedule and you get only new organizations matching your profile each run — a prospecting feed instead of a static list. Chain the names into a website contact scraper and the outreach email is one more step.
I packaged this as an Apify actor: Nonprofit Leads Scraper — search filters, 990 enrichment with the five-year trend, revenue-band filtering, cross-run dedupe, at $0.01 per organization row (no-filing orgs free, first 2 rows of every run free). It pairs with the Grant Opportunity Finder I shipped the same week: one side of the sector's money graph is who gives, the other is who raises and spends.
The nonprofit sector runs on transparency rules the for-profit world would never accept. If your ideal customer is a nonprofit, their budget has been sitting in a public API the whole time.
Top comments (0)