# Changelog of ATS Jobs Scraper — Greenhouse, Lever, Ashby & Job Tracker (`devjoi/ats-jobs-scraper`) Actor

- **URL**: https://apify.com/devjoi/ats-jobs-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/devjoi/ats-jobs-scraper.md

## Changelog

All notable changes to this project are documented here.
Format based on [Keep a Changelog](https://keepachangelog.com/); versioning follows [Semantic Versioning](https://semver.org/).

### \[0.1.3] - 2026-10-11

#### Changed

- Store discoverability pass: the title and short description now name the supported ATS platforms and the pay-per-result price; README gains "When should you use this Actor?", "Why this Actor", an API invocation example and a limitations section. Documentation only — no behavior changes.

### \[0.1.2] - 2026-10-08

#### Fixed

- **Change-detection storage renamed** to an actor-specific name (`ats-jobs-scraper-seen-state`). Apify storage names are unique per Apify account, and a limited-permission run can only access storages created by the same actor — the old generic name (`seen-state`) could clash with an unrelated store in a user's account and make the run fail. Opening the store is now also fail-safe: if it is unavailable, the run continues (with a warning and `stateStoreStatus: "unavailable"` in the `SUMMARY` record) instead of crashing, and no jobs are misreported as new in later runs.

### \[0.1.0] - 2026-10-07

Initial release.

#### Added

- **Apify store conformance**: output schema (`.actor/output_schema.json`), dataset schema (25 fields + overview table view) and key-value store schema, all wired through the canonical `input`/`output` keys and validated with the official `apify validate-schema` and the Apify meta-schemas; store-ready README; Dockerfile updated to the current Apify standard (`apify/actor-node:24`, non-root `myuser`, `--chown` copies, npm cache cleanup).
- **Six ATS adapters**: Greenhouse, Lever, Ashby, Recruitee, Personio and Breezy — each written against the provider's live payload structure (verified with captured real responses).
- **Auto-detection** of the ATS platform from a plain slug, a domain or a career-site URL, with an optional `ats` override.
- **Normalized output schema** (25 fields) shared across all platforms, plus runtime validation on every record — invalid records are dropped and counted, never silently pushed.
- **Filters**: title include/exclude keywords, location keywords, remote-only; `maxJobsPerCompany` safety cap; bounded concurrency.
- **Change detection** (`onlyNewJobs`) backed by a named key-value store (`seen-state`), persistent across runs on the platform; KV-safe key format.
- **HTTP client** with HTTPS-only guard (localhost exception for tests), retries with exponential backoff + jitter, per-request timeouts, response size caps and typed error codes.
- **Per-company error isolation**: a failing company is reported in the run summary without affecting the rest.
- **Run summary** (`SUMMARY` key-value record + log line): per-company and global stats — fetched, output, new, filtered, skipped, invalid, durations, errors and warnings.
- **Local runner** (`npm run local`) emulating platform storage, `--fresh` flag, and handling of the SDK's local `purgeOnStart` behavior so change detection works locally too.
- **Test suite** (84 tests):
  - unit tests for text/HTML handling, salary/remote/seniority normalization, detection, HTTP client (against a local server), validation, state store and concurrency pool;
  - dataset-schema tests: every record produced from the real fixtures is validated with AJV (draft-07) against `.actor/dataset_schema.json` — the same validation Apify runs on every dataset push — plus field-coverage drift and false-negative guards;
  - adapter tests against captured real payloads (a 923-record sample across the six platforms, including a descriptions-enabled Greenhouse payload);
  - end-to-end pipeline tests: filters, dedupe, validation, error isolation and change detection across three chained runs;
  - opt-in live integration tests (`RUN_LIVE=1`) against real endpoints, including posting-URL reachability checks.

#### Notes

- Conformance verified on 2026-10-08 against the current Apify documentation: `apify validate-schema` validates all four `.actor` schemas, they are valid against the official Apify meta-schemas, and the 960 records of a real run pass AJV validation against the dataset schema (0 failures).
- Salary parsing is heuristic and best-effort: structured provider compensation is preferred; text parsing handles common formats (`$120,000 - $160,000 per year`, `€60k–€80k`, `CHF 120,000 - CHF 150,000`, `$0.05 – $0.06 / hour`) and leaves fields `null` when not reliable.
- SmartRecruiters and Workable are on the roadmap (waitlist) — their public endpoints could not be verified reliably at release time.
