# Nonprofit Leads Scraper: IRS 990 Revenue, Assets & Contacts (`scrapemint/nonprofit-leads-scraper`) Actor

Find US nonprofits by keyword, state, and category with IRS 990 financials per organization: total revenue, expenses, assets, and multi-year trend. Segment by budget for lead lists and prospecting. Keyless public API, no browser. Pay per organization.

- **URL**: https://apify.com/scrapemint/nonprofit-leads-scraper.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 nonprofit organization rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Nonprofit Leads Scraper: IRS 990 Revenue, Assets & Contacts

Turn the IRS nonprofit universe into a segmented lead list. Search US nonprofits by keyword, state, and NTEE category, and get one JSON row per organization with its 990 financials: latest total revenue, expenses, and assets, a multi-year revenue trend, filing history, address, and a link to the filing PDF and public profile. Filter by revenue band to target organizations that can actually afford you. Keyless public API on IRS data: no login, no browser, no seat license.

Built for vendors and agencies selling to nonprofits, grant consultants prospecting clients, fundraisers researching peers and funders, and analysts sizing the sector.

### What you get

One row per organization, with:

- `ein`, `name`, `city`, `state`, `address`, `zipcode`, `nteeCode`, `subsectionCode`, `rulingDate`
- `totalRevenue`, `totalExpenses`, `totalAssets`, `latestFilingYear`
- `revenueByYear` (up to 5 years — spot growth or decline at a glance)
- `filingsAvailable`, `latestFilingPdf`, `profileUrl`, `matchedTerm`

### Input

- `searchTerms` (matched against organization names)
- `states` (two-letter codes)
- `nteeCategories` (1=Arts, 2=Education, 3=Environment, 4=Health, 5=Human Services, 6=International, 7=Public Benefit, 8=Religion, 9=Mutual Benefit)
- `minRevenue` / `maxRevenue` (segment by budget, e.g. only orgs over $1M)
- `includeFinancials` (default on; one extra request per org)
- `maxOrgs` (default 25, up to 1000)
- `dedupe` (skip previously returned EINs; built for scheduled prospecting)

### Example input

```json
{
  "searchTerms": ["food bank"],
  "states": ["TX", "OK"],
  "minRevenue": 1000000,
  "maxOrgs": 100
}
```

### Example output

```json
{
  "ein": 742181456,
  "name": "Houston Food Bank",
  "city": "Houston",
  "state": "TX",
  "nteeCode": "K31",
  "latestFilingYear": 2023,
  "totalRevenue": 401238747,
  "totalExpenses": 389516210,
  "totalAssets": 273904481,
  "revenueByYear": { "2023": 401238747, "2022": 388112604, "2021": 421077553 },
  "profileUrl": "https://projects.propublica.org/nonprofits/organizations/742181456"
}
```

### Uses

- Lead lists for software, services, and consultancies that sell to nonprofits, segmented by real budget
- Grant consultants: find growing organizations in your niche before pitching
- Fundraising benchmarks: revenue trends for every peer organization in a category and state
- Pair with the Grant Opportunity Finder: who is funding, who needs funding, in one workflow
- Chain the names into a website contact scraper for outreach emails

### Pricing

Pay per organization row. Organizations with no filing data on record are free rows, and searches that match nothing cost nothing. The first 2 rows of every run are free so you can validate output before you scale up.

### Notes

- Data comes from ProPublica's Nonprofit Explorer public API, built on IRS Form 990 filings and the IRS Business Master File. Financials reflect the latest filing on record, which typically lags the current year.
- Revenue filters require financials and skip organizations without filing data.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords matched against organization names, e.g. food bank, animal rescue, youth education.

## `states` (type: `array`):

Two-letter US state codes to filter by, e.g. TX, CA, NY. Empty = all states.

## `nteeCategories` (type: `array`):

1=Arts, 2=Education, 3=Environment, 4=Health, 5=Human Services, 6=International, 7=Public Benefit, 8=Religion, 9=Mutual Benefit, 10=Unknown.

## `minRevenue` (type: `integer`):

Only return organizations whose latest reported total revenue is at least this (USD). Requires financials.

## `maxRevenue` (type: `integer`):

Only return organizations whose latest reported total revenue is at most this (USD).

## `includeFinancials` (type: `boolean`):

Adds latest revenue, expenses, assets, and a multi-year revenue trend (one extra request per organization). Organizations with no filing data become free rows.

## `maxOrgs` (type: `integer`):

Cap on organization rows returned. Controls total cost.

## `dedupe` (type: `boolean`):

Remember returned EINs across runs and skip them. Turn on for scheduled prospecting.

## Actor input object example

```json
{
  "searchTerms": [
    "food bank"
  ],
  "states": [
    "TX"
  ],
  "nteeCategories": [],
  "includeFinancials": true,
  "maxOrgs": 25,
  "dedupe": false
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "food bank"
    ],
    "states": [
        "TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/nonprofit-leads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["food bank"],
    "states": ["TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/nonprofit-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "food bank"
  ],
  "states": [
    "TX"
  ]
}' |
apify call scrapemint/nonprofit-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapemint/nonprofit-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pf884zDI4zEeduAB1/builds/nxjDdbbsXEsnbL71T/openapi.json
