# Changelog of Glassdoor Jobs Scraper | Global Job Listings (`datascraperes/glassdoor-jobs-scraper`) Actor

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

## Changelog

### Unreleased

- Use verified 100-result mobile search pages for longer windows and retry the observed uncoded backend error with the same bounded request budget.

- Recover temporarily empty/incomplete mobile details, preserve valid offers when optional numeric fields are malformed, and report damaged or conflicting pagination as partial output.

- Reject malformed GraphQL error codes and oversized identifiers safely; extend local concurrency, fault injection, billing and maximum-volume resource validation.

- Retry individual mobile requests with bounded waits, preserve the current page and detail identity, and respect shared server cooldowns without restarting a completed search window.

- Record aggregate request attempts, recoveries and exhausted errors in SUMMARY while keeping credentials and response bodies out of progress logs.

- Align the run-summary schema with the current output and validate actual Dataset rows and summaries against their declared schemas.

- Deliver the affordable portion of tiered batches, restore spending reservations, serialize billing decisions, and distinguish uncertain Dataset writes from saved charge-ready batches.

- Reject overlapping billing replays before any duplicate write/charge; reuse stable charge keys after lost responses. Unknown Dataset-write outcomes stop for reconciliation.

- Reject malformed selector inputs and discard malformed optional links without dropping otherwise valid offers. Pin the tested Apify SDK/client and refresh the dependency lock.

- Bound active and completed search results to prevent memory growth during slow Dataset writes; select 256 MB for search windows above 100 offers, including offsets, while retaining 128 MB for smaller workloads.

- Enriched delivered offers with company IDs, ratings, review counts, salary provenance, normalized titles, application/sponsorship/expiration flags, company type/year/sector and public review/salary links.

- Preserve fractional salary amounts, normalize company domains as external websites, and prefer reported publication dates over age-derived dates.

- Distinguish country, region and city locations while preserving null locations for remote offers. All 28 existing output fields remain available; the 13 additions are optional.

- Validated the enriched output with 218 local tests, the final 17-case Docker matrix at 128 MB, complete real README output, and SDK PPE/spending-cap simulations.

- Migrated the Actor locally to the anonymous Android mobile GraphQL transport, preserving the public input and Dataset fields.

- Removed the production proxy-secret dependency; share request pacing and stop all searches on access controls or rate limits.

- Validate country scope, detail identity, cursor pagination, optional enrichment, and the documented whole-day publication dates.

- Passed the local Docker migration matrix at 128 MB and local SDK PPE checks, including the spending cap. Cloud promotion awaits approval.

- Show customer progress in both the run log and status message, with live page counts, saved-job counts, and explicit terminal outcomes.

- Keep library, request, retry, and billing diagnostics out of the console log; status-update failures do not interrupt Dataset delivery.

- Restored location lookup using Glassdoor's current autocomplete service.

- Updated the initial page request to the current homepage route.

- Stop on denied or unavailable pages rather than retrying an access denial.

- Added regression coverage and default-input smoke validation with real Dataset checks and a runtime limit.

- Resolve ambiguous locations within the selected country and align runtime result defaults with the input schema.

- Share a bounded request budget across retries for small searches, and close HTTP sessions on success and failure.

- Preserve source order and requested offsets in partial results; continue past filtered pages and stop repeated pagination cursors.

- Reject unreadable listing responses and access-challenge HTML instead of reporting empty success.

### 0.7.0

- Expanded per-keyword pagination to support the documented 1,000-result limit and validated `offset` plus result-limit boundaries.
- Preserved recovered Dataset items when a later Glassdoor page returns a transient 403/429/5xx response, and added a detail-request circuit breaker for sustained blocks.
- Created a Glassdoor-only job scraper for supported country sites worldwide.
- Added keyword, country, location, date, job-type, remote, and application filters.
- Added structured Dataset records with descriptions, locations, compensation, company data, and direct application links when available.
- Added duplicate removal across keywords and bounded retries for transient Glassdoor or proxy failures.
- Added pay-per-event pricing of `$0.001` per unique Glassdoor offer returned.
- Disabled start and automatic Dataset-item charges.
- Added a private external proxy configuration managed by the Actor.
- Added browser TLS impersonation and sticky DataImpulse sessions to reduce Glassdoor 403 blocks.
- Read public descriptions directly from the search response to avoid a blocked per-job detail request.
- Aligned browser origin and referer headers with each selected country site.
- Hardened malformed GraphQL, location, compensation, pagination, and listing responses.
- Improved remote-only pagination so non-remote listings do not consume the page limit.
- Added Dataset/SUMMARY contract validation and an optional international smoke test.
- Added a `SUMMARY` record with query, output, retry, failure, and billing counters.
