# Changelog of StepStone Denmark Scraper — Specialist & Management Jobs (`blackfalcondata/stepstone-dk-scraper`) Actor

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

## Changelog

### Unreleased — 2026-10-13

#### Fixed

- `extractedEmails` now picks up email addresses written in the job description itself, not only clickable mail links.
- Emails followed directly by other text are no longer returned with that text glued on (e.g. name@site.co.ukread).

### 0.2 — 2026-10-07 (searches return results again)

#### Fixed

- Searches on stepstone.dk returned no results after the site changed its search page on 2026-10-07. Searches return results again; no output fields changed.
- A run whose search could not be read at all now fails with an error code instead of finishing as a successful run with no results. A search that genuinely has no matching jobs still finishes successfully with zero results.
- Runs with a maximum cost per run now finish normally with the results that cost covers, instead of being stopped part-way. In incremental mode the results held back are delivered on the next run.

### 0.2.0 — 2026-04-25

#### Added — Output fields

- `salary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` — structured salary parsed from description text via `_lib/salaryParser` (DK-aware: kr/DKK detection)
- `extractedEmails: string[]` — regex-extracted emails from description
- `extractedPhones: string[]` — defensive phone-number extraction
- `extractedUrls: string[]` — URLs in description (excluding self-referential stepstone.dk + jobindex.dk)
- `socialProfiles: { linkedin, twitter, instagram, facebook, youtube, tiktok, github, xing }`
- `postedAt` — alias of `postedDate`
- Incremental: `firstSeenAt`, `lastSeenAt`, `previousSeenAt`, `expiredAt`
- Repost detection: `isRepost`, `repostOfId`, `repostDetectedAt`

#### Added — Inputs

- `emitUnchanged`, `emitExpired`, `skipReposts` — emission policy
- `telegramToken`, `telegramChatId`, `discordWebhookUrl`, `slackWebhookUrl` — notifications
- `whatsappAccessToken`, `whatsappPhoneNumberId`, `whatsappTo` — WhatsApp Cloud API
- `webhookUrl`, `webhookHeaders` — generic JSON webhook
- `notificationLimit`, `notifyOnlyChanges`, `phoneExtractionMode`

#### Changed

- **Full incremental classification** — `changeType` emits all 5 types (`NEW`/`UPDATED`/`UNCHANGED`/`EXPIRED`/`REAPPEARED`).
- **State-lock** — concurrent runs refuse with `Actor.fail`.
- **`stateKey` required** when `incrementalMode: true`.

#### Compliance

- Migrated from hand-rolled MD5 contentHash + `Record<tid, hash>` map to canonical `_lib/incrementalState.ts` + `_lib/stateLock.ts` + `_lib/notifications.ts`. Preserved Stash extraction + jobindex.dk white-label parsing.

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

- Added: `descriptionHtml`, `descriptionMarkdown` output fields (triple-format descriptions for RAG/LLM pipelines)
- Added: `contentHash` output field for stable change detection

### 0.1.0

- Initial release
