# Changelog of Google Jobs Scraper with Salary and Apply Links (`zovo-one/google-jobs-scraper`) Actor

- **URL**: https://apify.com/zovo-one/google-jobs-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/zovo-one/google-jobs-scraper.md

## Changelog

### 0.2.0 (2026-11-09)

Google changed its jobs page, and the first live check found no jobs on it. This release reads the new page and was checked live on Apify (GOOGLE_SERP proxy) with five runs on 2026-11-09: "software engineer" (20 jobs, and 50 jobs from 6 searches), "nurse jobs near Chicago" with "data analyst remote" (40 jobs), and "Lehrer Jobs Berlin" in German (20 jobs).

- Reads Google's server-rendered jobs page, where each job is its own block with the summary chips, apply buttons and description. The older inline data is still read when Google sends it.
- Apply links go straight to the posting (employer site or job board), with Google's `utm_` tags removed. Before, the first link could be a Google redirect.
- New fields: `highlights` (Qualifications, Benefits, Responsibilities), `googleJobUrl` and `matchedSearch`.
- Google shows 10 jobs per search and its "more jobs" scroll can't be loaded through the proxy, so a query that asks for more runs the same search with Google's date and job type refinements and keeps new jobs only. It stops after 3 refined searches in a row with nothing new.
- Google's script-only page (it says there are no "Jobs" matches, and has no jobs viewer) is fetched again up to 10 times and never charged. After 30 such pages in a row the run stops with a message.
- Normal results pages mention "/sorry/index" inside Google's own script. That no longer marks them as blocked.
- The request uses a short user agent, which got the jobs page more often in the live checks.
- Posted ages are read in German, French, Spanish, Portuguese, Italian and Dutch too ("vor 7 Tagen"), so the date filter works there. Job types in those languages ("Vollzeit", "Teilzeit") are read, and so is a list such as "Full-time, Part-time, and Contractor".
- When Google shows only a short preview of the description (some interface languages), `descriptionTruncated` is true.
- Price: $0.004 per saved job ($4 per 1,000).

### Unreleased (fix round 3, 2026-11-05)

- Apify Proxy upstream errors (HTTP 590, 592 to 596 and 599) are retried on a new proxy session, so one proxy hiccup no longer fails a run. A page that comes back empty or unknown is fetched one more time before the search counts as empty.
- Salary bounds the listing doesn't give stay null. "Up to $40 an hour" has no minimum, "From $50,000 a year" has no maximum, and "$100–150K a year" starts at 100,000. A bare "2 per hour" isn't read as pay.
- More currencies are read in English salary lines, such as US$, S$, NZ$, HK$, R, KSh, RM, Rp, ₱ and codes like SGD and AED.
- One posting that comes back under a new ID in another search or page is caught as a duplicate when its posting URL, title, company and location match. SerpApi rows match on the posting ID inside `job_id`.
- A SerpApi key left in the form no longer fails a Google run when it looks malformed. It's ignored with a warning.

### Unreleased (fix round 2, 2026-11-05)

- A results page with no jobs is no longer mistaken for Google's JavaScript page. Such a search now stops after one request with status `no_jobs`, and a search whose results run out ends `ok`.
- Salary lines like "$100K+ a year", "45.000 € a year" and the German, French, Spanish, Portuguese, Italian and Dutch period words are read. Bonus and benefit lines such as "$1,000 a month bonus" are no longer read as pay.
- Jobs with their own Google job IDs stay separate even when they share one apply URL.
- A redirect loop is not retried, and each page gets about 90 seconds across its tries.
- Invalid input and proxy setup failures write an `OUTPUT` record with the error. A record whose first apply link is unusable is kept when a later link works.

### 0.1.0 (2026-11-05)

First release. It searches Google Jobs by query, location, date posted, job type and a remote option, for 52 Google countries and 28 languages. Pricing is pay per event at $0.004 per saved job, with a hard stop at the run's maximum charge.

- Each row comes from one Google job record, so the title, company, salary and apply links always belong to the same job.
- Salary text plus parsed min, max, period and currency symbol when the listing shows a salary, and an approximate posted date from Google's "3 days ago" text.
- JavaScript and captcha pages are fetched again through the proxy (up to 4 tries) and never charged. GOOGLE_SERP is the default proxy group.
- Duplicate removal across searches by Google job ID or apply URL, so separate openings with the same title stay separate. Safe resume after a platform restart, with or without duplicate removal. An optional SerpApi source with your own key.
