# Nonprofit 990 Explorer: IRS Form 990 Charity Data by EIN (`cprussin/nonprofit-990-explorer`) Actor

Search US nonprofits and charities by name, state, category or 501(c) type, or look up EINs. Returns address, NTEE category, exempt status and IRS Form 990 financials: revenue, expenses, assets, officer pay, filing history and PDFs. $3 per 1,000 organizations.

- **URL**: https://apify.com/cprussin/nonprofit-990-explorer.md
- **Developed by:** [Connor Prussin](https://apify.com/cprussin) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 organizations

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Nonprofit 990 Explorer: IRS Form 990 data for US charities and nonprofits

**Nonprofit 990 Explorer** searches **1.8 million US tax-exempt organizations** and returns each one's IRS profile and **Form 990 financials**: total revenue, expenses, assets, liabilities, contributions and officer compensation, year by year, with links to the original filings. Search by name or keyword, state, NTEE category and 501(c) type, or look up organizations by **EIN**. Data comes from the official, free [ProPublica Nonprofit Explorer API](https://projects.propublica.org/nonprofits/api), built on IRS Form 990 e-filings and the IRS Exempt Organizations Business Master File.

- ✅ **Official IRS data** through ProPublica's documented public API. No login, CAPTCHA, proxy or API key needed.
- ✅ **Search or EIN lookup**: name and keyword search, filters for state, NTEE category and tax-exempt type, or a list of EINs.
- ✅ **Form 990 financials** per year: revenue, expenses, assets, liabilities, net assets, contributions, program revenue, officer pay, salaries, with PDF links. Covers 990, 990-EZ and 990-PF.
- ✅ **Revenue filters** to find organizations of the right size.
- ✅ You pay per organization returned. Filtered-out organizations are free.

### Start in one minute

Click **Start** with the prefilled input:

```json
{
  "query": "food bank",
  "state": "CA",
  "maxResults": 20
}
```

You get: up to 20 California food banks with `name`, `einFormatted`, `address`, `taxExemptStatus`, `latestFiling` (revenue, expenses, assets, officer pay) and five years of `filings`.

**Cost:** up to $0.06: 20 organizations × $0.003, plus the $0.00005 actor-start fee.

### Use with an AI assistant

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client (`https://mcp.apify.com?tools=cprussin/nonprofit-990-explorer` loads only this actor), then paste:

```text
Use the Apify actor cprussin/nonprofit-990-explorer to find 501(c)(3) animal shelters in Texas with at least $1M in revenue, and list their EIN, city, latest revenue, expenses and officer compensation.
```

### Recipes

#### Grant prospecting: mid-size health charities in a state

501(c)(3) health organizations in Oregon with $1M–$20M revenue.

```json
{
  "state": "OR",
  "nteeCategory": "4",
  "subsection": "3",
  "minRevenue": 1000000,
  "maxRevenue": 20000000,
  "maxResults": 100
}
```

#### Due diligence by EIN

Profiles and ten years of 990 financials for a list of organizations.

```json
{
  "eins": ["53-0196605", "13-1623829", "56-2618866"],
  "maxFilings": 10
}
```

#### Fast list of every chamber of commerce in a state

Names, cities and categories only (no financials), which is quicker.

```json
{
  "query": "chamber of commerce",
  "state": "NY",
  "subsection": "6",
  "includeFinancials": false,
  "maxResults": 500
}
```

### Who uses nonprofit 990 data?

- **Fundraising and grant-prospecting teams** find foundations and peer charities by size, cause and location.
- **Sales teams selling to nonprofits** (software, payroll, insurance, consulting) build lead lists by budget and category.
- **KYB, compliance and payment providers** verify a charity's EIN, exempt status and deductibility.
- **Donors, journalists and researchers** compare revenue, expenses and executive pay across organizations and years.
- **Data teams** enrich CRMs with official EINs, NTEE codes and financials.

### How does the nonprofit explorer work?

1. Enter a search (name, keywords, state, category, tax-exempt type) and/or a list of EINs.
2. The actor pages through ProPublica's `/nonprofits/api/v2/search.json` results (up to 10,000 matches per search).
3. With financials on (the default), it fetches each organization's `/nonprofits/api/v2/organizations/{ein}.json` profile and its Form 990 history.
4. Revenue filters are applied and matching organizations are saved to the dataset, one item each.

The actor uses only the documented public API, sends a declared User-Agent, stays at about 4 requests per second and backs off on errors. It returns about 3–4 organizations per second with financials, and 100 per second without.

### How do I filter nonprofits?

| Field                       | Description                                                                                                                                                                    | Example          |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- |
| `query`                     | Name or keywords; quotes for exact phrases                                                                                                                                     | `"food bank"`    |
| `state`                     | Two-letter state code                                                                                                                                                          | `"CA"`           |
| `nteeCategory`              | NTEE major group: 1 Arts, 2 Education, 3 Environment/Animals, 4 Health, 5 Human Services, 6 International, 7 Public/Societal Benefit, 8 Religion, 9 Mutual Benefit, 10 Unknown | `"4"`            |
| `subsection`                | 501(c) type, e.g. `3` charities, `4` social welfare, `6` trade associations, `7` clubs                                                                                         | `"3"`            |
| `eins`                      | EINs to look up directly                                                                                                                                                       | `["53-0196605"]` |
| `includeFinancials`         | Fetch address and Form 990 history (default `true`)                                                                                                                            | `true`           |
| `maxFilings`                | Most recent 990 years to include                                                                                                                                               | `5`              |
| `minRevenue` / `maxRevenue` | Latest total revenue range in USD                                                                                                                                              | `1000000`        |
| `maxResults`                | Maximum organizations to return                                                                                                                                                | `50`             |

### What data do you get for each nonprofit?

One dataset item per organization:

```json
{
  "ein": "237111782",
  "einFormatted": "23-7111782",
  "name": "Yolo Food Bank",
  "careOfName": null,
  "address": "233 HARTER AVE",
  "city": "Woodland",
  "state": "CA",
  "zip": "95776-5917",
  "nteeCode": "K31Z",
  "nteeCategory": "Food, Agriculture & Nutrition",
  "subsectionCode": 3,
  "taxExemptStatus": "501(c)(3)",
  "deductibleDonations": true,
  "rulingDate": "1971-05-01",
  "revenueAmount": 20328084,
  "incomeAmount": 20430551,
  "assetAmount": 18624049,
  "latestFiling": {
    "taxYear": 2023,
    "taxPeriod": "2023-06",
    "formType": "990",
    "totalRevenue": 23338085,
    "totalExpenses": 23350748,
    "totalAssets": 19376488,
    "totalLiabilities": 8588506,
    "netAssets": 10787982,
    "contributions": 22785337,
    "programServiceRevenue": 277401,
    "investmentIncome": 177392,
    "officerCompensation": 103333,
    "otherSalaries": 2664449,
    "fundraisingExpenses": 0,
    "pdfUrl": "https://projects.propublica.org/nonprofits/download-filing?path=IRS%2F237111782_202306_990_2024040522345095.pdf"
  },
  "filings": ["… the latestFiling object, then earlier years …"],
  "otherFilingYears": [2024],
  "profileUrl": "https://projects.propublica.org/nonprofits/organizations/237111782",
  "dataUpdatedAt": "2026-10-21T13:29:46.613Z"
}
```

**Field notes**

- `latestFiling` is the newest Form 990 with extracted financials; `filings` lists up to `maxFilings` years, newest first. `otherFilingYears` are years with a filing PDF but no extracted numbers yet (often the most recent year).
- `revenueAmount`, `incomeAmount` and `assetAmount` come from the IRS Business Master File and can be newer than `latestFiling`.
- `officerCompensation` is the total paid to current officers, directors and key employees (990 Part IX line 5; `compofficers` on 990-PF). Per-person pay is in the PDF.
- For private foundations (990-PF), revenue and expenses are the book amounts and `netAssets` is the fund balance.
- Without `includeFinancials`, items carry name, city, state, NTEE code and exempt status only.

### How much does nonprofit data cost?

This actor is priced **per result** (pay-per-event):

| Event                                  | Price      |
| -------------------------------------- | ---------- |
| Organization (one item in the dataset) | **$0.003** |

For example, 1,000 organizations cost $3.00. Organizations skipped by revenue filters are free. If you set a **maximum cost per run**, the actor stops cleanly when it reaches that limit.

### Tips

- **Big lists:** a single search returns at most 10,000 matches; split by state or category to go further.
- **Exact names:** put the name in quotes, for example `"\"American Red Cross\""`.
- **Verification:** an EIN lookup that returns nothing means ProPublica has no record of it.
- Send results to Google Sheets, a CRM or a webhook through Apify integrations.

### Nonprofit 990 explorer FAQ

**Where does the data come from?** From the IRS (Form 990 e-file data and the Exempt Organizations Business Master File), via ProPublica's free Nonprofit Explorer API. `profileUrl` links to the organization's ProPublica page.

**How current is it?** ProPublica updates the master file monthly; new 990s appear as the IRS releases them, usually 6–18 months after the tax year ends.

**Does it include churches?** Churches are not required to file Form 990, so most appear with profile data but no financials.

**Can I use it through the API or with AI agents?** Yes. Call it through the Apify API, the MCP server or any Apify integration.

**Disclaimer:** This actor is not affiliated with ProPublica or the IRS. Data is provided as published by the IRS; check the original filing for decisions that matter.

### Related actors

- [SEC Form D Funding](https://apify.com/cprussin/sec-form-d-funding?fpr=to54nm): New SEC Form D filings: startup funding rounds and private placements from EDGAR.
- [Federal Recompete Radar](https://apify.com/cprussin/federal-recompete-radar?fpr=to54nm): US federal contracts nearing expiry, with incumbent and value, for recompete pipelines.

# Actor input Schema

## `query` (type: `string`):

Organization name or keywords, e.g. "food bank" or "hospital". Supports quotes for exact phrases. Leave empty to list by state or category only.

## `state` (type: `string`):

Only organizations in this US state.

## `nteeCategory` (type: `string`):

Only organizations in this NTEE major category.

## `subsection` (type: `string`):

Only organizations with this IRS subsection, e.g. 501(c)(3) charities.

## `eins` (type: `array`):

Look up these organizations directly by Employer Identification Number (e.g. 53-0196605). Combined with any search above.

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

Fetch each organization's profile: address, ruling date, revenue, expenses, assets, officer pay and filing history (one extra request per organization). Turn off for a fast name/city/category list.

## `maxFilings` (type: `integer`):

How many of the most recent Form 990 years with financial data to include in `filings`.

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

Only organizations whose latest reported total revenue is at least this much (needs financials).

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

Only organizations whose latest reported total revenue is at most this much (needs financials).

## `maxResults` (type: `integer`):

Maximum number of organizations to return. Each organization is billed as one event.

## Actor input object example

```json
{
  "query": "food bank",
  "state": "CA",
  "includeFinancials": true,
  "maxFilings": 5,
  "maxResults": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "query": "food bank",
    "state": "CA",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cprussin/nonprofit-990-explorer").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 = {
    "query": "food bank",
    "state": "CA",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cprussin/nonprofit-990-explorer").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "query": "food bank",
  "state": "CA",
  "maxResults": 20
}' |
apify call cprussin/nonprofit-990-explorer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cprussin/nonprofit-990-explorer"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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