# Changelog of ATS Job Feed: Greenhouse, Lever, Ashby & More (`saiberops/ats-job-feed`) Actor

- **URL**: https://apify.com/saiberops/ats-job-feed/changelog.md
- **Full Actor documentation**: https://apify.com/saiberops/ats-job-feed.md

## Changelog

### 1.0.1 (unreleased)

- Security: every request, redirect hop and robots.txt fetch goes through an SSRF guard; careers-page URLs (or redirects) that point at private, loopback, link-local or internal hosts are refused with a free `UNSAFE_TARGET` error.
- Locations: "Berlin, DE", "Tel Aviv, IL", "Bengaluru, IN", "Toronto, ON, CA" and similar are no longer read as US states; a two-letter code that is both a US state and a country is resolved from a known city or left `null`. "Portland, OR" keeps its state.
- Greenhouse pay interval: the range title's keyword (hourly, annual, monthly, weekly, daily) is used first; the size thresholds are only a fallback and only in USD-scale currencies (a JPY hourly 15,000–25,000 range is no longer labelled yearly).
- Every download has a wall-clock limit (15 s for careers pages and robots.txt, 60 s for job-board APIs); a slow host gives a clean, free `TIMEOUT` error instead of holding the run.
- `ats-detected` is no longer charged (or cached) for a careers page that points at a Lever board with no postings: Lever answers `[]` for unknown names too.
- A 403/429 on the Greenhouse or Lever EU fallback host no longer hides the primary host's answer (e.g. `BOARD_NOT_FOUND`); a blocked Greenhouse `/departments` call is a warning, not a failed board.
- Personio: feed redirects are followed by hand with a robots.txt check on every hop; a redirect away from the `*.jobs.personio.de/.com` feed hosts is reported as `BOARD_NOT_FOUND` without fetching the target.
- An input without a `companies` field (Apify's daily test, bare API calls) reads the three example boards instead of returning nothing; an explicit empty list still does nothing.
- README: removed the pointer to another Actor.
- A detection cache that can't be opened is skipped with a warning instead of crashing the run.
- `contentHash` ignores the order of a job's locations and departments and float noise in pay amounts (jobs with one location and one department hash as before).

### 1.0 (2026-10-24)

- First release: Greenhouse, Lever, Ashby, Recruitee and Personio public job-board APIs in one normalized job schema (departments, teams, locations with city/region/ISO country, workplace type, employment type, structured pay ranges, posted/updated dates, job and apply URLs).
- Input as board URLs, `ats:token` shorthands or careers-page URLs with ATS auto-detection (robots.txt respected, cached for 30 days), optional board-name guessing.
- Filters: title include/exclude, department/team, location, country, remote or hybrid, employment type, pay range present, posted within N days, unlisted Ashby jobs.
- Pay per event: `job` per returned job, `ats-detected` per successful careers-page detection; stops cleanly at the run's max cost.
