# Changelog of Greenhouse, Lever & Ashby Job Scraper API (`tidyfetch/ats-jobs-api`) Actor

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

## Changelog

### 0.1 (build 0.1.4 and later) — 2026-09-26: SmartRecruiters removed, review fixes

- **SmartRecruiters support removed.** SmartRecruiters' API policy limits the public Posting API to customers' own career sites and forbids large-scale extraction, and `api.smartrecruiters.com/robots.txt` disallows all crawlers except LinkedIn's. Inputs with `"ats": "smartrecruiters"` now fail with an explanation; `auto` tries Greenhouse, Lever and Ashby.
- README: price stated at the top; the run fee is mentioned wherever charging is described; the claim that charged events always equal written rows is corrected (a failed charge request keeps the written jobs); the privacy note says exactly what is masked; a not-affiliated note was added.
- Console form: `maxJobsPerCompany` starts at 20 so a first test run stays small (the API default is still 500).

### 0.1 (first Store release, 2026-09-26)

Includes everything below.

### 0.1.1 — 2026-09-25 (review fixes)

- Output commit (budget check, push, charge) is serialized across companies with a mutex, so concurrent companies cannot overrun the spending limit or trigger the SDK's overcharge-by-one; charged events equal written rows unless a charge request itself fails.
- `run-started`'s `eventChargeLimitReached` no longer stops the run by itself; the run continues while at least one `job-listed` fits the budget.
- Once the limit is reached, no further company is contacted (auto-detection included); such companies are reported as `skipped` in `SUMMARY`.
- De-duplication no longer strips `gh_jid`, `ref` or `source` from URLs (Greenhouse career pages identify the job by `gh_jid`).
- Phone masking rewritten: dates, version numbers, IPs and numeric ranges are never masked; international, parenthesised and national formats are recognised; bare 7-digit local numbers are masked after a phone cue.
- HTTP client keeps the raw response body only for failures or unparseable responses.
- Greenhouse is fetched without `content=true` when `includeDescription` is false (department is then unavailable).
- Lever paging is capped at 200 pages and stops when a page repeats the previous postings.
- Lockfile regenerated for `apify ^3.7.2`; Docker build uses `npm ci`.

### 0.1.0 — 2026-09-25

First version.

- Greenhouse, Lever, Ashby and SmartRecruiters public job-board APIs (GET only).
- `ats: "auto"` tries the four APIs in order and keeps the first match.
- Filters: `postedAfter`, `titleKeywords`, `locationKeywords`, `remoteOnly`, `maxJobsPerCompany`.
- Normalized rows (`id, ats, company, companyId, title, department, location, remote, url, postedAt, updatedAt, descriptionText, salary, source`), de-duplicated by URL and `ats:id`.
- Email addresses and phone numbers in `descriptionText` are masked.
- Pay-per-event charging: `run-started` once per run, `job-listed` per job written; charging failures never drop output.
- Max 4 concurrent requests, per-host crawl delay for Lever, exponential backoff on 429/5xx.
