# New Nonprofits Feed: IRS 501(c)(3) Recognitions & Revocations (`moment-data/nonprofit-new-registrations-feed`) Actor

Feed of newly IRS-recognized, revoked and reinstated US nonprofits (501(c)(3) and all 501(c) types) from official IRS bulk data. Filter by state, NTEE cause, subsection, assets/income, keyword. EIN, city, ruling date, foundation status, plain-English codes. New-since-last-run mode.

- **URL**: https://apify.com/moment-data/nonprofit-new-registrations-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 organization 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

## New Nonprofits Feed: IRS 501(c)(3) Recognitions, Revocations & Reinstatements

Get a **feed of newly IRS-recognized nonprofits** (new 501(c)(3) charities and every other 501(c) type), **organizations that just lost tax-exempt status** on the IRS Automatic Revocation List, and **revoked organizations that were reinstated**, straight from **official IRS bulk data** (Exempt Organizations Business Master File + Automatic Revocation of Exemption List). Filter by **state, NTEE cause category, 501(c) subsection, public charity vs private foundation, assets, income and keyword**. Every record has the **EIN, legal name, city/state/ZIP, exemption type, NTEE code with a plain-English cause, ruling month, foundation status, deductibility, asset/income/revenue amounts, revocation and reinstatement dates** and links to Form 990 filings. Run it on a schedule in *new since last run* mode and you only pay for organizations you have not seen yet.

No API key, no login, no scraping of web pages: the Actor streams the IRS's own downloadable files.

### Who it's for

- **Fundraising consultants, grant writers and nonprofit software vendors:** every new nonprofit is a prospect that needs a CRM, donation platform, accounting, insurance, payroll, a bank account, a website and a board. Get them the month the IRS recognizes them, filtered by your state and cause.
- **Banks, credit unions, insurers, payment processors and payroll/HR vendors:** fresh 501(c)(3), 501(c)(4), 501(c)(6) and 501(c)(7) leads by ZIP and size.
- **Donor-advised fund sponsors, grant makers, CSR teams and giving platforms:** due diligence alerts when a grantee or listed charity is **revoked** (contributions may no longer be deductible), and when it is **reinstated**.
- **Donation platforms, marketplaces and payment KYB teams:** auto-flag revoked organizations in your merchant or charity catalog.
- **Researchers, journalists and data teams:** a clean, decoded monthly delta of the US nonprofit sector in JSON, CSV or Excel.

### Why this Actor

- **A delta feed, not a 1.9 million row dump.** Default runs return the newest events; `sinceLastRun` mode remembers what you received per schedule.
- **Three event types in one schema:** `newlyRecognized`, `revoked`, `reinstated`. Competing tools cover either the BMF or the revocation list, not changes across both.
- **Honest "new" detection:** every newly recognized record carries `likelyNewOrganization`, `previouslyRevoked` (cross-checked against all ~1.2M EINs on the revocation list) and `hasPriorFilings`. Turn on `newOrganizationsOnly` to keep only brand-new organizations and drop re-determinations of older groups.
- **Reinstatements detected properly:** the IRS back-dates most reinstatement dates to the revocation date, so a date filter alone misses them. This Actor also catches them through the new ruling in the Business Master File (`reinstatementDetectedVia`).
- **Plain English, not IRS codes:** subsection (`501(c)(3)` + description), NTEE code + category + sector + description (`K31` = Food Banks & Pantries), foundation status (`Publicly supported organization (170(b)(1)(A)(vi))`, `Private non-operating foundation`), deductibility, organization type, affiliation, filing requirement, asset and income ranges.
- **Friendly filters:** `nteeCategories` accepts letters, codes or words (`education`, `health`, `food bank`, `religion`, `veterans`); `subsection` accepts `501(c)(3)`, `c4`, `6`.
- **Entity-level only:** "in care of" person names and street addresses are never exported.
- **Fast and cheap:** a single-state run takes a few seconds; the all-states default run (about 390 MB of IRS files) takes roughly a minute at 512 MB.

### Quick start

1. Click **Start** with the default input. You get 40 records across all states: the 20 most recent newly recognized organizations and the 20 most recent revocations.
2. New Colorado charities: `{"states": ["CO"], "eventTypes": ["newlyRecognized"], "subsection": ["501(c)(3)"], "newOrganizationsOnly": true, "maxItems": 200}`
3. New food banks and pantries in Texas (last 2 years): `{"states": ["TX"], "eventTypes": ["newlyRecognized"], "keyword": "food bank, pantry", "rulingWithinMonths": 24}`
4. New private foundations with assets (grant makers to pitch): `{"eventTypes": ["newlyRecognized"], "charityType": "privateFoundation", "minAssets": 100000, "rulingWithinMonths": 12}`
5. Revocation and reinstatement watch for New York and New Jersey: `{"states": ["NY", "NJ"], "eventTypes": ["revoked", "reinstated"], "maxItems": 500}`
6. New education and health nonprofits in the Mountain West: `{"states": ["CO", "UT", "WY", "MT", "ID"], "nteeCategories": ["education", "health"], "rulingWithinMonths": 6}`

#### Schedule tip (monthly or weekly feed)

The IRS refreshes both files about once a month, so a weekly or monthly schedule is plenty. Create an Apify **Schedule** with:

```json
{ "mode": "sinceLastRun", "stateKey": "co-new-charities", "states": ["CO"], "eventTypes": ["newlyRecognized", "revoked", "reinstated"], "rulingWithinMonths": 6, "maxItems": 2000 }
```

Use one `stateKey` per schedule. History is kept in the named key-value store `nonprofit-new-registrations-feed-state`. Send each run to Google Sheets, Slack, email, HubSpot, Airtable, Make, Zapier, n8n or a webhook via Apify integrations.

### Input

| Field | Meaning |
|---|---|
| `eventTypes` | `newlyRecognized`, `revoked`, `reinstated` (default: newlyRecognized + revoked) |
| `states` | 2-letter codes (`CO`, `NY`, `DC`, `PR`). Empty = all states |
| `nteeCategories` | NTEE letters/codes (`B`, `E20`, `K31`) or words (`education`, `health`, `housing`, `animals`, `arts`, `religion`, `youth`, `veterans`, `foundations`) |
| `subsection` | `501(c)(3)`, `501(c)(4)`, `c6`, `7`, `529`, `4947`... Empty = all |
| `charityType` | `any`, `publicCharity` (501(c)(3) public charities) or `privateFoundation` |
| `newOrganizationsOnly` | Keep only brand-new organizations (no prior revocation, no prior Form 990 tax period) |
| `rulingWithinMonths` | IRS ruling month within the last N months (default 3). Empty results widen once to 12 months |
| `revokedWithinMonths` | Revocation posting date / reinstatement date within the last N months (default 3) |
| `minAssets`, `minIncome` | Minimum amounts from the latest BMF record |
| `keyword` | Words in the name, alternate name or city; comma-separate alternatives |
| `maxItems` | Cap per run (also caps spend), default 40, split evenly across event types |
| `mode` | `window` (default, stateless) or `sinceLastRun` (**for schedules**) |
| `stateKey` | One key per saved search (sinceLastRun) |

NTEE, asset/income and charity-type filters need Business Master File data, which the IRS removes for revoked organizations, so revoked events are skipped while those filters are set.

### Output

Common fields: `eventType`, `eventDate`, `ein`, `einFormatted`, `name`, `alternateName`, `city`, `state`, `zip`, `subsectionCode`, `exemptionType`, `exemptionDescription`, `propublicaUrl` (Form 990 filings), `irsTeosSearchUrl`, `irsSourceInfoUrl`, `sourceFileUrl`, `sourceFileUpdatedAt`, `firstSeenAt`.

Business Master File fields (newlyRecognized and most reinstated): `rulingMonth`, `nteeCode`, `nteeMajorGroup`, `nteeCategory`, `nteeDescription`, `nteeSector`, `classificationCode`, `foundationCode`, `foundationStatus`, `isPrivateFoundation`, `deductibilityCode`, `contributionsDeductible`, `deductibility`, `organizationType`, `affiliation`, `groupExemptionNumber`, `exemptStatus`, `latestTaxPeriod`, `accountingPeriodEndMonth`, `filingRequirementCode`, `filingRequirement`, `files990PF`, `assetAmount`, `incomeAmount`, `revenueAmount`, `assetRange`, `incomeRange`.

New-organization flags (newlyRecognized): `likelyNewOrganization`, `previouslyRevoked`, `priorRevocationDate`, `priorReinstatementDate`, `hasPriorFilings`.

Revocation fields (revoked, reinstated): `revocationDate`, `revocationPostingDate`, `reinstatementDate`, `isCurrentlyRevoked`, `country`, `reinstatementDetectedVia`.

Example (a real newly recognized record):

```json
{
  "eventType": "newlyRecognized",
  "eventDate": "2026-09-01",
  "ein": "931507133",
  "einFormatted": "93-1507133",
  "name": "COLORADO OVERSEAS CHINESE FEDERATIO N",
  "alternateName": null,
  "city": "DENVER",
  "state": "CO",
  "zip": "80237",
  "subsectionCode": "03",
  "exemptionType": "501(c)(3)",
  "exemptionDescription": "Charitable, religious, educational, scientific or literary organization",
  "classificationCode": "1000",
  "nteeCode": "Y03",
  "nteeMajorGroup": "Y",
  "nteeCategory": "Mutual & Membership Benefit",
  "nteeDescription": "Mutual & Membership Benefit: Professional Societies & Associations",
  "nteeSector": "Mutual/Membership Benefit",
  "rulingMonth": "2026-09",
  "foundationCode": "15",
  "foundationStatus": "Publicly supported organization (170(b)(1)(A)(vi))",
  "isPrivateFoundation": false,
  "deductibilityCode": 1,
  "contributionsDeductible": true,
  "deductibility": "Contributions are deductible",
  "organizationType": "Corporation",
  "affiliation": "Independent organization",
  "groupExemptionNumber": null,
  "exemptStatus": "Unconditional exemption",
  "latestTaxPeriod": null,
  "accountingPeriodEndMonth": 12,
  "filingRequirementCode": "02",
  "filingRequirement": "Form 990 not required: normally receives under $50,000 (files 990-N e-Postcard)",
  "files990PF": false,
  "assetAmount": null,
  "incomeAmount": null,
  "revenueAmount": null,
  "assetRange": "$0",
  "incomeRange": "$0",
  "previouslyRevoked": false,
  "priorRevocationDate": null,
  "priorReinstatementDate": null,
  "hasPriorFilings": false,
  "likelyNewOrganization": true,
  "propublicaUrl": "https://projects.propublica.org/nonprofits/organizations/931507133",
  "irsTeosSearchUrl": "https://apps.irs.gov/app/eos/",
  "irsSourceInfoUrl": "https://www.irs.gov/charities-non-profits/exempt-organizations-business-master-file-extract-eo-bmf",
  "sourceFileUrl": "https://www.irs.gov/pub/irs-soi/eo_co.csv",
  "sourceFileUpdatedAt": "2026-10-13T19:13:24.000Z",
  "firstSeenAt": "2026-10-31T05:16:08.268Z"
}
```

See `sample-output.json` for revoked and reinstated examples. Each run also writes a summary (window, resolved filters, rows scanned, IRS file dates, matches per event type, why it stopped) to the `OUTPUT` record.

### Pricing

Pay per event: a small fee per run start and a fee per delivered organization (`org-record`). Set `maxItems` to cap spend; the Actor never delivers more records than your run budget allows.

### Data source and notes

- [IRS Exempt Organizations Business Master File Extract](https://www.irs.gov/charities-non-profits/exempt-organizations-business-master-file-extract-eo-bmf) (per-state and regional CSV files) and the [IRS Automatic Revocation of Exemption List](https://www.irs.gov/charities-non-profits/automatic-revocation-of-exemption-list) ([bulk download](https://www.irs.gov/charities-non-profits/tax-exempt-organization-search-bulk-data-downloads)). Public US government data, free to reuse. This Actor is not affiliated with or endorsed by the IRS or ProPublica.
- **"Newly recognized" means the IRS ruling (determination) month is in your window.** The ruling month is month-precision, so `eventDate` is the first day of that month. The IRS refreshes the files about monthly and new rulings usually appear 1-2 months later.
- Ruling dates can be retroactive to the formation date, and some older groups receive new rulings (for example after joining a group exemption); use `likelyNewOrganization` / `newOrganizationsOnly` to separate brand-new organizations.
- Amounts are from the latest return on file and are often empty for brand-new organizations until their first Form 990.
- IRS names are stored in 35-character lines, so a few long names contain a stray space where the lines join (`S YSTEMS`); we keep the official text unchanged.
- Officer names, "in care of" names and street addresses are not exported. Always confirm status on IRS Tax Exempt Organization Search before relying on it for deductibility decisions.

### FAQ

**How fresh is it?** As fresh as the IRS files (see `sourceFileUpdatedAt`; the IRS updates monthly). Each run downloads the current files.
**Can I get all nonprofits in a state, not just new ones?** Yes: set `rulingWithinMonths` to 600 and raise `maxItems`.
**Does it include Form 990 financials?** It includes the BMF asset, income and revenue amounts from the latest return, plus a ProPublica link to the full 990 filings.
**Do I need an IRS account or API key?** No.
**Why are some revoked organizations missing NTEE codes?** The IRS removes revoked organizations from the Business Master File, so the revocation list only has name, location and exemption type.

# Actor input Schema

## `eventTypes` (type: `array`):

newlyRecognized: organizations whose IRS exemption ruling date falls in the window (Business Master File). revoked: organizations newly posted to the IRS Automatic Revocation List (lost exemption for not filing 3 years). reinstated: revoked organizations whose exemption was reinstated in the window. Empty = newlyRecognized + revoked.

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

2-letter codes, e.g. CO, NY, TX, DC, PR. Empty = all states (slower: scans the full national files, about 1 minute). Picking states makes runs much faster.

## `nteeCategories` (type: `array`):

NTEE letters or codes (B = Education, E = Health Care, P = Human Services, X = Religion, T = Foundations; E20 = Hospitals, B82 = Scholarships) or plain words: education, health, housing, animals, arts, environment, youth, religion, food, sports, veterans, foundations... Any match. Only organizations with BMF data (newlyRecognized, reinstated) can match.

## `subsection` (type: `array`):

e.g. 501(c)(3), 501(c)(4), 501(c)(6), c7, 3, 529, 4947. Empty = all types.

## `charityType` (type: `string`):

Filter by IRS foundation status (BMF FOUNDATION code).

## `newOrganizationsOnly` (type: `boolean`):

newlyRecognized only: drop organizations that were previously on the IRS revocation list or already have a Form 990 tax period on file (re-determinations of older groups). Every record also carries likelyNewOrganization / previouslyRevoked / hasPriorFilings flags.

## `rulingWithinMonths` (type: `integer`):

newlyRecognized: IRS ruling (recognition) month within the last N months, counting the current month. The IRS refreshes the BMF monthly, so the newest month is usually 1-2 months back. In window mode an empty result widens to 12 months once.

## `revokedWithinMonths` (type: `integer`):

revoked: IRS revocation posting date within the last N months. reinstated: reinstatement date within the last N months.

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

Only organizations whose latest BMF asset amount is at least this. Newly recognized organizations often show 0 until their first Form 990.

## `minIncome` (type: `integer`):

Only organizations whose latest BMF income amount is at least this.

## `keyword` (type: `string`):

Words that must all appear in the organization name, alternate name or city, e.g. "food bank", "PTA", "Denver". Comma-separate alternatives: "church, ministries".

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

Hard cap on delivered records (also caps your spend). Split evenly across the selected event types, newest first.

## `mode` (type: `string`):

window (default): every match in the window, no saved state. sinceLastRun: skips organizations (per event type) already delivered under this State key; use for daily/weekly schedules and alerts.

## `stateKey` (type: `string`):

Name of the saved history for sinceLastRun mode (stored in the named key-value store nonprofit-new-registrations-feed-state). Use one key per schedule.

## Actor input object example

```json
{
  "eventTypes": [
    "newlyRecognized",
    "revoked"
  ],
  "charityType": "any",
  "newOrganizationsOnly": false,
  "rulingWithinMonths": 3,
  "revokedWithinMonths": 3,
  "maxItems": 40,
  "mode": "window",
  "stateKey": "default"
}
```

# Actor output Schema

## `organizations` (type: `string`):

One record per organization event (newly recognized, revoked or reinstated).

## `summary` (type: `string`):

Window, resolved filters, rows scanned, IRS file dates, why the run stopped.

# 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 = {
    "eventTypes": [
        "newlyRecognized",
        "revoked"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("moment-data/nonprofit-new-registrations-feed").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 = { "eventTypes": [
        "newlyRecognized",
        "revoked",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("moment-data/nonprofit-new-registrations-feed").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 '{
  "eventTypes": [
    "newlyRecognized",
    "revoked"
  ]
}' |
apify call moment-data/nonprofit-new-registrations-feed --silent --output-dataset

```

## MCP server setup

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

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/9dZ9Gf797ccmeLkQw/builds/jELFb1Nn3ATdzCA8p/openapi.json
