Google Jobs listings by search, location, date posted and job type. Title, company, salary, direct apply links, job highlights, posted date and full description. Blocked pages are retried and never charged. $0.004 per job ($4 per 1,000). Call it from curl or Python.
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.