# Grants.gov Federal Grant Crawler (`jungle_synthesizer/grants-gov-crawler`) Actor

Crawl federal grant opportunities from Grants.gov (posted, forecasted, closed, archived). Extract titles, agencies, CFDA numbers, funding amounts, eligibility, close dates, and grantor contacts. Filter by agency, category, instrument, eligibility, CFDA, keyword, or posted-date window.

- **URL**: https://apify.com/jungle\_synthesizer/grants-gov-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

## Grants.gov Federal Grant Opportunity Crawler

Crawl federal grant opportunities from [Grants.gov](https://www.grants.gov/) — the U.S. government's single source of truth for federal funding announcements. Returns the ~1,000 posted opportunities, ~700 forecasted, ~8,000 closed, and ~72,000 archived records, each with agency, CFDA numbers, funding amounts, eligibility rules, close dates, and grantor contact info.

### Grants.gov Crawler Features

- Queries all four opportunity status buckets: posted (active), forecasted, closed, and archived
- Filter by sub-agency code, CFDA / Assistance Listing number, funding category, funding instrument, eligibility type, keyword, or opportunity number
- Restrict to opportunities posted within the last 3 to 56 days when you only want what's new
- Two-phase enrichment — grabs the listing summary then pulls the full synopsis (description, funding amounts, eligible applicants, grantor contacts) on a second call
- Listing-only mode if you want titles and dates fast and don't need the full synopsis
- Returns 30+ structured fields per opportunity, including total program funding, award ceiling, award floor, and cost-sharing flag
- No authentication, no proxies, no browser — pure JSON API
- Pay-per-event pricing at roughly $1 per 1,000 records plus a $0.10 start fee

### Who Uses Federal Grant Data?

- **Nonprofits and 501(c)(3)s** — Build a pipeline of grants matching your program area and eligibility class
- **Universities and research offices** — Track NIH, NSF, DOE, and USDA funding opportunities by CFDA number and surface new research grants the day they post
- **Municipalities and tribal governments** — Monitor opportunities gated to state, county, city, or federally recognized tribal governments
- **Grant writers and consultants** — Pull filtered lists for client proposals, with award ceilings and close dates so you know which ones are worth the effort
- **Journalists and transparency researchers** — Track federal funding flows by agency and category without manually clicking through search pages
- **Database providers and grant-match platforms** — Backfill and incrementally refresh grant listings with structured, consistent records

### How Grants.gov Crawler Works

1. You configure filters: status bucket, agency, CFDA, funding category, instrument, eligibility, keyword, posted-date window, and sort order.
2. The crawler POSTs to the Grants.gov search2 endpoint, paginating at 100 records per page with a 150ms courtesy delay.
3. For each listing hit, it optionally POSTs to fetchOpportunity to pull the full synopsis — description, funding amounts, grantor contact info, eligibility details.
4. Each record is flattened into a clean output object and written to the Apify dataset.

### Input

#### Active grants posted in the last 14 days

```json
{
  "oppStatuses": "posted",
  "dateRange": "14",
  "fetchDetails": true,
  "maxItems": 100
}
````

#### Department of Energy research grants

```json
{
  "oppStatuses": "posted|forecasted",
  "keyword": "SBIR STTR",
  "fundingInstruments": ["G", "CA"],
  "fetchDetails": true,
  "maxItems": 50
}
```

#### Education opportunities eligible for state and local governments

```json
{
  "oppStatuses": "posted",
  "fundingCategories": ["ED"],
  "eligibilities": ["00", "01", "02"],
  "fetchDetails": true,
  "maxItems": 100
}
```

#### Single opportunity by number (no detail fetch)

```json
{
  "oppStatuses": "posted|forecasted|closed|archived",
  "oppNum": "P25AS00474",
  "fetchDetails": false,
  "maxItems": 1
}
```

#### Listing-only scan for fast keyword triage

```json
{
  "oppStatuses": "posted",
  "keyword": "cybersecurity",
  "fetchDetails": false,
  "maxItems": 200
}
```

#### Input Parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| keyword | string | `""` | Full-text search across opportunity titles and descriptions. |
| oppStatuses | string | `"posted"` | Pipe-separated status list: `posted`, `forecasted`, `closed`, `archived`. Mix freely, e.g. `"posted\|closed"`. |
| agencies | string | `""` | Pipe-separated sub-agency codes (e.g. `USDA-AMS\|DOD-AFRL`). Sub-agency level only — top-level codes like `USDA` do not cascade because every record is tagged with a sub-agency. |
| cfda | string | `""` | Pipe-separated CFDA / Assistance Listing numbers (e.g. `15.931\|10.170`). |
| fundingCategories | string\[] | all | Category codes: `AG`, `ED`, `HL`, `ENV`, `ISS`, `HO`, `ELT`, etc. |
| fundingInstruments | string\[] | all | `G` (Grant), `CA` (Cooperative Agreement), `PC` (Procurement Contract), `O` (Other). |
| eligibilities | string\[] | all | Applicant eligibility codes — state govts (`00`), counties (`01`), 501(c)(3) nonprofits (`12`), small businesses (`23`), etc. |
| oppNum | string | `""` | Specific opportunity number (e.g. `P25AS00474`). Filters to a single record. |
| dateRange | string | `""` | Posted-within-last-N-days: `3`, `7`, `14`, `21`, `28`, `35`, `42`, `49`, `56`. |
| sortBy | string | relevance | `openDate\|desc`, `closeDate\|asc`, `title\|asc`, `agencyCode\|asc`. |
| fetchDetails | boolean | `true` | Fetch full synopsis (description, funding amounts, eligibility, contacts) per record. Roughly doubles crawl time but returns complete records. |
| maxItems | integer | `100` | Maximum number of opportunities to return. |

### Grants.gov Crawler Output Fields

```json
{
  "opportunity_id": 357994,
  "opportunity_number": "P25AS00474",
  "opportunity_title": "FY2025 NAGPRA Repatriation Grants",
  "agency_code": "DOI-NPS",
  "agency_name": "National Park Service",
  "top_agency_code": "DOI",
  "top_agency_name": "Department of the Interior",
  "funding_instrument_type": "Grant",
  "category_of_funding_activity": "Other",
  "funding_activity_category_explanation": "NAGPRA Repatriation",
  "cfda_numbers": ["15.922"],
  "eligible_applicants": [
    "Native American tribal governments (Federally recognized)",
    "Nonprofits having a 501(c)(3) status with the IRS",
    "Private institutions of higher education",
    "Public and State controlled institutions of higher education",
    "State governments"
  ],
  "additional_information_on_eligibility": "Eligible: Indian Tribes, Native Hawaiian Organizations, and museums within the United States that have complied with NAGPRA.",
  "post_date": "2025-01-03",
  "close_date": "2026-05-08",
  "archive_date": "2026-09-30",
  "estimated_total_program_funding": 3407000,
  "award_ceiling": 25000,
  "award_floor": 1000,
  "expected_number_of_awards": null,
  "description": "The Native American Graves Protection and Repatriation Act of 1990 authorizes the Secretary of the Interior to make grants to museums, Indian Tribes, and Native Hawaiian organizations...",
  "cost_sharing_or_matching": false,
  "grantor_contact_email": "nagpra_grants@nps.gov",
  "grantor_contact_name": "National Park Service",
  "grantor_contact_phone": "303-495-027",
  "grantor_contact_description": "Jim Modrick nagpra_grants@nps.gov",
  "opportunity_status": "posted",
  "doc_type": "synopsis",
  "created_date": "2025-03-28",
  "last_updated_date": "2025-01-13",
  "url": "https://www.grants.gov/search-results-detail/357994"
}
```

| Field | Type | Description |
|-------|------|-------------|
| opportunity\_id | integer | Unique Grants.gov identifier. |
| opportunity\_number | string | Agency-assigned opportunity number (e.g. `P25AS00474`). |
| opportunity\_title | string | Opportunity title. |
| agency\_code | string | Sub-agency code (e.g. `DOI-NPS`, `USDA-AMS`). |
| agency\_name | string | Sub-agency name. |
| top\_agency\_code | string | Top-level agency code (e.g. `DOI`, `DOD`, `USDA`). |
| top\_agency\_name | string | Top-level agency name. |
| funding\_instrument\_type | string | Semicolon-joined instrument list (Grant, Cooperative Agreement, Procurement Contract, Other). |
| category\_of\_funding\_activity | string | Semicolon-joined funding-activity categories. |
| funding\_activity\_category\_explanation | string | Explanation of "Other" category when applicable. |
| cfda\_numbers | string\[] | CFDA / Assistance Listing numbers. |
| eligible\_applicants | string\[] | Expanded applicant eligibility descriptions. |
| additional\_information\_on\_eligibility | string | Free-text eligibility details (HTML stripped). |
| post\_date | string | Posted date (`YYYY-MM-DD`). |
| close\_date | string | Application close / response date. |
| archive\_date | string | Archive date. |
| estimated\_total\_program\_funding | number | Total program funding in US dollars, or null. |
| award\_ceiling | number | Maximum per-award amount in US dollars, or null. |
| award\_floor | number | Minimum per-award amount in US dollars, or null. |
| expected\_number\_of\_awards | integer | Expected number of awards, or null when not published. |
| description | string | Full synopsis description (HTML stripped). Populated when `fetchDetails: true`. |
| cost\_sharing\_or\_matching | boolean | Whether cost sharing or matching is required. |
| grantor\_contact\_email | string | Grantor point-of-contact email. |
| grantor\_contact\_name | string | Grantor point-of-contact name. |
| grantor\_contact\_phone | string | Grantor point-of-contact phone. |
| grantor\_contact\_description | string | Free-text grantor contact description. |
| opportunity\_status | string | `posted`, `forecasted`, `closed`, or `archived`. |
| doc\_type | string | Document type (`synopsis`, `forecast`, `modification`). |
| created\_date | string | Record creation date. |
| last\_updated\_date | string | Last update date. |
| url | string | Direct link to the opportunity on grants.gov. |

Fields that only come from the detail endpoint (description, funding amounts, eligibility, grantor contact) will be empty or null when `fetchDetails: false`.

### FAQ

#### How do I scrape Grants.gov?

Grants.gov Crawler hits the official JSON API directly. You pick a status bucket, optionally layer in filters (agency, CFDA, category, eligibility, keyword, date window), and let it paginate. No HTML parsing, no browser, no guessing at selectors that break every other Tuesday.

#### How much does Grants.gov Crawler cost to run?

Grants.gov Crawler uses standard pay-per-event pricing: $0.10 per run start plus $0.001 per record. A 1,000-record crawl costs $1.10.

#### Can I filter by agency?

Grants.gov Crawler accepts sub-agency codes in pipe-separated form (e.g. `USDA-AMS|DOD-AFRL|DOI-NPS`). Top-level codes like `USDA` don't cascade because every opportunity is tagged with a sub-agency code, not a root code — that's how Grants.gov works, not a crawler quirk.

#### What data does Grants.gov Crawler return?

Grants.gov Crawler returns 30+ fields per opportunity, including the opportunity number, title, awarding agency, CFDA numbers, funding instrument, total program funding, award ceiling and floor, eligibility descriptions, grantor contact info, and close dates. With `fetchDetails: true` you get the full synopsis description; without it you get the lean listing summary.

#### Do I need an API key?

Grants.gov Crawler does not require an API key. The Grants.gov v1 search and fetch endpoints are fully public — no authentication, no rate limits, no DEMO\_KEY theatrics.

#### Does Grants.gov Crawler need proxies?

Grants.gov Crawler doesn't need proxies. It's a public government API with no anti-bot measures, which is as rare as it sounds.

### Need More Features?

Need custom fields, filters, or a different target site? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use Grants.gov Crawler?

- **Affordable** — $0.001 per record plus a $0.10 start fee
- **Complete** — Returns both the listing summary and full synopsis in one run, so you don't have to glue two data sources together later
- **Fast and clean** — Pure API, no browser, no proxies, no captchas — a 1,000-record detailed run completes in under an hour

# 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.

## `keyword` (type: `string`):

Full-text search across opportunity titles and descriptions.

## `oppStatuses` (type: `string`):

Pipe-separated status list. Default: posted (active opportunities only).

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

Pipe-separated sub-agency codes (e.g. USDA-AMS|DOD-AFRL). Sub-agency level codes only — top-level codes like USDA do not cascade. Leave blank for all agencies.

## `cfda` (type: `string`):

Pipe-separated CFDA numbers (e.g. 15.931|10.170). Leave blank for all.

## `fundingCategories` (type: `array`):

Filter by category of funding activity. Leave empty for all.

## `fundingInstruments` (type: `array`):

Filter by type of financial assistance. Leave empty for all.

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

Filter by applicant eligibility type. Leave empty for all.

## `oppNum` (type: `string`):

Specific opportunity number (e.g. P25AS00474). Filters to a single record.

## `dateRange` (type: `string`):

Restrict to opportunities posted within the last N days. Leave empty for no date restriction.

## `sortBy` (type: `string`):

Sort order for listing results.

## `fetchDetails` (type: `boolean`):

When enabled, fetches full synopsis (description, funding amounts, eligibility, grantor contact) for each opportunity via a second API call. When disabled, only returns the lean listing summary. Detail fetches roughly double crawl time.

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

Maximum number of grant opportunities to return.

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

Select proxies. Grants.gov is a government API and 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...",
  "oppStatuses": "posted",
  "fundingCategories": [],
  "fundingInstruments": [],
  "eligibilities": [],
  "fetchDetails": 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...",
    "keyword": "",
    "oppStatuses": "posted",
    "agencies": "",
    "cfda": "",
    "fundingCategories": [],
    "fundingInstruments": [],
    "eligibilities": [],
    "oppNum": "",
    "dateRange": "",
    "sortBy": "",
    "fetchDetails": true,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/grants-gov-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...",
    "keyword": "",
    "oppStatuses": "posted",
    "agencies": "",
    "cfda": "",
    "fundingCategories": [],
    "fundingInstruments": [],
    "eligibilities": [],
    "oppNum": "",
    "dateRange": "",
    "sortBy": "",
    "fetchDetails": True,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/grants-gov-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...",
  "keyword": "",
  "oppStatuses": "posted",
  "agencies": "",
  "cfda": "",
  "fundingCategories": [],
  "fundingInstruments": [],
  "eligibilities": [],
  "oppNum": "",
  "dateRange": "",
  "sortBy": "",
  "fetchDetails": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/grants-gov-crawler --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Grants.gov Federal Grant Crawler",
        "description": "Crawl federal grant opportunities from Grants.gov (posted, forecasted, closed, archived). Extract titles, agencies, CFDA numbers, funding amounts, eligibility, close dates, and grantor contacts. Filter by agency, category, instrument, eligibility, CFDA, keyword, or posted-date window.",
        "version": "1.0",
        "x-build-id": "1vsui5aFsvcELUKdD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~grants-gov-crawler/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-grants-gov-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~grants-gov-crawler/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-grants-gov-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~grants-gov-crawler/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-grants-gov-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": [
                    "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."
                    },
                    "keyword": {
                        "title": "Search Keyword",
                        "type": "string",
                        "description": "Full-text search across opportunity titles and descriptions."
                    },
                    "oppStatuses": {
                        "title": "Opportunity Status",
                        "enum": [
                            "posted",
                            "forecasted",
                            "posted|forecasted",
                            "closed",
                            "archived",
                            "posted|closed",
                            "posted|forecasted|closed|archived"
                        ],
                        "type": "string",
                        "description": "Pipe-separated status list. Default: posted (active opportunities only)."
                    },
                    "agencies": {
                        "title": "Agencies",
                        "type": "string",
                        "description": "Pipe-separated sub-agency codes (e.g. USDA-AMS|DOD-AFRL). Sub-agency level codes only — top-level codes like USDA do not cascade. Leave blank for all agencies."
                    },
                    "cfda": {
                        "title": "CFDA / Assistance Listing Numbers",
                        "type": "string",
                        "description": "Pipe-separated CFDA numbers (e.g. 15.931|10.170). Leave blank for all."
                    },
                    "fundingCategories": {
                        "title": "Funding Categories",
                        "type": "array",
                        "description": "Filter by category of funding activity. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ACA",
                                "AG",
                                "AR",
                                "BC",
                                "CD",
                                "CP",
                                "DPR",
                                "ED",
                                "ELT",
                                "EN",
                                "EIC",
                                "ENV",
                                "FN",
                                "HL",
                                "HO",
                                "HU",
                                "ISS",
                                "IS",
                                "IIJ",
                                "LJL",
                                "NR",
                                "OZ",
                                "O",
                                "RA",
                                "RD",
                                "ST",
                                "T",
                                "HOU"
                            ],
                            "enumTitles": [
                                "Affordable Care Act",
                                "Agriculture",
                                "Arts",
                                "Business and Commerce",
                                "Community Development",
                                "Consumer Protection",
                                "Disaster Prevention and Relief",
                                "Education",
                                "Employment, Labor and Training",
                                "Energy",
                                "Energy Infrastructure and Critical Minerals (EICMM)",
                                "Environment",
                                "Food and Nutrition",
                                "Health",
                                "Housing",
                                "Humanities",
                                "Income Security and Social Services",
                                "Information and Statistics",
                                "Infrastructure Investment and Jobs Act (IIJA)",
                                "Law, Justice and Legal Services",
                                "Natural Resources",
                                "Opportunity Zone Benefits",
                                "Other",
                                "Recovery Act",
                                "Regional Development",
                                "Science and Technology",
                                "Transportation",
                                "Housing Assistance"
                            ]
                        }
                    },
                    "fundingInstruments": {
                        "title": "Funding Instruments",
                        "type": "array",
                        "description": "Filter by type of financial assistance. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "G",
                                "CA",
                                "PC",
                                "O"
                            ],
                            "enumTitles": [
                                "Grant",
                                "Cooperative Agreement",
                                "Procurement Contract",
                                "Other"
                            ]
                        }
                    },
                    "eligibilities": {
                        "title": "Eligible Applicants",
                        "type": "array",
                        "description": "Filter by applicant eligibility type. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "00",
                                "01",
                                "02",
                                "04",
                                "05",
                                "06",
                                "07",
                                "08",
                                "11",
                                "12",
                                "13",
                                "20",
                                "21",
                                "22",
                                "23",
                                "25",
                                "99"
                            ],
                            "enumTitles": [
                                "State governments",
                                "County governments",
                                "City or township governments",
                                "Special district governments",
                                "Independent school districts",
                                "Public and State controlled higher ed",
                                "Federally recognized Tribal governments",
                                "Public housing authorities",
                                "Non-federally recognized Tribal organizations",
                                "501(c)(3) nonprofits (non-higher-ed)",
                                "Non-501(c)(3) nonprofits (non-higher-ed)",
                                "Private institutions of higher education",
                                "Individuals",
                                "For-profit organizations (non-small-business)",
                                "Small businesses",
                                "Others (see Additional Information)",
                                "Unrestricted"
                            ]
                        }
                    },
                    "oppNum": {
                        "title": "Opportunity Number",
                        "type": "string",
                        "description": "Specific opportunity number (e.g. P25AS00474). Filters to a single record."
                    },
                    "dateRange": {
                        "title": "Posted Within Last N Days",
                        "enum": [
                            "",
                            "3",
                            "7",
                            "14",
                            "21",
                            "28",
                            "35",
                            "42",
                            "49",
                            "56"
                        ],
                        "type": "string",
                        "description": "Restrict to opportunities posted within the last N days. Leave empty for no date restriction."
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "",
                            "openDate|desc",
                            "openDate|asc",
                            "closeDate|desc",
                            "closeDate|asc",
                            "title|asc",
                            "agencyCode|asc"
                        ],
                        "type": "string",
                        "description": "Sort order for listing results."
                    },
                    "fetchDetails": {
                        "title": "Fetch Full Opportunity Details",
                        "type": "boolean",
                        "description": "When enabled, fetches full synopsis (description, funding amounts, eligibility, grantor contact) for each opportunity via a second API call. When disabled, only returns the lean listing summary. Detail fetches roughly double crawl time.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of grant opportunities to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Select proxies. Grants.gov is a government API and 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
