# Foundation Grants Finder: IRS 990-PF Funders (`tatonicventures/foundation-grants-990pf`) Actor

Find private foundations that fund your cause. From IRS 990-PF e-file data: grants paid (recipient, state, purpose, amount) plus funder assets, giving, application contact, deadlines and restrictions. Filter by state, keyword, amount. No login or API key.

- **URL**: https://apify.com/tatonicventures/foundation-grants-990pf.md
- **Developed by:** [Nels Tate](https://apify.com/tatonicventures) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Foundation Grants Finder: IRS 990-PF Funders, Grants Paid & How to Apply

**Find private foundations that already fund work like yours, see exactly who they gave money to, and learn how to apply.** This Actor reads the IRS's own Form 990-PF e-file data and turns it into two clean tables: **funder profiles** (assets, total giving, application contact, deadlines, restrictions, invite-only flag) and **individual grants** (recipient, city, state, purpose, amount).

No login, no API key, no third-party database subscription. The source is public US government data, straight from the IRS.

### Who uses it

- **Nonprofit development teams and grant writers** building a prospect list: "Which Colorado foundations gave to youth mentoring programs in Colorado last year, and how big were the grants?"
- **Grant consultants and fundraising agencies** researching funders for many clients at once.
- **Researchers and journalists** analyzing philanthropic flows by state, cause or funder.
- **CRM and prospect-research tools** that need fresh, structured funder data through an API.

### What data you get

**Funder profile** (one row per foundation, latest filing):

| Field | Example |
|---|---|
| foundationName, foundationEin, city/state | THE COLORADO HEALTH FOUNDATION, 742568941, DENVER CO |
| website | WWW.COLORADOHEALTH.ORG |
| fmvAssetsEndOfYear | 2,893,236,966 |
| totalGrantsPaid / totalGrantsApprovedFuture | 102,222,360 / ... |
| onlyContributesToPreselected | `true` = invite-only, don't send unsolicited proposals |
| applicationDeadlines, applicationRestrictions, applicationFormAndMaterials | "GRANT APPLICATION DEADLINES: FEBRUARY 15, JUNE 15, AND OCTOBER..." |
| applicationAddress / applicationPhone / applicationEmail | as printed on the return |
| grantsListedCount, matchingGrantsCount, matchingGrantsTotal, topRecipientStates | for quick fit scoring |

**Grant row** (one row per grant paid or approved for future payment): foundation, recipient name, recipient city/state/zip, recipient foundation status (PC, GOV...), purpose, amount, tax year, and the IRS object ID so every row is traceable to the source filing.

### How to use

1. Pick a **foundation state** (e.g. `CO`), and/or **name keywords**, and/or specific **EINs**.
2. Optionally filter grants by **recipient state**, **purpose keywords** (e.g. `YOUTH`, `FOOD BANK`, `ARTS`) and **minimum amount**.
3. Choose output: funder profiles, grants, or both. Run. Export to CSV, Excel, JSON, or connect via API, Zapier, Make or Google Sheets.

Foundations are processed **largest first** (by assets on the IRS Business Master File), so a small `maxFoundations` still gets you the biggest funders.

#### Example input

```json
{
  "foundationStates": ["CO"],
  "recipientStates": ["CO"],
  "purposeKeywords": ["YOUTH", "MENTOR"],
  "outputType": "both",
  "maxFoundations": 50,
  "skipPreselectedOnlyFunders": true
}
```

#### Example output (grant row)

```json
{
  "recordType": "grant",
  "foundationName": "THE COLORADO HEALTH FOUNDATION",
  "foundationWebsite": "WWW.COLORADOHEALTH.ORG",
  "taxYear": "2024",
  "grantStatus": "approvedFuture",
  "recipientName": "WOMEN'S FOUNDATION OF COLORADO",
  "recipientCity": "DENVER",
  "recipientState": "CO",
  "recipientFoundationStatus": "PC",
  "purpose": "COMMUNITY SOLUTIONS",
  "amount": 8500000,
  "irsObjectId": "202533219349107083"
}
```

### Why this Actor is different

- **Direct from the IRS e-file XML**, not scraped from a third-party site. We read individual returns out of the IRS's 100 MB-1 GB monthly ZIP batches with HTTP range requests, so runs are fast (a 15-foundation state run took about 30 seconds in our tests) and cheap.
- **How-to-apply data included**: deadlines, restrictions, required materials and the invite-only flag, the fields grant seekers actually need.
- **Privacy by default**: grants that appear to go to private individuals (e.g. scholarships listed by student name) are excluded unless you opt in, and person names of application contacts are omitted unless you opt in.
- Handles IRS quirks automatically: split batches the index mislabels, Deflate64-compressed archives, and "see attached" grant lists (flagged as `grantsListedInAttachment`).

### Pricing

Pay per result: you pay for each **funder profile** and each **grant row** delivered (see the Pricing tab for current prices). No subscription. Filters run before you are charged, so you only pay for rows that match.

### Limitations

- The IRS publishes e-filed returns with a lag; the latest filing per foundation is usually for the tax year one to two years back.
- Some large foundations attach their grant list as a PDF instead of itemizing it in the XML. For those you get the funder profile and totals, flagged with `grantsListedInAttachment: true`.
- Paper-filed returns are not in the IRS e-file dataset.
- Data is reproduced as filed. Always confirm current guidelines on the funder's website before applying.

### Is this legal?

Form 990-PF returns are public by law (26 U.S.C. 6104) and the IRS publishes the e-file data for bulk download. This Actor uses only that public government data and excludes data about private individuals by default.

### FAQ

**Can I search by cause?** Yes: use `purposeKeywords`, which match the grant purpose text and recipient name.

**Can I get every foundation in a state?** Yes, raise `maxFoundations`. Colorado has about 2,300 private foundations on the IRS Business Master File.

**Does it include public charities or community foundations?** No. This Actor covers private foundations (Form 990-PF), which are the main source of foundation grants.

# Actor input Schema

## `foundationStates` (type: `array`):

Find private foundations headquartered in these US states (2-letter codes, e.g. CO, CA, NY). Foundations are processed largest first, by assets on the IRS Business Master File.

## `foundationNameKeywords` (type: `array`):

Keep foundations whose IRS name contains any of these words (case-insensitive), e.g. 'FAMILY FOUNDATION', 'BOETTCHER'. Combined with states using AND.

## `foundationEins` (type: `array`):

Specific foundations by EIN (9 digits, dashes optional). Always included, regardless of other filters.

## `recipientStates` (type: `array`):

Only output grants paid to recipients in these states, e.g. CO. Leave empty for all.

## `purposeKeywords` (type: `array`):

Only output grants whose purpose or recipient name contains any of these words, e.g. YOUTH, MENTOR, FOOD BANK, ARTS.

## `minGrantAmount` (type: `integer`):

Skip grants smaller than this.

## `outputType` (type: `string`):

Funder profiles include assets, total giving, application contact, deadlines and restrictions. Grant rows list each grant paid (recipient, city, state, purpose, amount).

## `filingYears` (type: `array`):

IRS e-file index years to search (the year the IRS processed the return; 2024 or later). The latest filing per foundation is used.

## `maxFoundations` (type: `integer`):

Maximum number of foundations to process in this run.

## `maxGrantsPerFoundation` (type: `integer`):

Keep only the largest N matching grants per foundation. 0 = no limit.

## `skipPreselectedOnlyFunders` (type: `boolean`):

Foundations that check the 990-PF box 'only makes contributions to preselected charitable organizations and does not accept unsolicited requests' are skipped.

## `includeIndividualRecipients` (type: `boolean`):

By default grants that appear to go to private individuals (e.g. scholarships listed by person name) are excluded to avoid collecting personal data.

## `includeContactPersonNames` (type: `boolean`):

By default, if the application contact is a person rather than an organization, the name is omitted (address, phone and email of the foundation's application contact are still returned).

## Actor input object example

```json
{
  "foundationStates": [
    "CO"
  ],
  "recipientStates": [
    "CO"
  ],
  "minGrantAmount": 0,
  "outputType": "both",
  "filingYears": [
    "2026",
    "2025"
  ],
  "maxFoundations": 25,
  "maxGrantsPerFoundation": 0,
  "skipPreselectedOnlyFunders": false,
  "includeIndividualRecipients": false,
  "includeContactPersonNames": false
}
```

# Actor output Schema

## `grants` (type: `string`):

No description

## `funders` (type: `string`):

No description

## `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 = {
    "foundationStates": [
        "CO"
    ],
    "recipientStates": [
        "CO"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tatonicventures/foundation-grants-990pf").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 = {
    "foundationStates": ["CO"],
    "recipientStates": ["CO"],
}

# Run the Actor and wait for it to finish
run = client.actor("tatonicventures/foundation-grants-990pf").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 '{
  "foundationStates": [
    "CO"
  ],
  "recipientStates": [
    "CO"
  ]
}' |
apify call tatonicventures/foundation-grants-990pf --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tatonicventures/foundation-grants-990pf"
        }
    }
}
```

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/9q6qp14PdSXL7VfWm/builds/J2lGgQC6sMbeLPshs/openapi.json
