# US Grants Monitor 🇺🇸 (Grants.gov alerts + NIH award history) (`tagadanar/us-grants-monitor`) Actor

Track new US federal grant opportunities on Grants.gov by agency, topic or assistance listing number, and see who already won similar grants and how much on NIH RePORTER. Monitor mode alerts on new postings. No API key. Platform usage included.

- **URL**: https://apify.com/tagadanar/us-grants-monitor.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, Automation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 opportunity founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## US Grants Monitor: Grants.gov Alerts + NIH Award History

**Find fundable federal grant opportunities the day they post, and see who already won similar grants and how much.** One actor, two official US government sources: Grants.gov for open and forecasted opportunities, NIH RePORTER for the award history behind them (principal investigator, recipient organization, award amount, direct and indirect cost split). No API key, no subscription, one flat per-record price.

Built for **nonprofit grant writers, university research development offices, and anyone tracking federal funding for research or programs** (works out of the box via API and MCP).

### Why this actor

- Two sources most tools keep apart: grant opportunities on Grants.gov, and who actually won similar grants on NIH RePORTER. Run either one alone or both together in a single call.
- A real diff, not a re-export: monitor mode remembers the opportunities you have already seen and returns only what is new since your last run, the same pattern used across this profile's other government-data monitors.
- Fixed per-record price instead of a monthly plan: you pay for what you actually get, no seat count, no annual contract.
- Official sources, no key, no scraping: every field comes from Grants.gov's public search API and the National Institutes of Health's RePORTER API. No login, no third-party mirror.
- Flat schema either way: opportunity and award records share one dataset, tagged by type, so a spreadsheet or BI tool can consume them without any JSON spelunking.

### Use cases

- **Nonprofit grant writers**: watch the funding categories and agencies you apply to and get alerted the day a new opportunity opens.
- **University research development offices**: track ALN/CFDA numbers and agencies relevant to your departments, and check NIH RePORTER for what a similar proposal actually won before your researchers write theirs.
- **Program and development staff**: search by keyword across both current opportunities and past awards to size up a funding area before committing staff time to an application.
- **AI agents**: plug it into Claude, Cursor or any MCP client and ask, *"any new NSF opportunities on climate resilience this week, and what has NIH funded on that topic recently?"*

### Input

Search open opportunities:

```json
{
    "mode": "opportunities",
    "keywords": ["climate resilience"],
    "agencies": ["NSF", "NASA"],
    "oppStatuses": ["posted", "forecasted"],
    "maxResults": 25
}
````

Look up who already won similar NIH grants:

```json
{
    "mode": "awards",
    "keywords": ["climate resilience"],
    "activityCodes": ["R01"],
    "fiscalYears": [2025, 2026],
    "maxResults": 25
}
```

Both in one run, tagged by `recordType` in the same dataset:

```json
{
    "mode": "both",
    "keywords": ["rural broadband"],
    "maxResults": 25
}
```

Monitor an agency for a scheduled run:

```json
{
    "mode": "opportunities",
    "agencies": ["USDA"],
    "monitorMode": true,
    "webhookUrl": "https://hooks.slack.com/services/xxx/yyy/zzz"
}
```

Provide at least one of `keywords`, `agencies` or `alnNumbers` so the query is scoped. `agencies` uses two different vocabularies depending on mode: Grants.gov top-level agency codes (`NSF`, `NASA`, `HHS`, `USDA`, `DHS`, find the full list at `grants.gov/search-grants`) for opportunities, and NIH institute/center abbreviations (`NHLBI`, `NIEHS`, `NCI`) for award history. `alnNumbers` (Assistance Listing Numbers, formerly CFDA numbers) and `oppStatuses` apply to opportunities only. `activityCodes` (NIH mechanism codes like `R01`, `K01`, `U01`) and `fiscalYears` apply to award history only, and `fiscalYears` defaults to the current and previous year when left empty. `includeDetails` (on by default) fetches the full Grants.gov record per opportunity: award ceiling and floor, expected number of awards, and the full description, at one extra request per opportunity. Turn it off for a faster run with just the search-result fields.

### Output (one record per opportunity or award, tagged by `recordType`)

Opportunity:

```json
{
    "recordType": "opportunity",
    "opportunityId": "360298",
    "opportunityNumber": "HHS-2026-IHS-TMD-0001",
    "title": "Tribal Management Grant (TMG) Program",
    "agency": "Indian Health Service",
    "agencyCode": "HHS-IHS",
    "aln": ["93.228"],
    "openDate": "2026-07-17",
    "closeDate": "2026-08-28",
    "oppStatus": "posted",
    "awardCeiling": 300000,
    "awardFloor": 50,
    "expectedAwards": 16,
    "description": "The Tribal Management Grant program aims to prepare tribes and tribal organizations for assuming all or part of existing Indian Health Service program...",
    "lastUpdatedDate": "Jul 17, 2026 08:53:38 AM EDT",
    "url": "https://www.grants.gov/search-results-detail/360298",
    "changeType": null,
    "retrievedAt": "2026-07-17T19:49:00.625Z"
}
```

Award:

```json
{
    "recordType": "award",
    "projectNumber": "1R01HD117936-01",
    "title": "Heat Waves, Pediatric Readiness, and Child Outcomes: Risk, Mitigation, and Resilience in Emergency Care",
    "piNames": ["Craig D. Newgard"],
    "orgName": "OREGON HEALTH & SCIENCE UNIVERSITY",
    "orgUei": "NPSNT86JKN51",
    "fiscalYear": 2025,
    "awardAmount": 87026,
    "directCost": 55786,
    "indirectCost": 31240,
    "agency": "Eunice Kennedy Shriver National Institute of Child Health and Human Development",
    "activityCode": "R01",
    "projectStart": "2025-05-01",
    "projectEnd": "2025-09-30",
    "orgCity": "PORTLAND",
    "orgState": "OR",
    "url": "https://reporter.nih.gov/project-details/11105604",
    "retrievedAt": "2026-07-17T19:48:52.672Z"
}
```

| Field | Record type | Meaning |
|---|---|---|
| `recordType` | both | `opportunity` or `award` |
| `opportunityId` / `opportunityNumber` | opportunity | Grants.gov opportunity identifiers |
| `title` | both | Opportunity or project title |
| `agency` / `agencyCode` | opportunity | Funding agency |
| `aln` | opportunity | Assistance Listing / CFDA numbers |
| `openDate` / `closeDate` | opportunity | Application window |
| `oppStatus` | opportunity | `posted`, `forecasted`, `closed` or `archived` |
| `awardCeiling` / `awardFloor` | opportunity | Award size range in dollars, when Grants.gov publishes one |
| `expectedAwards` | opportunity | Number of awards the agency expects to make |
| `description` | opportunity | Full opportunity description, trimmed to ~2000 characters |
| `lastUpdatedDate` | opportunity | When Grants.gov last updated the listing |
| `changeType` | opportunity | Monitor mode: `new`; `null` on one-off runs |
| `projectNumber` | award | NIH project number |
| `piNames` | award | Principal investigator(s) |
| `orgName` / `orgUei` | award | Recipient organization and its Unique Entity Identifier |
| `fiscalYear` | award | Award fiscal year |
| `awardAmount` / `directCost` / `indirectCost` | award | Total award and its direct/indirect cost split, in dollars |
| `agency` | award | Funding NIH institute or center |
| `activityCode` | award | NIH mechanism code (`R01`, `K01`, ...) |
| `projectStart` / `projectEnd` | award | Project period |
| `orgCity` / `orgState` | award | Recipient location |
| `url` | both | Direct link to the opportunity page or the NIH RePORTER project page |
| `retrievedAt` | both | When this run fetched the record |

### Pricing

Pay per event, no subscription. Users on higher Apify plans get automatic discounts.

| Event | Price | When |
|---|---|---|
| Run started | **$0.001** | Flat, once per run |
| Opportunity found | **$0.004** | Per grant opportunity returned with its data |
| Award record | **$0.003** | Per NIH award history record returned |
| Digest sent | **$0.03** | Monitor mode only, per Slack/webhook digest actually posted |

In monitor mode, the persistent seen-set means you are never billed twice for the same opportunity: a scheduled run that finds nothing new only pays the flat run fee. That is the difference between this and a raw export that bills you for the whole result set on every run.

### FAQ

**How do I get alerted when a new NSF opportunity opens?** Put `NSF` in `agencies`, set `mode` to `opportunities`, turn on `monitorMode`, add a Slack webhook URL and schedule the actor. You get a digest only when NSF actually posts something new, and you are only charged for new opportunities.

**How do I find out what a similar grant actually paid?** Set `mode` to `awards`, put your topic in `keywords` and narrow with `activityCodes` (for example `R01` for an NIH research project grant) and `fiscalYears`. You get real award amounts, recipient organizations and principal investigators, not a funding range guess.

**Can I search opportunities and award history together?** Yes. Set `mode` to `both` and both record types come back in the same dataset, tagged by `recordType`.

**Is this data free?** The data is public: Grants.gov and NIH RePORTER are both official, keyless US government APIs. You pay only for this actor's convenience: the merged schema, the detail lookups, the diffing and the webhook alerts.

**Why do `agencies` values look different for opportunities and awards?** Grants.gov and NIH RePORTER use different agency vocabularies. Grants.gov identifies agencies by short top-level codes (`NSF`, `NASA`, `HHS`); NIH RePORTER identifies its institutes and centers by their own abbreviations (`NHLBI`, `NIEHS`). The same `agencies` list is passed to both, so it is most useful when you either run one mode at a time or already know both codes for your target agency.

**What does `includeDetails` change?** With it on (the default), each opportunity gets one extra Grants.gov request for its award ceiling and floor, expected number of awards, full description and last-updated date. With it off, you get only the fields available from the search result: title, agency, dates, status and ALN. Turn it off for a faster, lighter run when you just need to know what is open.

**Does it work with AI agents?** Yes. Like every Apify actor it is exposed via REST API and **MCP**, so Claude, Cursor and similar tools can call it directly, for instance to answer "what NIH institutes fund rural health research and how much did they award last year?"

***

### Something missing?

If you need an extra field, another source, or a different output, open an issue on this Actor and describe it. I read every request and small additions usually ship within days. More monitors and data Actors are on [my profile](https://apify.com/tagadanar), including the [Federal Register monitor](https://apify.com/tagadanar), a USAspending monitor, and a ClinicalTrials.gov monitor.

*Keywords: Grants.gov API, federal grants monitor, NIH RePORTER, grant opportunity alerts, grant award history, nonprofit grant writer tools, research development office, ALN CFDA lookup, R01 award amounts, federal funding tracker, NIH grant database, grant opportunity monitoring, US government grants for AI agents, MCP.*

# Actor input Schema

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

<code>opportunities</code> searches open/forecasted grant opportunities on Grants.gov. <code>awards</code> looks up who already won similar NIH grants and how much, on NIH RePORTER. <code>both</code> runs both and returns one dataset tagged by <code>recordType</code>.

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

Words or phrases to search, e.g. <code>climate resilience</code>, <code>rural broadband</code>. Used as the Grants.gov full-text search and the NIH RePORTER title/terms/abstract search. Multiple entries are combined with OR. Provide at least one of keywords, agencies or ALN numbers.

## `agencies` (type: `array`):

Funding agencies to scope the search to. For opportunities, Grants.gov top-level agency codes, e.g. <code>NSF</code>, <code>NASA</code>, <code>HHS</code>, <code>DHS</code> (find codes at <code>grants.gov/search-grants</code>). For award history, NIH institute/center abbreviations, e.g. <code>NHLBI</code>, <code>NIEHS</code> (a different vocabulary, so the same list is passed to both and matches what it can). Provide at least one of keywords, agencies or ALN numbers.

## `alnNumbers` (type: `array`):

Assistance Listing Numbers (formerly CFDA numbers) to filter Grants.gov opportunities, e.g. <code>93.859</code>, <code>47.041</code>. Not used for NIH award history. Provide at least one of keywords, agencies or ALN numbers.

## `oppStatuses` (type: `array`):

Which Grants.gov opportunity statuses to include. Opportunities only.

## `activityCodes` (type: `array`):

NIH award mechanism codes to filter award history, e.g. <code>R01</code>, <code>R21</code>, <code>K01</code>, <code>U01</code>. Award history only. Leave empty for all mechanisms.

## `fiscalYears` (type: `array`):

Fiscal years to search for award history, e.g. <code>2025</code>, <code>2026</code>. Award history only. Defaults to the current and previous fiscal year.

## `includeDetails` (type: `boolean`):

Fetch the full Grants.gov detail record for each opportunity (award ceiling/floor, expected number of awards, full description, last-updated date). One extra request per opportunity, capped by max results. Turn off for a faster, lighter run with only the search-result fields. Opportunities only.

## `maxResults` (type: `integer`):

Stop after collecting this many records per mode (so <code>both</code> can return up to this many opportunities and this many awards). Caps cost and runtime on broad queries.

## `monitorMode` (type: `boolean`):

Remember opportunities already seen across runs and return only new ones. Applies to grant opportunities only (award history is a point-in-time lookup, not a stream of new events, so it is never diffed). Built for a scheduled run: the first run establishes the baseline, later runs report and charge for new opportunities only.

## `webhookUrl` (type: `string`):

When monitor mode finds new opportunities, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{"text": "..."}</code> JSON).

## Actor input object example

```json
{
  "mode": "opportunities",
  "keywords": [
    "climate resilience"
  ],
  "agencies": [],
  "alnNumbers": [],
  "oppStatuses": [
    "posted",
    "forecasted"
  ],
  "activityCodes": [],
  "fiscalYears": [],
  "includeDetails": true,
  "maxResults": 25,
  "monitorMode": false
}
```

# Actor output Schema

## `records` (type: `string`):

One item per matched grant opportunity and/or award record in the default dataset.

# 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": "opportunities",
    "keywords": [
        "climate resilience"
    ],
    "agencies": [],
    "alnNumbers": [],
    "oppStatuses": [
        "posted",
        "forecasted"
    ],
    "activityCodes": [],
    "fiscalYears": [],
    "includeDetails": true,
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/us-grants-monitor").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": "opportunities",
    "keywords": ["climate resilience"],
    "agencies": [],
    "alnNumbers": [],
    "oppStatuses": [
        "posted",
        "forecasted",
    ],
    "activityCodes": [],
    "fiscalYears": [],
    "includeDetails": True,
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/us-grants-monitor").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": "opportunities",
  "keywords": [
    "climate resilience"
  ],
  "agencies": [],
  "alnNumbers": [],
  "oppStatuses": [
    "posted",
    "forecasted"
  ],
  "activityCodes": [],
  "fiscalYears": [],
  "includeDetails": true,
  "maxResults": 25
}' |
apify call tagadanar/us-grants-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "US Grants Monitor 🇺🇸 (Grants.gov alerts + NIH award history)",
        "description": "Track new US federal grant opportunities on Grants.gov by agency, topic or assistance listing number, and see who already won similar grants and how much on NIH RePORTER. Monitor mode alerts on new postings. No API key. Platform usage included.",
        "version": "0.1",
        "x-build-id": "LYBCLrOlT2LUXkbL5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~us-grants-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-us-grants-monitor",
                "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/tagadanar~us-grants-monitor/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-us-grants-monitor",
                "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/tagadanar~us-grants-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-us-grants-monitor",
                "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",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "opportunities",
                            "awards",
                            "both"
                        ],
                        "type": "string",
                        "description": "<code>opportunities</code> searches open/forecasted grant opportunities on Grants.gov. <code>awards</code> looks up who already won similar NIH grants and how much, on NIH RePORTER. <code>both</code> runs both and returns one dataset tagged by <code>recordType</code>.",
                        "default": "opportunities"
                    },
                    "keywords": {
                        "title": "Keywords / topics",
                        "type": "array",
                        "description": "Words or phrases to search, e.g. <code>climate resilience</code>, <code>rural broadband</code>. Used as the Grants.gov full-text search and the NIH RePORTER title/terms/abstract search. Multiple entries are combined with OR. Provide at least one of keywords, agencies or ALN numbers.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "agencies": {
                        "title": "Agencies",
                        "type": "array",
                        "description": "Funding agencies to scope the search to. For opportunities, Grants.gov top-level agency codes, e.g. <code>NSF</code>, <code>NASA</code>, <code>HHS</code>, <code>DHS</code> (find codes at <code>grants.gov/search-grants</code>). For award history, NIH institute/center abbreviations, e.g. <code>NHLBI</code>, <code>NIEHS</code> (a different vocabulary, so the same list is passed to both and matches what it can). Provide at least one of keywords, agencies or ALN numbers.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "alnNumbers": {
                        "title": "ALN / CFDA numbers",
                        "type": "array",
                        "description": "Assistance Listing Numbers (formerly CFDA numbers) to filter Grants.gov opportunities, e.g. <code>93.859</code>, <code>47.041</code>. Not used for NIH award history. Provide at least one of keywords, agencies or ALN numbers.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "oppStatuses": {
                        "title": "Opportunity statuses",
                        "type": "array",
                        "description": "Which Grants.gov opportunity statuses to include. Opportunities only.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "forecasted",
                                "posted",
                                "closed",
                                "archived"
                            ],
                            "enumTitles": [
                                "Forecasted (not yet open)",
                                "Posted (currently open)",
                                "Closed",
                                "Archived"
                            ]
                        },
                        "default": [
                            "posted",
                            "forecasted"
                        ]
                    },
                    "activityCodes": {
                        "title": "NIH activity codes",
                        "type": "array",
                        "description": "NIH award mechanism codes to filter award history, e.g. <code>R01</code>, <code>R21</code>, <code>K01</code>, <code>U01</code>. Award history only. Leave empty for all mechanisms.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fiscalYears": {
                        "title": "Fiscal years",
                        "type": "array",
                        "description": "Fiscal years to search for award history, e.g. <code>2025</code>, <code>2026</code>. Award history only. Defaults to the current and previous fiscal year.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Include opportunity details",
                        "type": "boolean",
                        "description": "Fetch the full Grants.gov detail record for each opportunity (award ceiling/floor, expected number of awards, full description, last-updated date). One extra request per opportunity, capped by max results. Turn off for a faster, lighter run with only the search-result fields. Opportunities only.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Max results per mode",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Stop after collecting this many records per mode (so <code>both</code> can return up to this many opportunities and this many awards). Caps cost and runtime on broad queries.",
                        "default": 50
                    },
                    "monitorMode": {
                        "title": "Monitor mode (alert on new opportunities only)",
                        "type": "boolean",
                        "description": "Remember opportunities already seen across runs and return only new ones. Applies to grant opportunities only (award history is a point-in-time lookup, not a stream of new events, so it is never diffed). Built for a scheduled run: the first run establishes the baseline, later runs report and charge for new opportunities only.",
                        "default": false
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (Slack-compatible)",
                        "type": "string",
                        "description": "When monitor mode finds new opportunities, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{\"text\": \"...\"}</code> JSON)."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
