Google Jobs Scraper: Salaries, Apply Links & New Jobs avatar

Google Jobs Scraper: Salaries, Apply Links & New Jobs

Pricing

$3.00 / 1,000 job results

Go to Apify Store
Google Jobs Scraper: Salaries, Apply Links & New Jobs

Google Jobs Scraper: Salaries, Apply Links & New Jobs

Scrape Google Jobs listings with title, company, location, parsed salary, employment type, posting date, full description and direct apply links (LinkedIn, Indeed, Glassdoor…). Query variants beat the 10-jobs limit; only-new mode for job alerts. 34 countries, 8 languages.

Pricing

$3.00 / 1,000 job results

Rating

0.0

(0)

Developer

Mit Parekh

Mit Parekh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 minutes ago

Last modified

Share

Google Jobs Scraper extracts job listings from Google Jobs (the "Jobs" tab in Google Search) for any job title, keyword and location. Every job comes with the title, company, location, salary (parsed into min / max / currency / period), employment type, posting date, full job description, highlights (qualifications, responsibilities, benefits) and all direct apply links (LinkedIn, Indeed, Glassdoor, company career pages…). It works in English, German, French, Spanish, Portuguese, Italian, Dutch and Hindi markets. Only-new mode turns it into a daily job alert.

  • 💼 One table from every job board. Google Jobs aggregates LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri, StepStone, Welcome to the Jungle, InfoJobs, company ATS pages and more.
  • 💰 Salary parsing. "$120K–$150K a year" becomes salaryMin 120000, salaryMax 150000, salaryCurrency USD and salaryPeriod YEAR. It also handles €45.000–55.000 pro Jahr, ₹6–10 lakh a year, R$ 5 mil por mês and 50 an hour.
  • 🔗 Direct apply links. applyOptions lists every site the job can be applied on, with a source, a domain and the URL.
  • 🔁 Goes past Google's ~10 jobs per search. Query variants (senior, remote, part time, entry level… localized per language) are searched automatically and deduplicated by job ID.
  • 🆕 Only new jobs. It remembers job IDs between runs, so scheduled runs return (and charge for) only jobs you have not seen.
  • 🌍 34 countries and auto-language per country: US, UK, India, Canada, Germany, France, Spain, Mexico, Brazil, Italy, Netherlands and more.
  • 🪶 No browser. It runs on 256 MB through Apify's Google SERP proxy. Status rows are free. A query with no matches or no Google Jobs gives a free explanatory row, not a charge.

What job data does it return?

Each dataset item is one unique job (status: "ok"):

FieldExample
titleHome Infusion Registered Nurse
companyAccurate Care Home Health
locationChicago, IL
viaIndeed (the source Google shows first)
postedAgo / postedAt / postedDaysAgo2 days ago / 2026-10-21T13:54:57Z (approximate, derived from "2 days ago") / 2
salary50 an hour, parsed into salaryMin 50, salaryMax 50, salaryCurrency USD, salaryPeriod HOUR
employmentType / employmentTypesContractor / ["CONTRACTOR"] (normalized: FULL_TIME, PART_TIME, CONTRACTOR, INTERN, TEMPORARY…)
workFromHome, benefits, degreefalse, ["Paid time off"], No Degree Mentioned
highlights{"Qualifications": [...], "Responsibilities": [...], "Benefits": [...]}
descriptionFull job description text (descriptionIsPreview: true if Google only shows a snippet)
applyOptions[{"source": "Indeed", "domain": "indeed.com", "url": "https://www.indeed.com/viewjob?jk=..."}, {"source": "Glassdoor", ...}]
applyLinkThe first direct apply URL
shareLinkGoogle Jobs link for the search
jobIdGoogle's job ID (stable, used for deduplication and only-new mode)
query, searchQuery, position, country, language, searchUrl, scrapedAtYour query, the exact variant searched, rank on that page and the locale

Fill rates measured in our cloud tests (23 Oct 2026, 689 jobs, 12 markets): title, company, via, description and apply links on 100% of jobs, location 99%, employment type ~95%, posting date ~85%, salary ~40% (only where Google shows one).

Status rows (status: "no_results", "unavailable" or "error") explain queries that returned nothing. They are free. To analyse only jobs, filter status = ok; the Status view lists the explanations.

Dataset views: Overview, Salaries, Details (description + highlights), Apply links, Status.

How to scrape Google Jobs

  1. Enter one or more job searches, e.g. software engineer, nurse, data analyst.
  2. Optionally set a location (New York, Bangalore, Berlin, remote…). It is appended to each search, just like typing "nurse Chicago" into Google.
  3. Pick the country. The language is chosen automatically (Germany → German, Brazil → Portuguese…), or you can set it yourself.
  4. Choose max jobs per search (default 50) and click Start.
  5. Download the results as CSV, Excel, JSON, XML or HTML, or use the API.

Google Jobs no longer pages through results for scrapers: one search returns about 10 jobs. To get more, the Actor runs query variants and merges them by job ID:

software engineer New York → senior software engineer New York → remote software engineer New York → junior … → entry level … → lead … → part time … → contract … → …

Variants are localized (e.g. German Senior, Remote, Teilzeit, Werkstudent; French CDI, alternance, télétravail; Hindi fresher, work from home). Each variant typically adds ~7–9 new unique jobs. The Actor stops a search when it has maxJobsPerQuery jobs, or after stopAfterEmptyVariants (default 3) variant searches in a row with no new jobs (the market is exhausted). You can add your own variants with Custom variants (react, night shift, {query} startup). In our test, marketing manager Chicago with maxJobsPerQuery: 100 returned 100 unique jobs from 12 searches.

Turn Expand queries off to get exactly one Google search (~10 jobs) per query.

Input examples

Prefill: 20 software engineer jobs in New York

{ "queries": ["software engineer"], "location": "New York", "maxJobsPerQuery": 20 }

Several roles in India, 100 each, posted in the last 7 days

{ "queries": ["python developer", "data analyst", "sales executive"], "location": "Bangalore", "country": "IN", "maxJobsPerQuery": 100, "maxDaysOld": 7 }

German market (language auto = German)

{ "queries": ["Softwareentwickler", "Buchhalter"], "location": "Berlin", "country": "DE", "maxJobsPerQuery": 50 }

Daily job alert: schedule this and get only jobs you have not seen before

{ "queries": ["barista"], "location": "Seattle", "maxJobsPerQuery": 30, "onlyNewJobs": true, "stateKey": "seattle-barista-alert" }

Cheap listing feed without descriptions (smaller dataset)

{ "queries": ["warehouse associate"], "location": "Dallas", "maxJobsPerQuery": 200, "includeDescription": false }

Only new jobs (job alerts)

With onlyNewJobs: true the Actor stores the IDs of jobs it returned in the named key-value store google-jobs-scraper-state (in your account) under a key derived from the queries, location, country and language, or under your own stateKey. On the next run, jobs already seen are skipped and not charged. The Actor keeps searching variants until it finds maxJobsPerQuery new jobs or the market is exhausted. Combine it with an Apify schedule and an integration (email, Slack, Google Sheets, webhook) for a job alert. In our test, a second run of the same search skipped 18 already-seen jobs and returned 20 new ones. Delete the key in the store to reset the alert.

Countries and languages

Tested in the cloud: 🇺🇸 US, 🇬🇧 UK, 🇨🇦 Canada, 🇮🇳 India (English and Hindi), 🇩🇪 Germany, 🇫🇷 France, 🇪🇸 Spain, 🇲🇽 Mexico, 🇧🇷 Brazil, 🇮🇹 Italy, 🇳🇱 Netherlands. The country list also includes Austria, Switzerland, Belgium, Ireland, Portugal, Poland, Sweden, Singapore, the Philippines, South Africa, Nigeria, the UAE, Argentina, Colombia, Chile and others.

⚠️ Google Jobs is not available in every country. In Australia, for example, Google shows regular web results instead of Google Jobs. The Actor detects this and returns a free unavailable row instead of junk. Coverage can also be thin. In the Netherlands, Google answered "not many matches" for roughly half of our Dutch test searches (see Limitations).

Tip: write queries in the market's language (Krankenpfleger in Germany, comptable in France) and leave Language empty (auto). A language that doesn't match the market often returns nothing.

Cost

$3.00 per 1,000 jobs ($0.003 per job). Apify platform usage is included, so you pay nothing extra for compute or proxy. You only pay for job rows. Status and error rows are free. Use Maximum cost per run in the run options to cap spend. The Actor stops exactly at your limit.

Example: 50 jobs for each of 10 searches = 500 jobs = $1.50.

Use it as a Google Jobs API

curl -X POST "https://api.apify.com/v2/acts/mitp1997~google-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["data engineer"], "location": "London", "country": "GB", "maxJobsPerQuery": 30}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("mitp1997/google-jobs-scraper").call(run_input={"queries": ["nurse"], "location": "Chicago", "maxJobsPerQuery": 50})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
if job["status"] == "ok":
print(job["title"], job["company"], job["salaryMin"], job["applyLink"])

A run summary (searches, jobs per query, variants used, stop reason) is saved as RUN_SUMMARY in the run's key-value store. It is also linked in the Output tab.

  • Job alerts and job boards. Feed fresh listings into your niche job board, newsletter or Slack channel.
  • Salary research and benchmarking. Compare pay by role, city and country with parsed min/max salaries.
  • Lead generation and recruiting. Find companies that are hiring for a role (a buying signal for HR, staffing and SaaS sales).
  • Labour-market analytics. Track demand for skills, remote share and employment types over time.
  • Job-seeker automation. Get new matching jobs every morning with direct apply links.

Reliability, retries and errors

  • Every search goes through Apify's Google SERP proxy with retries (default 3) and a per-search timeout (default 75 s; Google sometimes needs up to a minute).
  • Google's "no matches" answer is re-checked once with a fresh session before the Actor gives up on a query.
  • Each query is independent. One failing query never fails the run; it gets a free error row. The run only fails if every query failed and nothing was saved.
  • Duplicates across variants and queries are removed by Google job ID.

FAQ

Is scraping Google Jobs legal? The Actor collects publicly visible job postings. You are responsible for how you use the data (e.g. GDPR for personal data, and the terms of the sites you link to). Job postings normally contain no personal data beyond a company name.

Why did my search return only ~10 jobs? Either Expand queries is off, or the market is small (variants stopped finding new jobs). Try a broader query, add custom variants, or remove the location.

Why do I get no_results? Google answered "no matches" for that search in that country. Check the spelling, use the market's language, or broaden the location.

What does unavailable mean? Google doesn't offer Google Jobs in that country (e.g. Australia), so there is nothing to scrape.

Can I get the job posting date? Yes. postedAgo is Google's text ("3 days ago"), and postedAt / postedDaysAgo are derived from it, so they are approximate to the day (hours for "x hours ago"). Use maxDaysOld to filter.

Does it scrape LinkedIn or Indeed directly? No. It reads Google Jobs, which already lists their postings with apply links back to them.

Limitations

  • About 10 jobs per Google search (Google's limit). Large result sets need variants, and each extra search adds ~7–9 jobs. Very large pulls (1,000+ jobs per query) are only possible in big markets.
  • Google Jobs is missing in some countries (e.g. Australia). Coverage can be thin or inconsistent in others: in the Netherlands, about 50% of our test searches (16/32) returned jobs, and the same search sometimes returned jobs and sometimes not.
  • postedAt is approximate. Salary is present only when Google shows it.
  • Results depend on what Google shows at the time of the run. Google's layout changes can temporarily reduce field coverage. Report it and we fix it fast.

Support

Found a bug or need a field? Open an issue in the Issues tab. We usually reply within a day. Related Actors: Google Trends Scraper, Keyword Ideas, Google Ads Transparency Scraper (competitor ads on Google Search, Display and YouTube) and Telegram Channel Scraper (posts, views and subscriber counts from public Telegram channels).