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

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

## Changelog

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

- Any number of Personio job pages per run, by company name (`acme`) or by any `acme.jobs.personio.de` or `acme.jobs.personio.com` link: the job page, a job, or the XML feed. One request per board returns the whole board, every job's text included. Rows link to the host the board was given on.
- A company's own careers domain (`careers.example.com`) and a company's Personio login address (`acme.personio.de`) are refused with a message asking for the name in its `jobs.personio.de` links: neither says which Personio job page is behind it, and no request is sent to a domain that is not a Personio job page.
- A language for the job text, English by default: Personio keeps each job's text per language and returns none for a job not written in the language asked for. Titles, offices and the other facts come back in any language.
- Output in the Adderley Data `job.v1` schema: the company Personio names with each job (its subcompany), or the board's Personio name where it names none; the department as category; every office the job lists in `location.raw`, with the country where an office's name states it, never from a city; employment type from Personio's schedule and employment type; the date the job was created, in UTC. Personio's feed has no work-arrangement field, no last-modified time and no closing date, so those stay `unknown` and `null`.
- Pay from Personio's salary information where the company filled it in: amount, ISO currency code and period, with `salary.raw` written out (`from €2,000 per month`). Where it is empty and the job's text states a range, the range is read from that sentence. No range, no salary.
- Filters on title keywords; office or country (every office a job lists counts); department; and days since the job was created.
- 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 order of jobs or a change to fields the Actor does not deliver.
- Optional full descriptions — each section of the job's text under its own heading, in Personio's order — from the same request as the listing, with email addresses, phone numbers and personal profile addresses redacted by default. A section headed as the job's contact person ("Ansprechpartner", "Contact" and the like) is never read. `description.html` keeps each link's words and drops its address, and drops images.
- A name Personio does not know is recognised when Personio's redirect to its own website is served: that board's request fails 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.
- The feed is read by a small, strict XML reader with no dependency: a feed that stops being the XML it was written for fails the run with a message, never a dataset of guesses.
- 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 contact-person sections of a job's text, the company's search keywords and its internal recruiting categories are never read, 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 `jtl-software-gmbh`, one company's public job page with 31 positions, in place of Personio's own board, which held one.
