# Changelog of ATS Jobs Hiring Radar: Greenhouse, Lever, Ashby, Time-to-Fill (`rayla/ats-hiring-radar`) Actor

- **URL**: https://apify.com/rayla/ats-hiring-radar/changelog.md
- **Full Actor documentation**: https://apify.com/rayla/ats-hiring-radar.md

## Changelog

All notable changes to ATS Hiring Radar are listed here. Prices change at most once a month with 14 days' notice.

### 0.1.0 - 2026-09-17

Initial release.

- Six ATS read through their official public job-board APIs: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee and Personio. Workable is recognised in the input but disabled until a live board with jobs has been verified.
- Company input as `ats:slug`, board URL or plain company domain with cached ATS auto-detection.
- One normalised job schema: stable `uid`, employer `postedAt` / `updatedAt`, `seniority`, `function`, `remoteType`, ISO-2 `countryCode`, `normalizedTitle`, provenance-tagged `compensation` (`source` = `ats` or `description-regex`).
- Monitor mode with per-company history in a named key-value store on your account: new jobs only after the baseline, closures from complete scans only, 7/30/90-day deltas, surge and contraction flags.
- Time-to-fill analytics: `daysOpen`, `isStale`, `daysToClose`, `medianDaysToFill90d`, `p75DaysToFill90d`, `closedRolesTracked90d`, `staleShare`, `hardToFillFunctions`.
- Eight built-in signal types plus user-defined regex Signal rules with a 160-character evidence snippet; signals deduplicated across runs.
- Optional HMAC-SHA256-signed signal webhook with a durable outbox.
- Pay-per-event pricing: job-record, company-snapshot (primary), signal, Actor start. First 100 job rows of every run are free; error rows are never billed.
- Dataset views: Jobs, Company snapshots, Signals.

Release-candidate fixes (2026-09-21, before publication):

- `stale_role` alerts only when a role becomes stale while tracked: a role already past Stale after (days) when first seen (the baseline run, or a role appearing later with an old posting date) is recorded as stale and never fires (previously the first monitor run fired once for every already-stale role).
- Extract mode is stateless: it neither reads nor writes the state store, returns every open job on every run, one snapshot per company computed from that run only (`isBaselineRun: true`, `historyRuns: 0`, `firstTrackedAt: null`) and only `rule_match` / `leadership_hire` signals.
- Partial, capped and held scans no longer feed the trend history: their deltas, `openRolesPct30d`, `surge` and `contraction` are `null`, and later runs skip their counts, so a truncated scan cannot produce a false contraction or a later false surge.
- A mass disappearance (zero postings for a tracked board, or at least five roles and 80% of the board gone at once) is held and reported as `company_error` `partial_scan`; the roles close only when the next complete scan confirms it, dated at the first miss.
- The per-company state record is bounded: roles that leave a capped board's window are dropped after max(2 x Stale after (days), 120) days without a closure, and the jobs map is capped at max(3 x Max jobs per company, 5,000) records (12,000 at most).
- Signals a spending limit withholds are queued in the state store (up to 1,000 per company) and delivered, each exactly once, by the next monitor run; withheld job rows were already re-emitted.
- New `company_snapshot` field `capped` (board truncated at Max jobs per company).
