# Nonprofit Search & IRS Form 990 Financials API (ProPublica) (`lathewright/nonprofit-990-lookup`) Actor

Returns US tax-exempt organizations (1.8M+) by name, state, cause or EIN, with IRS Form 990 financials per year (revenue, expenses, assets, officer pay, PDF links) from the ProPublica Nonprofit Explorer API. For fundraisers, grant makers and researchers.

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

## Pricing

from $4.00 / 1,000 organization founds

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 Search & IRS Form 990 Financials API (ProPublica)

Search US tax-exempt organizations and pull their IRS Form 990 financials, for fundraisers, grant makers, journalists, researchers and AI agents. It costs $0.004 per organization and $0.01 more when financials are included, so 100 organizations with financials cost $1.40.

Search 1.8 million US tax-exempt organizations by name, state, cause (NTEE) and 501(c) subsection, or look up EINs directly, and get each organization's IRS Form 990 financials for the years you need: total revenue, expenses, assets, liabilities, contributions, program revenue, officer compensation, net assets and a link to the filed PDF. Data is the IRS Business Master File and e-filed 990s, served through ProPublica's free Nonprofit Explorer API.

Built and maintained by **Lathewright**. Lathewright is operated by AI systems under human ownership. A person reviews and approves everything we publish, send and sell. **$0.004 per organization, $0.01 extra with financials.**

### Who uses it

- **Fundraisers and grant writers**: size up foundations and peer organizations (revenue, assets, grants paid) before applying or benchmarking.
- **Sales to nonprofits**: build lists of organizations by cause and state with budget data attached.
- **Journalists and researchers**: pull multi-year financial trends for a watchlist of EINs.
- **AI agents**: "How big is the Yolo Food Bank and what did it spend last year?" in one call.

### Example tasks

Paste any of these into the Input tab, or send the same JSON through the API. Prices are the per-result prices listed under Pricing.

#### 1. Food banks in Texas, no financials

```json
{
  "mode": "search",
  "query": "food bank",
  "state": "TX",
  "includeFinancials": false,
  "maxResults": 25
}
```

What comes back: One row per organization with `name`, `ein`, `city`, `state`, `nteeCode`, `latestRevenue` and `propublicaUrl`. Up to 25 rows, at most $0.10.

#### 2. Three years of financials for one EIN

```json
{
  "mode": "lookup",
  "eins": ["13-1644147"],
  "includeFinancials": true,
  "filingYears": 3
}
```

What comes back: The organization row with a `filings` list of up to three years. $0.004 plus $0.01.

#### 3. Texas animal rescues that are 501(c)(3) charities

```json
{
  "mode": "search",
  "query": "animal rescue",
  "state": "TX",
  "subsectionCode": 3,
  "includeFinancials": true,
  "filingYears": 2,
  "maxResults": 10
}
```

What comes back: Up to 10 organizations, each with two years of filings.

### Input

| Field | Type | Notes |
|---|---|---|
| `mode` | `search` or `lookup` | |
| `query` | string | Name or keyword (search mode) |
| `state` | string | Two-letter state code |
| `nteeCategory` | 1 to 10 | 1 Arts, 2 Education, 3 Environment/Animals, 4 Health, 5 Human Services, 6 International, 7 Public Benefit, 8 Religion, 9 Mutual Benefit, 10 Unknown |
| `subsectionCode` | integer | 3 = 501(c)(3), 4 = 501(c)(4), 6 = 501(c)(6)… |
| `eins` | array | EINs for lookup mode |
| `includeFinancials` | boolean | Add Form 990 data (default true) |
| `filingYears` | integer | Recent filings per organization (default 3) |
| `maxResults` | integer | Cap on organizations |

```json
{ "mode": "search", "query": "food bank", "state": "CA", "nteeCategory": 5, "subsectionCode": 3, "includeFinancials": true, "filingYears": 3, "maxResults": 100 }
```

### Output

```json
{
  "ein": "23-7111782",
  "name": "Yolo Food Bank",
  "city": "Woodland",
  "state": "CA",
  "zip": "95776-0000",
  "nteeCode": "K31Z",
  "subsectionCode": 3,
  "rulingDate": "1971-06-01",
  "latestTaxPeriod": "2023-06",
  "latestRevenue": 23338085,
  "latestExpenses": 23350748,
  "latestAssets": 19376488,
  "latestLiabilities": 8588506,
  "filings": [
    {
      "taxPeriod": "2023-06", "taxYear": 2023, "formType": "990",
      "totalRevenue": 23338085, "totalExpenses": 23350748, "totalAssetsEnd": 19376488, "totalLiabilitiesEnd": 8588506,
      "contributionsAndGrants": 22785337, "programServiceRevenue": 277401, "investmentIncome": 177392,
      "officerCompensation": 103333, "otherSalaries": 2664449, "netAssetsEnd": 10787982,
      "pdfUrl": "https://projects.propublica.org/nonprofits/download-filing?path=IRS%2F237111782_202306_990_2024040522345095.pdf"
    }
  ],
  "propublicaUrl": "https://projects.propublica.org/nonprofits/organizations/237111782"
}
```

### Pricing

| Event | Price | Notes |
|---|---|---|
| Organization found (`organization`) | $0.004 | Primary event |
| Form 990 financials added (`organization-financials`) | $0.01 | Only with `includeFinancials` and when filings exist |

Plus Apify's start fee ($0.00005). 100 organizations with financials = $1.40.

### How to use it

- **Console**: fill in the form, Start, export CSV/JSON/Excel.
- **API**: `POST https://api.apify.com/v2/acts/lathewright~nonprofit-990-lookup/run-sync-get-dataset-items?token=<token>`
- **n8n / Make / Zapier**: Apify node → enrich a sheet of EINs or build prospect lists by cause and state.

### Use from an AI agent (MCP)

Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client with `https://mcp.apify.com/?tools=lathewright/nonprofit-990-lookup`. The Actor description is the tool description, and the input fields above are the tool parameters. Example prompts: "Find 501(c)(3) animal rescues in Texas with revenue over $1M", "Pull three years of financials for EIN 13-1644147".

### Data source and fair use

IRS Exempt Organizations Business Master File and Form 990 e-file extracts, served by ProPublica's Nonprofit Explorer API (free, no key). The Actor sends at most two to three requests per second. Officer names and "care of" names are deliberately not included; only organization-level data is returned. Form 990s are public records by law.

### FAQ

**Why are financials missing for some organizations?** Small organizations file the 990-N postcard (no financial data), churches do not file, and new filings take months to be processed.

**What is the difference between `latestRevenue` and `filings[0].totalRevenue`?** They are the same number; the `latest*` fields exist so flat CSV exports and agents can read them without digging into the array.

# Actor input Schema

## `mode` (type: `string`):

`search` finds organizations by name/keyword with filters; `lookup` fetches specific EINs.

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

Organization name or keyword, e.g. `food bank`, `animal rescue`, `community foundation`.

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

Two-letter US state code, e.g. `CA`. Empty = all states.

## `nteeCategory` (type: `integer`):

1 Arts/Culture/Humanities, 2 Education, 3 Environment/Animals, 4 Health, 5 Human Services, 6 International, 7 Public/Societal Benefit, 8 Religion, 9 Mutual/Membership Benefit, 10 Unknown. Empty = all.

## `subsectionCode` (type: `integer`):

3 for 501(c)(3) charities, 4 for 501(c)(4), 6 for 501(c)(6) business leagues, etc. Empty = all.

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

Employer Identification Numbers for `lookup`, with or without the dash, e.g. `13-1644147`.

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

Fetch each organization's record with its filed Form 990 data (revenue, expenses, assets, liabilities, contributions, officer compensation, PDFs). Billed per organization (see pricing).

## `filingYears` (type: `integer`):

How many most recent filings with data to include per organization.

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

Cap on organizations returned. Each is one billable event (two with financials).

## `compactOutput` (type: `boolean`):

Return only the key fields (smaller, cheaper for AI agents to read).

## Actor input object example

```json
{
  "mode": "search",
  "query": "food bank",
  "includeFinancials": true,
  "filingYears": 3,
  "maxResults": 25,
  "compactOutput": false
}
```

# Actor output Schema

## `organizations` (type: `string`):

One row per organization.

# 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"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lathewright/nonprofit-990-lookup").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" }

# Run the Actor and wait for it to finish
run = client.actor("lathewright/nonprofit-990-lookup").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"
}' |
apify call lathewright/nonprofit-990-lookup --silent --output-dataset

```

## MCP server setup

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

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/9YabNqh1arqZiNanf/builds/eZKZRdfe03bp8PAwa/openapi.json
