Build a federal grant tracker with new grant alerts
Export federal funding opportunities, review eligibility and deadlines, and keep a spreadsheet of new and changed postings.
What you’ll make
A spreadsheet with one row per federal opportunity from Grants.gov, including its agency, status, deadline, and source link. Optional detail reads add descriptions, funding amounts, eligibility, and program contacts. You’ll need an Apify account and a spreadsheet app.
This feed covers federal opportunities on Grants.gov. State, foundation, and corporate grants are outside its scope. Nonprofits, local governments, and grant writers can use the export as a review queue, then check the full posting and attachments before deciding whether to apply.
1. Export a recent sample
Open Grants.gov Federal Grant Opportunities Feed and paste this JSON into the input.
{
"statuses": [
"posted"
],
"postedWithinDays": 14,
"includeDetails": true,
"maxResults": 20
}This starts broadly so you can inspect the fields before adding filters. postedWithinDays uses US Eastern calendar days, including today. It filters the opportunity’s opening date, not its most recent update. Set it to 0 to disable the date filter.
Detail reads add useful review information and incur their own charge. Check current pricing and set a maximum charge before starting. A 20-row sample is intentionally limited; inspect the log to see whether more matches were available.
2. Narrow the opportunities
Add a keyword, such as "rural broadband", and choose the relevant applicant codes in eligibilities. Examples include 01 for county governments, 02 for city or township governments, and 12 for nonprofits with 501(c)(3) status. Read each posting’s eligibility text as well.
fundingCategories accepts Grants.gov codes such as ED for education or HL for health. agencyCodes narrows by funder. Empty filter lists leave that dimension unrestricted. Add forecasted to statuses if you want planned opportunities alongside posted ones; forecast dates are estimates.
3. Build the review sheet
When the run finishes, open its output dataset and inspect a few rows. Choose CSV or Excel from the export options. In Google Sheets, use File → Import → Upload. Keep identifiers and ZIP codes as text so leading zeros survive the import.
| opportunityId | status | closeDate |
|---|---|---|
| DEMO-GRANT-001 | posted | 2026-10-15 |
| DEMO-GRANT-002 | posted | 2026-11-02 |
Keep opportunityId, opportunityNumber, title, agencyName, status, openDate, closeDate, and url. With details enabled, include awardFloorUsd, awardCeilingUsd, eligibilityDescription, costSharing, and the published contact fields.
Add your own columns for review owner, fit, next action, and checked date. Keep them separate from imported fields. A missing funding value or deadline is unknown, not zero or “no deadline.” detailFetchFailed: true flags a row whose detail request failed; review its source link.
Descriptions are plain text and attachments are not downloaded. Open url to read the complete posting, application instructions, attachments, and any deadline qualifications.
4. Track new and changed postings
Save the search as an Apify task. Create a dedicated key-value store, add newOnly: true, and set stateStoreId to that store’s ID. Keep includeDetails: true to compare the posting’s version and update timestamp, then schedule the task.
The first complete run establishes the baseline. Later runs deliver unseen opportunities and detected changes, with isNewSinceLastRun and isUpdate describing the result. Without details, comparison is limited to the search fields: title, status, and close date. Successful detail reads used for comparison are charged even when an unchanged opportunity produces no output row.
5. Keep the monitoring window useful
A 14-day opening-date window can miss revisions to an older opportunity. For monitoring older postings, set postedWithinDays: 0 and narrow the search by keyword, agency, or category. Include closed or archived statuses if you also need to revisit opportunities after they leave the posted results.
Inspect the run log for result, spending, and detail-fetch limits. A limited or failed run is not proof that the review queue is current, and records can reappear on a retry. Merge on opportunityId, updating imported fields while preserving your review notes. Use separate state stores for separate searches and avoid overlapping runs.
If no opportunities appear
Remove the keyword or narrow agency and eligibility filters, then try postedWithinDays: 0. Confirm the selected statuses. In new-only mode, empty output may mean that the matching postings are unchanged; check the log to distinguish that from source errors or a limited scan.
Start with a small export.
Check the sample against its source before expanding or scheduling your search.
Open the actor on Apify