DEV Community

Ken-Mutisya
Ken-Mutisya

Posted on

"The $459/mo Grant Alert Industry Runs on a Free Government API"

Grant discovery platforms are a quiet SaaS category with remarkable pricing: $179 to $459 a month for keyword alerts on grant opportunities. The primary source for US federal grants is grants.gov, and it has a public JSON API with no key, no registration, and no rate-limit drama. Here is the whole thing.

Search is one POST

POST https://api.grants.gov/v1/api/search2
Content-Type: application/json

{
  "keyword": "rural health",
  "oppStatuses": "posted|forecasted",
  "eligibilities": "12",
  "rows": 100,
  "startRecordNum": 0
}
Enter fullscreen mode Exit fullscreen mode

You get hitCount and an oppHits array: opportunity ID, number, title, agency code, open/close dates, status, and CFDA numbers. Filters compose with pipes: agencies (NSF, HHS, USDA...), fundingCategories (ED, ENV, HL...), eligibilities (12 = 501(c)(3) nonprofits, 20 = private universities, 22 = for-profits). Pagination is startRecordNum.

The status values matter more than they look. posted is open-now. forecasted is the interesting one: grants that are announced but not yet open — the window where a grant writer positions a client before the competition starts writing.

Details are one more POST

POST https://api.grants.gov/v1/api/fetchOpportunity
{"opportunityId": 103313}
Enter fullscreen mode Exit fullscreen mode

The synopsis block carries what the alert platforms sell as premium fields: awardCeiling, awardFloor, estimatedFunding, expectedNumberOfAwards, applicantTypes, costSharing, the full description, and — the field that surprised me — agencyContactEmail, the actual program officer inbox. In my verification run, 22 of 25 opportunities had one.

The two gotchas

  1. Relevance order lies. The default ordering happily surfaces a "posted" opportunity from 2012. Sort client-side by openDate descending and drop anything whose closeDate is behind you, or your "new grants" feed opens with the Obama administration.
  2. Money fields are strings with moods. awardCeiling can be a number, an empty string, or the literal string "none". Normalize before you compare.

Alerts are dedupe plus a schedule

The product these platforms sell is "tell me only what is new for my profile." That is: store the opportunity IDs you have already returned (a named key-value store on Apify), run the search on a weekly schedule, and skip seen IDs. Twenty lines of code, and the output is rows you can pipe to Slack or a client tracker instead of a marketing email.

I packaged all of it as an Apify actor: Grant Opportunity Finder — keywords, agency, category, and eligibility filters, forecasted support, detail enrichment with contact emails, recency sorting, past-deadline filtering, and cross-run dedupe, at $0.01 per opportunity row with the first 2 rows of every run free. The 25-row verification run cost $0.00056 to produce, which tells you everything about the margin structure of the incumbents.

Public data with a subscription moat around it is the most common shape of the alert-tool economy. Sometimes the moat is real (hard scraping, entity resolution). Here, it is one POST request.

Top comments (0)