Grants.gov Opportunities Scraper

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

Data fields

FieldTypeDescription
opportunityIdstringValue exported as opportunityId.
opportunityNumberstring | nullValue exported as opportunityNumber.
titlestring | nullValue exported as title.
agencyCodestring | nullValue exported as agencyCode.
agencyNamestring | nullValue exported as agencyName.
statusstring | nullValue exported as status.
docTypestring | nullValue exported as docType.
categorystring | nullValue exported as category.

Input preview

keywordKeyword
keywordsAdditional keywords
agenciesAgency filters
opportunityNumbersOpportunity numbers
assistanceListingsAssistance Listings
statusesOpportunity statuses

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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

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

Agency pipeline monitor

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

Deadline watch

{
  "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 example

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

Example output

{
  "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": []
}

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

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

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

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.

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/grants-gov-opportunities-scraper"
{
  "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."

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.

Common questions

Questions and answers reused from the canonical actor README.

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.