# Grants.gov Opportunities Scraper (`fetch_cat/grants-gov-opportunities-scraper`) Actor

Search and export public Grants.gov federal funding opportunities with optional detail enrichment.

- **URL**: https://apify.com/fetch\_cat/grants-gov-opportunities-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 opportunity saveds

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

## Grants.gov Opportunities Scraper

Export public U.S. federal funding opportunities from Grants.gov to structured datasets. The Actor searches the public Grants.gov API, deduplicates opportunities by stable ID, and can enrich each row with public detail fields such as descriptions, contacts, funding amounts, eligibility text, and attachment metadata.

### At a glance

- **Primary job**: Build repeatable exports and monitors for public Grants.gov opportunity notices.
- **Input**: Keyword plus optional agency/category/date-style filters and detail limits.
- **Output**: One dataset row per public opportunity.
- **Best for**: Grant writers, nonprofits, universities, consultants, public-sector sales teams, civic-tech analysts, and funding-intelligence workflows.

### Who is this for?

- **Grant writers and consultants** tracking new federal funding opportunities for clients.
- **Nonprofits and universities** building recurring grant-alert exports.
- **Public-sector sales and civic-tech teams** monitoring federal program signals.
- **Analysts and data teams** feeding Grants.gov rows into spreadsheets, CRMs, dashboards, or RAG systems.

### Common use cases

- **Funding research**: Search public opportunities by keyword and export structured rows.
- **Monitoring**: Schedule small repeat runs and compare stable `opportunityId` values over time.
- **CRM enrichment**: Send agency, contact, date, and funding fields to downstream systems.
- **Automation**: Use Apify datasets, API, webhooks, or MCP-compatible tools.

### Ready-to-run tasks

These task recipes cover distinct buyer workflows and can be copied directly into the Actor input. Publisher will create their public Examples after publication.

- [Climate funding opportunities](https://apify.com/fetch_cat/grants-gov-opportunities-scraper/examples/climate-funding-opportunities)
- [Commerce agency grants](https://apify.com/fetch_cat/grants-gov-opportunities-scraper/examples/commerce-agency-grants)
- [Grant deadline watch](https://apify.com/fetch_cat/grants-gov-opportunities-scraper/examples/grant-deadline-watch)
- [Nonprofit eligibility grants](https://apify.com/fetch_cat/grants-gov-opportunities-scraper/examples/nonprofit-eligibility-grants)

**Climate funding opportunities**

```json
{
  "keyword": "climate",
  "statuses": ["posted", "forecasted"],
  "includeDetails": true,
  "includeContacts": true,
  "includeAttachments": true,
  "maxItems": 10,
  "maxDetailRequests": 10
}
```

**Agency pipeline monitor**

```json
{
  "keyword": "research",
  "agencies": ["DOC"],
  "includeDetails": false,
  "includeContacts": false,
  "includeAttachments": false,
  "maxItems": 10,
  "maxDetailRequests": 0
}
```

**Deadline watch**

```json
{
  "keyword": "education",
  "includeDetails": true,
  "includeContacts": true,
  "includeAttachments": false,
  "maxItems": 10,
  "maxDetailRequests": 10
}
```

### What data can you extract?

| Field | Description |
| --- | --- |
| `opportunityId` | Stable Grants.gov opportunity ID used for dedupe. |
| `opportunityNumber` | Public opportunity number. |
| `title` | Opportunity title. |
| `agencyCode`, `agencyName` | Agency identifiers/names from search or detail data. |
| `status`, `docType`, `category` | Source status/type/category fields. |
| `cfdaList` | Assistance listing / CFDA numbers. |
| `openDate`, `openDateIso`, `closeDate`, `closeDateIso` | Raw and normalized dates when parseable. |
| `fundingInstrument`, `fundingCategory`, `eligibility` | Public detail classifications when available. |
| `awardCeiling`, `awardFloor`, `estimatedTotalFunding` | Funding amount fields when Grants.gov exposes them. |
| `description` | Public synopsis or forecast description. |
| `contactName`, `contactEmail`, `contactPhone` | Public opportunity contact fields when requested and available. |
| `attachments` | Public attachment metadata only; files are not downloaded. |
| `sourceUrl`, `fetchedAt`, `warnings` | Source link, scrape timestamp, and row-level warnings. |

### Input configuration

| Setting | JSON key | Use it for | Example |
| --- | --- | --- | --- |
| Keyword | `keyword` | Main Grants.gov search phrase. | `climate` |
| Additional keywords | `keywords` | Extra search terms. | `["resilience"]` |
| Agency filters | `agencies` | Narrow to agency codes/names when compatible with the source API. | `["DOC"]` |
| Statuses | `statuses` | Preserve recipe intent for posted/forecasted/closed workflows. | `["posted", "forecasted"]` |
| Funding categories | `fundingCategories` | Optional source-compatible category filters. | `["Environment"]` |
| Funding instruments | `fundingInstruments` | Optional source-compatible funding instrument filters. | `["Grant"]` |
| Eligibilities | `eligibilities` | Optional source-compatible eligibility filters. | `["Nonprofits"]` |
| Date from | `dateFrom` | Optional date filter start, YYYY-MM-DD recommended. | `2026-01-01` |
| Date to | `dateTo` | Optional date filter end, YYYY-MM-DD recommended. | `2026-12-31` |
| Include details | `includeDetails` | Fetch descriptions, contacts, funding fields, eligibility, and attachment metadata. | `true` |
| Include contacts | `includeContacts` | Save public contact fields when detail data exposes them. | `true` |
| Include attachments | `includeAttachments` | Save public attachment metadata only. | `false` |
| Maximum opportunities | `maxItems` | Cap saved rows and control spend. | `10` |
| Maximum detail requests | `maxDetailRequests` | Limit enrichment calls. | `10` |
| Fail on empty | `failOnSourceUnavailable` | Fail instead of succeeding with zero rows for strict monitors. | `false` |

### Input example

```json
{
  "keyword": "climate",
  "statuses": ["posted", "forecasted"],
  "includeDetails": true,
  "includeContacts": true,
  "includeAttachments": true,
  "maxItems": 10,
  "maxDetailRequests": 10,
  "failOnSourceUnavailable": false
}
```

### Example output

```json
{
  "opportunityId": "103313",
  "opportunityNumber": "NOAA-OAR-CPO-2012-2003041",
  "title": "Climate Program Office for FY 2012",
  "agencyCode": "DOC",
  "agencyName": "Department of Commerce",
  "status": "posted",
  "docType": "synopsis",
  "cfdaList": ["11.431"],
  "openDate": "07/06/2011",
  "openDateIso": "2011-07-06",
  "closeDate": "",
  "closeDateIso": null,
  "description": "Changing climate confronts society with significant economic...",
  "contactEmail": "steve.j.drescher@noaa.gov",
  "sourceUrl": "https://www.grants.gov/search-results-detail/103313",
  "fetchedAt": "2026-07-28T00:00:00.000Z",
  "warnings": []
}
```

### Pricing

| Event | Price | Charged when |
| --- | --- | --- |
| Opportunity saved | `$0.003` per row | After a public Grants.gov opportunity row is saved to the dataset. |

Discount tiers use the standard Apify Store labels: Free, Bronze, Silver, Gold, Platinum, and Diamond.

The Actor does not charge for failed detail fetches, skipped optional attachment downloads, empty searches, or summary metadata.

### Limits and caveats

- **Public data only**: This Actor returns public Grants.gov opportunity notices, not private applications, workspace data, or applicant-specific materials.
- **No grant-fit advice**: It does not score eligibility or recommend whether you should apply.
- **Source semantics**: Grants.gov may omit fields or use older date formats; raw fields are preserved and normalized fields are nullable.
- **Attachments**: V1 emits metadata only and does not download or parse attached files.

### API usage

#### Node.js

```js
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/grants-gov-opportunities-scraper").call({
  keyword: "climate",
  includeDetails: true,
  maxItems: 10,
  maxDetailRequests: 10
});
console.log(run.defaultDatasetId);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/grants-gov-opportunities-scraper").call(run_input={
    "keyword": "climate",
    "includeDetails": True,
    "maxItems": 10,
    "maxDetailRequests": 10,
})
print(run["defaultDatasetId"])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~grants-gov-opportunities-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"climate","includeDetails":true,"maxItems":10,"maxDetailRequests":10}'
```

### MCP and AI agents

Use this Actor from MCP-compatible tools through the official Apify MCP Server.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/grants-gov-opportunities-scraper"
```

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

Example prompt: "Run Grants.gov Opportunities Scraper for climate opportunities and summarize upcoming deadlines."

### Related actors

- [Google Maps Places Scraper](https://apify.com/fetch_cat/google-maps-places-scraper)
- [Bing Search Results Scraper](https://apify.com/fetch_cat/bing-search-results-scraper)

### FAQ

#### Can I export results?

Yes. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

#### Does this scrape private grant applications?

No. It only exports public Grants.gov opportunity notice data.

#### Why are some fields empty?

Grants.gov does not expose every field for every opportunity. The Actor preserves raw values where available and leaves unavailable fields empty instead of guessing.

### Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID, input JSON, expected output, actual output, and one reproducible public URL or Grants.gov opportunity link.

# Changelog

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

# Actor input Schema

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

Search keyword or phrase.

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

Optional extra search terms joined with the keyword.

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

Agency codes or names to pass to Grants.gov search.

## `opportunityNumbers` (type: `array`):

Exact Grants.gov opportunity numbers. Multiple values are queried separately and deduplicated.

## `assistanceListings` (type: `array`):

Assistance Listing (CFDA) numbers such as 93.137. Multiple values are queried separately and deduplicated.

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

Statuses such as posted, forecasted, closed, or archived.

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

Optional Grants.gov funding category filters.

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

Optional Grants.gov funding instrument filters.

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

Optional Grants.gov eligibility filters.

## `dateFrom` (type: `string`):

Optional source date filter, YYYY-MM-DD recommended.

## `dateTo` (type: `string`):

Optional source date filter end, YYYY-MM-DD recommended.

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

Fetch Grants.gov detail records for descriptions, contacts, funding fields, and attachments metadata.

## `includeContacts` (type: `boolean`):

Include public Grants.gov contact fields when details are fetched.

## `includeAttachments` (type: `boolean`):

Include public attachment metadata only; files are not downloaded.

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

Maximum number of opportunity rows to save.

## `maxDetailRequests` (type: `integer`):

Maximum number of detail API requests to make.

## `failOnSourceUnavailable` (type: `boolean`):

Fail the run if no rows are saved; leave off for legitimate zero-result searches.

## Actor input object example

```json
{
  "keyword": "climate",
  "statuses": [
    "posted",
    "forecasted"
  ],
  "includeDetails": true,
  "includeContacts": true,
  "includeAttachments": true,
  "maxItems": 10,
  "maxDetailRequests": 10,
  "failOnSourceUnavailable": false
}
```

# Actor output Schema

## `overview` (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 = {
    "keyword": "climate"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/grants-gov-opportunities-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": "climate" }

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/grants-gov-opportunities-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": "climate"
}' |
apify call fetch_cat/grants-gov-opportunities-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/grants-gov-opportunities-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/hB5giAdfswLKvZSal/builds/ts9heyMufh4Lrh4EQ/openapi.json
