# Changelog of RemoteOK Scraper \[Just 💰$1] — Remote Jobs, Tags & Salaries (`blackfalcondata/remoteok-scraper`) Actor

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

## Changelog

### 0.1.67 - 2026-09-03

#### Fixed

- **Several tags at once now work.** Entering a list of tags (for example "qa", "testing", "sdet") returned nothing at all - the run ended in under a second without ever searching. Each tag is now searched and the results are combined, so you get every job matching any of them. A single tag works exactly as before.
- **Pressing Start without choosing a filter now browses all listings.** It used to finish immediately with no results, even though leaving the input completely empty returned a full page of jobs.
- **`maxItems` works as an alternative to `maxResults`.** Setting only `maxItems` was ignored and the run used its default limit instead.
- **An empty result now explains itself.** When a tag, location or company has no open listings today, the run says so and names the filter, instead of ending with a bare "no jobs" line that was indistinguishable from a broken run.

### 0.2.0 — 2026-04-25

#### Added — Output fields

- `salaryCurrency`, `salaryPeriod` — structured salary fields (USD/year for jobs with salary, null for unsalaried)
- `extractedEmails: string[]` — regex-extracted emails from description
- `extractedPhones: string[]` — defensive phone-number extraction (strict/lenient mode)
- `extractedUrls: string[]` — URLs in description (excluding self-referential remoteok.com)
- `socialProfiles: { linkedin, twitter, instagram, facebook, youtube, tiktok, github, xing }`
- `postedAt` — ISO timestamp alias for `postedDate` (cross-actor consistency)
- Incremental: `firstSeenAt`, `lastSeenAt`, `previousSeenAt`, `expiredAt`
- Repost detection: `isRepost`, `repostOfId`, `repostDetectedAt`

#### Added — Inputs

- `emitUnchanged`, `emitExpired`, `skipReposts` — incremental emission policy
- `telegramToken`, `telegramChatId` — Telegram notifications
- `discordWebhookUrl` — Discord notifications
- `slackWebhookUrl` — Slack notifications
- `whatsappAccessToken`, `whatsappPhoneNumberId`, `whatsappTo` — WhatsApp Cloud API
- `webhookUrl`, `webhookHeaders` — generic JSON webhook (n8n/Make/Zapier)
- `notificationLimit`, `notifyOnlyChanges`, `phoneExtractionMode`

#### Changed

- **Full incremental classification** — `changeType` emits `NEW`/`UPDATED`/`UNCHANGED`/`EXPIRED`/`REAPPEARED` (uppercase). Previously only `new`/`updated`.
- **State-lock** — concurrent runs sharing same `stateKey` now refuse with `Actor.fail` instead of corrupting state.
- **Salary `0` is null** — RemoteOK API returns `0` for "no salary"; we now correctly map this to `null` (was previously `0/0/USD/year`).

#### Compliance

- Migrated from hand-rolled `simpleHash` + `Record<jobId, hash>` map to canonical `_lib/incrementalState.ts` + `_lib/stateLock.ts` + `_lib/notifications.ts`.

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

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

### 0.1.0

- Initial release
