Google Jobs Scraper — Apply Links, Salary & Filters avatar

Google Jobs Scraper — Apply Links, Salary & Filters

Pricing

from $2.00 / 1,000 job records

Go to Apify Store
Google Jobs Scraper — Apply Links, Salary & Filters

Google Jobs Scraper — Apply Links, Salary & Filters

Google Jobs postings with full description, parsed salary, schedule, job highlights and every apply link as a direct URL. Drop-in compatible with the leading Google Jobs actor. Date filter Google actually honours, multi-query fan-out, empty results reported not hidden.

Pricing

from $2.00 / 1,000 job records

Rating

0.0

(0)

Developer

DIOPSIDE AI

DIOPSIDE AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Google Jobs Scraper — apply links, salary, filters

Drop-in compatible with the leading Google Jobs actors — cheaper, and it never reports a silent empty result. Same input field names (query, location, country, language, google_domain, posted_within, num_results, include_lrad, lrad_value, max_delay) and the same SerpApi-shaped output field names (title, company_name, via, description, extensions, detected_extensions, job_highlights, apply_options, job_id, share_link). Point your existing input at this actor id and it runs unchanged; our extra fields are added alongside, never renamed.

Every job comes back complete in one pass: the full description (including the part Google collapses behind "Show full description"), the salary parsed into min/max/currency/period, the schedule, Google's extracted qualifications/responsibilities/benefits, and every apply link as a direct URL — LinkedIn, Indeed, ZipRecruiter, the company's own careers page — not a Google redirect.

Why this one

This actorTypical incumbent
Price$0.002 per job$0.015 per job, or $0.15 per page of ten
Failed runs (store stats, 30 d)—up to 19.6% on the most-used one
Empty result handlingretried on a fresh IP, then reported in the status messagesilently returns nothing
Date filtertbs=qdr — the parameter Google actually honourshtichips, which Google ignores
Descriptionfull textoften the truncated snippet
Apply linksdirect URLs + domainsGoogle redirect URLs

Four things make the difference:

  1. The route. Google's /search has required JavaScript since 2025 — a plain client gets a 90 KB "enable JavaScript" shell on every IP tier, datacenter and residential alike (we measured all of them). This actor uses Apify's Google SERP proxy, the one route that returns the rendered jobs page, and reads Google's own server-side markup. No browser, so a search takes about a second.
  2. Empty is not success. Google sometimes answers 200 with zero job cards on one session and ten on the next. Each search gets up to three attempts on fresh IPs, and any search that still comes back empty is named in the run's status message instead of quietly shrinking your dataset.
  3. A layout change fails loudly. Google rotates its CSS class names. Each field has a structural fallback (data-encoded-docid, data-title, the per-card data-maindata JSON), and if cards are present but unreadable the run fails rather than billing you for rows of null.
  4. The date filter is the one Google honours. Google Jobs scrapers commonly send htichips=date_posted:today; Google accepts that parameter and ignores it — in our measurements a "today" search returned jobs 5, 8 and 19 days old. Google's own filter links use tbs=qdr:d, which returned ten jobs all under 24 hours old. This actor uses tbs — and then checks the ages of what actually came back, warning in the run status when more than 40% of dated jobs fall outside the window. (Google's own filter is occasionally loose at the edges: a 3days search may include one older posting. You will see it in posted_at, which is exactly the point.)

How many jobs you get

Google's jobs vertical exposes ten jobs per query/filter combination — there is no page two. start=10, num=100, the callback:550 "more jobs" endpoint and the job-detail continuation were all measured returning either nothing or the same ten jobs; the highest-rated competing actor, asked for three pages, also fetched one page and returned ten. Any actor advertising 100 results for one query is fanning out behind the scenes — often billing you per "page processed" while it does.

So fan out explicitly, in one run, de-duplicated by Google's job id:

{
"queries": ["software engineer", "backend engineer", "data engineer"],
"locations": ["New York, NY", "Austin, TX", "Remote"],
"posted_within": "3days",
"num_results": 90
}

9 searches → up to 90 jobs. num_results caps the run; max_delay paces it.

Input

FieldTypeDefaultNotes
querystringSoftware EngineerWhat you would type into Google Jobs
queriesstring[]—Extra queries, run alongside query
locationstringNew York, NYFolded into the query text — Google Jobs ignores uule
locationsstring[]—Every query is run against every location
countrystringusGoogle's gl. Google Jobs is not available in every country
languagestring—Google's hl. Leave empty in non-English markets — forcing en can return zero jobs
google_domainstringgoogle.come.g. google.co.uk, google.de
posted_withinenumanyhour, today, 3days, week, month — applied with tbs=qdr, the filter Google honours
employment_typeenumanyFULLTIME, PARTTIME, CONTRACTOR, INTERN — applied to the parsed schedule (Google's jobs vertical has no employment-type control); the run reports how many jobs were dropped
remote_onlybooleanfalseAdds "remote" to the query, exactly as Google's own Remote chip does; results come back located "Anywhere"
include_lrad / lrad_valueboolean / stringfalse / 25Sent to Google as lrad; best-effort — Google's current jobs UI exposes no radius control
num_resultsinteger100Hard cap on records
max_delayinteger1Seconds between searches
max_paginationinteger0Accepted for compatibility, logged and ignored (see above)
proxyConfigurationobjectGoogle SERP proxyLeave as is; no other tier reaches this page

Output

{
"title": "Software Engineer, Front End, Pomelli",
"company_name": "Google",
"location": "New York, NY",
"via": "via Indeed",
"via_source": "Indeed",
"description": "Note: By applying to this position you will have an opportunity to share your preferred working location...",
"extensions": ["2 days ago", "147K–210K a year", "Full-time"],
"detected_extensions": {
"posted_at": "2 days ago",
"schedule_type": "Full-time",
"salary": "147K–210K a year",
"work_from_home": null,
"qualifications": null
},
"job_highlights": [
{ "title": "Qualifications", "items": ["Bachelor's degree or equivalent practical experience", "2 years of experience with front-end and user interface development"] },
{ "title": "Responsibilities", "items": ["Write product or system development code"] }
],
"apply_options": [
{ "title": "Indeed", "link": "https://www.indeed.com/viewjob?jk=902d27e60be7aa21", "domain": "indeed.com" },
{ "title": "LinkedIn", "link": "https://www.linkedin.com/jobs/view/4468856901", "domain": "linkedin.com" }
],
"apply_domains": ["indeed.com", "linkedin.com"],
"job_id": "uxZzDPHtdB_zAAAAAAAAAA==",
"share_link": "https://www.google.com/search?ibp=htl;jobs&q=software+engineer&htidocid=uxZzDPHtdB_z...",
"thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR7qIzv",
"posted_at": "2026-09-17T07:01:12+00:00",
"posted_at_relative": "2 days ago",
"schedule_type": "Full-time",
"salary": { "min": 147000, "max": 210000, "currency": null, "period": "year", "raw": "147K–210K a year" },
"result_position": 1,
"query": "Software Engineer",
"search_location": "New York, NY",
"country": "us",
"language": "en",
"google_domain": "google.com",
"search_timestamp": "2026-09-19T07:01:12+00:00",
"search_url": "http://www.google.com/search?q=Software+Engineer+in+New+York%2C+NY&udm=8&hl=en&gl=us"
}

Fields the incumbents do not give you: via_source (board name without the localized "via" prefix), posted_at (the relative badge resolved to an absolute UTC timestamp, so records stay sortable across runs), salary parsed into numbers, apply_domains, and search_url — the exact Google URL used, filters included, so any record can be reproduced by hand.

Localized markets are first-class: German, French, Spanish, Italian, Portuguese and Dutch pages parse, including their "vor 5 Tagen" / "hace 3 días" posting dates and comma-decimal salaries. When a locale uses wording we cannot date, posted_at is null and the original text is still in posted_at_relative — never a guess.

Typical run sizes

InputSearchesJobsTime
One query, one location110~5 s
One query, five locations5up to 50~15 s
Three queries × three locations9up to 90~25 s

Use cases

  • Job boards and aggregators — fill a niche board from Google's aggregate of LinkedIn, Indeed, ZipRecruiter, Workday and company career sites, with direct apply links.
  • Recruiting intelligence — track which companies are hiring which roles in which cities, daily, with posted_within: "today" (which really does return only jobs under 24 hours old).
  • Salary benchmarking — salary is parsed into min/max/currency/period, ready to aggregate.
  • Talent-market monitoring — run the same queries on a schedule and diff on job_id.

Switching from another Google Jobs actor

Change the actor id. Your query, location, country, language, google_domain, posted_within, num_results, include_lrad, lrad_value and max_delay fields are read as-is, and max_pagination is accepted and ignored. The output keys you already parse (title, company_name, location, via, description, extensions, detected_extensions, job_highlights, apply_options, job_id, share_link) keep their names and shapes.

Notes

  • Public job postings only — no personal data, no login, nothing behind a paywall.
  • Google Jobs is unavailable in some countries; a search there returns nothing, and the run says so in its status message rather than failing silently.
  • Billing is one event per job record pushed, plus the Apify actor-start event.