# IRS 990 Nonprofit Search (`maximedupre/irs-nonprofit-search`) Actor

Search US tax-exempt organizations by name, keyword, or EIN. Get IRS class details, filing history, financials, assessments, and links to available Form 990 PDFs.

- **URL**: https://apify.com/maximedupre/irs-nonprofit-search.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (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

$0.90 / 1,000 nonprofits

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

### 🔎 Find IRS nonprofit facts in one run

IRS Nonprofit Search helps grant teams, donors, researchers, and analysts find US tax-exempt organizations. Search by name or keyword, or run an EIN lookup. Each saved nonprofit can include IRS class details, Form 990 financials and filing history, a financial assessment, and direct links to available source PDFs.

- **[EIN Lookup](https://apify.com/maximedupre/irs-nonprofit-search/examples/ein-lookup)** — Find a nonprofit by its nine-digit EIN.
- **[501(c)(3) Lookup](https://apify.com/maximedupre/irs-nonprofit-search/examples/501c3-lookup)** — Find 501(c)(3) organizations and check their IRS class details.
- **[IRS 990 Search](https://apify.com/maximedupre/irs-nonprofit-search/examples/irs-990-search)** — Search for nonprofits and review available Form 990 facts.
- **[IRS Tax-Exempt Organization Search](https://apify.com/maximedupre/irs-nonprofit-search/examples/irs-tax-exempt-organization-search)** — Find tax-exempt organizations by name or keyword.
- **[Nonprofit Financial Research](https://apify.com/maximedupre/irs-nonprofit-search/examples/nonprofit-financial-research)** — Review revenue, expenses, assets, and other available filing facts.
- **[Nonprofit Filing History Lookup](https://apify.com/maximedupre/irs-nonprofit-search/examples/nonprofit-filing-history-lookup)** — Check available filing periods and open source-hosted Form 990 PDFs.

#### 📦 What data is returned?

The Actor saves one dataset row for each nonprofit found or looked up. A row includes:

- EIN, organization name, city, and state
- NTEE code, 501(c) subsection, exemption status, and foundation code
- available latest-filing revenue, expenses, assets, liabilities, net assets, contributions, program revenue, and compensation
- available Form 990 history with tax periods, form types, filing dates, and direct PDF links
- financial health, size, revenue trend, data completeness, and risk indicators based on available filings
- current IRS recognition, ruling date, and source record date when given

Some values may be `null` when the public source does not provide them. The Actor links to available source PDFs; it does not download or store the files.

#### ▶️ How do I run the Actor?

1. Open the Actor in Apify Console.
2. Set `target` to `search` or `einLookup`.
3. Add a name or keyword for a search, or add one or more EINs for a lookup.
4. For a search, you may add filters and set `maxResults`.
5. Click **Start** and open the default dataset when the run ends.

#### ⌨️ Input

For a search, use `query`. You can filter by two-letter US state codes, NTEE codes, 501(c) subsection numbers, and IRS exemption status codes. `maxResults` can be from 1 to 500. For direct lookup, use `eins`; dashes are optional.

```json
{
  "target": "search",
  "query": "community food bank",
  "states": ["CA"],
  "subsections": ["3"],
  "maxResults": 25
}
````

Options for the other target are ignored. If the same nonprofit is found more than once, only its first eligible match is saved.

#### 📤 Output

Results are saved in the default dataset. You can open the overview table or export the rows in formats such as JSON, CSV, or Excel. Each row follows the public dataset schema, with nested `classification`, `latestFiling`, `filingHistory`, `assessment`, and `irsRecord` fields.

#### 💳 Pricing

This Actor uses pay-per-event pricing. You pay for each nonprofit that is successfully saved to the dataset. Check the Pricing tab on the Actor page for the current event price.

#### 🔌 Integrations

Use Apify API calls to start runs and read dataset rows, or export the dataset for your own tools. This video shows how to connect Apify Actors with other apps:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Is this the official IRS Tax Exempt Organization Search?

No. This is an Apify Actor, not an IRS website. It returns public IRS class, filing, and financial facts in a dataset.

##### Can I look up several EINs in one run?

Yes. Choose `einLookup` and add one or more valid nine-digit EINs. Dashes are optional.

##### Why are some financial fields null?

A public filing may be missing, old, or may not include that value. Check `filingHistory`, `assessment.dataCompleteness`, and the source dates before making a decision.

##### Does a PDF link mean the filing is stored by the Actor?

No. When available, `pdfUrl` opens the source-hosted Form 990 PDF. The Actor does not store the PDF.

##### Can I filter a search before saving rows?

Yes. You can filter by state, NTEE code, 501(c) subsection, and exemption status. These filters apply only to the search target.

##### Is the financial assessment professional advice?

No. It is a plain summary based on available filing data. Review the filings and current IRS facts for your own decision.

##### What happens when the same nonprofit matches more than once?

The first eligible match is saved. Later matches for the same nonprofit are ignored.

### 📝 Changelog

- 0.0: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~irs-nonprofit-search/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [IRS 990 Scraper - Nonprofit & Charity Verification](https://apify.com/pink_comic/irs-990-nonprofit-search) — Search nonprofit filings for charity checks and grant research.
- [Nonprofit Explorer - IRS 990 Tax-Exempt Org Search](https://apify.com/ryanclinton/nonprofit-explorer) — Explore tax-exempt organizations and their filing financials.
- [ProPublica Nonprofit Crawler - IRS 990 & Tax-Exempt Org Data](https://apify.com/jungle_synthesizer/propublica-nonprofit-crawler) — Crawl ProPublica nonprofit and filing data.
- [IRS Exempt Organizations — 1.5M+ Nonprofit Search](https://apify.com/commonelements/irs-exempt-organizations) — Search IRS Business Master File organization facts.
- [ProPublica Nonprofit Explorer - Tax Data](https://apify.com/lulzasaur/propublica-nonprofit-scraper) — Search nonprofit tax and financial data from ProPublica.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose how to find nonprofits.

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

Enter a nonprofit name or keyword. Used only when you search organizations.

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

Enter two-letter US state codes to keep, such as NY or CA. Leave this empty to search all states. Used only when you search organizations.

## `nteeCodes` (type: `array`):

Enter NTEE codes to keep, such as P20. Leave this empty to include all NTEE classes. Used only when you search organizations.

## `subsections` (type: `array`):

Enter subsection numbers to keep, such as 3 or 4. Leave this empty to include all subsections. Used only when you search organizations.

## `exemptionStatuses` (type: `array`):

Enter IRS exemption status codes to keep. Leave this empty to include every status. Used only when you search organizations.

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

Set the most matching organizations to return. Used only when you search organizations.

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

Enter one or more nine-digit EINs. Dashes are optional. Used only when you look up EINs.

## `__isDebug` (type: `boolean`):

Internal debug setting.

## `__concurrency` (type: `integer`):

Internal concurrency setting.

## Actor input object example

```json
{
  "target": "search",
  "query": "American Red Cross",
  "states": [
    "DC"
  ],
  "nteeCodes": [
    "P21"
  ],
  "subsections": [
    "3"
  ],
  "exemptionStatuses": [
    "1"
  ],
  "maxResults": 1
}
```

# Actor output Schema

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

Open the nonprofit rows in the default dataset.

# 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 = {
    "target": "search",
    "query": "American Red Cross",
    "states": [
        "DC"
    ],
    "nteeCodes": [
        "P21"
    ],
    "subsections": [
        "3"
    ],
    "exemptionStatuses": [
        "1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/irs-nonprofit-search").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 = {
    "target": "search",
    "query": "American Red Cross",
    "states": ["DC"],
    "nteeCodes": ["P21"],
    "subsections": ["3"],
    "exemptionStatuses": ["1"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/irs-nonprofit-search").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 '{
  "target": "search",
  "query": "American Red Cross",
  "states": [
    "DC"
  ],
  "nteeCodes": [
    "P21"
  ],
  "subsections": [
    "3"
  ],
  "exemptionStatuses": [
    "1"
  ]
}' |
apify call maximedupre/irs-nonprofit-search --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "IRS 990 Nonprofit Search",
        "description": "Search US tax-exempt organizations by name, keyword, or EIN. Get IRS class details, filing history, financials, assessments, and links to available Form 990 PDFs.",
        "version": "0.0",
        "x-build-id": "OjtFkWZoeFQ71539h"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~irs-nonprofit-search/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-irs-nonprofit-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~irs-nonprofit-search/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-irs-nonprofit-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~irs-nonprofit-search/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-irs-nonprofit-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "target"
                ],
                "properties": {
                    "target": {
                        "title": "Target",
                        "enum": [
                            "search",
                            "einLookup"
                        ],
                        "type": "string",
                        "description": "Choose how to find nonprofits."
                    },
                    "query": {
                        "title": "Name or keyword",
                        "type": "string",
                        "description": "Enter a nonprofit name or keyword. Used only when you search organizations."
                    },
                    "states": {
                        "title": "US states",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Enter two-letter US state codes to keep, such as NY or CA. Leave this empty to search all states. Used only when you search organizations.",
                        "items": {
                            "type": "string",
                            "pattern": "^[A-Za-z]{2}$"
                        }
                    },
                    "nteeCodes": {
                        "title": "NTEE codes",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Enter NTEE codes to keep, such as P20. Leave this empty to include all NTEE classes. Used only when you search organizations.",
                        "items": {
                            "type": "string",
                            "pattern": "^[A-Za-z][0-9]{2}$"
                        }
                    },
                    "subsections": {
                        "title": "501(c) subsections",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Enter subsection numbers to keep, such as 3 or 4. Leave this empty to include all subsections. Used only when you search organizations.",
                        "items": {
                            "type": "string",
                            "pattern": "^[0-9]{1,2}$"
                        }
                    },
                    "exemptionStatuses": {
                        "title": "Exemption statuses",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Enter IRS exemption status codes to keep. Leave this empty to include every status. Used only when you search organizations.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Set the most matching organizations to return. Used only when you search organizations.",
                        "default": 1
                    },
                    "eins": {
                        "title": "EINs",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Enter one or more nine-digit EINs. Dashes are optional. Used only when you look up EINs.",
                        "items": {
                            "type": "string",
                            "pattern": "^[0-9]{2}-?[0-9]{7}$"
                        }
                    },
                    "__isDebug": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Internal debug setting."
                    },
                    "__concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Internal concurrency setting."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
