IRS Form 990-PF Private Foundation Scraper - Grant Detail
IRS Form 990-PF Scraper — Private Foundation Grants
Parse IRS Form 990-PF filings for private foundation grant detail — recipient name, address, purpose, and dollar amount — directly from the IRS open-data portal. Covers ~120,000 private foundations filing annually. No API key, no proxy, no browser required.
What does the IRS Form 990-PF Scraper do?
Part XV is the schedule on Form 990-PF where private foundations disclose each grant recipient, the stated purpose, and the dollar amount paid. This scraper downloads the IRS bulk XML archives for a given filing year, filters for 990-PF returns, and parses every filing's Part XV grant rows alongside foundation header and financial data.
This actor targets Form 990-PF (private foundations) specifically. It is distinct from nonprofit scrapers that target Form 990 (public charities) — the schemas are different and the grant detail in Part XV is the core payload.
The IRS publishes 990-series XML files as bulk ZIP archives at irs.gov/charities-non-profits/form-990-series-downloads. Each archive contains thousands of XML files, one per return.
Estimated platform cost
The default memory is 2,048 MB and a full-year scan runs for approximately 1 hour. On Apify's standard compute pricing, a single full-year scan of all 990-PF filings costs roughly $2–4. Use maxItems and state/name filters to reduce scope and cost for targeted pulls.
What data does it extract?
Each record represents one foundation's 990-PF filing for a given tax year.
| Field | Type | Description |
|---|---|---|
foundation_ein |
string | Foundation EIN (9-digit) |
foundation_name |
string | Foundation legal name |
filing_year |
number | Tax year of this filing |
return_type |
string | Always 990PF |
foundation_address |
string | Street address |
foundation_city |
string | City |
foundation_state |
string | 2-letter state code |
foundation_zip |
string | ZIP code |
total_assets_eoy |
number | Total assets at year-end (USD) |
total_revenue |
number | Total revenue for the year (USD) |
total_grants_paid |
number | Qualifying distributions paid (USD) |
investment_income |
number | Net investment income (USD) |
excise_tax_paid |
number | Excise tax on investment income (USD) |
trustee_count |
number | Number of trustees/officers listed |
trustees |
array | name|title|compensation per trustee |
grant_count |
number | Number of Part XV grant recipients |
grants |
array | recipient|address|purpose|amount per grant — the primary payload |
source_xml_url |
string | IRS ZIP batch URL |
source_file |
string | XML filename within the ZIP |
scraped_at |
string | ISO 8601 scrape timestamp |
Which fields are populated in each mode:
grants_by_yearandfoundation_lookup— all fields populated includinggrantsarraygrants_by_recipient— same full schema; only foundations that have a Part XV entry matchingrecipientNameare returned- The
grantsarray is the main payload in all modes;grant_count: 0means the foundation reported no Part XV distributions in that year
How to use it
Three modes:
{
"mode": "grants_by_year",
"filingYear": 2024,
"stateFilter": "CA",
"minGrantAmount": 100000,
"maxItems": 50
}
{
"mode": "foundation_lookup",
"einList": ["13-1803509", "23-7129889"],
"filingYear": 2024
}
{
"mode": "grants_by_recipient",
"recipientName": "Red Cross",
"filingYear": 2024,
"maxItems": 20
}
| Field | Type | Description |
|---|---|---|
mode |
string | grants_by_year, foundation_lookup, or grants_by_recipient |
filingYear |
integer | Tax year to pull (e.g. 2024) |
einList |
array | EINs for foundation_lookup mode |
foundationName |
string | Filter by foundation name substring |
recipientName |
string | Filter by grant recipient name substring |
stateFilter |
string | Two-letter state code (e.g. CA) |
minGrantAmount |
integer | Only include foundations with total_grants_paid above this threshold |
maxItems |
integer | Maximum foundation records to return |
Use cases
- Grant writers — Identify which private foundations have funded projects in your sector. Use
grants_by_recipientwith a peer organization's name to find funders you haven't approached yet. - Foundation prospect research — Build a grant landscape for a client: which funders are active in a given state and sector, and how much are they distributing year over year.
- Nonprofit fundraising teams — Pull multi-year filings for target foundations to understand grant size patterns and cycles before making an approach.
- Grant-research SaaS platforms — Feed structured Part XV data into foundation search features without building an IRS XML parser.
- Journalism and investigation — Trace grant flows from a specific foundation across years and grantees to document funding patterns.
FAQ
Is IRS 990-PF data public? Yes. The IRS publishes all 990-series XML filings as open data under the TEOS (Tax-Exempt Organization Submission) program. No login or API key is required.
How current is the data? IRS publishes TEOS data for the current and prior tax years. Data for the most recent year typically appears a few months after year-end. Filings for 2024 are generally available by mid-2025.
What export formats are available?
Apify supports JSON, CSV, and Excel export from the dataset view. The grants array exports as a JSON column in CSV mode.