Grants.gov Opportunity Alert — Daily Federal Grant Diff avatar

Grants.gov Opportunity Alert — Daily Federal Grant Diff

Pricing

Pay per usage

Go to Apify Store
Grants.gov Opportunity Alert — Daily Federal Grant Diff

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

ChangeWire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

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"] +
    statuses: ["forecasted", "posted"]
    . Schedules it daily at 06:00 UTC. Pipes the dataset into Slack #grants-alerts via 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:

FieldTypeDefaultDescription
watchlistarray of opp numbers[]Explicit list, e.g. ["HHS-2026-IHS-RAP-0001"]
keywordsarray of strings[]Title + synopsis keyword filter
agenciesarray of strings[]Agency codes (HHS, NIH, NSF, USDA, DOD)
cfda_numbersarray of strings[]CFDA / Assistance Listing Numbers (e.g. 93.243)
funding_categoriesarray of strings[]Grants.gov category codes
eligibilitiesarray of strings[]Eligibility codes (00, 06, 07, 11)
statusesarray of strings["forecasted","posted"]forecasted / posted / closed / archived
change_typesarray of stringsall sevenSubset of {status, close_date, award_ceiling, award_floor, award_count, eligibility, synopsis_text}
snapshot_keystringsnapshot-latestKey-value-store key for previous snapshot (lets you run multiple watchlists in one account)
max_opportunitiesint5000Hard 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/search2
  • 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:

Running locally (for contributors)

cd actors/actor-2-grantsgov-opportunity-alert
apify 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}'

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.