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
Top comments (0)