# Changelog of Werk.nl Scraper \[Just 💰$1] — Dutch Government Jobs (UWV) (`blackfalcondata/werk-scraper`) Actor

- **URL**: https://apify.com/blackfalcondata/werk-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/blackfalcondata/werk-scraper.md

## Changelog

### 0.3.22 — 2026-09-13

- Fixed: two scheduled runs sharing one `stateKey` could both pass the ownership check and deliver — and bill — the same records. Ownership is now settled by an atomic claim before the soft lock, so exactly one run proceeds and the other exits immediately with no results and no charge beyond the start fee.
- Fixed: a run that lost its lock while working no longer ends as **failed**. The check happens after the results have already been delivered, so the run now finishes successfully with those results; only the incremental state is left untouched, for the run that holds the lock to write.
- Improved: long runs renew their lock while they work, instead of expiring mid-run and forcing the next run to re-send — and re-charge for — the whole result set as new.

### 0.3.0 — 2026-06-07

- **Breaking (output):** the `description` field is now **plain text** (previously raw HTML). The raw HTML is still available in `descriptionHtml`, and `descriptionMarkdown` is unchanged. Consumers that parsed `description` as HTML should switch to `descriptionHtml`. This makes `descriptionFormat: "text"` truly text-only.
- Improved: incremental EXPIRED detection is now coverage-proof — a run that didn't fully cover the search scope (a failed result page or a very broad query) no longer expires jobs it simply didn't fetch; it records the jobs it did see and defers expiry to a complete run.

### 0.2.0 — 2026-06-07

- Improved: salary coverage — `salaryMin` / `salaryMax` now captured for far more listings, including salary ranges (e.g. `EUR 3,506 - EUR 5,644 monthly`)
- Added: inclusive-hiring target-group flags `isBanenafspraak`, `isForDisabled`, `isFor50Plus`
- Improved: cleaner output — change-tracking fields are omitted from non-incremental runs; a dedicated "Incremental Changes" dataset view groups them
- Updated: title and description

### 0.1.x — 2026-04-14

- Added: `descriptionHtml`, `descriptionMarkdown` output fields (triple-format descriptions for RAG/LLM pipelines)
- Added: `contentHash` output field (SHA-256 hash of content-identifying fields)

### 0.1.x — 2026-04-14

- Added: cross-run repost detection (`isRepost`, `repostOfId`, `repostDetectedAt`)
- Added: `skipReposts` input to exclude detected reposts from output

### \[0.1.0] - 2026-04-06

#### Added

- Initial release
- Keyword + location search across 278k+ Dutch job vacancies (UWV/werk.nl)
- Full detail enrichment: HTML description, plain text, normalized salary, contact info, apply URL
- Facet filters: contract type (Vast/Tijdelijk), education level, sort order
- Days-old filter to limit results to recent vacancies
- Incremental change tracking: NEW / UPDATED / UNCHANGED / EXPIRED across runs
- Compact output mode for AI-agent and MCP workflows (13 core fields)
- Parallel SERP fetching (20 concurrent pages) for fast large scrapes
- Description truncation via `descriptionMaxLength`
