# IRS Form 990 High-Revenue Nonprofit & Foundation Intelligence (`afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence`) Actor

Official IRS annual Form 990 and 990-PF financial records with current organization profiles. Filter EIN, state, form, tax period and revenue.

- **URL**: https://apify.com/afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 unique nonprofit tax-period 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 IRS Form 990 High-Revenue Nonprofit & Foundation Intelligence

Discover nonprofit and foundation financial records from **official IRS-produced public extracts**, with current IRS organization profiles. Designed for research, grant prospecting, Clay enrichment and n8n automation. Independent product; not affiliated with or endorsed by the IRS or Treasury.

### Quick start

```json
{"states":["NY"],"forms":["990","990-PF"],"extractYears":[2024],"minRevenueUsd":1000000,"maxRecords":5}
```

The default returns up to five qualifying records in source order, not a ranking or exhaustive list of the largest organizations. A small request still downloads an official national financial ZIP; typical execution is well below five minutes, subject to IRS availability. Source processing is capped at 240 seconds. No browser or proxy is used.

### Inputs

| Input | Meaning |
|---|---|
| `eins` | Up to 100 nine-digit EINs, optionally hyphenated. Leading zeros preserved. |
| `states` | Up to five postal abbreviations, filtering the **current BMF address**. Defaults to NY if neither states nor EINs provided. Empty states with EINs searches national BMF profiles. |
| `forms` | `990`, `990-PF`, or both. This is a filing form filter, not a legal-status determination. |
| `extractYears` | IRS processing calendar years, supported 2022–2024. Default 2024, latest linked on the official source page inspected October 28, 2026. These are **not tax years**. |
| `taxPeriod` | Optional exact fiscal period end, YYYYMM, e.g. 202312. |
| `minRevenueUsd` | Minimum revenue in the same filing row; default $1,000,000. |
| `maxRecords` | Unique EIN + tax period limit, 1–10,000, default 5. |

When EINs and states are both supplied, filters intersect. Organizations missing from today's BMF may be returned for explicit EIN requests with null profile fields, but cannot pass a state filter. This is historical extract coverage, not a promise of the latest return for every organization. Form 990-EZ is outside this release.

### Output and financial definitions

Each Dataset item is one unique EIN + tax period, never a merger of different financial years.

| Field | Definition |
|---|---|
| `ein` | Nine-character identifier. Import as text in spreadsheets. |
| `organization_name`, `city_state`, `ntee_code` | Current EO BMF metadata, not the historical filing identity/address. Missing values are null. |
| `total_revenue_usd` | 990 `totrevenue`, Part VIII line 12(A); PF `TOTRCPTPERBKS`, Part I line 12(a). |
| `total_assets_usd` | End-of-year book assets: `totassetsend` / `TOTASSETSEND`. Not fair market value. |
| `total_functional_expenses` | 990 `totfuncexpns`, Part IX line 25(A). **Null for PF**, which reports expenses on a different basis. |
| `tax_period` | Exact source fiscal end YYYYMM; independent of processing year. |
| `pdf_filing_url` | Null. SOI extracts contain no filing PDF URLs. No links are guessed. |
| `form_type`, `source_extract_year`, `source_url` | Filing form and official extract provenance. |
| `source_retrieved_at`, `source_last_modified` | Retrieval UTC and upstream Last-Modified where supplied. |
| `profile_source_url`, `profile_retrieved_at`, `profile_is_current` | Current BMF source and retrieval provenance. |

Null means unavailable, not zero. Negative reported revenue is retained but does not match a nonnegative minimum. Duplicate EIN + period rows use the first source occurrence, with extract years descending and forms in input order; no claim is made that this identifies the latest amended filing.

### Exports and integrations

The default Apify Dataset supports JSON and CSV exports. In Clay, use the Apify integration or import Dataset CSV. In n8n, run this Actor with an HTTP Request or Apify node and read the run's default Dataset items. Output links expose JSON, CSV and a source audit (`SUMMARY`). Empty runs contain no error rows in the billed Dataset.

### Price

Target and release gate: **$0.005 per successful unique EIN + tax period Dataset item ($5 / 1,000)**. Only `apify-default-dataset-item` is enabled; no paid start event and no separate standard-run platform usage charge. Consult the live Pricing tab for the effective published price. Duplicates within a run (including resumed runs) are skipped. A fresh run is a new request and can charge for the same period again. Apify post-run storage/access charges may apply.

### Operational bounds

Downloads use 256 KiB chunks, 10-second connection and 30-second read timeouts, up to three attempts with backoff, 120 MB per download, 500 MB total network budget and 1.5 GB uncompressed CSV budget per archive. CSV rows are iterated rather than loaded in bulk. Current profiles are joined through a temporary SQLite database with a 4 MB page cache; only required profile columns are stored. No archive contents are extracted to paths. 240-second processing deadline; at most 512 MB Actor memory. Failures are visible as failed runs, not fabricated data. Earlier delivered valid records remain chargeable if a later source fails. The source audit is saved on successful completion.

### Sources and reuse

- IRS annual extracts and field documentation: https://www.irs.gov/statistics/soi-tax-stats-annual-extract-of-tax-exempt-organization-financial-data
- IRS EO BMF: https://www.irs.gov/charities-non-profits/exempt-organizations-business-master-file-extract-eo-bmf
- IRS content-use policy: https://www.irs.gov/about-irs/use-of-content-from-irsgov

The IRS permits freely copying content created or maintained by federal employees in their duties. This product transforms factual fields from IRS-produced extracts; it does not redistribute third-party attachments, logos, or full return documents. Credit: Internal Revenue Service, Statistics of Income and EO BMF. Source checks dated 2026-10-28. This is the documented basis for commercial use, not a claim that every document linked by IRS has the same status.

ProPublica Nonprofit Explorer API v2 was reviewed (https://projects.propublica.org/nonprofits/api). Commercial redistribution permission was not established, so it is not called or used by this product.

### Development

Python 3.13, Apify SDK 4.1.0, requests 2.32.5. `python -m unittest discover -s tests -v`; `docker build -t newapi37:0.1.0 .`. Local SDK storage is supported. Financial records are historical information and may contain filing or IRS extraction errors; verify consequential decisions against original filings.

# Actor input Schema

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

Up to five state abbreviations; omitted defaults to NY unless EINs supplied. Empty with EINs searches national profiles.

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

Optional, up to 100 nine-digit EINs; intersection with states when both supplied.

## `forms` (type: `array`):

Form types.

## `extractYears` (type: `array`):

Official extract years, not tax years. Supported: 2022, 2023, 2024. Latest available on inspected IRS page: 2024.

## `taxPeriod` (type: `string`):

Fiscal period end; independent of extract processing year.

## `minRevenueUsd` (type: `integer`):

Minimum total revenue (USD).

## `maxRecords` (type: `integer`):

Maximum unique EIN/period records.

## Actor input object example

```json
{
  "states": [
    "NY"
  ],
  "forms": [
    "990",
    "990-PF"
  ],
  "extractYears": [
    2024
  ],
  "minRevenueUsd": 1000000,
  "maxRecords": 5
}
```

# Actor output Schema

## `json` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `summary` (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 = {
    "states": [
        "NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence").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 = { "states": ["NY"] }

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence").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 '{
  "states": [
    "NY"
  ]
}' |
apify call afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/newapi37-irs-form990-nonprofit-foundation-intelligence"
        }
    }
}
```

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/KxtalySSe4F1VrXl9/builds/nVhTUGYiOfrlce2nf/openapi.json
