Tools / Nonprofit Grants.gov Database, Status Eligibility Award Details
Nonprofit Grants.gov Database, Status Eligibility Award Details
Search and enrich US federal grant opportunities from the official Grants.gov API: keyword, agency, status, eligibility and funding-category filters, plus optional award ceiling/floor, eligibility text and full synopsis via detail lookup. Optional watchLabel mode returns only opportunities new since your last run, so a schedule becomes a grant alert; add watchChanges to also catch deadline extensions, status changes, funding-range revisions, eligibility rewrites and forecasts turning into real posted opportunities.
Run it
Pay-per-result on Apify, no FetchSmith account needed. Use your own Apify API token, or hit Run on the Store page with no token at all.
curl -X POST "https://api.apify.com/v2/acts/fetchsmith~grants-gov-scraper/run-sync-get-dataset-items?clean=true" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"keyword": "water quality", "maxResults": 100, "oppStatuses": ["posted"]}'
Returns the rows as JSON when the run finishes. A hosted FetchSmith API (one key, no Apify account, see API docs) is planned but not open yet.
Output fields
id opportunityNumber title agencyCode agency openDate closeDate oppStatus docType cfdaList url enrichment agencyName topAgencyName topAgencyCode opportunityCategory postingDate responseDate archiveDate costSharing awardCeiling awardFloor applicantEligibilityDesc applicantTypes fundingInstruments fundingActivityCategories synopsisText cfdas fundingDescLinkUrl synopsisDocumentURLs attachments assistURL lastUpdatedDate modComments numberOfAwards estimatedFunding estSynopsisPostingDate estApplicationResponseDate estAwardDate estProjectStartDate fiscalYear _watchChangeType _watchPrevious
Sample output
{
"agency": "Office of the Assistant Secretary for Health",
"agencyCode": "HHS-OPHS",
"awardCeiling": 600000,
"awardFloor": 450000,
"cfdaList": [
"93.137"
],
"closeDate": null,
"costSharing": false,
"docType": "forecast",
"estApplicationResponseDate": "Jun 23, 2025 12:00:00 AM EDT",
"estAwardDate": "Sep 15, 2025 12:00:00 AM EDT",
"estSynopsisPostingDate": "Apr 14, 2025 12:00:00 AM EDT",
"estimatedFunding": 5000000,
"fiscalYear": 2025,
"id": "355824",
"numberOfAwards": 9,
"openDate": "08/01/2024",
"oppStatus": "forecasted",
"opportunityCategory": "Discretionary",
"opportunityNumber": "MP-CPI-25-001",
"title": "Making America Healthy Again by Addressing Dementia Disparities",
"url": "https://www.grants.gov/search-results-detail/355824"
}
Guides
- "Does a watchChanges deadline alert actually fire? We seeded 711 opportunities and forced it to find out" — "grants-gov-scraper's watchChanges re-delivers a saved opportunity if its deadline, status, forecast/posted type, award range or eligibility text moved. Live baseline of 711 posted opportunities, one stored snapshot deliberately altered, and the exact JSON the next run returned."
- Grants.gov's search API has two opposite silent failures — and only one of them is safe — A typo'd filter value on Grants.gov returns zero results. A typo'd filter NAME returns the entire unfiltered catalog, at the same errorcode 0 "Webservice Succeeds". Measured both, found the free detector in the response, and shipped a guard.
- Grants.gov's search API never returns an error — a typo in your filter just silently returns zero results — Grants.gov's public search2/fetchOpportunity API needs no key, but a bad enum value returns "Webservice Succeeds" with an empty result set instead of a 400, and parent agency codes don't roll up to sub-agencies.
Only publicly accessible pages are read. Respect the source site's terms when using the data.