Google Jobs Scraper & Monitor
Pricing
from $2.50 / 1,000 jobs
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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 niche | Monitor mode + datePosted: "3 days" on a daily schedule |
| Feed fresh jobs into my job board or database | Search or monitor mode; upsert by jobId |
| Compare salaries posted for a role across cities | Explicit searches, one per city, then the Salary view |
| See which companies are hiring for a skill | Search mode; group by company |
| Pipe new jobs into Slack, Sheets or a CRM | Monitor 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" }]}
How many jobs per search?
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:
| Field | Example / meaning |
|---|---|
eventType | SNAPSHOT (search mode), NEW or CHANGED (monitor mode) |
jobId | Google's job ID. Use it to upsert. |
title, company, jobLocation, publisher | "Data Analyst IV", "Texas HHSC", "Austin, TX", "Indeed" |
description, descriptionStatus | Full text; FULL / PREVIEW / MISSING |
highlights | Qualifications, 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, workplaceType | Full-time / Contractor…; remote / hybrid / onsite / unknown, with evidence |
firstSeenAt, lastSeenAt | When 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.
| Event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| 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
| Filter | How it works |
|---|---|
datePosted | Asks 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, requireSalary | Applied to the jobs found. Filtered jobs are free. |
Use it from code, n8n or AI agents
from apify_client import ApifyClientclient = 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 byeventId. - Alerts without n8n: set
alertsto a Slack, Discord or webhook URL. Webhook deliveries can be signed with HMAC-SHA256 (alertSecret); deduplicate bydeliveryId. - 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;
primaryApplyUrlis 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).