ProPublica APIprojects.propublica.org ↗
Search 1.9M+ US nonprofits by name, EIN, state, or NTEE category. Retrieve financials, tax filings, compensation, and grants via 3 structured endpoints.
What is the ProPublica API?
The ProPublica Nonprofit Explorer API provides structured access to over 1.9 million US nonprofit organizations across 3 endpoints. Use search_organizations to filter nonprofits by name, state, IRS subsection code, or NTEE category, and get_organization to retrieve full financial profiles including annual revenue, expenses, assets, liabilities, and multi-year tax filing records by EIN.
curl -X GET 'https://api.parse.bot/scraper/215c40f3-ec1f-432f-a891-57122947675c/search_organizations?ntee=1&page=0&limit=5&query=foundation' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace projects-propublica-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ProPublica Nonprofit Explorer SDK — search, detail, filings."""
from parse_apis.propublica_nonprofit_explorer_api import (
NonprofitExplorer,
NteeCategory,
OrganizationNotFound,
)
client = NonprofitExplorer()
# Search arts nonprofits (lightweight summaries) — limit= caps total items fetched.
for org in client.organizationsummaries.search(query="museum", ntee=NteeCategory.ARTS, limit=5):
print(org.name, org.state, org.ntee_code)
# Drill into one result's full profile via .details().
summary = client.organizationsummaries.search(query="red cross", limit=1).first()
if summary:
detail = summary.details()
print(detail.name, detail.city, detail.state, detail.revenue_amount)
# Walk its filings (already included in the detail response).
for filing in detail.filings_with_data[:3]:
print(filing.tax_prd_yr, filing.totrevenue, filing.totfuncexpns)
# Search with full details in one call (combines search + detail lookups).
for org in client.organizations.search(query="hospital", state="CA", limit=3):
print(org.name, org.city, org.asset_amount)
# Direct point-lookup by EIN when you already know it.
try:
org = client.organizations.get(ein="530196605")
print(org.name, org.asset_amount, org.ntee_code)
except OrganizationNotFound as exc:
print(f"EIN not found: {exc.ein}")
print("exercised: organizationsummaries.search / details / organizations.search / organizations.get / OrganizationNotFound")
Full-text search over US nonprofit organizations. Filters by state, NTEE major category, and IRS subsection code. Returns 25 results per upstream page; auto-paginates up to the requested limit. Each result is a lightweight summary (EIN, name, location, NTEE code, subsection); use get_organization for full financials and filings.
| Param | Type | Description |
|---|---|---|
| ntee | string | NTEE major category numeric ID filter. |
| page | integer | Page number (0-indexed). |
| limit | integer | Maximum number of results to return (auto-paginates if needed). |
| query | string | Search query — organization name, keyword, or EIN. |
| state | string | Two-letter US state code filter (e.g. 'NY', 'CA', 'TX'). |
| c_code | string | IRS subsection code filter (e.g. '3' for 501(c)(3), '4' for 501(c)(4)). |
{
"type": "object",
"fields": {
"page": "integer - starting page",
"num_pages": "integer - total pages available",
"organizations": "array of organization summary objects with ein, name, city, state, ntee_code, subseccd, score",
"total_results": "integer - total matching organizations",
"results_returned": "integer - number returned in this response"
}
}About the ProPublica API
What the API Covers
The API surfaces data from ProPublica's Nonprofit Explorer, a public database of IRS filings for US tax-exempt organizations. Coverage includes 501(c)(3) charities, 501(c)(4) social welfare organizations, and dozens of other subsection types. Each organization record includes core identifiers (ein, name, city, state, zipcode), classification metadata (ntee_code, subsection_code, classification_codes), and a ruling_date indicating when the IRS recognized the organization's tax-exempt status.
Endpoints and Key Parameters
search_organizations accepts a free-text query (name, keyword, or EIN), a two-letter state code, a numeric ntee major category ID (e.g., '1' for Arts, '2' for Education), and a c_code for IRS subsection filtering. Results default to 25 per page; the limit parameter triggers auto-pagination across pages. Each result includes ein, name, city, state, ntee_code, subseccd, and a relevance score.
get_organization takes a single ein (dashes stripped automatically) and returns the full organization object plus two filing arrays: filings_with_data contains extracted financial figures per tax year — totrevenue, totfuncexpns, totassetsend, totliabend, totcntrbgfts, totprgmrevn, and more — while filings_without_data lists years where a filing exists but financials were not extracted.
Combined Lookup
search_and_detail merges a search query with per-organization detail fetches in a single call, returning an array where each element contains both the full organization object and its filings_with_data. Because it issues multiple lookups internally, keeping limit small (under 10) reduces the chance of timeouts on large result sets.
The ProPublica API is a managed, monitored endpoint for projects.propublica.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when projects.propublica.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official projects.propublica.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Screen nonprofit grantees by pulling revenue, expenses, and assets from
filings_with_databefore disbursing funds. - Map the density of 501(c)(3) organizations by state using the
statefilter insearch_organizations. - Track year-over-year financial trends for a specific nonprofit by comparing
totrevenueandtotassetsendacross filing years fromget_organization. - Build a sector analysis tool by filtering nonprofits with the
nteeparameter across arts, education, health, and other major categories. - Identify large nonprofits in a region by sorting results on
totassetsendfrom combinedsearch_and_detailresponses. - Verify nonprofit status and EIN for compliance workflows using
get_organizationwith known EINs. - Filter 501(c)(4) social welfare organizations separately from charitable 501(c)(3)s using the
c_codeparameter.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ProPublica offer an official developer API for Nonprofit Explorer?+
What financial fields are available per tax filing, and are they available for every organization?+
filings_with_data returns fields including totrevenue, totfuncexpns, totassetsend, totliabend, totcntrbgfts, and totprgmrevn for years where IRS data was extracted. Some organizations have filings listed in filings_without_data where financial figures were not extracted — typically smaller organizations or those that filed paper returns that were not digitized.Does the API return executive compensation or individual grant data?+
get_organization endpoint description references compensation and grants as part of the filing data, but the specific compensation and grant line items are part of the broader filing object rather than top-level search filters. Granular compensation breakdowns by officer name are not surfaced as discrete response fields in the current endpoints. You can fork this API on Parse and revise it to extract and expose those sub-fields explicitly.Can I retrieve nonprofit data for organizations outside the United States?+
state filter accepts US state codes only. You can fork this API on Parse and revise it to incorporate additional international nonprofit data sources if needed.How does pagination work in `search_organizations`, and what is the maximum result size?+
page parameter is 0-indexed. The limit parameter triggers auto-pagination to assemble larger result sets, but very large limits may slow response times significantly. The num_pages and total_results fields in the response indicate how many records are available for a given query.