DEV Community

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

The API

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. 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
}

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.

Status Values

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 Endpoint

Details are one more POST:

POST https://api.grants.gov/v1/api/fetchOpportunity
{"opportunityId": 103313}

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

  • 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.
  • 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.

The Implementation

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.

Comments

No comments yet. Start the discussion.