Google Jobs Scraper — Apply Links, Salary & Filters
Pricing
from $2.00 / 1,000 job records
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
Maintained by CommunityActor 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 actor | Typical 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 handling | retried on a fresh IP, then reported in the status message | silently returns nothing |
| Date filter | tbs=qdr — the parameter Google actually honours | htichips, which Google ignores |
| Description | full text | often the truncated snippet |
| Apply links | direct URLs + domains | Google redirect URLs |
Four things make the difference:
- The route. Google's
/searchhas 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. - 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.
- A layout change fails loudly. Google rotates its CSS class names. Each field has a structural
fallback (
data-encoded-docid,data-title, the per-carddata-maindataJSON), and if cards are present but unreadable the run fails rather than billing you for rows ofnull. - 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 usetbs=qdr:d, which returned ten jobs all under 24 hours old. This actor usestbs— 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: a3dayssearch may include one older posting. You will see it inposted_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
| Field | Type | Default | Notes |
|---|---|---|---|
query | string | Software Engineer | What you would type into Google Jobs |
queries | string[] | — | Extra queries, run alongside query |
location | string | New York, NY | Folded into the query text — Google Jobs ignores uule |
locations | string[] | — | Every query is run against every location |
country | string | us | Google's gl. Google Jobs is not available in every country |
language | string | — | Google's hl. Leave empty in non-English markets — forcing en can return zero jobs |
google_domain | string | google.com | e.g. google.co.uk, google.de |
posted_within | enum | any | hour, today, 3days, week, month — applied with tbs=qdr, the filter Google honours |
employment_type | enum | any | FULLTIME, 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_only | boolean | false | Adds "remote" to the query, exactly as Google's own Remote chip does; results come back located "Anywhere" |
include_lrad / lrad_value | boolean / string | false / 25 | Sent to Google as lrad; best-effort — Google's current jobs UI exposes no radius control |
num_results | integer | 100 | Hard cap on records |
max_delay | integer | 1 | Seconds between searches |
max_pagination | integer | 0 | Accepted for compatibility, logged and ignored (see above) |
proxyConfiguration | object | Google SERP proxy | Leave 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
| Input | Searches | Jobs | Time |
|---|---|---|---|
| One query, one location | 1 | 10 | ~5 s |
| One query, five locations | 5 | up to 50 | ~15 s |
| Three queries × three locations | 9 | up 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 —
salaryis 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.