Grants.gov Opportunity Alert — Daily Federal Grant Diff
Pricing
Pay per usage
Grants.gov Opportunity Alert — Daily Federal Grant Diff
Daily diff feed for the Grants.gov public REST API. Emits JSONL records for every change to status, close-date, award ceiling/floor, eligibility, or synopsis. Replaces $550-2,400/yr NOFO trackers (GrantStation, FDO) at $3-15/mo. For grant writers, university grants offices, and AI funding agents.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
ChangeWire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Grants.gov API Wrapper — Daily Funding Opportunity Diff Feed
Daily diff of federal grant opportunities for grant writers, nonprofit BI teams, and AI agents. Watches Grants.gov public REST endpoints for status / close-date / award-amount / eligibility changes and emits JSONL change records.
What this does
- Tracks every federal NOFO posted to Grants.gov with full historical diff coverage (status / close-date / award-ceiling / award-floor / award-count / eligibility / synopsis-text).
- Cuts grant-deadline detection latency from days to hours so grant writers don't miss pull-forward close dates or freshly posted NOFOs in their watched CFDA codes.
- Replaces $550-2400/yr commercial NOFO trackers with a metered pay-per-result Apify actor at $3-15/month for a typical filter set.
Use cases
Grants gov daily alert for nonprofit grant writers
A grant-writing agency tracking 200-500 opportunities across HHS,
NIH, NSF, and USDA filters this actor on agencies: ["HHS", "NIH"]
cfda_numbers: ["93.243", "93.205", "93.226"]+. Schedules it daily at 06:00 UTC. Pipes the dataset into Slackstatuses: ["forecasted", "posted"]#grants-alertsvia webhook. Cost: roughly 30-150 change records per week × $0.02 = $0.60-3/wk = $3-12/mo. Replaces a $699/yr GrantStation seat with full diff fidelity (close-date pull-forwards + award-ceiling adjustments that GrantStation summarizes monthly).
Federal funding opportunity API for university grants offices
A research university's central grants office filters on
eligibilities: ["06"] (state higher ed) + statuses: ["posted"],
runs every 12 hours, and pushes the JSONL feed into their internal
Grants Pipeline BI tool (Tableau / PowerBI). The 7-change-type
schema lines up cleanly with their existing opportunity-tracking
data model — they don't have to re-shape anything. Sub-second
joins against their existing PI-interest watchlist surface
matches in their grants newsletter without manual triage.
NOFO tracking automation for AI funding-discovery agents
A funding-discovery AI agent embedded in a foundation's research desk consumes the diff stream as a retrieval-augmented fact source. Each diff record is a structured event the agent can reason over ("HHS just pulled the close date forward on CFDA 93.243 by 16 days") rather than an unstructured "grants.gov has new content" HTML page. The agent uses change records to prompt the foundation's program officers proactively rather than waiting for the next weekly digest.
Input
See .actor/input_schema.json for the full schema. Key fields:
| Field | Type | Default | Description |
|---|---|---|---|
watchlist | array of opp numbers | [] | Explicit list, e.g. ["HHS-2026-IHS-RAP-0001"] |
keywords | array of strings | [] | Title + synopsis keyword filter |
agencies | array of strings | [] | Agency codes (HHS, NIH, NSF, USDA, DOD) |
cfda_numbers | array of strings | [] | CFDA / Assistance Listing Numbers (e.g. 93.243) |
funding_categories | array of strings | [] | Grants.gov category codes |
eligibilities | array of strings | [] | Eligibility codes (00, 06, 07, 11) |
statuses | array of strings | ["forecasted","posted"] | forecasted / posted / closed / archived |
change_types | array of strings | all seven | Subset of {status, close_date, award_ceiling, award_floor, award_count, eligibility, synopsis_text} |
snapshot_key | string | snapshot-latest | Key-value-store key for previous snapshot (lets you run multiple watchlists in one account) |
max_opportunities | int | 5000 | Hard cap so a misconfigured filter can't blow the budget |
Realistic example input:
{"agencies": ["HHS", "NIH"],"cfda_numbers": ["93.243", "93.205", "93.226"],"statuses": ["forecasted", "posted"],"max_opportunities": 500}
Output
JSONL dataset; one record per detected change:
{"actor": "actor-2-grantsgov-opportunity-alert","schema_version": "1.0.0","extracted_at": "2026-05-16T12:00:00Z","source_url": "https://www.grants.gov/search-results-detail/352001","opportunity_id": "352001","opportunity_number": "HHS-2026-IHS-RAP-0001","change_type": "close_date","before": {"synopsis.responseDate": "12/15/2026"},"after": {"synopsis.responseDate": "12/31/2026"},"detected_at": "2026-05-16T12:00:00Z"}
Apify Console preview shows a 5-column table view (opp ID / opp # / change type / detected at / source URL) so non-engineers can sanity-check runs before piping into BI.
Pricing & limits
- $0.02 per result (per detected diff record).
- Free 7-day trial so you can verify the diff fidelity against your own watchlist before committing.
- Recommended schedule: daily for posted/forecasted opps, every 12 hours for active-deadline workflows.
- Estimated monthly cost:
- Small filter (~200-500 watched opps, weekly cadence): $3-12/mo
- Mid-market BI (~5,000 opps, daily cadence): $30-180/mo
- Replaces GrantStation Premium ($699/yr) and Foundation Directory Online ($550/yr) at substantially lower cost with full diff fidelity rather than monthly snapshots.
Data source & freshness
- Source: Grants.gov public REST API (
POST /v1/api/search2POST /v1/api/fetchOpportunity), https://www.grants.gov/api
- Update cadence (source-side): Grants.gov refreshes posted opportunities continuously as agencies submit them; in practice most posting activity falls within US business hours. Forecasted opportunities update less often (typically weekly per agency).
- Actor cadence (recommended): Daily 06:00 UTC for forecasted
- posted; every 12 hours if you depend on intra-day close-date detection.
- Public-domain license: Grants.gov data is US government public-domain under the DATA Act 2014 (Pub. L. 113-101) + FFATA (Pub. L. 109-282). No restrictions on derivative use.
FAQ
What's the difference between a Grants.gov "watchlist" and "filters"?
A watchlist is an explicit list of opportunity numbers you already know about (e.g. NIH PA-25-225). The actor only checks those. Filters (agencies / CFDA / eligibilities / statuses) let the actor discover new opportunities that match your criteria on each run. Most buyers use filters; watchlists are for narrow "watch this specific NOFO" workflows.
Does this give me forecasted opportunities or only posted ones?
Both. statuses: ["forecasted", "posted"] is the default. Forecasted
opportunities have a forecast.* block with parallel field names
to the synopsis.* block on posted opps. When a forecasted opp
graduates to posted, the actor emits a change_type: status record
plus per-field synopsis-level changes on the same cycle.
How does this compare to the Grants.gov RSS feed?
The Grants.gov RSS feed is post-only (no diffs, no field-level change semantics, no forecasted opps). It's useful for "did something new appear" but not for "did the close date shift" or "did the award ceiling drop by 20%" — both of which this actor emits as structured records.
Can I run multiple independent watchlists from one Apify account?
Yes. Each watchlist gets its own snapshot_key value. The actor
reads/writes the previous snapshot from snapshot_key in your
Apify Key-Value Store, so two runs with different keys don't
trample each other.
What about the Grants.gov S2S SOAP API?
This actor uses the public REST API (read-only opportunity discovery). The S2S SOAP API is for application submission and requires Workspace credentials — that's a different product and out of scope here.
How is dates formatted? ISO 8601?
No — Grants.gov returns dates as MM/DD/YYYY strings (US format).
The diff comparison treats them as opaque strings. Downstream
consumers re-parse for timezone-aware deadlines.
What does awardCeiling: "none" mean?
Some agencies post opportunities with no fixed dollar ceiling and
the API returns the literal string "none" rather than null.
The diff stream treats "none" as a present value, so transitions
like "none" → 50000 emit on the next snapshot. Treat literal
"none" as a missing-data signal, not as the dollar amount zero.
Is there a rate limit risk?
The actor self-limits to roughly 2 req/s and respects standard
Grants.gov throttling. We've never hit the limit at typical
filter sizes. If you push max_opportunities past 10,000 you
should split into multiple runs with disjoint filters.
Companion actors in this portfolio
changewire maintains a portfolio of federal-data diff actors. All
share the same daily-snapshot + JSONL change-record pattern, watchlist
filtering, and per-record change-type semantics. Pick the data domain
you need; mix and match across a single Apify account:
changewire/clinicaltrials-protocol-diff— NIH-registered trial protocol diffs.changewire/fda-orange-book-extraction— FDA Orange Book pharmaceutical applications + patent listings.changewire/noaa-storm-events-diff— NOAA NCEI storm-event records.changewire/uspto-ttab-docket-extractor— USPTO TTAB trademark docket records + filings.changewire/epa-echo-compliance— EPA ECHO facility compliance status + violations.changewire/samgov-contracts-diff— SAM.gov federal contract opportunities, daily diff. (currently hard-blocked on identity-tied SAM.gov API key; awaiting user-machine key generation)
Running locally (for contributors)
cd actors/actor-2-grantsgov-opportunity-alertapify run --purge # uses .actor/input_schema.json defaults
Targeted run:
$apify run --input '{"watchlist": ["HHS-2026-IHS-RAP-0001"]}'
Filter run:
$apify run --input '{"agencies": ["HHS"], "statuses": ["posted"], "max_opportunities": 100}'
Legal
Grants.gov data is US government public-domain under the DATA Act 2014 (Pub. L. 113-101) + FFATA (Pub. L. 109-282). The actor respects polite ~2-rps rate limit and emits no PII.