# Changelog of JobStreet Scraper — MY, SG, ID & PH Job Listings (`blackfalcondata/jobstreet-scraper`) Actor

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

## Changelog

### Unreleased

#### Fixed

- A date-only "To date" (for example 2026-09-25) now includes jobs posted at any time on that day. Before, it stopped at midnight, so "From date" and "To date" set to the same day returned no jobs. A full date-and-time "To date" still cuts off at that exact time.

### 0.4.35 — 2026-09-28

#### Improved

- A search JobStreet answers with no jobs now ends with a status saying so, instead of an empty status.

### 0.4.34 — 2026-09-28

#### Fixed

- Searches with a full address-style location (for example `Kawit, Cavite, Calabarzon, PHL`) no longer return zero jobs. JobStreet only recognises shorter place names, so when the full string finds nothing the run now retries with the trailing parts dropped (`Kawit, Cavite`) and logs which spelling it used.

### 0.4.1 — 2026-08-14

#### Fixed

- Runs no longer fail outright when a search is refused. A minority of requests were being rejected before results came back, and because every retry left from the same place, one rejection failed the whole run with "rate limited" — even though the same search succeeded seconds later. Requests now rotate their route on each attempt and switch to a second route when one is refused, so an isolated rejection costs a retry instead of the run. Affected roughly 1 in 15 runs on the busiest accounts.

### 0.4.0 — 2026-06-24

#### Changed

- **Reliability and freshness improvements** to how listings are retrieved — more consistent results across every supported market. No input changes required and existing configurations keep working.
- **Applicant demand data is now included by default.** `applicantCount`, `applicantVolumeLabel`, and `coverLetterPercentage` now populate on every run (previously opt-in). No price change. Set `includeApplicantInsights: false` to turn it off.

#### Added

- **Category IDs** — each job now carries `categoryId` and `subCategoryId` (the stable classification / sub-classification IDs) alongside the existing `category`/`subCategory` names, so you can filter and join on IDs that don't change when labels are reworded. Present on search-sourced jobs; `null` on paste-a-URL / detail-only runs.

### 0.3.0 — 2026-05-31

#### Added

- **Applicant demand data** (opt-in via `includeApplicantInsights`, default off). Each job can carry `applicantCount`, `applicantVolumeLabel` (e.g. "High application volume"), and `coverLetterPercentage`. Useful for spotting low-competition roles and gauging hiring demand. Adds one extra request per job. Coverage is partial — standard-apply listings expose it; external-apply listings return `null`.
- **Company enrichment** — when `includeDetails` is on, each job now also carries `companyLogo`, `companyCoverImageUrl`, `companyDescription`, `companyPerks`, `companyReviewRating`, `companyReviewCount`, `companySearchUrl`, and `isVerifiedAdvertiser`. Pulled from the detail page already fetched (no extra request). Null for private advertisers; logo falls back to per-ad branding when no company profile exists.

### 0.2.x — 2026-05-21

#### Fixed

- Input-validation errors now surface a clear, actionable message listing the valid `startUrls` shapes — previously these returned the same generic "try again later" message used for transient failures.

#### Changed

- In non-incremental mode, unparseable `startUrls` are dropped with a warning and the run continues using the remaining valid URLs and/or query inputs instead of hard-failing. Incremental-mode runs still fail fast on invalid URLs to protect state-key integrity.
- `startUrls` input description now spells out valid shapes and explicitly notes that the bare homepage is not accepted.

### 0.2.x — 2026-05-15

#### Added

- `customFilters` post-filter DSL for advanced filtering against output fields.
- Keyword field toggles (`keywordMatchTitle`, `keywordMatchCompany`, `keywordMatchDescription`, `keywordMatchCategory`, `keywordMatchBulletPoints`) for scoped include/exclude keyword filters.
- `jobScore` v0 and `jobScoreReasons` output fields based on parseable salary, full detail content, and posting recency.
- Store docs and examples for keyword, date, and custom post-filter workflows.
- Note: strict `customFilters` can significantly reduce emitted rows and pay-per-event dataset-item charges.

#### Changed

- Auto-derived incremental state keys now include `customFilters`, so different custom-filter universes are isolated.
- Auto-derived incremental state keys now include keyword field toggles, so different keyword scopes are isolated.
- Pasted search `startUrls` now derive market, `searchQuery`, and location metadata from the URL instead of reusing the default input country.
- Content-quality degradation is now emitted as an operator diag event instead of a user-visible warning.
- Description text and Markdown now use a shared HTML entity decoder for named, decimal, and hex entities.

#### Fixed

- JobStreet output URLs now use public `*.jobstreet.com` hosts even when internal fetches route through SEEK infrastructure.
- Escaped block-level HTML descriptions are now decoded before text/Markdown conversion while escaped inline tags remain literal.

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

- Added: `descriptionHtml`, `descriptionMarkdown` output fields (triple-format descriptions for RAG/LLM pipelines)
- Added: `contentHash` output field (SHA-256 digest 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 — 2026-03-28

#### Added

- Initial release
- Multi-market support: Malaysia, Singapore, Indonesia, Philippines
- Keyword search with location, classification, salary, and work type filters
- Detail enrichment with full descriptions, company profiles, and salary data
- Incremental mode — only new or changed listings on recurring runs
- Compact output mode for AI-agent and MCP workflows
- Description truncation (`descriptionMaxLength`)
- Parallel detail fetching for throughput
