# Changelog of SAM.gov Opportunities Feed (Unofficial) (`graylabs/sam-gov-opportunities`) Actor

- **URL**: https://apify.com/graylabs/sam-gov-opportunities/changelog.md
- **Full Actor documentation**: https://apify.com/graylabs/sam-gov-opportunities.md

## Changelog

### 0.3.5 (2026-10-17)

- New option **Skip notices whose response deadline has passed** (`skipPastDeadlines`), on by default: notices whose response deadline is already over at run time are not saved or charged. Time-zone safe (a deadline without a time zone counts as passed only once it has passed everywhere; a date-only deadline lasts to the end of that day). Notices with no deadline are always kept, and award, justification and bundling notices are never skipped. The run log, the status message and `RUN_SUMMARY.pastDeadlineSkipped` show the count. Set it to `false` for the previous behaviour.

### 0.3.3 (2026-10-17)

- Example inputs in `examples/` (also in the README). No code changes.

### 0.3.1 (unreleased, local build only)

- Pay-per-event pricing (`opportunity` event) in both data sources. No code change; prices are set on the Apify platform.
- README: new Reliability section.
- actor.json description shortened to 261 characters (Apify's limit is 300; `apify push` rejected the longer one).

### 0.3.0 (unreleased, local build only)

- New default data source: SAM.gov's public Contract Opportunities daily CSV extract. No key or SAM.gov account needed. Streams the file with constant memory and stops reading once it is past your date range (the file lists the newest notices first).
- API mode (`mode: "api"`) is unchanged and still needs your SAM.gov API key.
- Same output schema in both modes; `source` tells you which one a row came from. Same filters where the CSV has the columns, same dedupe, change tracking and pay-per-event charging.
- Default date range: last 3 days for the CSV, last 7 for the API. The prefilled example uses the CSV, last 7 days, 20 results.
- CSV downloads retry with backoff and resume past rows already read; clear messages if the file is missing, changes format, or is more than 48 hours old.
- With descriptions on, the CSV source takes them from the file at no extra cost (emails and phones removed).
- The API key is no longer a required field (CSV mode needs none).

### 0.2.0 (unreleased, local build only)

- Title is now "SAM.gov Opportunities Feed (Unofficial)"; README states no affiliation with, endorsement by, or sponsorship from GSA or SAM.gov.
- Fewer SAM.gov requests: pages through a date range (largest page first) before splitting it; detects the offset format once and reuses it.
- New optional full descriptions (`includeDescriptions`, off by default; `maxDescriptions`, default 5). Each costs one SAM.gov request; emails and phone numbers are removed.
- Run summary shows SAM.gov requests used this run, quota headers if SAM.gov sends them, and when a rate-limited key can be used again.
- Clearer quota error citing GSA's documented 10 requests per 24 hours for personal keys without an entity role.
- Request timeout raised to 120 s (SAM.gov can be slow).
- FAQ rewritten as factual statements only.

### 0.1.0 (unreleased, local build only)

- First build: SAM.gov Get Opportunities Public API v2 with your own key.
- Date range or last N days, automatic one-year chunking, window splitting and page fallback for busy days.
- Filters: keywords (title), NAICS, notice type, set-aside, state, agency.
- Retries with exponential backoff and Retry-After; clear errors for bad or missing keys and quota exhaustion; per-run request cap.
- Dedupe by noticeId, zod-validated flat output, optional change tracking (new/updated/unchanged).
- No point-of-contact data or street addresses; awardee withheld on awards before 2022-04-04.
- Pay-per-event `opportunity` charging that respects the user's max cost per run.
