# Changelog of SAM.gov Federal Contract Opportunity & Award Alerts (2026) (`scrapebench/samgov-opportunity-alert`) Actor

- **URL**: https://apify.com/scrapebench/samgov-opportunity-alert/changelog.md
- **Full Actor documentation**: https://apify.com/scrapebench/samgov-opportunity-alert.md

## Changelog

### 0.1.9

- Fix intermittent run failures (drove the Store "under maintenance" flag): route the SAM.gov
  fetch through the shared `request_with_retries` (429/5xx backoff, honors `Retry-After`) instead
  of crashing on the first non-200. A transient rate-limit/gateway blip that survives all retries
  now degrades to the rows gathered so far (a clean, charge-nothing run) rather than a failed run;
  non-transient 4xx still raise.

### 0.1.0

- Initial release: stateful new-since-last-run alert over the GSA Get Opportunities (SAM.gov) API.
  Filters by NAICS, keyword, agency, set-aside; dedupes per filter-config in a named KV store;
  baseline run is free, charges per new opportunity.

### 0.2 — 2026-07-21

#### Fixed

- **A throttled run no longer looks like a quiet day (#133).** All public runs share one baked-in
  data.gov API key with a **daily** quota. On exhaustion the actor degraded to a clean 0-row run —
  so a customer monitoring for federal opportunities was told "no new opportunities" when the
  truth was "we could not look". On an alert actor that is a false all-clear, not a graceful
  degradation. The run now emits a free `status` marker row explaining what happened and when the
  quota resets (00:00 UTC).
- `fetch_opportunities()` returns `(rows, degraded_reason)` instead of silently swallowing why it
  stopped early.
- Charging keys off `status is None`, so a marker row can never be billed.
