# Nonprofit 990 Scraper — EIN, Financials & Execs (ProPublica) (`haketa/propublica-nonprofit-scraper`) Actor

Scrape US nonprofits from ProPublica Nonprofit Explorer: name, EIN, address, NTEE, 501(c) type, IRS ruling, plus 990 financials (revenue, expenses, assets, liabilities, executive compensation) by year with filing PDFs. Search by name, state or category. For KYC, grants and research.

- **URL**: https://apify.com/haketa/propublica-nonprofit-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 990 Scraper — EIN, Financials & Execs (ProPublica)

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify\&logoColor=white)](https://apify.com/haketa/propublica-nonprofit-scraper)
[![Maintenance](https://img.shields.io/badge/Maintained-Active-brightgreen)](#-changelog)
[![Data Quality](https://img.shields.io/badge/Deduplicated-100%25-success)](#-key-features)
[![Output Formats](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)](#-data-fields--output-structure)
[![Pagination](https://img.shields.io/badge/Pagination-1%2C000%2B%20Unlocked-blueviolet)](#-at-a-glance)
[![KYC Compliance](https://img.shields.io/badge/KYC%20%2F%20AML-Verified%20EINs-success)](#-key-features)

Extract structured US nonprofit intelligence and IRS Form 990 tax-exempt filings at scale from ProPublica Nonprofit Explorer. Query over 1.8 million tax-exempt organizations across the United States by name, EIN, state, 501(c) subsection classification, or NTEE major cause categories.

Retrieve verified **Employer Identification Numbers (EINs)**, formal organization names, physical headquarters addresses, IRS ruling dates, exemption statuses, and multi-year **Form 990 financial statements** — including total annual revenue, operating expenses, end-of-year assets, total liabilities, executive compensation, and direct PDF download URLs for original IRS filings.

Export seamlessly to **JSON, CSV, Excel, or API** — or feed real-time grantee data directly into your foundation CRM, grantmaking platform, AML/KYC screening pipeline, or investigative analytics stack.

***

### ⚡ At a glance

| Feature | Specification |
|---|---|
| **Data Source** | ProPublica Nonprofit Explorer & IRS Form 990 Public Database |
| **Search Modes** | Keyword / Name, Direct EIN list, US State, 501(c) Subsection, NTEE Category |
| **Financial Depth** | Multi-year Form 990, 990-EZ, 990-PF returns + IRS BMF headline metrics |
| **Executive Compensation** | Officer, director, and key employee compensation parsed in USD |
| **Pagination Model** | Deep pagination per query (25 orgs/page, set `0` for auto/unlimited) |
| **Throughput Speed** | ~80–120 enriched organizations per minute (~15–30s on prefill runs) |
| **Deduplication** | Automatic deduplication by 9-digit IRS EIN (0% duplicates) |
| **Export Formats** | Dataset (JSON, CSV, XML, Excel) & Key-Value Store `OUTPUT` mirror |
| **Proxy Requirement** | Apify Proxy Datacenter (enabled by default, fully supported) |
| **Default Sample Run** | Automatic national food bank sample (~50 items) when run with `{}` |

***

### 🔎 Why scrape Nonprofit 990 data?

Form 990 is the primary public accountability mechanism for tax-exempt organizations in the United States. Filed annually with the Internal Revenue Service, it exposes critical governance and financial metrics that are essential for commercial and civic vetting:

1. **Grantee & Partner Verification (KYC/AML):** Validate legitimate 501(c)(3) tax-exempt status, check IRS revocation flags, and confirm physical office addresses before disbursing foundation grants or corporate donations.
2. **Philanthropic Prospect Research:** Identify well-funded charities, private foundations (`990-PF`), and endowments by sorting and filtering across net asset balances (`latestAssets`) and annual gross receipts (`latestRevenue`).
3. **Executive Compensation Benchmarking:** Analyze officer, trustee, and CEO compensation (`latestExecCompensation`) across non-profit sectors to evaluate organizational overhead efficiency.
4. **Donor & Major-Gift Intelligence:** Discover grantmaking institutions and assess their liquidity, asset holdings, and historical grant allocation patterns.
5. **Academic & Economic Sector Analysis:** Track systemic changes in charitable revenues, balance sheets, and sector health across metropolitan regions and states.

***

### ✨ Key features

- 🔍 **Multi-Dimensional Search & Filtering:** Combine free-text keyword search (`"food bank"`), state filters (`"CA"`), major NTEE category codes (e.g., `4` for Health, `5` for Human Services), and 501(c) subsection filters (`"3"` for charitable organizations, `"4"` for social welfare, `"6"` for business leagues).
- 🆔 **Direct Bulk EIN Lookups:** Pass a pre-compiled list of specific 9-digit EINs (formatted or raw) in `einList` for immediate, targeted financial extraction.
- 📈 **Granular Form 990 Financial Breakdown:** Extracts latest tax period year (`latestFilingYear`), return type (`latestFormType`: `990`, `990-EZ`, `990-PF`), total revenue (`latestRevenue`), total functional expenses (`latestExpenses`), total assets (`latestAssets`), and total liabilities (`latestLiabilities`).
- 👔 **Executive Compensation Extraction:** Automatically surfaces compensation amounts paid to officers, directors, and key executives (`latestExecCompensation`).
- 📄 **Direct Filing PDF Links:** Provides permalinks to original digitized IRS Form 990 PDF scans (`latestFilingPdfUrl`) for audit verification.
- ⚡ **Continuous Deep Pagination (1,000+ Orgs):** Seamlessly pages through 25-record batches without artificial cutoffs when `maxPagesPerSearch` is set to `0`.
- 🛡️ **Zero Rate-Limiting Headaches:** Parallelized asynchronous requests with intelligent retry mechanisms and datacenter proxy rotation for maximum throughput.

***

### 📥 Input parameters

The actor features intuitive parameters designed for rapid experimentation and high-volume data harvesting:

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | `array` | `["food bank"]` | Nonprofit name keywords or search phrases (e.g. `["red cross", "humane society"]`). |
| `states` | `array` | `[]` | Two-letter US state abbreviations (e.g. `["CA", "NY", "TX"]`). |
| `nteeCategories` | `array` | `[]` | Major NTEE category IDs (1: Arts, 2: Education, 3: Environment, 4: Health, 5: Human Services, 6: International, 7: Public/Societal, 8: Religion, 9: Mutual Benefit, 10: Unclassified). |
| `cCode` | `string` | `""` | 501(c) subsection number (e.g., `"3"` for 501(c)(3) charities, `"4"` for 501(c)(4), `"6"` for trade associations). |
| `einList` | `array` | `[]` | List of explicit EINs for direct retrieval (e.g. `["530196605", "13-1628105"]`). |
| `includeFilings` | `boolean` | `true` | When true, fetches full 990 balance sheets, executive compensation, and PDF URLs. |
| `maxPagesPerSearch` | `integer` | `0` | Maximum pages to paginate per search query (25 orgs/page). `0` = auto/unlimited governed by `maxItems`. |
| `maxItems` | `integer` | `0` | Total maximum organizations to scrape across all queries (`0` = no limit; prefilled to `100` for fast validation). |
| `proxyConfiguration` | `object` | `{ "useApifyProxy": true }` | Proxy settings. Apify Datacenter proxies are enabled by default. |

***

### 📊 Data fields & output structure

Every output record delivers comprehensive legal identity, IRS classification, address records, and Form 990 financial statements.

#### 🏢 Nonprofit Identity & Classification

| Field | Type | Coverage | Description |
|---|---|---|---|
| `ein` | `string` | 🟢 High (100%) | 9-digit IRS Employer Identification Number (unformatted) |
| `einFormatted` | `string` | 🟢 High (100%) | Standard dash-formatted EIN (e.g. `12-3456789`) |
| `name` | `string` | 🟢 High (100%) | Registered legal name of tax-exempt organization |
| `address` | `string` | 🟢 High (>95%) | Physical or mailing street address |
| `city` | `string` | 🟢 High (>98%) | Municipality or city |
| `state` | `string` | 🟢 High (100%) | Two-letter US state abbreviation |
| `zipcode` | `string` | 🟢 High (>98%) | 5-digit postal ZIP code |
| `nteeCode` | `string` | 🟡 Conditional (~80%) | National Taxonomy of Exempt Entities classification code |
| `subsectionCode` | `string` | 🟢 High (>95%) | IRS 501(c) subsection integer code (e.g. `3`) |
| `subsectionLabel` | `string` | 🟢 High (>95%) | Human-readable tax-exempt status label (e.g. `501(c)(3) Charitable`) |
| `rulingDate` | `string` | 🟢 High (>90%) | Year and month of official IRS tax-exemption ruling |
| `profileUrl` | `string` | 🟢 High (100%) | Direct web link to Nonprofit Explorer organization profile |

#### 💰 Form 990 Financials & Balance Sheets

| Field | Type | Coverage | Description |
|---|---|---|---|
| `latestFilingYear` | `string` | 🟡 Conditional (~75%) | Tax year corresponding to most recent filed Form 990 |
| `latestFormType` | `string` | 🟡 Conditional (~75%) | Specific return filed (`990`, `990-EZ`, `990-PF`) |
| `latestRevenue` | `string` | 🟡 Conditional (~75%) | Total gross revenue from latest return in USD |
| `latestExpenses` | `string` | 🟡 Conditional (~75%) | Total functional expenses from latest return in USD |
| `latestAssets` | `string` | 🟡 Conditional (~75%) | Total end-of-year net assets from latest return in USD |
| `latestLiabilities` | `string` | 🟡 Conditional (~75%) | Total liabilities reported at tax year end in USD |
| `latestExecCompensation` | `string` | 🟡 Conditional (~60%) | Total compensation reported for officers and directors in USD |
| `latestFilingPdfUrl` | `string` | 🟡 Conditional (~75%) | Direct URL to original digitized IRS Form 990 PDF document |
| `filingsCount` | `string` | 🟢 High (100%) | Total number of historical annual returns digitized |
| `filingYears` | `string` | 🟢 High (100%) | Array of tax years available in digital history |

#### 🏛️ IRS Business Master File (BMF) Baseline Metrics

| Field | Type | Coverage | Description |
|---|---|---|---|
| `assetAmount` | `string` | 🟢 High (>90%) | Baseline asset amount recorded in IRS Business Master File |
| `incomeAmount` | `string` | 🟢 High (>90%) | Baseline income amount recorded in IRS Business Master File |
| `revenueAmount` | `string` | 🟢 High (>90%) | Baseline revenue amount recorded in IRS Business Master File |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO 8601 scrape timestamp |

***

### 💡 Example output record

```json
{
  "ein": "530196605",
  "einFormatted": "53-0196605",
  "name": "AMERICAN NATIONAL RED CROSS",
  "address": "430 17TH ST NW",
  "city": "WASHINGTON",
  "state": "DC",
  "zipcode": "20006-2401",
  "careOfName": "",
  "nteeCode": "P20",
  "subsectionCode": 3,
  "subsectionLabel": "501(c)(3) Charitable",
  "rulingDate": "1905-01",
  "foundationCode": 15,
  "exemptStatusCode": 1,
  "assetAmount": 4215890000,
  "incomeAmount": 3485000000,
  "revenueAmount": 3485000000,
  "latestFilingYear": 2023,
  "latestFormType": "990",
  "latestRevenue": 3485210450,
  "latestExpenses": 3210450120,
  "latestAssets": 4215890100,
  "latestLiabilities": 1450200300,
  "latestExecCompensation": 12850400,
  "latestFilingPdfUrl": "https://projects.propublica.org/nonprofits/display_990/530196605/download990pdf_05_2024_prefixes_47-53%2F530196605_202306_990_2024051021481234.pdf",
  "filingsCount": 21,
  "filingYears": [2023, 2022, 2021, 2020, 2019, 2018],
  "profileUrl": "https://projects.propublica.org/nonprofits/organizations/530196605",
  "scrapedAt": "2026-11-10T16:45:00.000Z"
}
```

***

### 🎯 Practical input recipes

#### Recipe 1: Targeted Grantee Due Diligence by EIN

Perform comprehensive financial audits for specific partner organizations:

```json
{
  "einList": [
    "53-0196605",
    "13-1628105",
    "06-1506561"
  ],
  "includeFilings": true
}
```

#### Recipe 2: Human Services Charities in California

Extract 501(c)(3) human service nonprofits across California with full financial statements:

```json
{
  "states": ["CA"],
  "cCode": "3",
  "nteeCategories": ["5"],
  "includeFilings": true,
  "maxItems": 500
}
```

#### Recipe 3: High-Speed Organizational Directory (Without Filings)

Extract large-scale contact and status directories without retrieving detailed tax returns:

```json
{
  "searchTerms": ["animal shelter", "humane society"],
  "includeFilings": false,
  "maxPagesPerSearch": 0,
  "maxItems": 1500
}
```

#### Recipe 4: Major Healthcare Foundations Benchmark

Benchmark major health organizations (`NTEE 4`) with over 1,000 records:

```json
{
  "states": ["NY", "MA", "IL"],
  "cCode": "3",
  "nteeCategories": ["4"],
  "includeFilings": true,
  "maxPagesPerSearch": 0,
  "maxItems": 1000
}
```

#### Recipe 5: Higher Education & University Endowments

Screen university foundations and higher education institutions:

```json
{
  "searchTerms": ["university foundation", "college endowment"],
  "cCode": "3",
  "includeFilings": true,
  "maxItems": 250
}
```

#### Recipe 6: Environmental & Wildlife Conservation Trusts

Audit environmental conservation organizations across the Pacific Northwest:

```json
{
  "states": ["WA", "OR"],
  "cCode": "3",
  "nteeCategories": ["3"],
  "includeFilings": true,
  "maxItems": 200
}
```

***

### 💡 Optimization & best practices

- **Understanding Small Filers (Form 990-N):** Organizations with annual gross receipts under $50,000 typically file the electronic Form 990-N (e-Postcard). These filings do not contain line-item revenues, expenses, or executive pay; hence financial fields will be null while legal name, EIN, and address remain 100% populated.
- **Speed Optimization:** If your project only requires legal organization names, state registrations, and IRS ruling dates, disable `includeFilings: false`. This skips the secondary detail requests and increases throughput by up to 5x.
- **Filtering by Form Type:** Use downstream pandas or SQL filtering on `latestFormType` to separate private grantmaking foundations (`latestFormType == '990-PF'`) from public operating charities (`latestFormType == '990'`).
- **Combining Multiple States:** You can pass several state codes simultaneously (e.g. `["NY", "NJ", "CT"]`) to build regional tri-state non-profit intelligence datasets.
- **Preventing Duplicate Filers:** Organizations are keyed on their unique 9-digit IRS EIN. Overlapping keyword searches will never result in duplicate records in your dataset.

***

### 🚀 How to use & integrate

1. **Configure Search Parameters:** Enter keyword search phrases, choose target states, or provide a list of EINs.
2. **Execute Scraper:** Trigger the run via Apify Web Console or through the Apify REST API:
   ```bash
   curl --request POST \
     --url "https://api.apify.com/v2/acts/haketa~propublica-nonprofit-scraper/runs?token=YOUR_API_TOKEN" \
     --header 'Content-Type: application/json' \
     --data '{"searchTerms": ["food bank"], "states": ["CA"], "maxItems": 100}'
   ```
3. **Consume Dataset:**
   - **Python:** Load directly into a Pandas DataFrame using `apify-client`.
   - **Spreadsheets:** Export directly to Excel or auto-sync with Google Sheets.
   - **Database Pipelines:** Connect with Snowflake, BigQuery, or PostgreSQL via Apify integrations.

***

### ❓ Frequently asked questions

##### Is scraping IRS Form 990 data legal?

Yes. Form 990 tax filings and the IRS Business Master File are public records by federal law. Tax-exempt non-profit organizations are required to make their annual returns publicly accessible.

##### Do I need an API key or account?

No. There are no API keys, logins, or authentication credentials required.

##### What is the NTEE classification system?

The National Taxonomy of Exempt Entities (NTEE) is the IRS classification system used to categorize non-profit organizations by primary purpose (e.g. Category 1: Arts & Humanities, Category 2: Education, Category 4: Health, Category 5: Human Services).

##### Why are executive compensation figures missing for some records?

Executive compensation (`latestExecCompensation`) is reported on Part VII of Form 990. Non-profits that file simplified Form 990-EZ or Form 990-N do not have detailed executive compensation digitized in this specific field, or may rely on volunteer management.

##### How frequently is the financial data refreshed?

Data reflects the most recently digitized returns released by the IRS and processed by ProPublica. New tax filings are published as non-profits complete their annual IRS reporting cycles.

##### What export formats are supported?

You can download datasets in JSON, CSV, Excel (XLSX), XML, or HTML format directly from the Apify console.

##### What is the difference between BMF amounts and latest 990 amounts?

The IRS Business Master File (BMF) metrics (`assetAmount`, `incomeAmount`, `revenueAmount`) represent cumulative baseline amounts recorded by the IRS during administrative status tracking. The `latestRevenue`, `latestExpenses`, `latestAssets`, and `latestLiabilities` fields reflect the exact line-item figures filed on the organization's most recent digitized Form 990, 990-EZ, or 990-PF.

##### How are fiscal year-ends handled?

Non-profits operate on diverse fiscal calendars (e.g. July 1 – June 30 or October 1 – September 30). The `latestFilingYear` field indicates the primary calendar tax period year associated with the return.

##### Can I monitor a portfolio of charities for changes?

Yes. You can input your list of foundation partners or grantees into `einList` and schedule a monthly run. By comparing the new dataset with previous runs, you can automatically detect updated balance sheets, new revenue figures, or changes in tax exemption standing.

##### What happens if an organization files multiple amended returns?

The scraper extracts the latest digitized return available in the official repository, which incorporates any accepted superseding or amended filings.

***

### 🛠️ Step-by-step code integration examples

#### Python Integration with Pandas

```python
from apify_client import ApifyClient
import pandas as pd

client = ApifyClient("YOUR_APIFY_TOKEN")

## Trigger Nonprofit 990 Scraper run
run = client.actor("haketa/propublica-nonprofit-scraper").call(
    run_input={
        "searchTerms": ["food bank"],
        "states": ["CA"],
        "includeFilings": True,
        "maxItems": 100,
    }
)

## Fetch dataset items and load into DataFrame
items = client.dataset(run["defaultDatasetId"]).list_items().items
df = pd.DataFrame(items)

## Rank by total revenue
top_earners = df[["name", "city", "latestRevenue", "latestAssets", "latestExecCompensation"]].sort_values(
    by="latestRevenue", ascending=False
)
print(top_earners.head(10))
```

#### Node.js / JavaScript Integration

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/propublica-nonprofit-scraper').call({
    searchTerms: ['food bank'],
    states: ['CA'],
    includeFilings: true,
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Retrieved ${items.length} non-profit records.`);
```

***

### 🔗 Related intelligence scrapers

- [USAspending Federal Awards Scraper](https://apify.com/haketa/usaspending-scraper) — Extract federal contracts, grants, and procurement awards.
- [EPA ECHO Compliance Scraper](https://apify.com/haketa/epa-echo-scraper) — Extract US industrial facilities, compliance status, and penalties.
- [Google Maps Business Leads Scraper](https://apify.com/haketa/google-maps-contacts-scraper) — Extract business listings with enriched email and social profiles.
- [Article Content Extractor](https://apify.com/haketa/article-content-extractor) — Clean text and metadata extraction from news and media feeds.

***

### 📋 Changelog

#### v1.2 (2026-11)

- **Deep Pagination Unlocked:** Fully unlocked continuous multi-page pagination for 1,000+ organizations; `maxPagesPerSearch: 0` now executes as unlimited pagination governed by `maxItems`.
- **Fast Prefill Optimization:** Adjusted prefill limits to 100 records for sub-20s sample verification with full 990 financial statements.
- **Default Fallback Robustness:** Added safe fallback defaults (food bank) ensuring runs with empty input payloads execute reliably with ~50 sample organizations.
- **Financial Normalization:** Enhanced parsing for numeric financial amounts and standardized 501(c) subsection labels.

#### v1.1 (2026-10)

- **Concurrent Financial Extraction:** Increased concurrent detail fetching to 8 parallel streams, cutting run durations by 60%.
- **Source PDF URLs:** Added direct link resolution to digitized Form 990 PDF scans.

#### v1.0 (2026-09)

- Initial release featuring EIN lookups, NTEE category mapping, IRS BMF headline metrics, and Form 990 financial statement parsing.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/propublica-nonprofit-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Nonprofit names or keywords (e.g. "food bank", "red cross"). Each runs as a separate search.

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

Two-letter US state codes to filter by (e.g. CA, NY).

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

Major NTEE category IDs: 1 Arts, 2 Education, 3 Environment/Animals, 4 Health, 5 Human Services, 6 International, 7 Public/Societal, 8 Religion, 9 Mutual benefit, 10 Unclassified.

## `cCode` (type: `string`):

501(c) subsection number to filter by (e.g. 3 for 501(c)(3) charities, 4, 6).

## `einList` (type: `array`):

Specific EINs to look up (e.g. 530196605 or 53-0196605).

## `includeFilings` (type: `boolean`):

Fetch each organization's 990 financials (revenue, expenses, assets, exec compensation) and filing history.

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

Maximum organizations across all searches. 0 = no limit.

## `maxPagesPerSearch` (type: `integer`):

Pagination cap per search (25 per page). 0 = auto/unlimited governed by maxItems.

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

Apify Proxy. The API is public — datacenter is enough and enabled by default.

## Actor input object example

```json
{
  "searchTerms": [
    "food bank"
  ],
  "includeFilings": true,
  "maxItems": 100,
  "maxPagesPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `ein` (type: `string`):

Employer ID Number

## `einFormatted` (type: `string`):

EIN with dash

## `name` (type: `string`):

Organization name

## `address` (type: `string`):

Street address

## `city` (type: `string`):

City

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

State

## `zipcode` (type: `string`):

ZIP code

## `nteeCode` (type: `string`):

NTEE classification

## `subsectionCode` (type: `string`):

501(c) subsection

## `subsectionLabel` (type: `string`):

501(c) type label

## `rulingDate` (type: `string`):

IRS ruling date

## `assetAmount` (type: `string`):

IRS BMF assets

## `incomeAmount` (type: `string`):

IRS BMF income

## `revenueAmount` (type: `string`):

IRS BMF revenue

## `latestFilingYear` (type: `string`):

Latest 990 year

## `latestFormType` (type: `string`):

990 form type

## `latestRevenue` (type: `string`):

Latest total revenue

## `latestExpenses` (type: `string`):

Latest total expenses

## `latestAssets` (type: `string`):

Latest total assets

## `latestLiabilities` (type: `string`):

Latest liabilities

## `latestExecCompensation` (type: `string`):

Officer compensation

## `latestFilingPdfUrl` (type: `string`):

Latest 990 PDF URL

## `filingsCount` (type: `string`):

Years with data

## `filingYears` (type: `string`):

Years available

## `profileUrl` (type: `string`):

Nonprofit Explorer URL

## `scrapedAt` (type: `string`):

ISO timestamp

# 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 = {
    "searchTerms": [
        "food bank"
    ],
    "maxItems": 100,
    "maxPagesPerSearch": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/propublica-nonprofit-scraper").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 = {
    "searchTerms": ["food bank"],
    "maxItems": 100,
    "maxPagesPerSearch": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/propublica-nonprofit-scraper").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 '{
  "searchTerms": [
    "food bank"
  ],
  "maxItems": 100,
  "maxPagesPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/propublica-nonprofit-scraper --silent --output-dataset

```

## MCP server setup

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

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/GAsoqZf9W2Qb4e8Yn/builds/Oq5CtuqKKs8ZSxAG1/openapi.json
