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

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

## Changelog

### 0.1 — first version (25 Sep 2026)

- Any number of JazzHR career pages per run, by subdomain or by any applytojob.com link — the career page or a posting. Subdomains are kept in lower case.
- Each board's list of postings is read in one request from the company's public career page at `<company>.applytojob.com/apply`; JazzHR publishes no feed of one company's postings. Both of JazzHR's career-page layouts are read: the current one and the older one some companies still use. Every posting that will be saved then gets one request for its own page: its employment type and, where the page publishes them in its structured data, its posting date, pay and postcode.
- Output in the Adderley Data `job.v1` schema: the company name the career page shows; the location as JazzHR prints it, with city and region read from it where its shape is plain and the country where it names one; the department as category; the employment type from the posting's "Type"; `remote` where JazzHR lists the posting as remote.
- Pay from the pay the company entered in JazzHR, which the posting page publishes in its structured data: minimum, maximum, currency and period, with `salary.raw` in words (`150,000 - 175,000 USD per year`). Where a posting has none there but its text states a range, that range is read from the text.
- Filters on title keywords; location, country or "Remote"; and department. Filters are applied to the board's list, so a posting they leave out costs no request.
- Incremental mode: `changeType` of NEW, UPDATED, REAPPEARED or EXPIRED; unchanged postings skipped, not charged and not requested. A change is a new title, location or department on the board's list; an edit only to a posting's own page is not reported.
- Optional full descriptions from the posting's page, with email addresses and phone numbers redacted by default and link addresses and images dropped from the HTML. The application form on each posting page is never read.
- A subdomain JazzHR does not know, or a closed account, fails that board's request once with a message saying which. A posting put on hold between the list and its page is saved with what the list said. The other boards in the run are kept, and nothing is declared expired.
- The run's output is declared for Console's Output tab, the Run API and AI agents: postings in the default dataset, the run summary in the default key-value store.
- No recruiter names, emails or phone numbers in any field: neither page names a recruiter, and `job.v1` has nowhere to put a person.
- 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 in the log and in the run summary, as before, and is no longer counted under `http.failed`. The run summary also counts any HTTP 429 (too many requests) answers, under `http.tooManyRequests`.
- 26 Sep 2026: the prefilled example board is now `mra`, one company's public career page, because JazzHR's own career pages are inactive and show nothing. The prefill saves 20 postings.
- 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: fixed incremental mode on Apify. Every posting is finished from its own record, and on Apify each of those rows failed the `job.v1` contract on `firstSeenAt` and was dropped: Apify's request queue returns a stored date as a date object rather than text. The engine now stores that data as text, and a test puts it through the same conversion. Runs with incremental mode off were not affected. Also, 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.
