# Grant & Foundation Funding Intel - Grants.gov + 990-PF (`seibs.co/grant-funding-intel`) Actor

Federal grant opportunities (Grants.gov) + private-foundation giving (IRS 990-PF via ProPublica) in one schema. Funder, eligibility/recipient, amount, focus area, deadline. Funder-to-recipient enrichment, giving history, funder-match scoring, monitor mode. For grant writers and nonprofits.

- **URL**: https://apify.com/seibs.co/grant-funding-intel.md
- **Developed by:** [Seibs.co](https://apify.com/seibs.co) (community)
- **Categories:** Business, Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 funding 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/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

## Grant & Foundation Funding Intel

**Federal grant opportunities and private-foundation giving in one normalized schema.**
Candid's Foundation Directory Online paywalls the funder graph; the underlying IRS
Form 990-PF data is public but fragmented and hard to assemble. This actor unifies
two public sources - **Grants.gov** (federal opportunities) and **IRS Form 990 / 990-PF
via ProPublica Nonprofit Explorer** (foundation giving) - into one queryable feed of
funders, eligibility, amounts, focus areas, and deadlines.

Built for **grant writers, nonprofits, and fiscal sponsors** hunting non-dilutive
funding.

---

### What it does

| Mode | What you get | Source |
|---|---|---|
| `grant_search` | Open federal grant opportunities by keyword, agency, eligibility, or funding category - with award range, eligibility, and deadline. | Grants.gov Search2 API |
| `foundation_search` | Private foundations by name, state, focus area, or size - optionally with multi-year giving history. | IRS 990-PF via ProPublica |
| `funder_profile` | Deep profile of specific funders (foundation EINs and/or federal agency codes): multi-year giving trend, payout vs the 5% minimum, asset trend, and recipient-level grant awards. | ProPublica + Grants.gov + 990-PF XML |
| `funder_match` | The funders most likely to fund your cause - federal opportunities and foundations scored against a cause / focus area / region / size, with transparent match reasons. | Both, scored |

All four emit the **same normalized record**: `funder`, `recipient_or_eligibility`,
`amount` / `amount_min` / `amount_max`, `focus_area`, `deadline`, `source`,
`source_url`.

---

### Quick start

**Find open federal education grants for nonprofits:**
```json
{
  "mode": "grant_search",
  "keywords": ["literacy"],
  "funding_categories": ["education"],
  "eligibilities": ["nonprofits_with_501c3"],
  "opp_statuses": "posted",
  "max_results_per_query": 25
}
````

**Profile a foundation's giving history:**

```json
{
  "mode": "funder_profile",
  "eins": ["56-2618866"],
  "include_giving_history": true
}
```

**Find foundations likely to fund your project:**

```json
{
  "mode": "funder_match",
  "cause": "after-school literacy in rural Ohio",
  "focus_area": "Education",
  "states": ["OH"],
  "min_assets": 5000000,
  "include_giving_history": true
}
```

**Search private foundations by focus + state:**

```json
{
  "mode": "foundation_search",
  "keywords": ["community foundation"],
  "states": ["CA"],
  "ntee_major": ["2"],
  "include_giving_history": true
}
```

***

### Output schema (normalized)

| Field | Meaning |
|---|---|
| `record_type` | `grant_opportunity` | `funder` | `grant_award` | `funder_match` |
| `funder_name` / `funder_type` | Federal agency or foundation; `federal_agency` | `private_foundation` |
| `funder_ein` / `funder_state` | Foundation identity |
| `title` | Opportunity title or grant purpose |
| `recipient_or_eligibility` | Who can apply (opportunity) or who received the grant (award) |
| `amount` / `amount_min` / `amount_max` / `amount_label` | Award floor/ceiling, grant amount, or annual giving |
| `focus_area` / `focus_categories` | Funding category (opportunity) or NTEE focus (foundation) |
| `deadline` | Application close date (opportunities) |
| `giving_history` | Multi-year grants paid, payout ratio, asset trend (foundations) |
| `match_score` / `match_reasons` | Funder-match ranking + transparent reasons |
| `source` / `source_url` | Provenance, back to the official record |

Dataset **views**: `overview` (AI-agent skim), `opportunities` (open federal grants),
`funders` (foundation funders).

***

### Recipient-level grant awards (990-PF Part XV)

The list of *who a foundation actually funded* (recipient, place, purpose, amount)
lives in **Part XV of Form 990-PF**. ProPublica exposes the giving *totals*; the
per-recipient lines live in the e-file XML.

The IRS now serves machine-readable 990s only as **per-year bulk ZIPs** (the old AWS
S3 per-filing bucket is frozen at 2021), so live per-filing recipient extraction is
gated behind the bulk corpus - that gating is exactly the value. In `funder_profile`
mode, supply `irs_xml_url` pointing at a specific 990-PF e-file XML and the actor
parses its Part XV lines into `grant_award` records. Without it, you still get the
funder's full giving history and a note explaining the gate.

***

### Pricing (pay-per-event)

| Event | Price | When |
|---|---|---|
| `funder_record` | $0.006 | Per normalized record (opportunity, funder, or award) |
| `grant_history_enrichment` | $0.012 | Per foundation enriched with multi-year giving history, or per Part XV award extraction |
| `funder_match` | $0.015 | Per scored funder-match result |
| `scheduled_delta_run` | $0.050 | Per scheduled monitor run (new-opportunity / new-grant digest) |

A focused `grant_search` for 25 opportunities costs ~$0.15. A `funder_profile` of one
foundation with giving history costs ~$0.018.

***

### Monitor mode (new-opportunity alerts)

Save this actor as a task and put it on a schedule. On scheduled runs it computes the
delta against the previous run (new opportunities, changed deadlines, new grants) and,
if you set `slack_webhook_url`, posts a digest to Slack. Grant cycles are recurring -
this is the recurring value.

***

### Sources & access

- **Grants.gov Search2 / fetchOpportunity** - public REST API, no key, logged-out.
  Covers every federal grant-making agency.
- **IRS Form 990 / 990-PF via ProPublica Nonprofit Explorer API** - public REST API,
  no key, logged-out. Structured 990-PF financials (grants paid, assets, qualifying
  distributions) for 501(c)(3) nonprofits and private foundations.
- **IRS 990-PF e-file XML** - public; recipient-level Part XV lines, parsed when an
  `irs_xml_url` is supplied.

**Legal & responsible use.** Public filings and public feeds only - logged-out, no
accounts, no API keys, no paywalls. PII is minimized: agency contacts and 990-PF
recipient/related-person names are public record; the actor keeps name + place +
purpose + amount and never enriches into private contact data. Always verify deadlines
and eligibility against the official source before applying.

***

### AI agents & MCP

A paired **MCP server** (`mcp-grant-funding-intel`) exposes these capabilities as
AI-agent tools (`search_grants`, `find_funders`, `profile_funder`, `match_funders`),
and is x402 (USDC on Base) and Skyfire agentic-payment ready. The dataset's `overview`
view and the MCP-compatible output link are built for direct LLM tool-call wiring.

# Actor input Schema

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

grant\_search = federal grant opportunities (Grants.gov). foundation\_search = private foundations (990-PF) by name/state/focus/size. funder\_profile = deep profile of specific funders (EINs + agency codes) with multi-year giving history. funder\_match = surface + score funders most likely to fund a cause/region.

## `keywords` (type: `array`):

Search terms. grant\_search: matches opportunity title/description (e.g. 'workforce development'). foundation\_search: matches foundation name. Hard cap of 20.

## `agencies` (type: `string`):

Pipe-separated Grants.gov agency codes for grant\_search / funder\_profile, e.g. 'NSF' or 'HHS|ED|USDA'. Leave blank for all agencies.

## `eligibilities` (type: `array`):

Who can apply (grant\_search). Plain tokens or Grants.gov codes. Common: nonprofits\_with\_501c3, public\_higher\_education, state\_governments, city\_or\_township\_governments, individuals, small\_businesses, indian\_tribal\_governments. Hard cap of 20.

## `funding_categories` (type: `array`):

Funding activity category (grant\_search / funder\_match). Plain tokens or Grants.gov codes. Common: education, health, housing, environment, arts, community\_development, employment\_labor\_and\_training, food\_and\_nutrition, science\_and\_technology. Hard cap of 20.

## `opp_statuses` (type: `string`):

Pipe-separated Grants.gov statuses for grant\_search: posted, forecasted, closed, archived. Default 'posted' (open opportunities).

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

Two-letter state codes. foundation\_search/funder\_match: filter foundations by state of domicile (e.g. \['CA','NY']). Hard cap of 51 (50 states + DC).

## `ntee_major` (type: `array`):

ProPublica NTEE major-group ids for foundation\_search (1=Arts, 2=Education, 3=Environment/Animals, 4=Health, 5=Human Services, 6=International, 7=Public/Societal Benefit, 8=Religion). Numbers only.

## `min_assets` (type: `integer`):

Only surface foundations whose latest fair-market asset value meets this floor (foundation\_search/funder\_match). Requires include\_giving\_history to filter on enriched assets. Leave 0 for no floor.

## `eins` (type: `array`):

Employer Identification Numbers of foundations to deep-profile (e.g. \['56-2618866']). Each yields a funder record + multi-year giving history. Hard cap of 50.

## `cause` (type: `string`):

Free-text description of what you need funded (funder\_match), e.g. 'after-school literacy program in rural Ohio'. Drives federal-opportunity keyword + foundation matching.

## `focus_area` (type: `string`):

Target focus area for funder\_match, e.g. 'Education', 'Health', 'Human Services', 'Environment'. Maps to NTEE buckets for foundation matching.

## `irs_xml_url` (type: `string`):

Optional. URL to a specific 990-PF e-file XML document. When supplied, recipient-level Part XV grant lines are parsed into grant\_award records. The IRS serves machine-readable 990s only as per-year bulk ZIPs, so live per-filing extraction is gated; this lets you point at one filing.

## `include_giving_history` (type: `boolean`):

For foundations, fetch the full 990-PF filing series and compute year-over-year grants paid, payout ratio vs the 5% minimum, asset trend, and giving direction. Adds grant\_history\_enrichment PPE per foundation. On by default in funder\_profile.

## `include_opportunity_detail` (type: `boolean`):

Fetch each opportunity's detail page for award floor/ceiling, eligibility text, funding categories, and deadlines. Off = faster, metadata-only rows.

## `max_results_per_query` (type: `integer`):

Hard cap on records returned per keyword/search. Default 25.

## `contact_email` (type: `string`):

Optional contact email added to the outbound User-Agent so the public APIs can reach you. Not required; not stored.

## `slack_webhook_url` (type: `string`):

Optional. When this actor runs on a schedule, post a new-opportunity / new-grant digest to this Slack incoming webhook. Adds scheduled\_delta\_run PPE on scheduled runs only.

## `use_apify_proxy` (type: `boolean`):

Route requests through Apify Proxy. DATACENTER is sufficient - Grants.gov and ProPublica are public APIs that do not block datacenter IPs.

## `apify_proxy_groups` (type: `array`):

Apify Proxy groups. DATACENTER is fine for both upstreams.

## `concurrency` (type: `integer`):

Parallel requests to the upstream public APIs. Capped at 8 to stay polite.

## Actor input object example

```json
{
  "mode": "grant_search",
  "keywords": [
    "education"
  ],
  "agencies": "",
  "eligibilities": [],
  "funding_categories": [],
  "opp_statuses": "posted",
  "states": [],
  "ntee_major": [],
  "min_assets": 0,
  "eins": [],
  "cause": "youth literacy",
  "focus_area": "Education",
  "irs_xml_url": "",
  "include_giving_history": false,
  "include_opportunity_detail": true,
  "max_results_per_query": 10,
  "contact_email": "",
  "slack_webhook_url": "",
  "use_apify_proxy": true,
  "apify_proxy_groups": [
    "DATACENTER"
  ],
  "concurrency": 5
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Narrow, token-efficient slice of every record. Consumer: LLM agents (Claude, GPT, LangChain tools), MCP hosts, dashboards. Fields: type, funder, title/purpose, eligibility/recipient, amount, focus, deadline, source, URL.

## `datasetItemsOpportunities` (type: `string`):

Federal grant opportunities with award range, eligibility, and deadline. Consumer: grant writers, nonprofits, fiscal sponsors building a pipeline.

## `datasetItemsFunders` (type: `string`):

Private foundations with latest grants paid, payout ratio, and focus area. Consumer: prospect-research teams building a funder list.

## `datasetItemsMcp` (type: `string`):

First 50 overview records as a clean JSON array. Wrap on the agent side in an MCP tool-call response envelope, e.g. `{ "ok": true, "data": <this array>, "meta": { "actor": "grant-funding-intel", "count": <len>, "view": "overview" } }`. Consumer: MCP servers, Claude Desktop, Cursor, OpenAI Assistants tool calls.

## `datasetItemsCsv` (type: `string`):

Spreadsheet-friendly export of the overview view. Consumer: humans, grant-ops teams, Excel / Google Sheets users.

# 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 = {
    "mode": "grant_search",
    "keywords": [
        "education"
    ],
    "opp_statuses": "posted",
    "cause": "youth literacy",
    "focus_area": "Education",
    "max_results_per_query": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("seibs.co/grant-funding-intel").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 = {
    "mode": "grant_search",
    "keywords": ["education"],
    "opp_statuses": "posted",
    "cause": "youth literacy",
    "focus_area": "Education",
    "max_results_per_query": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("seibs.co/grant-funding-intel").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 '{
  "mode": "grant_search",
  "keywords": [
    "education"
  ],
  "opp_statuses": "posted",
  "cause": "youth literacy",
  "focus_area": "Education",
  "max_results_per_query": 10
}' |
apify call seibs.co/grant-funding-intel --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=seibs.co/grant-funding-intel",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Grant & Foundation Funding Intel - Grants.gov + 990-PF",
        "description": "Federal grant opportunities (Grants.gov) + private-foundation giving (IRS 990-PF via ProPublica) in one schema. Funder, eligibility/recipient, amount, focus area, deadline. Funder-to-recipient enrichment, giving history, funder-match scoring, monitor mode. For grant writers and nonprofits.",
        "version": "0.1",
        "x-build-id": "HbkzjEFoGylX8oNKc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/seibs.co~grant-funding-intel/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-seibs.co-grant-funding-intel",
                "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/seibs.co~grant-funding-intel/runs": {
            "post": {
                "operationId": "runs-sync-seibs.co-grant-funding-intel",
                "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/seibs.co~grant-funding-intel/run-sync": {
            "post": {
                "operationId": "run-sync-seibs.co-grant-funding-intel",
                "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"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "grant_search",
                            "foundation_search",
                            "funder_profile",
                            "funder_match"
                        ],
                        "type": "string",
                        "description": "grant_search = federal grant opportunities (Grants.gov). foundation_search = private foundations (990-PF) by name/state/focus/size. funder_profile = deep profile of specific funders (EINs + agency codes) with multi-year giving history. funder_match = surface + score funders most likely to fund a cause/region.",
                        "default": "grant_search"
                    },
                    "keywords": {
                        "title": "Keywords",
                        "maxItems": 20,
                        "type": "array",
                        "description": "Search terms. grant_search: matches opportunity title/description (e.g. 'workforce development'). foundation_search: matches foundation name. Hard cap of 20.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "agencies": {
                        "title": "Federal agency codes (Grants.gov)",
                        "type": "string",
                        "description": "Pipe-separated Grants.gov agency codes for grant_search / funder_profile, e.g. 'NSF' or 'HHS|ED|USDA'. Leave blank for all agencies.",
                        "default": ""
                    },
                    "eligibilities": {
                        "title": "Eligibility filter",
                        "maxItems": 20,
                        "type": "array",
                        "description": "Who can apply (grant_search). Plain tokens or Grants.gov codes. Common: nonprofits_with_501c3, public_higher_education, state_governments, city_or_township_governments, individuals, small_businesses, indian_tribal_governments. Hard cap of 20.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "funding_categories": {
                        "title": "Funding category filter",
                        "maxItems": 20,
                        "type": "array",
                        "description": "Funding activity category (grant_search / funder_match). Plain tokens or Grants.gov codes. Common: education, health, housing, environment, arts, community_development, employment_labor_and_training, food_and_nutrition, science_and_technology. Hard cap of 20.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "opp_statuses": {
                        "title": "Opportunity statuses (Grants.gov)",
                        "type": "string",
                        "description": "Pipe-separated Grants.gov statuses for grant_search: posted, forecasted, closed, archived. Default 'posted' (open opportunities).",
                        "default": "posted"
                    },
                    "states": {
                        "title": "States",
                        "maxItems": 51,
                        "type": "array",
                        "description": "Two-letter state codes. foundation_search/funder_match: filter foundations by state of domicile (e.g. ['CA','NY']). Hard cap of 51 (50 states + DC).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "ntee_major": {
                        "title": "NTEE major group (foundation focus)",
                        "type": "array",
                        "description": "ProPublica NTEE major-group ids for foundation_search (1=Arts, 2=Education, 3=Environment/Animals, 4=Health, 5=Human Services, 6=International, 7=Public/Societal Benefit, 8=Religion). Numbers only.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "min_assets": {
                        "title": "Minimum foundation assets (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only surface foundations whose latest fair-market asset value meets this floor (foundation_search/funder_match). Requires include_giving_history to filter on enriched assets. Leave 0 for no floor.",
                        "default": 0
                    },
                    "eins": {
                        "title": "Foundation EINs (funder_profile)",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Employer Identification Numbers of foundations to deep-profile (e.g. ['56-2618866']). Each yields a funder record + multi-year giving history. Hard cap of 50.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "cause": {
                        "title": "Cause / project (funder_match)",
                        "type": "string",
                        "description": "Free-text description of what you need funded (funder_match), e.g. 'after-school literacy program in rural Ohio'. Drives federal-opportunity keyword + foundation matching.",
                        "default": ""
                    },
                    "focus_area": {
                        "title": "Focus area (funder_match)",
                        "type": "string",
                        "description": "Target focus area for funder_match, e.g. 'Education', 'Health', 'Human Services', 'Environment'. Maps to NTEE buckets for foundation matching.",
                        "default": ""
                    },
                    "irs_xml_url": {
                        "title": "990-PF e-file XML URL (funder_profile, optional)",
                        "type": "string",
                        "description": "Optional. URL to a specific 990-PF e-file XML document. When supplied, recipient-level Part XV grant lines are parsed into grant_award records. The IRS serves machine-readable 990s only as per-year bulk ZIPs, so live per-filing extraction is gated; this lets you point at one filing.",
                        "default": ""
                    },
                    "include_giving_history": {
                        "title": "Include multi-year giving history",
                        "type": "boolean",
                        "description": "For foundations, fetch the full 990-PF filing series and compute year-over-year grants paid, payout ratio vs the 5% minimum, asset trend, and giving direction. Adds grant_history_enrichment PPE per foundation. On by default in funder_profile.",
                        "default": false
                    },
                    "include_opportunity_detail": {
                        "title": "Fetch full opportunity detail (Grants.gov)",
                        "type": "boolean",
                        "description": "Fetch each opportunity's detail page for award floor/ceiling, eligibility text, funding categories, and deadlines. Off = faster, metadata-only rows.",
                        "default": true
                    },
                    "max_results_per_query": {
                        "title": "Max results per query",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Hard cap on records returned per keyword/search. Default 25.",
                        "default": 25
                    },
                    "contact_email": {
                        "title": "Contact email (optional, polite User-Agent)",
                        "type": "string",
                        "description": "Optional contact email added to the outbound User-Agent so the public APIs can reach you. Not required; not stored.",
                        "default": ""
                    },
                    "slack_webhook_url": {
                        "title": "Slack webhook (monitor mode)",
                        "type": "string",
                        "description": "Optional. When this actor runs on a schedule, post a new-opportunity / new-grant digest to this Slack incoming webhook. Adds scheduled_delta_run PPE on scheduled runs only.",
                        "default": ""
                    },
                    "use_apify_proxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Route requests through Apify Proxy. DATACENTER is sufficient - Grants.gov and ProPublica are public APIs that do not block datacenter IPs.",
                        "default": true
                    },
                    "apify_proxy_groups": {
                        "title": "Proxy groups",
                        "type": "array",
                        "description": "Apify Proxy groups. DATACENTER is fine for both upstreams.",
                        "default": [
                            "DATACENTER"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "concurrency": {
                        "title": "Max concurrent requests",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Parallel requests to the upstream public APIs. Capped at 8 to stay polite.",
                        "default": 5
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
