Google Jobs Scraper & Monitor avatar

Google Jobs Scraper & Monitor

Pricing

from $2.50 / 1,000 jobs

Go to Apify Store
Google Jobs Scraper & Monitor

Google Jobs Scraper & Monitor

Scrape Google Jobs: full descriptions, every apply link, parsed salary and remote/hybrid type. Monitor mode returns only new and changed jobs for daily alerts to Slack, webhooks or n8n. Covers LinkedIn, Indeed, Glassdoor and more. Pay per result.

Pricing

from $2.50 / 1,000 jobs

Rating

0.0

(0)

Developer

SusLabs

SusLabs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Turn any Google Jobs search into clean job data, or into a daily feed of only new and changed jobs. Google Jobs collects postings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, company career sites and hundreds of other boards, so one search covers many sources.

  • 📄 Full job descriptions, not snippets: the complete text Google shows, with highlights where available.
  • 🔗 Every apply link Google lists (often 5–8 boards per job), plus one recommended primaryApplyUrl.
  • 💰 Salary parsed into min / max / currency / period ($, £, ₹, K, lakh/LPA), with the raw text kept.
  • 🆕 Monitor mode: a named monitor returns only NEW jobs and meaningful CHANGES (salary, title, location, description, main apply link). Jobs you already have are never charged again.
  • 🕒 Freshness filters (past day, 3 days, week, month) push Google towards recent postings.
  • 🚦 Honest run summary: every search reports OK, EMPTY, BLOCKED or FAILED, so "nothing new" never looks like "something broke".
  • 🔔 Slack, Discord or signed webhook alerts, plus a ready n8n workflow.
  • 💸 Pay per result: no monthly fee; failed searches and duplicates are free.

What can I use it for?

I want to…Use
Get a daily list of new roles for my recruiting nicheMonitor mode + datePosted: "3 days" on a daily schedule
Feed fresh jobs into my job board or databaseSearch or monitor mode; upsert by jobId
Compare salaries posted for a role across citiesExplicit searches, one per city, then the Salary view
See which companies are hiring for a skillSearch mode; group by company
Pipe new jobs into Slack, Sheets or a CRMMonitor mode + alerts or the n8n workflow

Quick start

One search (about 10 jobs):

{ "queries": ["data analyst"], "location": "Austin, TX", "country": "us" }

A daily monitor that returns only new and changed jobs:

{
"mode": "monitor",
"monitorName": "austin-analysts",
"queries": ["data analyst"],
"location": "Austin, TX",
"country": "us",
"datePosted": "3 days",
"firstRun": "baseline"
}

Run it on an Apify schedule once a day. firstRun: "baseline" records today's jobs without charging for them, so you only pay for jobs that appear afterwards. Use "emit" to receive the first batch too.

Many searches at once (no hidden query × city multiplication):

{
"searches": [
{ "id": "nyc-nurse", "query": "registered nurse", "location": "New York, NY", "country": "us" },
{ "id": "london-nurse", "query": "registered nurse", "location": "London", "country": "uk" },
{ "id": "blr-python", "query": "python developer", "location": "Bengaluru", "country": "in" }
]
}

Google Jobs shows about 10 jobs per search, and that first page is what this Actor reads. It doesn't page deeper. To cover more ground, add searches (more cities, more job titles), or turn on extra searches:

"extraSearches": { "enabled": true, "freshness": ["any", "week", "month"], "nearbyCities": ["Round Rock, TX"], "queryVariants": ["analytics engineer"] }

Each extra search is one more first page, billed as one search page. Different date windows often return different jobs. In our tests, four windows gave about 25 unique jobs instead of 10. Jobs that appear in several searches are delivered and charged once, with every matching search listed in searchIds.

Output

Each dataset row is one job event. Main fields:

FieldExample / meaning
eventTypeSNAPSHOT (search mode), NEW or CHANGED (monitor mode)
jobIdGoogle's job ID. Use it to upsert.
title, company, jobLocation, publisher"Data Analyst IV", "Texas HHSC", "Austin, TX", "Indeed"
description, descriptionStatusFull text; FULL / PREVIEW / MISSING
highlightsQualifications, responsibilities and benefits, when Google shows them
primaryApplyUrl, applyOptions[]Recommended link, plus every board Google lists (tracking parameters removed)
salary{raw, min, max, currency, period}
postedAgeText, postedAtEstimate"3 days ago", estimated timestamp
employmentType, workplaceTypeFull-time / Contractor…; remote / hybrid / onsite / unknown, with evidence
firstSeenAt, lastSeenAtWhen this monitor first and last saw the job
changes[]For CHANGED rows: {field, before, after}. Changes to the extra boards Google rotates in and out are ignored.

Output views in the Console: Overview, Salary, Apply links and Changes. Download as JSON, CSV, Excel or via the API.

The run's key-value store has a SUMMARY record: each search's outcome, jobs found, new, changed, filtered and charges.

Pricing

Pay-per-event: you pay only for what you get.

EventFreeStarterScaleBusiness
Run start$0.003$0.003$0.003$0.003
Search page checked$0.008$0.007$0.006$0.005
Job delivered$4.00 / 1,000$3.50 / 1,000$3.00 / 1,000$2.50 / 1,000
Job change delivered$1.00 / 1,000$1.00 / 1,000$1.00 / 1,000$1.00 / 1,000

No charge for: failed, blocked or retried searches (only the run start applies), duplicate jobs, filtered-out jobs, and unchanged jobs in a monitor.

Examples on the Free plan:

  • One search with 10 jobs: about $0.05.
  • A 50-search batch with ~500 jobs: about $2.40.
  • A daily one-search monitor with nothing new: about $0.33 per month, plus $0.004 for each new job.

Set Maximum cost per run in the run options to cap any run.

Filters

FilterHow it works
datePostedAsks Google for recent jobs, then drops any whose age is outside the window. Jobs with no age shown are kept and marked unknown. "past day" can return very few jobs; "3 days" works best for daily monitors.
employmentType, remoteOnly, titleInclude, titleExclude, companyExclude, requireSalaryApplied to the jobs found. Filtered jobs are free.

Use it from code, n8n or AI agents

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("suslabs/google-jobs-scraper").call(
run_input={"queries": ["data analyst"], "location": "London", "country": "uk"},
max_total_charge_usd=0.10,
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], "|", job["company"], "|", job["primaryApplyUrl"])
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('suslabs/google-jobs-scraper').call(
{ queries: ['data analyst'], location: 'London', country: 'uk' },
{ maxTotalChargeUsd: 0.10 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
curl -X POST "https://api.apify.com/v2/acts/suslabs~google-jobs-scraper/run-sync-get-dataset-items?maxTotalChargeUsd=0.10" \
-H "Authorization: Bearer <YOUR_APIFY_TOKEN>" -H "Content-Type: application/json" \
-d '{"queries":["data analyst"],"location":"London","country":"uk"}'
  • n8n: start the Actor on a schedule with the Apify node (or an HTTP request), wait for the run, read the dataset and send NEW jobs to Slack, Sheets or your database. Upsert by jobId; deduplicate notifications by eventId.
  • Alerts without n8n: set alerts to a Slack, Discord or webhook URL. Webhook deliveries can be signed with HMAC-SHA256 (alertSecret); deduplicate by deliveryId.
  • AI agents (MCP): https://mcp.apify.com?tools=suslabs/google-jobs-scraper

Limits, stated plainly

  • About 10 jobs per search (Google's first page). Not every job in a city.
  • Tested in the US, UK and India. Other countries usually work, but results are marked unverified.
  • Descriptions are the text Google shows. The employer's site isn't visited.
  • Google sometimes groups listings that don't match under one job. All apply links are kept as Google shows them; primaryApplyUrl is our best pick.
  • A job disappearing from Google doesn't mean it closed, so this Actor never marks jobs as closed.
  • Google can change its pages at any time. We run a daily health check and fix breakages quickly.

FAQ

Why did my monitor return nothing? Check SUMMARY. A search marked OK with no new jobs is healthy: nothing new appeared since the last run.

Can I change a monitor's searches? Use a new monitorName for a different set of searches or filters. A monitor rejects changed inputs so it never mixes two scopes.

How long does a monitor remember jobs? 90 days after a job was last seen.

Is it legal? It reads public, logged-out Google Jobs pages only: no login, no CAPTCHA solving. You're responsible for how you use the data, including privacy and employment laws where you operate.

Found a problem? Open an issue on the Issues tab with the run ID and your input (without secrets).