# Changelog of Workable Job Board Scraper — Company Hiring Signals (`foxlabs/workable-ats-scraper`) Actor

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

## Changelog

### Cross-link — 2026-10-20

- README: links the cross-platform [Job Postings Database](https://apify.com/foxlabs/job-postings-database), for searches that span every ATS at once. No code, input, output or pricing change.

### 0.2.0 — 2026-10-14

- Restart-safe: when Apify migrates a run to another host, the actor starts again with the same dataset. It now reads the jobs already delivered (`companyBoard` + `jobId`), never writes or charges them again, and tops each query up to its cap only (beta run PpDnVESHJoXf6J2Db was migrated after 7,417 rows and started over). Proxy/network errors on a search page (e.g. proxy status 594) are retried with backoff instead of failing the whole search.
- New: keyword search across all of Workable (`searchQueries`) via the public job search (`jobs.workable.com/api/v1/jobs`) — no company slug needed. Filters: `location`, `workplace`, `employmentType`, `postedWithinDays`, and `titleMustMatch` for strict title matching (dropped jobs are never charged). Cursor pagination, up to 10,000 jobs per keyword.
- New company fields on search rows: `companyWebsite`, `companyDomain`, `companyLogo`, `companyDescription`, `companyJobsUrl`; new role fields `workplace`, `language`, `requirements`, `benefits`. Board rows now also carry `companyDescription` and `companyJobsUrl`.
- A job found by several keywords is delivered and charged once per run.
- `queries` (company boards) works exactly as before and is now optional.
- Rate limits: the job search answers HTTP 429 after ~120 quick pages from one IP (beta run m0CUoD7P0rUw5O95m lost a whole 10,000-row search to it). Pages now go out on one shared, self-widening interval (start 0.5 s), back off up to 60 s on 429, and if the source keeps refusing, the jobs already collected are delivered with a log warning instead of being dropped.
- Proxy: `proxyConfiguration` now defaults to Apify Proxy (datacenter). The 429s are a per-IP quota, not a depth limit: a 10,000-row search stopped at 8,000 (run 4slEwQUn9QzPhetaE) and the next run from the platform was refused from its first page for 3+ minutes (run g6QNbXpoe9hSGGe1d); each request now goes out through a fresh proxy session.
- Fix: every row has the same key set (`industry` used to appear only on board rows). Remote search hits show their real place instead of Workable's `TELECOMMUTE` marker.

### 0.1.0 — 2026-10-11

- Initial release. Scrapes every open role from any company's Workable job board via the public widget API (`apply.workable.com/api/v1/widget/accounts/{slug}?details=true`), no API key.
- Accepts account slugs, `apply.workable.com/{slug}` URLs and `{slug}.workable.com` URLs.
- Maps title, department, function, location (city/region/country), remote flag, employment type, seniority, industry, posted/created dates, HTML-stripped description and apply URL.
- Shares the B2B hiring-signal core (`core.js`) with the Greenhouse/Lever/Ashby/… series: same row schema (join key `companyName` + `companyBoard`), pay-per-posting, concurrent queries, empty/failed queries returned as non-billable rows.
