Google Jobs Scraper avatar

Google Jobs Scraper

Pricing

from $2.80 / 1,000 jobs

Go to Apify Store
Google Jobs Scraper

Google Jobs Scraper

[from $2.63/1K jobs] Scrape Google Jobs listings by job title and location: title, company, location, remote flag, job type, salary parsed into min, max, currency and period, posted date, publisher and job link. Only-new-jobs mode. No run fee.

Pricing

from $2.80 / 1,000 jobs

Rating

0.0

(0)

Developer

BlueskyScraper

BlueskyScraper

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

2 hours ago

Last modified

Categories

Share

Tested head-to-head — 12.10.2026

Same search for every Google Jobs actor in the top 5 by monthly users: software engineer in New York, 20 jobs, $0.10 spending cap.

This ActorOther top-5 Google Jobs actors
Jobs returned20 of 200–15: one returns sample (mock) jobs on the free plan, one failed, two could not run within the $0.10 cap
Price per 1,000 jobs, free plan$7.20$3 (50-job minimum) – $200
Price per 1,000 jobs, Gold$2.80$3 – $150
Fields per job30, incl. salary as numbers, ISO date, publisher20–26
Billingper job, a half-empty page costs halfmostly per page or with a start fee

What is Google Jobs Scraper?

Google Jobs Scraper is a Google Jobs API for job listings. Type one or more job titles, add one or more locations, and get one row per vacancy from Google Jobs with job title, company, location, remote flag, employment type, the salary text plus the salary parsed into numbers (salaryMin, salaryMax, salaryCurrency, salaryPeriod), the posted date in ISO format, the publisher the posting was found on (LinkedIn, ZipRecruiter, the company careers site…) and the link to the job posting. Every job title runs in every location you list, in one run.

One row is one job. Google Jobs collects vacancies from hundreds of job boards and careers sites, so one search here covers LinkedIn, ZipRecruiter, Built In, Y Combinator, company career pages and many more at once. The data is read from Google Jobs result pages through a licensed data provider, so there are no proxies, CAPTCHAs or browser sessions to manage and no Google account or API key is needed on your side.

  • 💰 $0.0072 per job on the free plan, from $0.0028 on paid plans — 20% cheaper than the market leader on every plan; you pay per job, not per page, so a half-empty page costs half
  • 💵 Salary data as numbers: "125K–250K a year" becomes 125000, 250000, USD, year
  • 📅 Posted date in ISO 8601 (2026-09-30T00:44:28.000Z), not just "2 days ago"
  • 🏠 Remote flag on every row, 🔁 duplicates removed across pages and searches
  • 🆕 Only new jobs mode for scheduled runs — jobs you already received are skipped and free
  • 🔗 Same field names as our Indeed, LinkedIn and Jobs API actors — one parser for all of them
  • 🆓 Error rows are free — an unknown location or a search with no jobs costs nothing
  • 🤖 Works from the Apify API, the MCP server (Claude, ChatGPT, Cursor), n8n, Make and Zapier

What it does not return: the full job description text. Google Jobs result lists do not carry it, so this Actor does not promise it. If you need descriptions, see Indeed Jobs Scraper or Jobs API.

What data can Google Jobs Scraper extract?

FieldExampleWhat it means
💼 titleSoftware Engineer, Developer InfrastructureJob title as Google Jobs shows it
🏢 companyNumericEmployer name
📍 locationNew York, NYJob location; Anywhere for remote jobs
otherLocationsCount1More locations listed on the same posting ("+1 other")
🏠 isRemotefalsetrue when location or title says remote, anywhere or work from home
workplaceTypehybridremote, hybrid or empty when the posting does not say
⏱️ employmentTypefulltimeNormalised: fulltime, parttime, contractor, internship
jobTypes["fulltime"]All employment types the posting lists
💵 salaryText125K–250K a yearSalary exactly as Google shows it
salaryMin125000Lower bound as a number
salaryMax250000Upper bound as a number
salaryCurrencyUSDISO currency code
salaryCurrencySourcesearch countrysalary text when a symbol (£, €, ₹) was in the salary; search country when Google left it out and the searched country's currency was used
salaryPeriodyearhour, day, week, month or year
📅 postedAt2026-09-14T00:34:57.000ZWhen the job was posted, ISO 8601
postedText18 days agoPosting age as Google shows it
🔗 publisherBuilt In NYCSite Google found the posting on
🔗 urlhttps://www.builtinnyc.com/job/…Link to the posting (the apply page)
companyLogohttps://…/cdn/i/…:0Employer logo (temporary image link)
idcdSQQAHZ24TXq-GEAAAAAA==Google Jobs job id
position12Position in the search after duplicates are removed
🔍 querysoftware engineerJob title you searched for
queryLocationNew York, NYLocation as you typed it
searchLocationNew York, New York, United StatesGoogle Jobs location the search ran in
countryCodeUSCountry of the search
languageEnglishGoogle interface language
searchUrlhttps://www.google.com/search?q=software%20engineer&udm=8&…The Google Jobs search that was read
sourcegoogle-jobsSame field as in our other jobs actors
scrapedAt2026-10-02T00:44:28.000ZWhen the row was produced

How the computed fields are made

  • Salary. Google writes salaries as short text: 250K a year, 75–80 an hour, £35k–£40k a year, £350–£400 a day, £27,657–£30,730 a year. The Actor turns K into thousands, reads ranges and single values ("From 50K" fills only salaryMin, "Up to $30" only salaryMax), detects the period and the currency. In the US Google usually drops the dollar sign, so the currency falls back to the searched country — salaryCurrencySource tells you which case you have. Many postings carry no salary at all; then all salary fields are empty. In our test runs 6 of 20 New York jobs and 10 of 25 London jobs had a salary.
  • Posted date. Google shows "6 hours ago" or "11 days ago"; postedAt turns that into a date-time. It is as precise as Google's wording (a day for "days ago"). A few postings show no age; then postedAt is empty.
  • Remote flag. isRemote is true when the location is "Anywhere" / "Remote" or the title says remote. It is a reading of the posting, not a promise from the employer.
  • Duplicates. The same vacancy often appears twice — once via LinkedIn and once via the company site, or under two of your job titles. Rows are de-duplicated by Google job id and by title + company + location across pages and searches of the run, so you pay for each vacancy once.

💰 How much does it cost to scrape Google Jobs?

Google Jobs Scraper uses pay-per-event pricing. You pay per job row, nothing per run, per page or per search.

PlanPrice per jobPrice per 1,000 jobs
Free$0.0072$7.20
Bronze$0.0036$3.60
Silver$0.0032$3.20
Gold, Platinum, Diamond$0.0028$2.80

How this compares: the most-used Google Jobs actor on Apify charges per page of up to 10 jobs — $0.09 per page on the free plan and $0.045 / $0.04 / $0.035 on paid plans. Per job that is $9 / $4.50 / $4 / $3.50 per 1,000 — we are 20% cheaper on every plan (checked 12.10.2026). Because we bill per job rather than per page, a search that has only 4 jobs costs 4 jobs, not a full page.

What is free:

  • error rows (unknown location, a search Google has no jobs for, an unsupported country);
  • duplicates removed by the Actor;
  • postings of other job types dropped by the ⏱️ Job types filter;
  • jobs skipped by 🆕 Only new jobs because an earlier run already returned them.

Examples: the default run (10 software engineer jobs in New York) costs $0.072 on the free plan. 1,000 jobs cost $7.20 on the free plan and $2.80 on Gold. Apify's free plan includes $5 of monthly credit — about 690 jobs.

How to scrape Google Jobs with Google Jobs Scraper

  1. Open the Actor and go to the Input tab.
  2. In 🔍 Job titles, type one job search per line (software engineer, registered nurse, data analyst).
  3. In 📍 Locations, type one city, state or country per line (New York, NY, London, Texas, India).
  4. Set 💯 Max jobs per search (10 is one Google Jobs page; up to 200).
  5. Optional: pick ⏱️ Job types, switch on 🆕 Only new jobs for scheduled runs.
  6. Click Start. A small search finishes in 15–25 seconds.
  7. Open the Output tab and download the table as CSV, Excel or JSON, or read it through the API.

⬇️ Input

Job titles in several locations (default)

{
"queries": ["software engineer"],
"locations": ["New York, NY"],
"maxJobsPerQuery": 10
}

Every job title runs in every location: 3 titles × 2 locations = 6 searches. Locations can be a city (New York, NY, London, Toronto, Bengaluru), a state or province (Texas, Ontario) or a country (United States, UK, India). Abbreviations work (Austin, TX, Seattle, WA, NYC). The run log prints which Google Jobs location each line was matched to, and every row carries it in searchLocation.

⏱️ Job types

{
"queries": ["data analyst"],
"locations": ["London"],
"maxJobsPerQuery": 25,
"jobTypes": ["fulltime", "contract"]
}

Values: fulltime, parttime, contract, internship. Google Jobs ignores type filters sent as settings, so the Actor writes the type into the Google search itself (marketing + Internship → marketing internship) and keeps only postings labelled with a type you picked; postings of other types are dropped and not charged. Tested 12.10.2026: marketing + Internship in New York — 10 of 10 rows are internships (before the fix Google returned 1 internship in 10); java developer + Contract in the United States — 10 of 10 contract jobs. With several types picked, the Actor runs one Google search per type and mixes the answers.

🆕 Only new jobs

{
"queries": ["software engineer", "software developer"],
"locations": ["New York, NY"],
"maxJobsPerQuery": 10,
"onlyNewJobs": true
}

The Actor remembers the jobs it returned for each job title + location + job types + language (last 5,000 per search, stored in your own Apify account). The next run returns only jobs that were not there before; the rest are skipped for free. Tested: the first run returned 20 jobs, an identical second run returned 0 and charged nothing. Schedule it daily and you get a feed of new vacancies.

🗣️ Language

Leave empty for English (recommended: salary and date texts are then in English, which the parser reads best). Use a name or code (German, de, es-419) to change Google's interface language.

Countries

Google Jobs data is available for 76 countries, including the United States, United Kingdom, Canada, India, Singapore, the United Arab Emirates, Japan, Brazil, South Africa, Nigeria, Kenya, the Philippines, Malaysia and Indonesia. Tested end to end: United States (New York) and United Kingdom (London).

Not available: Google Jobs results are currently not shown in the EU — on 2 October 2026 searches in Berlin and Paris came back empty while London and New York were full. Locations in Germany, France, Spain, Italy, the Netherlands, Belgium, Austria, Portugal, Denmark and Greece therefore return a free error row right away. Australia, New Zealand, Ireland, Mexico, Poland and the Nordics are not covered by Google Jobs data either and also get a free error row.

⬆️ Output

One row per job:

{
"type": "job",
"source": "google-jobs",
"id": "cdSQQAHZ24TXq-GEAAAAAA==",
"title": "Software Engineer, Developer Infrastructure",
"company": "Numeric",
"location": "New York, NY",
"otherLocationsCount": 0,
"isRemote": false,
"workplaceType": null,
"employmentType": "fulltime",
"jobTypes": ["fulltime"],
"salaryText": "125K–250K a year",
"salaryMin": 125000,
"salaryMax": 250000,
"salaryCurrency": "USD",
"salaryCurrencySource": "search country",
"salaryPeriod": "year",
"postedAt": "2026-09-14T00:34:57.000Z",
"postedText": "18 days ago",
"publisher": "Built In NYC",
"url": "https://www.builtinnyc.com/job/software-engineer-developer-infrastructure/11174118",
"position": 12,
"query": "software engineer",
"queryLocation": "New York, NY",
"searchLocation": "New York, New York, United States",
"countryCode": "US",
"language": "English",
"scrapedAt": "2026-10-02T00:44:28.000Z"
}

The dataset has three views: Jobs (the main table), Salaries (salary columns side by side) and Errors.

Same fields as our other jobs actors

title, company, location, isRemote, workplaceType, employmentType, jobTypes, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText, postedAt, postedText, url, query, queryLocation, source and scrapedAt mean the same here as in Indeed Jobs Scraper, LinkedIn Jobs Scraper and Jobs API. You can append their datasets to one table and tell the rows apart by source. The input also accepts keywords and location as aliases of queries and locations.

Use cases for Google Jobs data

Job market and salary research

Pull a few hundred postings for a role in several cities and compare salaryMin / salaryMax by city without retyping a single number. The Salaries view puts the parsed columns next to the original text.

Recruiting and lead generation

Agencies use hiring signals as leads: which companies are hiring for which roles right now, and through which boards. company, publisher and postedAt answer that in one table.

Job alerts and new-vacancy feeds

Schedule a daily run with 🆕 Only new jobs and send the new rows to Slack, email or a Google Sheet. Already-seen jobs cost nothing.

Job boards and aggregators

Seed a niche job board with fresh postings by title and city, with links back to the original posting.

AI agents and LLM workflows

Agents can call the Actor with a title and a city and get flat rows with numeric salaries and ISO dates — easy to filter and summarise without extra parsing.

Integrations

Apify API (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('lergassy/google-jobs-scraper').call({
queries: ['registered nurse'],
locations: ['Texas'],
maxJobsPerQuery: 30,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((j) => j.type === 'job').map((j) => [j.title, j.company, j.salaryMin, j.salaryPeriod]));

Apify API (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("lergassy/google-jobs-scraper").call(run_input={
"queries": ["data analyst"],
"locations": ["London"],
"maxJobsPerQuery": 25,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
if job["type"] == "job":
print(job["title"], job["company"], job["salaryMin"], job["salaryCurrency"])

One HTTP call

POST https://api.apify.com/v2/acts/lergassy~google-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN with the input JSON as the body returns the rows directly.

No-code tools

Use the Apify integrations for n8n, Make, Zapier, Google Sheets, Slack and webhooks to push new jobs wherever you need them.

MCP server

Add https://mcp.apify.com to Claude, ChatGPT, Cursor or any MCP client and ask for "software engineer jobs in New York with salaries" — the agent calls this Actor and reads the rows.

🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (lergassy/google-jobs-scraper).

Purpose: one row per Google Jobs vacancy for a job title in a location — who is hiring, where, for what pay, since when, and the link to apply.

Minimal input:

{ "queries": ["software engineer"], "locations": ["New York, NY"], "maxJobsPerQuery": 10 }

Output: type, source, id, title, company, location, otherLocationsCount, isRemote, workplaceType, employmentType, jobTypes, salaryText, salaryMin, salaryMax, salaryCurrency, salaryCurrencySource, salaryPeriod, postedAt, postedText, publisher, url, companyLogo, position, query, queryLocation, searchLocation, countryCode, language, searchUrl, scrapedAt. Error rows: type "error", input, error, scrapedAt.

Behaviors an agent should know:

  • Every query runs in every location; maxJobsPerQuery (default 10, max 200) caps each pair.
  • No job description text is returned.
  • Salary fields are empty when the posting shows no salary; salaryCurrencySource: "search country" means the currency was inferred.
  • EU countries, Australia, Ireland, Mexico and Poland return a free error row, not jobs.
  • Use jobTypes and onlyNewJobs instead of post-filtering: postings of other types and already returned jobs are dropped for free.
  • Billed per job row (event job); error rows, duplicates and already-seen jobs are free.
  • All fields are flat except jobTypes (array of strings).

Error items / Troubleshooting

Problems never stop the run and never cost money. They come as rows like this:

{ "type": "error", "input": "Berlin", "error": "Google Jobs currently shows no job listings in Germany (Google Jobs results are not shown in the EU / EEA). Search a country outside the EU instead, for example United Kingdom or United States. Not charged.", "scrapedAt": "2026-10-02T00:50:20.000Z" }
ErrorWhat to do
Location not foundCheck the spelling, add the state or country (Cambridge, MA, London, UK)
Not a place ("Remote")Put a country in Locations and add "remote" to the job title
No job listings in an EU countryGoogle Jobs results are currently not shown in the EU; search the UK, US or another non-EU country
Shows no jobs for this searchTry a broader title or a bigger location; with job types set, try without them
Unknown language / job typeUse the values listed in the input form

❓ FAQ

The Actor reads publicly visible Google Jobs results — job titles, employers, locations, salaries as published by employers and job boards. It collects no personal data about candidates. Public job data is widely used for market research, but the rules depend on your country and use; consult a lawyer if you are unsure.

Does Google Jobs Scraper return the job description?

No. Google Jobs result lists do not include it. Use the url to open the posting, or use Indeed Jobs Scraper / Jobs API where descriptions are part of the row.

Up to 200 per job title and location. Google often has fewer for narrow searches; you pay only for the jobs returned.

How fresh are the results?

Each search is live at run time. An identical search repeated within 12 hours (1 hour with Only new jobs) is served from a short cache and returns the same snapshot — handy for retries, and you still get complete rows.

Why is the salary empty?

The employer did not publish one. Google shows a salary on roughly a third of postings in our tests.

Why is the currency "search country"?

Google writes US salaries as "125K–250K a year" without a dollar sign. The Actor then uses the currency of the country you searched and says so in salaryCurrencySource.

How much does it cost to scrape 1,000 Google Jobs listings?

$7.20 on the Apify free plan, $3.60 on Bronze, $3.20 on Silver and $2.80 on Gold and above. No start fee.

Can I use Google Jobs Scraper with the Apify API?

Yes — see the JavaScript, Python and HTTP examples above. Every input field has the same name in the API as in the JSON tab of the form.

Can I use it through an MCP server?

Yes. Connect https://mcp.apify.com to your AI assistant; the Actor is available as a tool and returns flat JSON rows.

Can I integrate it with other apps?

Yes: Google Sheets, Slack, n8n, Make, Zapier, Airtable and webhooks through Apify integrations.

Do I get one row per job?

Yes. One row is one vacancy; duplicates of the same job across pages, publishers and your searches are removed.

Do I need proxies or a Google account?

No. Nothing to configure beyond job titles and locations.

Your feedback

Found a location that matches the wrong place, a salary format that parses wrong, or a field you need? Open an issue in the Issues tab — we answer quickly and ship fixes.

You might also like

ActorWhat it does
Jobs APIIndeed, LinkedIn and career sites (Greenhouse, Lever, Ashby…) in one table, with descriptions
Indeed Jobs ScraperIndeed jobs with full descriptions, salaries and company data
LinkedIn Jobs ScraperLinkedIn job listings without login
SEEK Jobs ScraperAustralia and New Zealand job ads from SEEK
Website Contacts APIEmails and phones from company websites — pair it with company to reach hiring teams