# Grants.gov Scraper - Federal Grant Opportunities Monitor (`monriah-studio/grants-gov-opportunities`) Actor

Federal grant opportunities from the official Grants.gov API. Search by keyword, agency, eligibility and category, get award ceiling, close date, eligibility and contact, and get only new grants on each scheduled run. No login, no proxy.

- **URL**: https://apify.com/monriah-studio/grants-gov-opportunities.md
- **Developed by:** [MonRiah Studio](https://apify.com/monriah-studio) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 grant opportunity results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Grants.gov Scraper - Federal Grant Opportunities Monitor

A 25-result test run with the default input ("education" grants posted in the last 30 days) costs about $0.05 ($0.002 per result, plus a $0.00005 start fee). Apify's free plan includes monthly platform credit.

**Find federal grants before your competitors do.** This Actor searches the official **Grants.gov** database of U.S. federal funding opportunities and returns **one clean row per opportunity**: title, agency, opportunity number, status, posted and close dates, Assistance Listing (ALN/CFDA) numbers and a direct link to the Grants.gov page. Turn on **full details** to add the synopsis, award ceiling and floor, estimated total funding, expected number of awards, cost sharing, eligible applicant types, eligibility notes and the agency contact. Turn on **change detection** and each scheduled run returns **only the grants that are new since the last run**.

It uses only the free public Grants.gov API (`search2` and `fetchOpportunity`). No login, no API key, no proxy, no browser.

### What it does

- Searches **forecasted and posted** opportunities (closed and archived too, if you want them), newest first.
- Filters by **keywords**, **agency** (a top-level code like `HHS` includes every sub-agency, e.g. NIH, CDC, HRSA), **eligible applicant type** (nonprofits, small businesses, tribes, local governments, universities and more), **funding category** and **posted within the last N days**.
- **Full details** (`includeDetails`): synopsis as plain text, `awardCeiling`, `awardFloor`, `estimatedTotalFunding`, `expectedNumberOfAwards` as numbers, `costSharing`, eligibility, close date notes, contact name, email and phone, the link to the full announcement, and estimated post and award dates for forecasts.
- **Change detection** (`onlyNewSinceLastRun`): remembers opportunity IDs for each search in a named key-value store, so a daily schedule becomes a new-grant alert and you only pay for new grants.
- Writes a `SUMMARY` record with the search parameters, total matches and delivered counts.

### Use cases

- **Grant writers and grant consultants**: run a daily search per client (by keyword, agency and eligibility) and send new matches to email, Slack or a Google Sheet. Bill clients for a grant-prospecting service without copying from Grants.gov by hand.
- **Nonprofits**: watch for grants your 501(c)(3) can apply for (eligibility code `12`) in your program areas, and see award size and deadline at a glance.
- **Small businesses and startups**: track SBIR/STTR-style and other opportunities open to small businesses (code `23`) from NSF, DOE, NIH, USDA and others.
- **Universities and research offices**: monitor NIH, NSF and DOE funding announcements and forecasts for faculty.
- **Local governments, school districts and tribes**: catch infrastructure, education and public safety funding early, including **forecasted** grants that aren't open yet.
- **GovTech, grant-matching apps and AI agents**: feed a clean, structured federal grants dataset into your product, CRM or LLM pipeline through the Apify API or MCP server.

### Input example

```json
{
  "keywords": ["rural health", "broadband"],
  "oppStatuses": ["forecasted", "posted"],
  "agencies": ["HHS", "USDA"],
  "eligibilities": ["12", "23"],
  "fundingCategories": ["HL"],
  "postedWithinDays": 30,
  "includeDetails": true,
  "maxResults": 100,
  "onlyNewSinceLastRun": true
}
```

- `keywords`: several terms are combined with OR; multi-word terms are searched as a phrase. Use `[]` for all opportunities.
- `oppStatuses`: `forecasted` (announced, not open yet), `posted` (open now), `closed`, `archived`. Default: forecasted + posted.
- `agencies`: Grants.gov agency codes such as `HHS`, `NSF`, `ED`, `USDA`, `DOE`, `DOD`, `USDOJ`, `DOI`, `EPA`, or sub-agencies such as `HHS-NIH11` (NIH) or `HHS-HRSA`.
- `eligibilities`: applicant type codes, e.g. `12` nonprofits with 501(c)(3), `23` small businesses, `00` state, `01` county, `02` city or township, `05` school districts, `06` public universities, `07` federally recognized tribes, `25` others, `99` unrestricted.
- `fundingCategories`: e.g. `ED` education, `HL` health, `ST` science and technology, `CD` community development, `AG` agriculture, `EN` energy, `ENV` environment, `AR` arts, `HU` humanities, `T` transportation.
- `postedWithinDays` (default 30, `0` = any date), `maxResults` (default 25, up to 5,000).

With empty input the Actor runs the example search (keyword `education`, forecasted + posted, last 30 days, 25 results) in a few seconds.

### Output example

With `includeDetails: true`:

```json
{
  "opportunityId": "364120",
  "opportunityNumber": "HHS-2027-ACL-AOA-INNU-0014",
  "title": "Evaluating Innovative Community Based Nutrition Models that Improve Health Outcomes for Older Adults in Senior Nutrition Programs",
  "agencyCode": "HHS-ACL",
  "agencyName": "Administration for Community Living",
  "topAgencyName": "Department of Health and Human Services",
  "status": "forecasted",
  "docType": "forecast",
  "postedDate": "2026-10-19",
  "closeDate": "2027-04-30",
  "alnNumbers": ["93.045"],
  "url": "https://www.grants.gov/search-results-detail/364120",
  "category": "Discretionary",
  "synopsis": "The purpose of this Notice of Funding Opportunity is to support innovative, community-based nutrition and healthy aging models...",
  "awardCeiling": 439520,
  "awardFloor": 400000,
  "estimatedTotalFunding": 2197600,
  "expectedNumberOfAwards": 5,
  "costSharing": true,
  "fundingInstruments": ["Cooperative Agreement"],
  "fundingCategories": ["Health"],
  "eligibleApplicants": ["State governments", "County governments", "Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education", "..."],
  "eligibilityCodes": ["00", "01", "12", "..."],
  "eligibilityDetails": "Foreign entities are not eligible to compete for, or receive, awards made under this announcement...",
  "fiscalYear": 2027,
  "estimatedPostDate": "2027-03-01",
  "estimatedAwardDate": "2027-06-01",
  "contactName": "Kari Benson",
  "contactEmail": "AoA.OAA@acl.hhs.gov",
  "contactPhone": "202-401-4634",
  "additionalInfoUrl": "https://acl.gov/grants/open-opportunities",
  "programs": [{ "aln": "93.045", "programTitle": "Special Programs for the Aging, Title III, Part C, Nutrition Services" }],
  "isNew": true,
  "scrapedAt": "2026-10-19T19:24:17.489Z"
}
```

Without details, each row has `opportunityId, opportunityNumber, title, agencyCode, agencyName, status, docType, postedDate, closeDate, alnNumbers, url, isNew, scrapedAt`. Dates are ISO (`YYYY-MM-DD`) and amounts are numbers. For forecasts, `closeDate` is the agency's estimated application due date. Export to JSON, CSV or Excel, or connect webhooks, Google Sheets, Slack, Zapier, Make or n8n.

### Pricing

Pay per result: **$2 per 1,000 opportunities delivered** (`result` event, $0.002 per opportunity), **with or without full details**. Apify also charges a tiny Actor-start event ($0.00005 per run per GB of memory). Opportunities skipped by change detection are **not charged**.

Examples:

- A daily new-grant alert for one client with about 5 new matches a day: about **$0.30 a month**.
- A one-off export of 1,000 open federal grants with full details: **$2**.
- Ten client searches run daily with change detection, about 50 new grants a day in total: about **$3 a month**.

### FAQ

**Is this official data?** Yes. Every row comes from the public Grants.gov API run by the U.S. Department of Health and Human Services, and `url` links to the opportunity page on Grants.gov.

**How fresh is it?** The Actor queries Grants.gov live on every run. Agencies post new opportunities every business day, so a daily schedule is a good fit.

**How does change detection work?** Opportunity IDs are stored per search in the key-value store named by `stateStoreName`. The first run outputs everything and sets the baseline, and later runs output only opportunities that weren't returned before. Change the store name to start fresh.

**What's the difference between forecasted and posted?** A forecast announces a grant the agency plans to open, with estimated dates and amounts. Posted opportunities are open for applications now. Watching forecasts gives you weeks or months of lead time.

**Why is `awardFloor` or `awardCeiling` null?** Some agencies enter "none" or leave the field blank. The full announcement (`additionalInfoUrl` or the Grants.gov page) has the detail.

**Does it cover foundation or state grants?** No, it covers federal opportunities listed on Grants.gov only.

**Can I apply through this Actor?** No. It finds and tracks opportunities. You apply on Grants.gov (or the agency's system) as usual.

*Not affiliated with Grants.gov or the U.S. government.*

### Use from an AI agent

You can give this Actor to an AI agent as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) (`https://mcp.apify.com`), from Claude, Cursor, VS Code and other MCP clients. Add the server with only this Actor loaded:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=monriah-studio/grants-gov-opportunities"
    }
  }
}
```

On first connection your browser opens to sign in to Apify (OAuth). Or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }` to use your API token instead. Then ask your agent something like "Find federal education grants posted in the last 30 days".

You can also call it directly via the [Apify API](https://docs.apify.com/api/v2), for example to run it and get the results in one request:

```bash
curl -X POST "https://api.apify.com/v2/acts/monriah-studio~grants-gov-opportunities/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "keywords": ["education"],
  "oppStatuses": ["forecasted", "posted"],
  "postedWithinDays": 30,
  "maxResults": 25
}'
```

### More actors from MonRiah Studio

- [Greenhouse, Lever, Ashby & Workday Jobs Scraper](https://apify.com/monriah-studio/ats-hiring-signals): open roles and hiring signals from 6 ATS job boards, with change detection.
- [SEC Form 4 Insider Trading Scraper](https://apify.com/monriah-studio/sec-form4-insider-trades): insider trading data from official SEC EDGAR Form 4 filings.
- [RSS Feed Scraper & Monitor](https://apify.com/monriah-studio/rss-feed-monitor): RSS to JSON for any RSS or Atom feed, with new-item change detection.
- [Journalist Requests Scraper](https://apify.com/monriah-studio/journalist-requests): live #journorequest and PR source requests from Bluesky and Mastodon, a HARO alternative.
- [Bluesky Mentions Monitor](https://apify.com/monriah-studio/bluesky-mentions): brand, keyword and hashtag mentions on Bluesky, with engagement, sentiment and only-new alerts.

# Actor input Schema

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

Full-text search terms (title, description, opportunity number). Several terms are combined with OR. Multi-word terms are searched as a phrase. Empty = all opportunities matching the other filters.

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

Forecasted = announced but not open yet. Posted = open for applications now.

## `postedWithinDays` (type: `integer`):

Only opportunities posted (or forecast) in the last N days. 0 = any date.

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

Grants.gov agency codes, e.g. HHS, NSF, ED, USDA, DOE, DOJ is USDOJ, NIH is HHS-NIH11. A top-level code (HHS) also matches all its sub-agencies. Empty = all agencies.

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

Keep opportunities open to any of these applicant types. Empty = any.

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

Keep opportunities in any of these funding activity categories. Empty = any.

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

Open each opportunity for synopsis, award ceiling/floor, estimated funding, number of awards, close date notes, eligibility text and agency contact. Slower (one extra request per opportunity), same price.

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

Hard cap on opportunities written to the dataset in this run (newest first).

## `onlyNewSinceLastRun` (type: `boolean`):

Change detection: output only opportunities not seen before for this same search. State is kept in a named key-value store.

## `stateStoreName` (type: `string`):

Named key-value store used when onlyNewSinceLastRun is on. Rename it to start fresh.

## Actor input object example

```json
{
  "keywords": [
    "education"
  ],
  "oppStatuses": [
    "forecasted",
    "posted"
  ],
  "postedWithinDays": 30,
  "agencies": [],
  "eligibilities": [],
  "fundingCategories": [],
  "includeDetails": false,
  "maxResults": 25,
  "onlyNewSinceLastRun": false,
  "stateStoreName": "grants-gov-opportunities-state"
}
```

# Actor output Schema

## `results` (type: `string`):

All opportunities delivered by this run.

## `summary` (type: `string`):

JSON record SUMMARY: scrapedAt, search parameters, totalMatches, totalDelivered and detail errors.

# 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 = {
    "keywords": [
        "education"
    ],
    "oppStatuses": [
        "forecasted",
        "posted"
    ],
    "postedWithinDays": 30,
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("monriah-studio/grants-gov-opportunities").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 = {
    "keywords": ["education"],
    "oppStatuses": [
        "forecasted",
        "posted",
    ],
    "postedWithinDays": 30,
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("monriah-studio/grants-gov-opportunities").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "education"
  ],
  "oppStatuses": [
    "forecasted",
    "posted"
  ],
  "postedWithinDays": 30,
  "maxResults": 25
}' |
apify call monriah-studio/grants-gov-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,monriah-studio/grants-gov-opportunities"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wHWPC0W6mF9yMkCza/builds/gw66ZtoTgMOTYFdLM/openapi.json
