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

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

## Changelog

### 0.1 — 25 Sep 2026, first version

- Any number of Pinpoint careers sites per run, by company name (`acme`) or by any `acme.pinpointhq.com` link: the careers site, one of its jobs, or the feed. One request per board reads Pinpoint's public Job Postings JSON Endpoint — every job on the board, its text and its structured pay included — and one request per job saved reads that job's own page for its posted date, the country of its location and the company's name.
- A company's own careers domain (`careers.example.com`) is refused with a message asking for its `pinpointhq.com` name: the domain does not say which Pinpoint account is behind it, and no request is sent to a domain Pinpoint does not run.
- Output in the Adderley Data `job.v1` schema: the company's name from each job's page; the department as category; the company's own location name, with city, region and postcode from its address and the country from the job's page; employment type from Pinpoint's employment type code; work arrangement from Pinpoint's workplace type; posted and closing dates in UTC.
- Pay from Pinpoint's structured compensation, and only where the job shows it: minimum, maximum, currency and period, with `salary.raw` worded as Pinpoint prints it (`£70,000 - £90,000 / year`). Pay the company hides is never read. A shown compensation with no number, such as "Competitive", is no salary; where the job's text states a range, the range is read from that sentence. Pay per two weeks keeps its numbers and currency with no period, because the schema has none for it. No range, no salary.
- Filters on title keywords; location name, city, region, stated country or workplace type; and department. Filters are applied to the board's list, so a job they leave out costs no request.
- Incremental mode: `changeType` of NEW, UPDATED, REAPPEARED or EXPIRED; unchanged jobs skipped, not charged and not requested. A change is found by comparing the job's fields and a hash of its text; a formatting change alone is not an update.
- Optional full descriptions — the description, then the responsibilities, the skills and the benefits under the company's own headings — from the same request as the list of jobs, 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.
- A name Pinpoint 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. A job withdrawn between the list and its page is saved with what the list said, and the log says so.
- 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 reporting line, the company's structure groups, requisition ids, office street addresses and the application form 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 `intermedia`, one company's public careers site with 63 jobs, in place of Pinpoint's own board, which held two. The prefill saves 20 jobs.
