# US Nonprofit Data — EIN, Revenue & Form 990 Financials (`foxlabs/us-nonprofit-data`) Actor

Look up US nonprofits and charities by name, EIN or state. Returns EIN, legal name, NTEE classification, 501(c) subsection, address, and the revenue, expenses and total assets filed on their most recent Form 990.

- **URL**: https://apify.com/foxlabs/us-nonprofit-data.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 company records

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

## US Nonprofit Data — EIN, Revenue & Form 990 Financials 💙

**foXLabs nonprofit & funding series:** [UK charities](https://apify.com/foxlabs/uk-charity-data) · [Canadian charities](https://apify.com/foxlabs/ca-charity-data) · [NIH grants](https://apify.com/foxlabs/nih-reporter-organization-data) · [NSF awards](https://apify.com/foxlabs/nsf-awards-company-data) · [Research organizations (ROR)](https://apify.com/foxlabs/ror-research-organization-data)

🎉 Look up any US nonprofit by **name or EIN** and get its IRS identity plus the **Form 990 financials** — revenue, expenses, assets and liabilities — as clean rows. No key, no login.
Built for nonprofit-sector sales, grant researchers, and anyone sizing an organization before they approach it.

### 🔍 What is this Actor — and when should you use it?

Every US tax-exempt organization files a Form 990, and those filings are public. This Actor searches the IRS exempt-organization record (through ProPublica's Nonprofit Explorer) by **name or EIN** and returns one row per organization: legal identity, 501(c) subsection, full address, ruling year, how many filings exist — and the headline financials from the most recent filing.

**Use it when you need:** to qualify a nonprofit by budget size before a sales call; a list of organizations in one state; the EIN for a grant application or a CRM record; or the revenue and asset base behind a foundation.

**Use something else when:** the charity is not American — use [UK charities](https://apify.com/foxlabs/uk-charity-data) or [Canadian charities](https://apify.com/foxlabs/ca-charity-data). For research funding rather than organizational finances, use the [NIH](https://apify.com/foxlabs/nih-reporter-organization-data) and [NSF](https://apify.com/foxlabs/nsf-awards-company-data) Actors.

### 🤖 Use with AI agents

**Already on the Apify MCP server?** Ask for this Actor by name: `foxlabs/us-nonprofit-data`.

**Your agent can pay for its own runs.** This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over **x402 (USDC on Base)** or **Skyfire** — no Apify account or API token of its own. Billing is the same either way: per delivered organization row.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```
Run the Apify actor foxlabs/us-nonprofit-data with
{"queries":["American Red Cross","530196605"],"maxResultsPerQuery":10}
and tell me their revenue and total assets.
```

### 📋 Overview

| | |
|---|---|
| **Source** | IRS Form 990 via ProPublica Nonprofit Explorer |
| **Coverage** | US tax-exempt organizations (501(c) filers) |
| **Auth needed** | None. No API key, no login, no proxy required |
| **Row** | One nonprofit organization |
| **Measured run** | 15 rows in 3.3 s for 3 queries (2026-09-20, build 0.1.8) |
| **Pricing** | $0.004 per delivered row — $4 per 1,000 |

### ✨ Features

- 🔎 **Name or EIN** in the same field — mixed lists work
- 💵 **Form 990 financials** — revenue, expenses, total assets, total liabilities
- 🏷️ **501(c) subsection** rendered the way people write it (`501(c)(3)`)
- 📮 **Full address** with city, state and ZIP on every row
- 📅 **Ruling year** and **filing count** — how long the organization has been exempt and how deep its history goes
- 🗺️ **State filter** for building regional lists
- ⚡ **Key-free and fast** — 15 rows in about 3 seconds, no proxy

### 🎬 Quick Start

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~us-nonprofit-data/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["American Red Cross","Khan Academy","530196605"],"maxResultsPerQuery":10}'
```

### 🚀 Getting Started (3 steps)

1. **Put names or EINs into `queries`.** Both forms work; the default run mixes them.
2. **Add a state if you want a regional list.** `state` takes a two-letter code.
3. **Run it.** Rows arrive in the dataset; export to CSV/JSON/Excel or read them over the API.

### 📥 Input

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | `["American Red Cross","Khan Academy","530196605"]` | Nonprofit names or 9-digit EINs |
| `state` | string | `""` (all) | Two-letter state code to restrict results |
| `maxResultsPerQuery` | integer | `10` | Cap on organizations returned per query |
| `maxConcurrency` | integer | `4` | Parallel requests |
| `requestDelayMs` | integer | `0` | Optional pause between requests |
| `includeRaw` | boolean | `false` | Attach the untouched source record to each row |
| `proxyConfiguration` | object | proxy off | The source answers direct requests; enable only if you need it |

**Example — exact lookup by EIN:**

```json
{ "queries": ["530196605", "141683211"], "maxResultsPerQuery": 1 }
```

**Example — regional list:**

```json
{ "queries": ["food bank"], "state": "TX", "maxResultsPerQuery": 50 }
```

### 📤 Output

One row per organization. Fill rates below are from the measured run (15 rows, 3 queries, 2026-09-20):

| Field | Type | Fill | Description |
|---|---|---|---|
| `companyName` | string | 100% | Organization name as filed |
| `registrationNumber` | string | 100% | EIN, formatted `53-0196605` |
| `legalForm` | string | 100% | 501(c) subsection, e.g. `501(c)(3)` |
| `status` | string | 100% | Exempt status |
| `address` | string | 100% | Full address line |
| `city` / `state` / `postalCode` | string | 100% | Location |
| `countryName` | string | 100% | Always `United States` |
| `rulingYear` | number | 100% | Year the IRS granted exemption |
| `filingCount` | number | 100% | Number of Form 990 filings on record |
| `revenue` | number | 80% | Total revenue from the most recent filing |
| `totalAssets` | number | 80% | Total assets from the most recent filing |
| `industryCode` | string | 80% | NTEE classification code |
| `expenses` | number | 53% | Total expenses, where the filing reports them |
| `totalLiabilities` | number | 53% | Total liabilities, where reported |
| `fiscalYear` | number | 53% | Fiscal year of the financials |
| `formType` | string | 53% | Which 990 variant was filed (990, 990-EZ, 990-PF) |
| `careOfName` | string | 53% | "Care of" contact name on the filing, where present |
| `sourceUrl` | string | 100% | Nonprofit Explorer page for the organization |
| `country` / `registry` / `query` / `scrapedAt` | string | 100% | Provenance fields |
| `industry` | string | **0%** | The source publishes a numeric NTEE code but no industry label — use `industryCode`; this column stayed empty on every measured row |

**Why the financial fields are not at 100%:** small organizations file the short 990-EZ or 990-N, which carry fewer figures, and the newest filings are sometimes indexed before their financial detail lands. `filingCount` tells you how much history exists for an organization.

Columns the source does not publish at all (tax number, incorporation and dissolution dates, headcount, capital, website, e-mail, phone, officers) were removed rather than shipped permanently empty.

**A real row from the default run:**

```json
{
  "companyName": "American National Red Cross",
  "registrationNumber": "53-0196605",
  "legalForm": "501(c)(3)",
  "address": "431 18TH ST NW, Washington, DC, 20006-5310",
  "city": "Washington",
  "state": "DC",
  "postalCode": "20006-5310",
  "industryCode": "P210",
  "revenue": 3217077611,
  "totalAssets": 4028321133,
  "sourceUrl": "https://projects.propublica.org/nonprofits/organizations/530196605"
}
```

### 💼 Use cases

- **Qualify before you call** — revenue and assets tell you whether an organization can afford your product
- **Territory lists** — filter by state to build a regional nonprofit prospect list
- **Grant research** — profile foundations by asset base before applying
- **CRM enrichment** — attach EIN, subsection and address to existing nonprofit records
- **Sector analysis** — group organizations by NTEE code and compare revenue bands

### 🔗 Integration

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/us-nonprofit-data').call({
  queries: ['American Red Cross'], maxResultsPerQuery: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("foxlabs/us-nonprofit-data").call(
    run_input={"queries": ["American Red Cross"], "maxResultsPerQuery": 10}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**No-code:** Make, n8n and Zapier reach this Actor through the Apify app — schedule it and push nonprofits into a CRM or a sheet.

### 📊 Pricing

Pay-per-event: **`company-record` — $0.004 per delivered row ($4 per 1,000)**. Compute and traffic are included; you pay for rows, not run time. Rows without an organization name are not charged.

[View current pricing.](https://apify.com/foxlabs/us-nonprofit-data)

### ❓ FAQ

**Do I need an API key?** No. The IRS exempt-organization record is public and this Actor needs no key, login or proxy.

**Can I look up by EIN?** Yes — put the 9-digit EIN in `queries`, with or without the dash.

**How current are the financials?** They come from the most recent Form 990 on record. Nonprofits file annually and the IRS publishes with a lag, so the newest year is usually one to two years behind.

**Why does an organization show no revenue?** It most likely filed a 990-EZ or 990-N, which carry less financial detail. `filingCount` shows how many filings exist.

**Does it include officer compensation?** No. This Actor returns organization-level identity and headline financials, not the schedules.

**Can I get every nonprofit in a state?** Search a broad term with `state` set and raise `maxResultsPerQuery`; the source paginates search results rather than dumping the full register.

### 🐛 Troubleshooting

**A name returns the wrong organization.** Nonprofits often share names across states. Search the EIN for an exact match, or add `state`.

**Fewer rows than expected.** `maxResultsPerQuery` caps per query — raise it, or split queries across runs.

**Financial fields are empty for small charities.** Expected: the short filing forms do not carry those figures. Use `filingCount` and `rulingYear` to judge organization maturity instead.

### ⚠️ Trademark

The IRS is a US federal agency and ProPublica's Nonprofit Explorer is an independent journalism project. This Actor is not affiliated with or endorsed by either, and reads only publicly published exempt-organization filings.

### ⚖️ Is it legal to scrape this data?

Form 990 filings are public by law — Congress made them disclosable precisely so donors and the public can see how tax-exempt organizations use their money. The rows this Actor returns are organizational records and financial totals, not personal data. You remain responsible for how you use the output.

### 🤝 Support & contact

Questions, a field you need, or a bug: **info@foxlabs.com.tr** — or open an issue on the Actor's Apify page.

### Changelog

#### 0.1.8

- **Removed permanently-empty columns** (tax number, status detail, incorporation and dissolution dates, headcount, capital, website, e-mail, phone, officers) — the source does not publish them. Row went from 35 columns to 25.

#### 0.1

- IRS exempt-organization search by name or EIN, enriched with the most recent Form 990 filing.
- Pay-per-event billing on delivered rows (`company-record`).

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/us-nonprofit-data/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Organization names (`American Red Cross`, `Khan Academy`) or 9-digit EINs (`530196605`). EINs are exact lookups.

## `maxResultsPerQuery` (type: `integer`):

How many rows a single query may produce.

## `maxConcurrency` (type: `integer`):

How many queries to run at the same time. Lower it if the source throttles you.

## `includeRaw` (type: `boolean`):

Attach the source's untouched response under `raw`. Useful when you need a field this actor does not map.

## `requestDelayMs` (type: `integer`):

Politeness delay against a public source. Raise it for large runs.

## `proxyConfiguration` (type: `object`):

Optional. The ProPublica API is open and rarely needs a proxy.

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

Two-letter state code (`NY`, `CA`). Leave empty to search nationally.

## Actor input object example

```json
{
  "queries": [
    "American Red Cross",
    "Khan Academy",
    "530196605"
  ],
  "maxResultsPerQuery": 10,
  "maxConcurrency": 4,
  "includeRaw": false,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "state": ""
}
```

# Actor output Schema

## `dataset` (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 = {
    "queries": [
        "American Red Cross",
        "Khan Academy",
        "530196605"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/us-nonprofit-data").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 = { "queries": [
        "American Red Cross",
        "Khan Academy",
        "530196605",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/us-nonprofit-data").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 '{
  "queries": [
    "American Red Cross",
    "Khan Academy",
    "530196605"
  ]
}' |
apify call foxlabs/us-nonprofit-data --silent --output-dataset

```

## MCP server setup

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

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/2jBGUX4ciK0CVS7NU/builds/DZBkkVu73k9cRgl5q/openapi.json
