# IRS Nonprofit 990 Financials and Health Score API (`transparent_meteorite/irs-nonprofit-990-financials`) Actor

Search IRS tax-exempt organizations and get Form 990 financials: revenue, expenses, net assets, officer compensation total and a financial-health score. Uses the free ProPublica Nonprofit Explorer API. No login.

- **URL**: https://apify.com/transparent_meteorite/irs-nonprofit-990-financials.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 nonprofit organization rows

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

## IRS Nonprofit 990 Financials and Health Score

**IRS Form 990 nonprofit financials** from the ProPublica Nonprofit Explorer API: search US tax-exempt organizations by keyword, state and NTEE category and get revenue, expenses, net assets, officer compensation total, revenue growth and a 0-100 financial-health score, one row per organization.

Search US tax-exempt organizations and get their latest Form 990 numbers in one table. For every organization the actor returns the EIN, name, city and state, NTEE code, tax-exempt type, IRS ruling date, latest tax period, total revenue, total expenses, net assets, the organization-level officer compensation total and a simple financial-health score. It reads the free ProPublica Nonprofit Explorer API, which republishes IRS data. No login, no proxy, no API key.

### What is IRS Nonprofit 990 Financials and Health Score?

Search IRS tax-exempt organizations and get Form 990 financials: revenue, expenses, net assets, officer compensation total and a financial-health score. Uses the free ProPublica Nonprofit Explorer API. No login. Run it from the Apify Console, the API or a schedule, and export the results as JSON, CSV, Excel or HTML.

### Output

One row per organization:

| Field | Meaning |
|---|---|
| `ein`, `name`, `city`, `state` | Identity and location of the organization. |
| `nteeCode`, `subsection` | NTEE activity code and tax-exempt type, for example 501(c)(3) charitable. |
| `rulingDate`, `taxPeriod`, `filingYear` | IRS ruling date, latest tax period and the filing year the numbers come from. |
| `totalRevenue`, `totalExpenses`, `netAssets`, `totalAssets`, `totalLiabilities` | Figures from the latest Form 990 with data, in US dollars. |
| `officerCompensationTotal` | Total compensation of current officers, directors and trustees as one organization-level number. |
| `expenseRatio` | Expenses divided by revenue. Under 1 means a surplus, over 1 a deficit. |
| `revenueGrowthPct` | Revenue change against the previous filing on record. |
| `healthScore`, `healthBand` | 0 to 100 score and a band: strong (70+), stable (45 to 69), watch (under 45). |
| `propublicaUrl`, `filingPdfUrl`, `scrapedAt` | Source page, the filing PDF where available, and the run time. |

### Sample output

```json
{
  "ein": "38-1359084",
  "name": "Judson Center Inc",
  "city": "Farmingtn Hls",
  "state": "MI",
  "nteeCode": "P700",
  "subsection": "501(c)(3) charitable",
  "rulingDate": "1945-08-01",
  "filingYear": 2023,
  "totalRevenue": 21090731,
  "totalExpenses": 22587062,
  "netAssets": 11557468,
  "expenseRatio": 1.071,
  "healthScore": 52,
  "healthBand": "stable"
}
```

### Input

| Field | What it does |
|---|---|
| `query` | Words to find in organization names, for example `food`, `youth` or `animal rescue`. |
| `state` | Two-letter US state code such as `MI`. Empty means all states. |
| `nteeCategory` | Broad NTEE category 1 to 10 (arts, education, environment, health, human services, international, public benefit, religion, mutual benefit, unknown). Empty means any. |
| `eins` | Optional list of EINs to look up directly. When filled, the search fields are ignored. |
| `includeFinancials` | On by default. Turn off for a fast list of names without financials. |
| `maxItems` | Stop after this many organizations (default 30, up to 500). |

Sample input:

```json
{
  "query": "youth",
  "state": "OH",
  "nteeCategory": "5",
  "maxItems": 50
}
```

### Pricing

Pay per event. You pay a small fixed amount per organization row delivered, listed on the Pricing tab, plus a tiny start fee per run. Organizations that cannot be found are never charged, and you can set a maximum cost per run in the run options.

### What does this Actor do?

It runs a search on ProPublica Nonprofit Explorer (keywords, state and broad category), then opens each organization's record and reads its filings. The newest filing with financial data gives the revenue, expense and balance-sheet figures. The filing before it is used to work out revenue growth. The result is one row per organization, ready for a spreadsheet, a CRM or an n8n, Make or Zapier workflow.

Only organization-level data is collected. The actor does not read or output the names or addresses of individual people, and the officer compensation field is a single total for the whole organization, as reported on the Form 990.

**Run in 30 seconds**

1. Open the Actor and press **Try for free** (a free Apify account is enough).
2. Keep the prefilled search (food-related human-services nonprofits in Michigan) and press **Start**.
3. Open the **Output** tab. Use the table view or download CSV, Excel or JSON.

### Use cases

- Screen charities before a donation or grant: look at expense ratio, reserves and revenue trend side by side.
- Build a prospect list of nonprofits in a state and category, ranked by revenue, for fundraising software, accounting or consulting outreach.
- Monitor organizations you fund or partner with and flag any whose health band drops to watch.
- Feed rows into an n8n, Make or Zapier workflow that adds new organizations to a CRM and alerts you on deficits.
- Research a sector for journalism, academic work or a market report using real IRS-sourced figures.

### How the health score works

The score is a fixed formula, so the same filings always give the same number. Up to 40 points for the operating surplus (a 10 percent deficit scores zero, a 10 percent surplus scores full marks), up to 30 points for revenue growth against the previous filing (minus 20 percent to plus 20 percent), and up to 30 points for reserves (net assets measured in months of expenses, full marks at six months). When there is no earlier filing, the growth part gets a neutral 15 points. It is a quick screening aid, not an audit or a rating.

### Limits

- Search results come from ProPublica's own index and may differ slightly from the IRS site.
- The actor reads one organization at a time with a short pause between requests, so 30 organizations take about a minute.
- Private foundations file a different form (990-PF) and may show fewer of these fields.
- Financial figures are as filed and are not audited or corrected by this actor.

### Related Actors

- [Developer Signals](https://apify.com/transparent_meteorite/developer-signals) tracks public developer activity signals for companies.
- [Website Tech Stack](https://apify.com/transparent_meteorite/website-tech-stack) detects which technologies a website runs on.
- [Sitemap Link Inventory](https://apify.com/transparent_meteorite/sitemap-link-inventory) lists every URL a site publishes in its sitemaps.

Found a bug or need a field? Open an issue on the Issues tab with the run URL.

### FAQ

**Where does the data come from?**
From the ProPublica Nonprofit Explorer API, which republishes IRS Business Master File and Form 990 extract data. The actor adds no data of its own.

**Why is an organization missing financials?**
Small organizations may file a postcard (990-N) with no revenue figures, and new ones may not have filed yet. Those rows keep the identity fields and leave the financial fields empty.

**How current are the numbers?**
They reflect the newest filing ProPublica has processed, which is usually one to two years behind the calendar. The `taxPeriod` and `filingYear` fields tell you exactly which period each row covers.

**Does it list individual officers or salaries?**
No. Only the organization-level compensation total is returned.

**This Actor vs pink_comic/irs-990-nonprofit-search:** that one is the most-used 990 search and links source pages and filing PDFs for charity KYB and grant prospecting. This one adds analysis on top of the numbers: expense ratio, revenue growth against the previous filing and a 0-100 health score with a strong, stable or watch band.

### More from DWA Open Data

Browse all 69 data Actors, with live prices and sample output, at [open-data-actors.pages.dev](https://open-data-actors.pages.dev).

***

**Feedback:** if this Actor was useful, or if it fell short, an honest review on the [Reviews tab](https://apify.com/transparent_meteorite/irs-nonprofit-990-financials/reviews) helps other users decide. Problems or feature requests: please open an [Issue](https://apify.com/transparent_meteorite/irs-nonprofit-990-financials/issues) and we usually reply within one business day.

### Changelog

- 2026-10-22: Initial release.
- 2026-10-25: Documentation updated: README refreshed.
- 2026-10-25: Pricing update announced, effective 2026-10-25: Price cut to stay the lowest on the Store.
- 2026-10-25: Listing refresh: new Store icon, README reorganised (overview, data fields, pricing, FAQ) and changelog tab added. No code change.

# Changelog

This Actor's version history is a separate document: https://apify.com/transparent_meteorite/irs-nonprofit-990-financials/changelog.md

# Actor input Schema

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

Words to find in organization names, for example food, youth, hospital or animal rescue. Leave empty to browse by state and category only.

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

Two-letter US state code, for example MI, CA or NY. Leave empty for all states.

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

Broad NTEE category of the organization.

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

Look up specific organizations by 9-digit EIN (with or without the dash). When filled, the search fields above are ignored.

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

Fetch each organization's latest Form 990 numbers and compute the health score. Turn off for a fast list of names only.

## `maxItems` (type: `integer`):

Stop after this many organizations. You pay only for rows delivered.

## Actor input object example

```json
{
  "query": "food",
  "state": "MI",
  "nteeCategory": "5",
  "includeFinancials": true,
  "maxItems": 30
}
```

# Actor output Schema

## `overview` (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",
    "state": "MI",
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/irs-nonprofit-990-financials").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",
    "state": "MI",
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/irs-nonprofit-990-financials").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",
  "state": "MI",
  "maxItems": 30
}' |
apify call transparent_meteorite/irs-nonprofit-990-financials --silent --output-dataset

```

## MCP server setup

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

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/E7kgJmhtt9tePBSUq/builds/hdmCgJPK8vHnXN2kW/openapi.json
