# Changelog of Ashby Jobs Scraper with Salaries (`redomic/ashby-jobs-monitor`) Actor

- **URL**: https://apify.com/redomic/ashby-jobs-monitor/changelog.md
- **Full Actor documentation**: https://apify.com/redomic/ashby-jobs-monitor.md

## Changelog

### Unreleased

- Added `seniority` field and `seniority` filter (`Intern`, `Junior`, `Mid`, `Senior`, `Lead/Principal`), read from the title; matches the seniority enrichment on the top Store competitors (bovi/greenhouse-lever-ashby-job-scraper, factpipe/ats-jobs-feed) that this Actor lacked. On the 31 Oct 2026 ramp capture (171 jobs): 115 `Mid`, 27 `Senior`, 21 `Lead/Principal`, 5 `Intern`, 3 `Junior`.

- 0.6 (2026-11-02): Raised the HTTP client timeout to 120 s (2 attempts) for large boards such as OpenAI so they no longer time out mid-download; parser unchanged.

- 0.7 (2026-11-03): Ashby now puts OTE notes (e.g. "80/20 split between base and variable") in a tier's additionalInformation; the parser checks that field, alongside the component summary and the overall tier summary, when classifying a Salary range as on-target earnings, so OTE figures are not reported as base salary.

- 0.8 (2026-11-03): Refreshed live fixtures (ramp now publishes 169 jobs); tolerate a null `jobs` array in a board response instead of raising ParseError.

- 0.5 (2026-11-02): A board that does not exist (404) or has no open jobs no longer ends the run FAILED: it is reported in the status and summary rows, and only an unreachable or unparseable board fails the run, so scheduled monitors stop failing on typos and empty boards. A salary read from the description no longer keeps `salaryBasis: "ote"` from a structured on-target-earnings tier (5 Ramp sales jobs), and the published OTE tiers stay in `salaryRanges`.

- 0.4 (2026-11-01): Handle KV store permission failures in monitor mode gracefully without failing runs.

- 0.3 (2026-11-01): Publish with prefilled default input in monitor mode (ramp, openai, maxItems 50) to demo deltas on first runs.

- 0.2 (2026-11-01): Handle KV store permission failures in monitor mode gracefully.

- Fix: on-target earnings (OTE, base + commission) published inside a Salary component were reported as salary. They now go to `oteMin`/`oteMax`; `salaryBasis` (`base`/`unspecified`/`ote`) says what the salary range is.

- Monitor runs with nothing new, changed or removed end successfully (status `ok`): scheduled monitors no longer fail on quiet days.

- Monitor state lives in a store named after the Actor (`ashby-jobs-monitor-state`), opened only in monitor mode.

### 0.1

- First release: reads Ashby's public posting API (`api.ashbyhq.com/posting-api/job-board/<board>?includeCompensation=true`), one request per board, no proxy or browser.
- Salary as numbers from Ashby's structured compensation (min, max, ISO currency, period, every tier in `salaryRanges`), equity/bonus/commission flags; a range written in the description is read when no structured one exists.
- Flat rows: department, team, location, city/region/country, secondary locations, remote flag, workplace and employment type, posting date, job and apply links.
- Modes: `jobs` and `monitor` (new/changed/removed since the last run, state in a named key-value store; a changed pay range counts as changed).
- Never silent: 404 and empty boards push status rows; a run with no data exits non-zero. Pay per job; monitor charges only new and changed jobs.
