# Grants.gov Scraper - Federal Grant Opportunities (`publicrecords101/grants-gov-scraper`) Actor

Extract federal grant opportunities from Grants.gov with deadlines, award amounts, eligibility and agency contacts. Filter by keyword, agency, category and eligibility. Official data, no API key needed.

- **URL**: https://apify.com/publicrecords101/grants-gov-scraper.md
- **Developed by:** [Public Records Data Tools](https://apify.com/publicrecords101) (community)
- **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 opportunities

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/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

### What does the Grants.gov Scraper do?

The **Grants.gov Scraper** extracts **federal grant opportunities** from [Grants.gov](https://www.grants.gov), the official
US government site for federal grants. For each opportunity you get the **application deadline**, **award ceiling and
floor**, **total funding**, **eligible applicant types**, the funding agency, the description and the agency contact,
as clean JSON, CSV or Excel.

It reads Grants.gov's official public API, so there is **no login and no API key**. The easiest way to try it: type a
keyword such as `broadband` or `cancer research`, press **Start**, and you get the newest open opportunities first.

### What data can you extract from Grants.gov?

| Field | Example |
|---|---|
| `title` | Tribal Broadband Connectivity Program |
| `opportunityNumber` | 2026-NTIA-TBCP |
| `status` | posted (also forecasted, closed, archived) |
| `agencyName`, `parentAgencyName` | DOC NIST ERA, Department of Commerce |
| `postedDate`, `closeDate` | 2026-06-17, 2026-11-17 |
| `closeDateNote` | Agency notes on the deadline, e.g. rolling submissions |
| `estimatedTotalFunding`, `awardCeiling`, `awardFloor` | 5000000, 600000, 450000 (USD) |
| `expectedNumberOfAwards` | 150 |
| `costSharingRequired` | false |
| `eligibleApplicants` | Small businesses, State governments, ... |
| `eligibilityNotes`, `description` | Plain text, HTML removed |
| `fundingInstruments`, `fundingCategories` | Grant; Health |
| `assistanceListings` | 11.029 Tribal Broadband Connectivity Program |
| `contactName`, `contactEmail`, `contactPhone` | The agency's grants contact |
| `estimatedPostDate`, `estimatedAwardDate`, `fiscalYear` | For forecasted opportunities |
| `url` | Link to the opportunity on Grants.gov |

Every field is described in the Actor's output schema. Dates are `YYYY-MM-DD`, amounts are numbers in USD.

### Who uses Grants.gov data?

- **Grant writers and consultants** who track new opportunities for their clients every day.
- **Nonprofits, universities, cities and tribes** looking for funding they are eligible for.
- **Small businesses** searching for SBIR, research and economic development funding.
- **Market and policy researchers** analysing where federal funding goes.
- **AI agents and assistants** that answer "what grants can my organisation apply for?"

### How to use the Grants.gov Scraper

1. Enter a **keyword**, or leave it empty for all opportunities.
2. Optionally pick **status**, **eligible applicants** (e.g. Small businesses), **funding categories**, **agency codes**
   or an **assistance listing number**.
3. Set **Maximum results** and press **Start**.
4. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

Turn off **Include full details** for a faster list with only titles, agencies and dates.

### How much does it cost to scrape Grants.gov?

This Actor uses **pay-per-result pricing**: you pay only for opportunities saved to your dataset. There is no monthly
fee and no separate charge for platform usage.

| Apify plan | Price per 1,000 opportunities |
|---|---|
| Free | $3.00 |
| Bronze | $2.70 |
| Silver | $2.40 |
| Gold | $2.00 |

**Example:** 1,000 opportunities with full details cost **$3.00** on the free plan and **$2.00** on Gold. A test run with
20 results costs $0.06. Each run also has Apify's standard start fee of $0.00005.

In our test runs, 20 opportunities took about 10 seconds and 1,000 opportunities with full details took about
6 minutes. Turning off **Include full details** makes large runs much faster.

### Input example

```json
{
    "keyword": "broadband",
    "statuses": ["posted"],
    "eligibilities": ["07", "11"],
    "postedWithinDays": "any",
    "includeDetails": true,
    "maxItems": 100
}
```

### Output example

```json
{
    "opportunityId": "362843",
    "opportunityNumber": "2026-NTIA-TBCP",
    "title": "Tribal Broadband Connectivity Program",
    "status": "posted",
    "noticeType": "synopsis",
    "agencyCode": "DOC-DOCNISTERA",
    "agencyName": "DOC NIST ERA",
    "parentAgencyName": "Department of Commerce",
    "category": "Discretionary",
    "fundingInstruments": ["Grant"],
    "fundingCategories": ["Science and Technology and other Research and Development"],
    "assistanceListings": ["11.029 Tribal Broadband Connectivity Program"],
    "postedDate": "2026-06-17",
    "closeDate": "2026-11-17",
    "closeDateNote": null,
    "archiveDate": "2026-12-17",
    "lastUpdatedAt": "2026-10-01T13:32:46.000Z",
    "estimatedTotalFunding": null,
    "awardCeiling": null,
    "awardFloor": null,
    "expectedNumberOfAwards": 150,
    "costSharingRequired": false,
    "eligibleApplicants": ["Others (see text field entitled \"Additional Information on Eligibility\" for clarification)"],
    "eligibilityNotes": "The following entities are eligible to receive grants under the TBCP: 1. a Tribal Government; ...",
    "description": "NTIA is soliciting applications for funds remaining under the Tribal Broadband Connectivity Program ...",
    "contactName": "Jane Doe",
    "contactEmail": "grants-contact@example.gov",
    "contactPhone": "202-555-0100",
    "estimatedPostDate": null,
    "estimatedAwardDate": null,
    "estimatedProjectStartDate": null,
    "fiscalYear": null,
    "url": "https://www.grants.gov/search-results-detail/362843",
    "sourceUrl": "https://api.grants.gov/v1/api/fetchOpportunity",
    "scrapedAt": "2026-10-12T23:59:00.000Z"
}
```

Contact details in this example are replaced with placeholders.

### Get only new grant opportunities every day

Turn on **Only new or updated** and add a **schedule** (for example daily at 7:00). Each run then returns only
opportunities that are new, or that Grants.gov changed since your last run with the same filters, so you pay only for
what you haven't seen. Connect a webhook, email or Slack integration to get alerts.

### Integrations and API

Run the Actor from the Apify API, the JavaScript or Python client, or connect it to **Make**, **Zapier**,
**Google Sheets**, **Slack** and webhooks. Results can be exported as JSON, CSV, Excel, XML or RSS.

### Use with AI assistants (MCP)

The Actor works as a tool for AI agents through Apify's MCP server: the input fields have plain names and
descriptions, and a small run with a keyword returns in seconds.

### Other public-records scrapers

| Actor | Data |
|---|---|
| [USAspending Scraper](https://apify.com/publicrecords101/usaspending-contracts-scraper) | Federal contract awards, including contracts ending soon (recompete leads) |
| [SEC EDGAR Filings Scraper](https://apify.com/publicrecords101/sec-edgar-scraper) | 8-K, 10-K, 10-Q and Form 4 filings for any list of tickers |
| [FDA Recalls Scraper](https://apify.com/publicrecords101/fda-recalls-scraper) | FDA food, drug and medical device recalls in one feed |
| [NIH RePORTER Scraper](https://apify.com/publicrecords101/nih-reporter-scraper) | NIH-funded research projects: newly funded labs, PIs and amounts |
| [Federal Register Scraper](https://apify.com/publicrecords101/federal-register-scraper) | US rules, proposed rules and notices with comment deadlines |

### FAQ

**Is it legal to scrape Grants.gov?** Grants.gov data is public US government information, published for reuse
through an official API. This Actor reads only that public API, at a polite rate. You are responsible for how you use
the data.

**Why do I get fewer results than the website shows?** Check the status filter (the default is posted only in the
example input), the "Posted within" filter and Maximum results. Grants.gov's keyword search also matches differently
from its website's suggestions.

**How fresh is the data?** Each run reads Grants.gov live, so results are as current as Grants.gov itself.

**Something is wrong or missing?** Open an issue on the Actor's Issues tab and we'll reply within 48 hours. Custom
filters or data joins are welcome too.

# Changelog

This Actor's version history is a separate document: https://apify.com/publicrecords101/grants-gov-scraper/changelog.md

# Actor input Schema

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

Words to search for in opportunity titles and descriptions, e.g. broadband, cancer research, workforce. Leave empty for all.

## `statuses` (type: `array`):

Which opportunities to include. Default: forecasted and posted (open now).

## `postedWithinDays` (type: `string`):

Only opportunities posted recently.

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

Only opportunities open to these applicant types. Leave empty for all.

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

Only opportunities in these categories. Leave empty for all.

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

Only these kinds of awards. Leave empty for all.

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

Grants.gov agency codes, e.g. HHS (all of HHS), HHS-NIH11 (NIH only), DOC-EDA, USDA. Leave empty for all agencies.

## `assistanceListing` (type: `string`):

Only opportunities under this Assistance Listing number, e.g. 93.137.

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

Fetch each opportunity's full record: award amounts, eligibility, description and agency contact. Turn off for a faster list with titles and dates only.

## `onlyNew` (type: `boolean`):

Skip opportunities your earlier runs with the same filters already returned, unless Grants.gov updated them since. Use with a schedule for daily alerts.

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

Stop after this many opportunities.

## Actor input object example

```json
{
  "keyword": "broadband",
  "statuses": [
    "posted"
  ],
  "postedWithinDays": "7",
  "eligibilities": [
    "23",
    "12"
  ],
  "fundingCategories": [
    "HL",
    "ST"
  ],
  "fundingInstruments": [
    "G"
  ],
  "agencies": [
    "HHS-NIH11",
    "NSF"
  ],
  "assistanceListing": "93.137",
  "includeDetails": true,
  "onlyNew": true,
  "maxItems": 500
}
```

# Actor output Schema

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

Grant opportunities found by this run, one per row.

# 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 = {
    "keyword": "health",
    "statuses": [
        "posted"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicrecords101/grants-gov-scraper").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 = {
    "keyword": "health",
    "statuses": ["posted"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("publicrecords101/grants-gov-scraper").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 '{
  "keyword": "health",
  "statuses": [
    "posted"
  ],
  "maxItems": 20
}' |
apify call publicrecords101/grants-gov-scraper --silent --output-dataset

```

## MCP server setup

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

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/xDkbWQTdcXmailPVO/builds/SqarwJB2TGyI4uRcL/openapi.json
