Grants.gov Federal Grant Opportunities Scraper avatar

Grants.gov Federal Grant Opportunities Scraper

Pricing

$1.50 / 1,000 opportunity scrapeds

Go to Apify Store
Grants.gov Federal Grant Opportunities Scraper

Grants.gov Federal Grant Opportunities Scraper

Extract US federal grant opportunities from Grants.gov via its official public API: title, agency, ALN/CFDA, open and close dates, status, and optionally synopsis, award ceiling/floor, eligibility and attachments. Pay per result.

Pricing

$1.50 / 1,000 opportunity scrapeds

Rating

5.0

(1)

Developer

Hriday Rungta

Hriday Rungta

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

7 hours ago

Last modified

Categories

Share

Pull US federal funding opportunities from Grants.gov into a clean dataset you can filter, schedule and export. The Actor talks to the official, public Grants.gov REST API (the same search2 and fetchOpportunity endpoints that power the Grants.gov search page), so results are complete, structured and fast: no browser, no HTML parsing, no login.

You pay only for the opportunities you receive, and maxItems caps every run.

Not affiliated with or endorsed by Grants.gov or HHS; the underlying data is free and public domain at grants.gov. This is an independent tool that saves you the work of collecting, filtering and structuring that public data.

What it extracts

One flat record per opportunity:

FieldAlwaysDescription
id, number, titleyesGrants.gov opportunity ID, funding opportunity number, title
agencyCode, agencyyesAgency code (e.g. HHS-NIH) and organisation name
openDate, closeDateyesPosting date and application deadline, YYYY-MM-DD
oppStatus, docTypeyesposted / forecasted / closed / archived; synopsis or forecast
alns[]yesAssistance Listing Numbers (formerly CFDA)
sourceUrl, scrapedAtyesLink to the Grants.gov detail page; ISO timestamp
synopsisdetailsPlain-text description
awardCeiling, awardFloor, expectedAwards, estimatedFundingdetailsAward range, expected number of awards, total program funding (USD)
costSharingdetailsCost sharing / matching requirement (true/false)
fundingInstruments[], eligibleApplicants[], eligibilityDescription, categoryOfFunding[], opportunityCategorydetailsGrant / cooperative agreement, applicant types, category of funding activity
department, archiveDate, lastUpdateddetailsTop-level department, archive date, synopsis last-updated date
attachments[]details{ name, url } for every NOFO, FAQ or related document

"Details" fields are added when Include full details is on (one extra API call per opportunity, same price per record).

Only organisation-level data is collected. Agency contact names, e-mail addresses and phone numbers published on Grants.gov are deliberately not extracted. Agencies sometimes write a programme officer's e-mail or desk number into the description text itself, so every free-text field (synopsis, eligibilityDescription) is additionally scanned and any e-mail address or phone number is replaced with [redacted].

Use cases

  • Grant writers and consultants - watch every new NOFO in your field the morning it appears, with deadlines, award ceilings and attachments ready to triage.
  • Universities and research offices - feed sponsored-programs newsletters and internal funding portals with NIH, NSF, DOE and USDA opportunities filtered by ALN or category.
  • Nonprofits and local governments - track opportunities open to 501(c)(3)s, tribes, counties or school districts using the eligibility filter.
  • Market and policy intelligence - measure federal funding flows by agency, category and status over time; join on ALN with USAspending award data.
  • Product teams - power grant-matching apps, CRMs and AI assistants with a structured, deduplicated feed instead of scraping HTML.

Input

FieldTypeDefaultDescription
keywordstring-Full-text search. Grants.gov OR-matches multiple words; one specific term works best.
oppStatusesarray["posted","forecasted"]Any of posted, forecasted, closed, archived.
agenciesarrayallAgency codes such as HHS, NIH, NSF, USDA-FS, DHS-FEMA.
fundingCategoriesarrayallCategory codes (HL Health, ED Education, ENV Environment, ST Science and Technology, ...).
eligibilitiesarrayallApplicant type codes (00 State governments, 12 501(c)(3) nonprofits, 06 public universities, 99 unrestricted, ...).
alnstring-One Assistance Listing / CFDA number, e.g. 93.243.
postedSincedate-Keep only opportunities opened on/after this date (client-side, never billed).
includeDetailsbooleanfalseFetch the full record for every result.
maxItemsinteger200Hard cap on saved (and billed) records.
requestsPerSecondinteger2Throttle for API calls (1-5).
maxRetriesinteger4Retries with backoff for network errors, 5xx and 429.
sortBystringopenDate|descsearch2 sort expression.
proxyConfigurationobjectnoneOptional; the API is public and normally needs no proxy.

Example:

{
"keyword": "wildfire",
"oppStatuses": ["posted", "forecasted"],
"agencies": ["USDA-FS", "DHS-FEMA", "DOI"],
"eligibilities": ["00", "01", "12"],
"includeDetails": true,
"maxItems": 100
}

Sample output

{
"id": "358123",
"number": "USDA-FS-2026-WF-001",
"title": "Community Wildfire Defense Grant Program",
"agencyCode": "USDA-FS",
"agency": "Forest Service",
"department": "Department of Agriculture",
"openDate": "2026-08-15",
"closeDate": "2026-11-30",
"oppStatus": "posted",
"docType": "synopsis",
"alns": ["10.720"],
"synopsis": "The Community Wildfire Defense Grant program assists at-risk communities.\nPlanning grants\nImplementation grants",
"awardCeiling": 10000000,
"awardFloor": 0,
"expectedAwards": 150,
"estimatedFunding": 200000000,
"costSharing": true,
"fundingInstruments": ["Grant", "Cooperative Agreement"],
"eligibleApplicants": ["State governments", "Native American tribal governments (Federally recognized)", "Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education"],
"eligibilityDescription": "Local governments, tribes and nonprofits in at-risk communities.",
"categoryOfFunding": ["Disaster Prevention and Relief", "Environment"],
"opportunityCategory": "Discretionary",
"archiveDate": "2026-12-30",
"lastUpdated": "2026-08-20",
"attachments": [
{ "name": "CWDG_NOFO_FY26.pdf", "url": "https://apply07.grants.gov/grantsws/rest/opportunity/att/download/401001" }
],
"detailsFetched": true,
"sourceUrl": "https://www.grants.gov/search-results-detail/358123",
"scrapedAt": "2026-09-11T06:00:02.114Z"
}

Export from the Apify Console or API as JSON, CSV, Excel or XML, or push straight to Google Sheets, Airtable, Slack or a webhook with an integration.

Daily "new since" runs

  1. Create a Schedule in Apify Console (e.g. every morning at 06:00).
  2. Set postedSince to yesterday's date, or leave it empty and rely on the newest-first ordering plus a small maxItems.
  3. Keep sortBy at openDate|desc. Because results arrive newest first, the Actor stops paging as soon as a whole page is older than postedSince, so a daily run costs only the handful of new records, not the full backlog.
  4. Add an integration (Slack, e-mail, Google Sheets, webhook) on the schedule to deliver the new opportunities.

Older opportunities that fall outside postedSince are skipped before billing, so they cost nothing.

Pricing

Pay-per-event pricing: a small actor-start fee per run plus one opportunity-scraped event per saved record. maxItems is your hard cost cap, and the run also stops as soon as your Apify "max total charge" limit is reached. Every pushed record is billed exactly once; records skipped by postedSince or de-duplicated across pages are free. Fetching full details does not change the per-record price.

FAQ

Do I need a Grants.gov account or API key? No. The search2 and fetchOpportunity endpoints are public and documented by Grants.gov as requiring no authentication. This Actor never logs in.

Is this legal? Grants.gov publishes federal funding opportunities as US government works in the public domain, through an API intended for programmatic access. This Actor is an independent tool and is not affiliated with, endorsed by, or operated by Grants.gov, HHS or the US government.

How current is the data? Each run queries the live API, so results reflect Grants.gov at the moment the run executes.

Why did my agency filter return zero results? Grants.gov applies agency and ALN filters server-side and returns an empty set for unknown codes instead of an error, so a typo looks like "no matches". Department codes such as HHS, USDA or DOD are expanded automatically to include their sub-agencies, so you can filter by department without listing every child code. A specific sub-agency works too, in the PARENT-CHILD form, e.g. HHS-NIH11 or USDA-NIFA.

Why are multi-word keywords so broad? Grants.gov OR-matches each word and does not support quoted phrases. Use one precise term and narrow with agencies, fundingCategories or aln.

Can I get contact e-mails or phone numbers? No. The Actor intentionally omits agency contact persons and returns organisation-level fields only, and it redacts any e-mail address or phone number that appears inside the free-text description fields.

Can I scrape closed or archived opportunities? Yes, add closed and/or archived to oppStatuses. Historical backfills can be large; use maxItems and postedSince to bound them.

What happens on errors? Network errors, 5xx and 429 responses are retried with exponential backoff. If a fetchOpportunity call fails, the basic record is still saved with detailsFetched: false.

Local development

npm install
npm test # offline unit tests against documented fixtures
APIFY_LOCAL_STORAGE_DIR=$PWD/storage node src/main.js