# Changelog of Workable Jobs Scraper — Company Job Boards (`adderleydata/workable-jobs-scraper`) Actor

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

## Changelog

### 0.1 — first version, 25 Sep 2026

- Any number of Workable careers pages per run, by account name (`acme`) or by any link that names it: the careers page (`apply.workable.com/acme/`), one of its jobs, its application page, the legacy `acme.workable.com` address or Workable's public API. One request per board returns the whole board, every job's text included.
- A short job link (`apply.workable.com/j/<code>`), a Jobs by Workable link and a company's own careers domain are refused with a message asking for the account name: none of them says which Workable account is behind it, and no request is sent to find out.
- Output in the Adderley Data `job.v1` schema: the company name Workable gives with the board; the department as category; every place the job's careers page shows, with city, region and Workable's ISO country code from the first; employment type from Workable's employment type; `remote` for jobs Workable marks as remote and `unknown` for the rest, because Workable's feed does not say hybrid or on-site; the published date, at 00:00 UTC.
- A job Workable's feed lists once per place is one row with every place. A place the company hides from its careers page is never output and never matched by a filter.
- Pay: Workable's public feed has no salary fields. Where a job's text states a range, the range is read from that sentence, which is kept in `salary.raw`. No range, no salary.
- Filters on title keywords; location, country or "Remote" (every place shown counts); department; and days since the job was published.
- Incremental mode: `changeType` of NEW, UPDATED, REAPPEARED or EXPIRED; unchanged jobs skipped and not charged. A change is found by comparing the job's fields and a hash of its text; a formatting change alone is not an update, and neither is a new internal requisition code, creation date or order of the jobs on the board.
- Optional full descriptions — the description, requirements and benefits as Workable publishes them — from the same request as the listing, with email addresses, phone numbers and personal profile addresses redacted by default. `description.html` keeps each link's words and drops its address, and drops images.
- An account name Workable does not know fails that board's request once, with a message saying so, and is never counted as a block. The other boards in the run are kept, and nothing is declared expired. A run in which every board is missing ends with an empty dataset and a message naming them.
- The run's output is declared for Console's Output tab, the Run API and AI agents: jobs in the default dataset, the run summary in the default key-value store.
- No recruiter names, emails or phone numbers in any field: the company's own blurb, the application link and Workable's targeting fields are never read, and `job.v1` has nowhere to put a person.
- 26 Sep 2026: Workable's rate limit is honoured. The defaults are one request at a time and at most ten a minute. When Workable answers 429 (too many requests), the Actor waits as long as Workable asks, or 30 seconds, and asks again from the same address, at most twice; a board still refused fails with a message naming it, and the run summary counts every 429 under `http.tooManyRequests`. The Actor no longer retries a refused request at once from another address.
- 26 Sep 2026: a board that does not exist is no longer logged as a failed request with an error trace; it is named once, as before. The prefilled example board is now `futureplc`, one company's public careers page, because Workable's own careers page has too few open roles to show what the Actor returns.
- 27 Sep 2026: text read from HTML decodes every character reference HTML 4 defines — `1.5&times;` reads "1.5×", `&eacute;` reads "é", `&euro;` reads "€" — where before only fifteen common ones were decoded and the rest were delivered as written. In `description.text` a list item whose words sit in their own paragraph reads "• words" on one line, list items sit one under the other, and an item that holds only a list of its own no longer adds an empty bullet. `description.html` is unchanged. In incremental mode a posting whose text or title held one of those references may be reported as UPDATED once, on its first run after this change.
- 28 Sep 2026: a run in which every row fails the `job.v1` contract now fails with a message that names the first fault, where before it finished as a success with an empty dataset. In incremental mode a posting whose row is not saved is no longer recorded as seen, so the next run offers it again instead of skipping it as unchanged.
- 28 Sep 2026: contact details in descriptions. United Kingdom phone numbers written in their own formats — "07123 456789", "01234 567890", "+44 7700 900123", or eleven digits with no spaces — are now redacted like other phone numbers, and a number written after a country code and a one-digit area code ("+61 2 9123 4567") is redacted whole, where before "+61 2" was left in front of "\[redacted]". A figure after a pound or euro sign is never taken for a phone number. Only `description.text` and `description.html` change, and no posting is reported as UPDATED because of it.
