# Changelog of US Grants Monitor 🇺🇸 (Grants.gov alerts + NIH award history) (`tagadanar/us-grants-monitor`) Actor

- **URL**: https://apify.com/tagadanar/us-grants-monitor/changelog.md
- **Full Actor documentation**: https://apify.com/tagadanar/us-grants-monitor.md

## Changelog

### 2026-09-08

- **A run can no longer spend more time than it has.** The retry ladder booked
  its worst case up front — five attempts at a 30-40 second timeout plus backoff,
  roughly 165-231 seconds for a single request — under loops with no ceiling.
  Because everything was collected before anything was delivered, a run killed
  by the platform timeout handed back nothing and could not say why.
- Every request now plans against the time actually left. A run that hits its
  limit delivers what it did read and says plainly that the result is PARTIAL,
  naming the sources or entries it never reached — instead of reporting an empty
  search, which is a claim it has not earned.
- A request the source rejects outright (a 4xx that is not a rate limit) leaves
  the ladder at once instead of being retried five times.

### 2026-08-30

- Two new opportunity filters, both verified live against the Grants.gov
  search2 API on 2026-08-30:
  - **Funding categories** (`fundingCategories`) — the funding-activity codes
    Grants.gov publishes. 1,618 open/forecasted opportunities in total, 876
    under Health, 336 under Science and Technology.
  - **Applicant eligibility** (`eligibilities`) — the applicant-type codes.
    766 of those opportunities are open to small businesses.
    Both are dropdowns rather than free text on purpose: Grants.gov answers an
    unknown code with errorcode 0 and hitCount 0, so a typo would be
    indistinguishable from an empty result set. Either filter now also counts as
    scoping the query, so a run can be scoped by category alone.
- Every run now finishes with a status message that says what actually
  happened, chosen from counters rather than from an empty dataset — and it
  always names WHICH source answered. This actor reads two independent APIs
  (Grants.gov and NIH RePORTER) and one can be down while the other is healthy:
  a run where only one answered is now reported as a PARTIAL answer with the
  failing source named, instead of exiting with a single "could not reach"
  message that threw away the rows the other source did return.
- README: opportunity and award prices are stated per 1,000 with the real
  plan-discount steps.

### 2026-08-19

- The User-Agent contact is now the actor's own Apify URL instead of an email
  address. Same identification, same reachability (the actor page's Issues tab),
  no published mailbox.

### 2026-07-17

- Initial build.
- Grant opportunity search on the official Grants.gov `search2` API: keyword, agency, ALN/CFDA number and opportunity-status filters, with an optional per-opportunity detail lookup (award ceiling/floor, expected number of awards, full description, last-updated date) gated behind `includeDetails`.
- Award-history enrichment on the official NIH RePORTER API: keyword, agency, activity-code and fiscal-year filters, returning principal investigators, recipient organization and UEI, award amount and its direct/indirect cost split.
- `mode` selects opportunities, awards, or both in one dataset tagged by `recordType`.
- Monitor mode (opportunities only): persistent seen-set returns only opportunities new since the last run, with a Slack-compatible webhook digest. Award history is a point-in-time lookup and is never diffed.
- Input is tolerant of common shapes (a bare string / bare object / delimited string for list fields is coerced into a list, including datasets piped straight from another actor). Empty scope exits cleanly with a status message instead of failing the run.
- Official Grants.gov and NIH RePORTER APIs, no API key.
