Google Jobs collects listings from LinkedIn, Indeed, company career pages and many smaller job boards, and shows them in one panel on the search page. That makes it a useful single source for job data, but Google has no public API for it.
This tutorial uses Google Jobs Scraper (US & UK), an Apify actor I built. For each search it returns the title, company, location, salary, job type, full description and the real apply links behind each listing. It also has an only-new mode for scheduled runs. The full examples are on GitHub: auto-actor/google-jobs-scraper.
What people use it for
- A daily feed of new postings for a role and city with
onlyNew: true, so you only see jobs you haven't seen. - Salary and job-type snapshots across cities.
- Lists of employers hiring for a skill, with direct apply links.
Input
{"queries": ["data analyst new york"], "country": "us", "maxItems": 10} | Field | What it does |
|---|---|
queries | Job searches, e.g. software engineer london. |
country | us or uk. |
maxItems | Stop after this many jobs in total. |
onlyNew | Skip jobs already returned by earlier runs (remembered in the google-jobs-seen store of your account). Ideal for schedules. |
debug | Save raw HTML for debugging. |
Python
"""Run Google Jobs Scraper (US & UK) on Apify and print the results. pip install apify-client export APIFY_TOKEN=... # Apify Console -> Settings -> Integrations python example.py """ import os from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) run = client.actor("daedal_quintuplet/google-jobs-scraper").call( run_input={ "queries": [ "data analyst new york" ], "country": "us", "maxItems": 10 } ) jobs = client.dataset(run["defaultDatasetId"]).iterate_items() for job in jobs: print(job["title"], "|", job["company"], "|", job["location"], "|", job.get("salary") or "no salary listed") Node.js
// Run Google Jobs Scraper (US & UK) on Apify and print the results. // // npm install apify-client // APIFY_TOKEN=... node example.js (token: Apify Console -> Settings -> Integrations) const { ApifyClient } = require('apify-client'); async function main() { const client = new ApifyClient({ token: process.env.APIFY_TOKEN }); const run = await client.actor('daedal_quintuplet/google-jobs-scraper').call({ "queries": [ "data analyst new york" ], "country": "us", "maxItems": 10 }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); for (const job of items) { console.log(job.title, '|', job.company, '|', job.location, '|', job.salary || 'no salary listed'); } } main().catch((err) => { console.error(err); process.exit(1); }); No code: one HTTP request
Works from n8n, Make, Zapier or curl:
curl -X POST "https://api.apify.com/v2/acts/daedal_quintuplet~google-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"queries": ["data analyst new york"], "country": "us", "maxItems": 10}' What you get
One row per job:
| Field | Meaning |
|---|---|
id | Google's job id |
title | Job title |
company | Employer |
location | Location text |
via | The job board Google sourced it from |
postedAt | Posting age as Google shows it |
salary | Salary text when shown |
jobType | Full-time, Part-time, Contractor, Internship |
description | Full job description |
applyLinks | Every apply option Google lists, with its URL |
googleJobsUrl | Link to the listing on Google Jobs |
query | The query that found it |
country | us or uk |
scrapedAt | When it was scraped |
Limits
- Google returns 10 jobs per query; use several specific queries rather than one broad one.
- US and UK only. Google does not show a jobs panel for some countries, Australia included.
Price
$0.0025 per job ($2.50 per 1,000), paid per result, with no monthly fee. Apify's free plan includes $5 of usage a month, which is enough to try it.
Links: Store page · GitHub examples
