Grants.gov Federal Grant Opportunities Scraper
Pricing
$1.50 / 1,000 opportunity scrapeds
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
Maintained by CommunityActor 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:
| Field | Always | Description |
|---|---|---|
id, number, title | yes | Grants.gov opportunity ID, funding opportunity number, title |
agencyCode, agency | yes | Agency code (e.g. HHS-NIH) and organisation name |
openDate, closeDate | yes | Posting date and application deadline, YYYY-MM-DD |
oppStatus, docType | yes | posted / forecasted / closed / archived; synopsis or forecast |
alns[] | yes | Assistance Listing Numbers (formerly CFDA) |
sourceUrl, scrapedAt | yes | Link to the Grants.gov detail page; ISO timestamp |
synopsis | details | Plain-text description |
awardCeiling, awardFloor, expectedAwards, estimatedFunding | details | Award range, expected number of awards, total program funding (USD) |
costSharing | details | Cost sharing / matching requirement (true/false) |
fundingInstruments[], eligibleApplicants[], eligibilityDescription, categoryOfFunding[], opportunityCategory | details | Grant / cooperative agreement, applicant types, category of funding activity |
department, archiveDate, lastUpdated | details | Top-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
| Field | Type | Default | Description |
|---|---|---|---|
keyword | string | - | Full-text search. Grants.gov OR-matches multiple words; one specific term works best. |
oppStatuses | array | ["posted","forecasted"] | Any of posted, forecasted, closed, archived. |
agencies | array | all | Agency codes such as HHS, NIH, NSF, USDA-FS, DHS-FEMA. |
fundingCategories | array | all | Category codes (HL Health, ED Education, ENV Environment, ST Science and Technology, ...). |
eligibilities | array | all | Applicant type codes (00 State governments, 12 501(c)(3) nonprofits, 06 public universities, 99 unrestricted, ...). |
aln | string | - | One Assistance Listing / CFDA number, e.g. 93.243. |
postedSince | date | - | Keep only opportunities opened on/after this date (client-side, never billed). |
includeDetails | boolean | false | Fetch the full record for every result. |
maxItems | integer | 200 | Hard cap on saved (and billed) records. |
requestsPerSecond | integer | 2 | Throttle for API calls (1-5). |
maxRetries | integer | 4 | Retries with backoff for network errors, 5xx and 429. |
sortBy | string | openDate|desc | search2 sort expression. |
proxyConfiguration | object | none | Optional; 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
- Create a Schedule in Apify Console (e.g. every morning at 06:00).
- Set
postedSinceto yesterday's date, or leave it empty and rely on the newest-first ordering plus a smallmaxItems. - Keep
sortByatopenDate|desc. Because results arrive newest first, the Actor stops paging as soon as a whole page is older thanpostedSince, so a daily run costs only the handful of new records, not the full backlog. - 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 installnpm test # offline unit tests against documented fixturesAPIFY_LOCAL_STORAGE_DIR=$PWD/storage node src/main.js