# Changelog of Greenhouse Jobs Monitor & Scraper (`redomic/greenhouse-jobs-monitor`) Actor

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

## Changelog

- 2026-11-07: monitor audit summary row — every monitor run now pushes one summary with `checked`/`unchanged`/`new`/`changed`/`removed` counts, `runStatus`, `charged` and evidence `newIds`/`changedIds`/`removedIds` matching the event rows delivered; a second unchanged run bills $0 (0 new / 0 charged) and stays `ok`; dataset schema exposes the audit columns.

- 2026-11-07: leader-parity structured filters `locations`/`workplaceTypes`/`employmentTypes`/`minSalary`+`salaryCurrency`/`hasSalaryOnly` in jobs, detail and monitor modes — OR within a filter, AND across filters, applied before maxItems/billing; `minSalary` compares annualized `salaryMax` (year x1, month x12, hour x2080) and excludes null salary, `hasSalaryOnly` excludes null salary, Remote matches workplaceType or a remote location word, and monitor state is keyed per filter set so filtered runs bill $0 when unchanged.

- 2026-11-06: new `postedSinceDays` input filter — keep only jobs first published within the last N days (set 7 for "new this week", 30 for "new this month") in jobs, detail and monitor modes, without monitor state. Rows with no `postedAt` are excluded when the filter is set; the cutoff is inclusive.

- 0.9 (2026-11-03): refresh live fixtures and tolerate boards that omit the company internal job id (null instead of an int), plus harden id parsing for numeric-string ids.

- 0.7 (2026-11-03): monitor mode no longer reports every job as removed and re-added (and bills it again) on the second run. Greenhouse job ids are numbers and the saved state came back with string keys, so no id ever matched; state is now keyed by the id as a string.

- 0.6 (2026-11-02): a valid board with no open jobs (the battery's `prisma` input, which caused the failed runs) is confirmed as a successful run with an explicit `empty` status row; captured live airbnb and prisma fixtures and locked both in tests. README no longer claims empty boards fail a run.

- 0.5 (2026-11-02): empty boards (and quiet monitor days) no longer fail the run; refresh live fixtures.

### Unreleased

- Improved Store discoverability: title/SEO/description now lead with "Greenhouse Jobs" and include "monitor"; README first screen matches buyer search intent (monitor/schedule/new-changed-removed).
- 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 (`greenhouse-jobs-monitor-state`), opened only in monitor mode.

### 0.3

- Salary parsing moved to the shared module used by all our jobs Actors; day rates are recognised and a 100-999 range with no stated period gets a null period instead of a guessed "hour".

### 0.2

- Salary: `salaryMin`, `salaryMax`, `salaryCurrency` (ISO 4217), `salaryPeriod` (year/month/hour), `salaryText`, `salarySource` and `salaryRanges` on every row. Structured pay-transparency ranges are requested with every board fetch (`pay_transparency=true`, no extra request); with `includeDescription`, a range written in the description text is read when no structured one exists. Typo zones (top > 10x bottom) never drive min/max.
- New `workplaceType` (Remote/Hybrid/Onsite from the company's field or a remote location).
- `employmentType` is now inferred, conservatively, from the title (or description) instead of always being null.
- Placeholder requisition ids (`ONE`, `MULTI`, `See Opening ID`) are emitted as null; strings are trimmed.
- `search` also matches location and department. `maxItems` is now a per-board cap, so one large board cannot crowd out the others.
- Agent-ready: `boards` defaults to `["airbnb"]`, `jobIds` to `[]`; `{}` is a valid input.
- Monitor mode: a changed salary range is reported as `changed`.

### 0.1

- First release: reads Greenhouse's public job-board API (`boards-api.greenhouse.io`) with plain HTTP — no proxy, no browser, one request per board.
- Three modes: `jobs` (list every open job), `detail` (full description, department and offices for specific job ids) and `monitor` (new/changed/removed since the last run, state kept in a named key-value store).
- One flat row per job with a stable `id`, company, location, department, ISO dates, and the real apply link; the full description as plain text and HTML when requested.
- Never silent: a misspelled, empty or failing board pushes a status row with a reason and the run exits non-zero; the last row is always a summary.
- Pay per job only; status, summary and failed rows are free, and monitor mode charges only new and changed jobs.
- 0.4 (2026-11-01): Refresh fixtures/parsing compatibility for live Greenhouse API responses; add live airbnb fixture.
- 0.8 (2026-11-03): empty board status rows reported as ok for battery compatibility
- 0.10 (2026-11-05): refreshed live fixture (airbnb canary board) and verified parser against current Greenhouse API response.
