# Nonprofit Leads from IRS 990 Filings (Officers, Phone, Website) (`intenal_builds/irs-990-nonprofit-leads`) Actor

Nonprofit and private foundation leads straight from the newest IRS Form 990 e-file releases: phone, website, address, signing officer, officers with titles and pay, mission, revenue, assets, staff count and the CPA firm that prepared the return. Filter by state, size, keywords. No API key.

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

## Pricing

from $3.00 / 1,000 nonprofit leads

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 Leads from IRS 990 Filings (Officers, Phone, Website)

Get **nonprofit and private foundation leads** straight from the official **IRS Form 990 e-file data**: organization phone, website, address, the officer who signed the return, officers and key employees with titles and pay, mission, revenue, assets, staff count, and the **CPA firm that prepared the return**. Newest IRS releases first. No API key, no login, no proxies.

The IRS publishes every e-filed Form 990, 990-EZ and 990-PF as XML in large monthly ZIP releases (the August 2026 release alone is 315 MB with 50,349 returns; the 2026 index lists 436,239 returns so far). This actor reads those files directly with HTTP range requests, filters them, and gives you one clean row per organization.

### What you get per organization

- EIN, legal name, form type (990 / 990-EZ / 990-PF), tax year, e-file timestamp, exempt status (501(c)(3), (c)(4), (c)(6), private foundation...)
- Address, **phone**, **website** (N/A and NONE are cleaned out)
- **Signing officer** name, title and phone; principal officer
- **Officers, directors, trustees and key employees** with title, hours per week and compensation (highest paid first), plus highest-paid person and amount
- Mission / primary exempt purpose, year formed, state of domicile
- Total revenue, expenses, contributions received, program revenue, grants paid, salaries, total and net assets, foundation fair-market-value assets
- Employee and volunteer counts, audited-financials flag
- **Paid preparer firm** (the CPA/accounting firm) and its city/state
- Link to the ProPublica Nonprofit Explorer page

In a test run on the newest release (1,000 organizations, no filters), 922 had a phone, 470 a real website and 879 a named preparer firm.

### Who uses it

- **Nonprofit software sales** (donor CRM, fundraising, accounting, payroll, volunteer tools): target by size, staff and state
- **CPA and audit firms**: find organizations near audit thresholds and see who prepares their return today
- **Insurance, banking, benefits and 403(b) advisors**: organizations with paid staff and real budgets
- **Grant seekers and consultants**: private foundations (990-PF) with assets, grants paid and trustees
- **Researchers and journalists**: executive pay and finances by sector or region

### Filters

IRS batches to read (1 to 12, newest first), form types, states, cities, ZIP prefixes, 501(c)(3) only, keywords in name or mission (e.g. `school`, `food bank`, `animal`, `church`, `housing`), exclude keywords, min/max revenue, min/max assets, min employees, phone required, website required, paid staff required, specific EINs, officer list on/off and cap.

### Example input

```json
{
  "batchesBack": 2,
  "returnTypes": ["990"],
  "states": ["TX"],
  "only501c3": true,
  "minRevenue": 500000,
  "requireWebsite": true,
  "requirePaidStaff": true,
  "maxResults": 500
}
```

### Example output (trimmed)

```json
{
  "ein": "131740069",
  "organizationName": "SPCA OF WESTCHESTER INC",
  "returnType": "990",
  "taxYear": 2025,
  "subsection": "501(c)(3)",
  "city": "BRIARCLIFF MANOR",
  "state": "NY",
  "phone": "(914) 941-2896",
  "website": "https://www.spcawestchester.org",
  "signingOfficerName": "DEBORAH KLUGMAN",
  "signingOfficerTitle": "CHAIRMAN/PRESIDENT",
  "highestPaidTitle": "CEO",
  "highestCompensation": 184316,
  "totalRevenue": 6262496,
  "totalAssets": 24409610,
  "employeeCount": 84,
  "preparerFirm": "VARGAS & RIVERA CPA'S LLP",
  "officers": [{"name": "SHANNON LAUKHUF", "title": "CEO", "hoursPerWeek": 40, "compensation": 184316}]
}
```

### Pricing

Pay per organization returned. Set **Max results** (or a max charge) to cap spend. Duplicate EINs are removed, so each organization is billed once per run.

### Data source and notes

- Source: IRS Form 990 Series Downloads (apps.irs.gov/pub/epostcard/990/xml), public e-file data released by the IRS about monthly. Only e-filed returns are included; paper returns are not.
- Each row comes from the newest return found for that EIN in the selected batches. Financial figures are as filed for that tax year.
- Officer home addresses and individual grant recipients (for example scholarship students) are deliberately left out.
- Requests are throttled to about 1 per second, back off on 429/5xx, and send a declared User-Agent.
- Use the data in line with applicable laws (TCPA, CAN-SPAM, state rules) and honor opt-outs. Not affiliated with the IRS or ProPublica.

### More from Intenal_Builds

- [SAM.gov Federal Contract Opportunities Tracker](https://apify.com/intenal_builds/federal-contract-opportunities-tracker)
- [USASpending Federal Awards Tracker](https://apify.com/intenal_builds/usaspending-federal-awards-tracker)
- [SEC Form D Funding Tracker](https://apify.com/intenal_builds/sec-form-d-funding-tracker)
- [US Federal Lobbying Disclosure Tracker](https://apify.com/intenal_builds/federal-lobbying-disclosure-tracker)

# Actor input Schema

## `batchesBack` (type: `integer`):

How many of the newest IRS Form 990 e-file releases to read (newest first). Each batch holds roughly 30,000 to 170,000 returns. 1 = newest release only.

## `returnTypes` (type: `array`):

990 = larger nonprofits (officers with pay, staff, mission), 990EZ = small nonprofits, 990PF = private foundations (grantmakers). Empty = all three.

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

Two-letter state codes of the organization's filing address, e.g. TX, CA. Empty = all.

## `cities` (type: `array`):

Exact city names (case-insensitive). Empty = all.

## `zipPrefixes` (type: `array`):

Keep organizations whose ZIP starts with any of these, e.g. 770 or 10001.

## `only501c3` (type: `boolean`):

Drop 501(c)(4), (6), (7), (19) and other non-charity exempt organizations.

## `keywords` (type: `array`):

Keep organizations whose name or mission contains any keyword, e.g. school, church, hospital, food bank, animal, housing, arts.

## `excludeKeywords` (type: `array`):

Drop organizations whose name or mission contains any of these, e.g. booster, alumni.

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

Minimum total revenue on the return.

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

Maximum total revenue on the return.

## `minAssets` (type: `integer`):

Minimum end-of-year total assets (book value).

## `maxAssets` (type: `integer`):

Maximum end-of-year total assets.

## `minEmployees` (type: `integer`):

Minimum W-2 employee count (Form 990 only reports this).

## `requirePhone` (type: `boolean`):

Skip returns without an organization phone number.

## `requireWebsite` (type: `boolean`):

Skip returns without a real website (N/A and NONE are ignored).

## `requirePaidStaff` (type: `boolean`):

Keep organizations that report at least one compensated officer, director or key employee.

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

Only these EINs (9 digits, dashes OK). Empty = all.

## `includeOfficers` (type: `boolean`):

Add officers, directors, trustees and key employees with title, hours and compensation.

## `maxOfficers` (type: `integer`):

Cap the officer list (large hospitals list hundreds).

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

Stop after this many organizations (you pay per organization).

## Actor input object example

```json
{
  "batchesBack": 1,
  "returnTypes": [
    "990",
    "990EZ",
    "990PF"
  ],
  "states": [
    "TX"
  ],
  "only501c3": false,
  "requirePhone": false,
  "requireWebsite": false,
  "requirePaidStaff": false,
  "includeOfficers": true,
  "maxOfficers": 10,
  "maxResults": 100
}
```

# Actor output Schema

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

One item per nonprofit or private foundation.

# 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 = {
    "batchesBack": 1,
    "states": [
        "TX"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("intenal_builds/irs-990-nonprofit-leads").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 = {
    "batchesBack": 1,
    "states": ["TX"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("intenal_builds/irs-990-nonprofit-leads").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 '{
  "batchesBack": 1,
  "states": [
    "TX"
  ],
  "maxResults": 100
}' |
apify call intenal_builds/irs-990-nonprofit-leads --silent --output-dataset

```

## MCP server setup

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

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/rc9nGeQSpv4wk6QUj/builds/5GZX4HCsyBcGahxyf/openapi.json
