# ProPublica Nonprofit Crawler - IRS 990 & Tax-Exempt Org Data (`jungle_synthesizer/propublica-nonprofit-crawler`) Actor

Crawl IRS 990 filings and tax-exempt org data from ProPublica. Search by name, EIN, state, NTEE code, or 501(c) subsection. Extract revenue, expenses, net assets, officer compensation, and PDF links. For grant writers, donors, journalists, and compliance teams.

- **URL**: https://apify.com/jungle\_synthesizer/propublica-nonprofit-crawler.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ProPublica Nonprofit Crawler — IRS 990 Filings & Tax-Exempt Org Data

Crawl IRS Form 990 filings and tax-exempt organization data from the [ProPublica Nonprofit Explorer API](https://projects.propublica.org/nonprofits/api). Returns organization identity, 501(c) classification, NTEE codes, multi-year financial history, officer compensation, and PDF links for ~1.8M US nonprofits — the same data source investigative journalists use to follow the money.

---

### ProPublica Nonprofit Crawler Features

- Searches ProPublica's free Nonprofit Explorer API by name, state, NTEE category, or 501(c) subsection.
- Extracts one row per (organization, tax year) when full financial data is requested — so year-over-year comparisons work without reshaping.
- Returns 45+ fields per row including total revenue, functional expenses, net assets, total contributions, program service revenue, officer compensation, and wage breakdowns.
- Fetches specific organizations by EIN list, with or without dashes.
- Filters by 501(c) subsection (3, 4, 5, 6, 7, 8, 9, 10, 19) and NTEE top-level category (1-10).
- Emits the direct ProPublica PDF URL for every 990 filing, structured or scanned.
- No API key, no proxy, no browser. Pure JSON API with a polite 300ms pace.

---

### Who Uses IRS 990 Data?

- **Grant writers** — Screen foundations by NTEE category and asset size before writing another application nobody reads.
- **Donor due diligence** — Pull a nonprofit's last five years of financials to check whether the ratio of officer comp to program expenses is reasonable or not.
- **Investigative journalists** — Build leads by filtering 501(c)(4) social-welfare orgs in a specific state, or track foundation-to-foundation grants across years.
- **Compliance & KYC teams** — Screen nonprofit counterparties against the IRS Business Master File and flag organizations with unusual asset or contribution patterns.
- **Academic researchers** — Export a bounded slice of the nonprofit sector (hospitals, foundations, advocacy orgs) for econometric work without wrestling with IRS bulk extracts.
- **Market researchers** — Size up a vertical by counting 501(c)(3) orgs with revenue above a threshold in a given geography.

---

### How the ProPublica Nonprofit Crawler Works

1. Pick a mode: `search` to paginate filtered results, or `organizations` to fetch specific EINs you already have.
2. Set filters — search term, state, NTEE category, 501(c) subsection. Or leave them empty and browse the whole universe one page at a time.
3. Decide whether you want one row per org (fast) or one row per filing year (richer). The `includeFilings` toggle controls this.
4. The crawler paginates ProPublica's API at ~3 requests per second, hydrates each match with the organization detail endpoint when needed, and writes a flat JSON record per row. Dataset is ready to export as CSV, Excel, or JSON.

---

### Input

```json
{
    "mode": "search",
    "searchTerm": "hospital",
    "state": "VT",
    "nteeCategory": "",
    "subsectionCode": "3",
    "einList": [],
    "includeFilings": true,
    "maxItems": 100
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `"search"` | Either `"search"` (paginate filtered results) or `"organizations"` (fetch specific EINs). |
| `searchTerm` | string | `"hospital"` | Free-text query matched against org names. Leave empty to browse all orgs matching the other filters. |
| `state` | string | `""` | Two-letter US state code (e.g., `"CA"`, `"NY"`). Search mode only. |
| `nteeCategory` | string | `""` | NTEE top-level category 1-10 (Arts, Education, Environment, Health, Human Services, International, Public Benefit, Religion, Mutual Benefit, Unclassified). Search mode only. |
| `subsectionCode` | string | `""` | IRS 501(c) subsection. `"3"` = charitable, `"4"` = social welfare, `"6"` = business leagues, etc. Search mode only. |
| `einList` | array<string> | `[]` | EINs to fetch directly. Accepts `"13-1623888"` or `"131623888"`. Required when `mode` is `"organizations"`. |
| `includeFilings` | boolean | `true` | When true, emits one row per (org, tax year) with full 990 financials. When false, one summary row per org. |
| `maxItems` | integer | `100` | Hard cap on records returned. Each filing year counts as one record when `includeFilings` is on. |

**Organizations mode example** — fetch three specific EINs with their full filing history:

```json
{
    "mode": "organizations",
    "einList": ["13-1623888", "53-0196605", "941340523"],
    "includeFilings": true,
    "maxItems": 50
}
```

***

### ProPublica Nonprofit Crawler Output Fields

Each record is one (organization, tax year) row when `includeFilings: true`, or one summary row per organization when `false`. Organization-level fields are repeated across every filing row so downstream joins are trivial.

```json
{
    "ein": "941340523",
    "strein": "94-1340523",
    "name": "Kaiser Foundation Health Plan Inc",
    "careofname": "% KP TAX",
    "address": "ONE KAISER PLAZA",
    "city": "Oakland",
    "state": "CA",
    "zipcode": "94612-3610",
    "ntee_code": "E310",
    "subsection_code": 3,
    "subsection_label": "501(c)(3) - Charitable / religious / educational",
    "classification_codes": "1200",
    "activity_codes": "164000000",
    "foundation_code": 16,
    "deductibility_code": 1,
    "exempt_organization_status_code": 1,
    "organization_code": 1,
    "ruling_date": "1981-12-01",
    "latest_tax_period": "2024-12-01",
    "latest_asset_amount": 33547368863,
    "latest_income_amount": 93006408021,
    "latest_revenue_amount": 82490440881,
    "filing_year": 2023,
    "filing_tax_period": 202312,
    "filing_type": "990",
    "filing_has_data": true,
    "filing_pdf_url": "https://projects.propublica.org/nonprofits/download-filing?path=...",
    "filing_updated": "2025-08-05T16:11:09.202Z",
    "total_revenue": 75101306911,
    "total_functional_expenses": 74356004001,
    "total_assets_end": 31400724759,
    "total_liabilities_end": 22078604890,
    "net_assets_end": 9322119869,
    "total_contributions": 11542682,
    "program_service_revenue": 75068903991,
    "investment_income": 298237561,
    "net_rental_income": 1970907,
    "net_gains_losses": -280418643,
    "compensation_current_officers": 90793859,
    "other_salaries_wages": 2680303412,
    "payroll_taxes": 233744277,
    "professional_fundraising_fees": 0,
    "unrelated_business_income": "Y",
    "data_source": "current_2026_03_10",
    "updated_at": "2026-03-10T23:37:21.272Z",
    "propublica_url": "https://projects.propublica.org/nonprofits/organizations/941340523",
    "scraped_at": "2026-04-19T10:16:31.950Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `ein` | string | 9-digit Employer Identification Number with leading zeros preserved. |
| `strein` | string | EIN formatted with dash (`XX-XXXXXXX`). |
| `name` | string | Organization legal name. |
| `sub_name` | string | Alternative name or DBA (from search results). |
| `careofname` | string | Care-of name on the IRS record. |
| `address`, `city`, `state`, `zipcode` | string | Registered address. |
| `ntee_code` | string | NTEE classification (e.g., `E200` for hospitals). |
| `subsection_code` | number | IRS 501(c) subsection integer. |
| `subsection_label` | string | Human-readable subsection label. |
| `classification_codes` | string | IRS classification codes. |
| `activity_codes` | string | IRS activity codes. |
| `foundation_code` | number | IRS foundation status code. |
| `deductibility_code` | number | IRS deductibility code. |
| `exempt_organization_status_code` | number | IRS exempt status code (1 = unconditional). |
| `organization_code` | number | IRS organization type (1 = corporation, 2 = trust, etc.). |
| `ruling_date` | string | Date the IRS granted exempt status (`YYYY-MM-DD`). |
| `latest_tax_period` | string | Most recent tax period on the master file. |
| `latest_asset_amount` | number | Most recent reported total assets (USD). |
| `latest_income_amount` | number | Most recent reported total income (USD). |
| `latest_revenue_amount` | number | Most recent reported total revenue (USD). |
| `filing_year` | number | Calendar year of this filing. |
| `filing_tax_period` | number | Tax period end in `YYYYMM` format. |
| `filing_type` | string | IRS form (`990`, `990-EZ`, `990-PF`). |
| `filing_has_data` | boolean | True when ProPublica parsed structured financial fields; false when only a PDF is available. |
| `filing_pdf_url` | string | Direct link to the 990 PDF. |
| `filing_updated` | string | Last-updated timestamp for the filing record (ISO 8601). |
| `total_revenue` | number | Total revenue on the filing (USD). |
| `total_functional_expenses` | number | Total functional expenses (USD). |
| `total_assets_end` | number | Total assets at year end (USD). |
| `total_liabilities_end` | number | Total liabilities at year end (USD). |
| `net_assets_end` | number | Net assets at year end (USD). |
| `total_contributions` | number | Total contributions, gifts, and grants received (USD). |
| `program_service_revenue` | number | Total program service revenue (USD). |
| `investment_income` | number | Investment income (USD). |
| `net_rental_income` | number | Net rental income (USD). |
| `net_gains_losses` | number | Net gains/losses from asset sales (USD). |
| `compensation_current_officers` | number | Compensation of current officers, directors, trustees, and key employees (USD). |
| `other_salaries_wages` | number | All other salaries and wages (USD). |
| `payroll_taxes` | number | Payroll taxes (USD). |
| `professional_fundraising_fees` | number | Professional fundraising fees (USD). |
| `unrelated_business_income` | string | `Y` or `N` — whether the filing reports unrelated business income. |
| `data_source` | string | ProPublica data snapshot label (e.g., `current_2026_03_10`). |
| `updated_at` | string | Organization record last-updated timestamp. |
| `propublica_url` | string | Link to the ProPublica Nonprofit Explorer page for this org. |
| `scraped_at` | string | Timestamp when this record was produced. |

***

### FAQ

#### How do I scrape IRS 990 data from ProPublica?

ProPublica Nonprofit Crawler wraps the [Nonprofit Explorer API v2](https://projects.propublica.org/nonprofits/api) and returns structured JSON. Set the `mode` to `search`, optionally filter by state, NTEE category, and 501(c) subsection, and run the actor. Output can be exported as CSV, Excel, or JSON from the run dataset.

#### How much does ProPublica Nonprofit Crawler cost to run?

ProPublica Nonprofit Crawler uses pay-per-event pricing: $0.10 per actor start plus $0.001 per record. A thousand-record pull costs about $1.10. A 100-record preview is around $0.20.

#### Can I fetch specific nonprofits by EIN?

ProPublica Nonprofit Crawler supports direct EIN lookup through the `organizations` mode. Paste a list of EINs (with or without dashes) into `einList` and the actor will fetch each organization and every filing ProPublica has on record.

#### Does ProPublica Nonprofit Crawler need a proxy or API key?

ProPublica Nonprofit Crawler doesn't need either. The Nonprofit Explorer API is free and unauthenticated, and the actor runs well inside the site's courtesy rate limit with no proxy configuration.

#### How many years of financial history does it return?

ProPublica Nonprofit Crawler returns every filing ProPublica has on record for each organization — typically 10-15 years of 990, 990-EZ, or 990-PF filings, back to the early 2000s for long-lived orgs. When `includeFilings: true`, each year is a separate row with full financial fields.

#### What's the difference between `filing_has_data: true` and `false`?

ProPublica Nonprofit Crawler marks a filing `filing_has_data: true` when ProPublica has parsed structured financial fields from the IRS extract, so you get all the revenue and expense columns populated. When `false`, only the PDF and basic metadata are available — the IRS has not yet released structured data for that tax year. Recent filings (last 1-2 years) are commonly in this state.

***

### Need More Features?

Need custom fields, a different nonprofit data source, or batch export to your warehouse? File an issue on the actor page or get in touch.

### Why Use ProPublica Nonprofit Crawler?

- **Affordable** — $0.10 per start plus $0.001 per record. A thousand nonprofits runs about $1.
- **Fresh data** — Pulls from ProPublica's live mirror of the IRS Business Master File and Annual Financial Extract, which is how the Nonprofit Explorer website itself gets its numbers. The `data_source` field tells you exactly which IRS extract the row came from.
- **Clean multi-year shape** — One row per (organization, tax year) means year-over-year comparisons and trend analysis work without reshaping the output. Most scrapers hand you a nested blob and wish you luck.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Whether to search by criteria or fetch specific EINs.

## `searchTerm` (type: `string`):

Name or keyword to search for (search mode). Leave empty to browse all orgs matching the state/NTEE/subsection filters.

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

Filter by US state (2-letter code, e.g., 'CA', 'NY'). Leave empty for all states. Search mode only.

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

National Taxonomy of Exempt Entities top-level category (1-10). Search mode only.

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

IRS 501(c) subsection. Search mode only. Common values: 3 = 501(c)(3) charities, 4 = 501(c)(4) social welfare, 6 = 501(c)(6) business leagues.

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

List of Employer Identification Numbers to fetch directly (e.g., \['13-1623888', '131623888']). Required in 'organizations' mode. Accepts with or without dashes.

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

When enabled, fetches the full organization detail for each search match and emits one row per tax year (with totrevenue, totassets, officer comp, PDF link, etc.). Otherwise emits one summary row per organization. Adds one request per organization.

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

Maximum number of records to return. Each filing year counts as one record when includeFilings is on.

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

Select proxies. The ProPublica API does not require proxies.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerm": "hospital",
  "einList": [],
  "includeFilings": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerm": "hospital",
    "state": "",
    "nteeCategory": "",
    "subsectionCode": "",
    "einList": [],
    "includeFilings": true,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/propublica-nonprofit-crawler").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerm": "hospital",
    "state": "",
    "nteeCategory": "",
    "subsectionCode": "",
    "einList": [],
    "includeFilings": True,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/propublica-nonprofit-crawler").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerm": "hospital",
  "state": "",
  "nteeCategory": "",
  "subsectionCode": "",
  "einList": [],
  "includeFilings": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/propublica-nonprofit-crawler --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/propublica-nonprofit-crawler",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ProPublica Nonprofit Crawler - IRS 990 & Tax-Exempt Org Data",
        "description": "Crawl IRS 990 filings and tax-exempt org data from ProPublica. Search by name, EIN, state, NTEE code, or 501(c) subsection. Extract revenue, expenses, net assets, officer compensation, and PDF links. For grant writers, donors, journalists, and compliance teams.",
        "version": "1.0",
        "x-build-id": "s6ZgTxFabeb2qgnIv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~propublica-nonprofit-crawler/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-propublica-nonprofit-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~propublica-nonprofit-crawler/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-propublica-nonprofit-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~propublica-nonprofit-crawler/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-propublica-nonprofit-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode",
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "mode": {
                        "title": "Crawl Mode",
                        "enum": [
                            "search",
                            "organizations"
                        ],
                        "type": "string",
                        "description": "Whether to search by criteria or fetch specific EINs.",
                        "default": "search"
                    },
                    "searchTerm": {
                        "title": "Search Term",
                        "type": "string",
                        "description": "Name or keyword to search for (search mode). Leave empty to browse all orgs matching the state/NTEE/subsection filters."
                    },
                    "state": {
                        "title": "State",
                        "type": "string",
                        "description": "Filter by US state (2-letter code, e.g., 'CA', 'NY'). Leave empty for all states. Search mode only."
                    },
                    "nteeCategory": {
                        "title": "NTEE Category",
                        "enum": [
                            "",
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7",
                            "8",
                            "9",
                            "10"
                        ],
                        "type": "string",
                        "description": "National Taxonomy of Exempt Entities top-level category (1-10). Search mode only."
                    },
                    "subsectionCode": {
                        "title": "501(c) Subsection",
                        "enum": [
                            "",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7",
                            "8",
                            "9",
                            "10",
                            "19"
                        ],
                        "type": "string",
                        "description": "IRS 501(c) subsection. Search mode only. Common values: 3 = 501(c)(3) charities, 4 = 501(c)(4) social welfare, 6 = 501(c)(6) business leagues."
                    },
                    "einList": {
                        "title": "EIN List",
                        "type": "array",
                        "description": "List of Employer Identification Numbers to fetch directly (e.g., ['13-1623888', '131623888']). Required in 'organizations' mode. Accepts with or without dashes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeFilings": {
                        "title": "Include Per-Filing Financial Data",
                        "type": "boolean",
                        "description": "When enabled, fetches the full organization detail for each search match and emits one row per tax year (with totrevenue, totassets, officer comp, PDF link, etc.). Otherwise emits one summary row per organization. Adds one request per organization.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of records to return. Each filing year counts as one record when includeFilings is on.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Select proxies. The ProPublica API does not require proxies."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
