Google Jobs Scraper - Salary, Apply Links & Descriptions
Pricing
from $2.00 / 1,000 job postings
Google Jobs Scraper - Salary, Apply Links & Descriptions
Scrape Google Jobs by keyword and location: title, employer, location, salary (min/max/currency/period), employment type, remote flag, posting date, full description, requirements and every apply link. Optional employer emails. Export to Excel/CSV/JSON or run via API.
Pricing
from $2.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Raven
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Google Jobs Scraper — Salaries, Apply Links & Full Descriptions
Scrape Google Jobs — the aggregated jobs feed Google builds from LinkedIn, Indeed, ZipRecruiter, Glassdoor and thousands of company career sites — by keyword and location, from $2.40 per 1,000 job postings on the free plan (from $2.00 per 1,000 on paid plans). No login, no API key, no code, no proxies to configure. Every posting comes back with 65 fields: the full job description, a parsed salary, the exact posting age, and every apply link Google syndicated — plus optional employer emails.

| Raven · Recruiting & lead generation • Google Jobs · Google Maps · Website contacts · Trustpilot | |||
|
➤ You are here |
Places, emails, reviews |
Bulk emails, phones, socials |
Company reviews & TrustScore |
What does this Google Jobs Scraper do?
Google has no public Google Jobs API — the jobs vertical is a search surface, not a documented endpoint, and it is not covered by any official Google API you can sign up for. This Actor is the unofficial Google Jobs API: you give it keywords and locations (or a Google Jobs URL) and it returns structured JSON, CSV or Excel rows.
| You give it | You get back |
|---|---|
Job titles or keywords (queries) | One row per posting, deduplicated by Google's own job id |
Cities, states or regions (locations) | Title, employer, location split into city / state / country |
| Optional filters (date, type, remote, salary) | Parsed salary min/max/currency/period, employment type, work mode |
Optional Google Jobs URLs (startUrls) | Full description + the qualification and responsibility lists Google extracts |
Optional employer lookup (scrapeEmails) | Employer website, public email, phone and social profiles |
Every row also carries all application options — on average 5.7 apply links per posting (LinkedIn, Indeed, SimplyHired, BeBee, the employer's own careers site …), each flagged for whether it applies directly with the employer.
Why use this scraper?
- ✅ 65 fields per posting — not a title and a URL, the whole record
- ✅ Full job descriptions included — 4,700 characters on average, at no extra cost or extra step
- ✅ Every apply link, not just one — 5.7 per posting on average, with
hasDirectApplymarking employer-direct applications - ✅ Salaries actually parsed —
salaryMin,salaryMax,salaryCurrency,salaryPeriod, not just the raw string - ✅ Absolute posting dates —
postedAtDateas UTC ISO-8601 pluspostedHoursAgo, so you can sort and filter properly - ✅ Location split out —
city,state,countryas separate fields - ✅ Derived classifications —
workMode(REMOTE / HYBRID / ONSITE),seniorityLevel,noDegreeRequired - ✅ Employer contacts on demand — public email, phone and socials from the employer's own website
- ✅ Job-alert mode —
onlyNewJobsremembers postings across runs, so a scheduled run never returns (or bills) the same job twice - ✅ Automatic search expansion — Google shows ~10 postings per search; the Actor asks each keyword several different ways to reach the number you asked for
- ✅ 34 country markets, results localized by country and language
| Official Google API | Typical Google Jobs scrapers | This Actor | |
|---|---|---|---|
| Availability | No public jobs API exists | Varies | Live, on demand |
| Full description | — | Often a preview or a paid extra step | Always included |
| Apply links | — | Usually one link per posting | All of them, average 5.7 |
| Salary | — | Usually the raw string only | Raw and min/max/currency/period |
| Posting date | — | Usually "3 days ago" text only | Text and absolute UTC timestamp |
| Employer contacts | — | Rarely | Optional email, phone, socials |
| Cross-run dedup | — | Rarely | onlyNewJobs mode |
What data can you extract from Google Jobs?
Identity & employer
| Field | Description |
|---|---|
jobId | Google's own posting id — stable, used for de-duplication |
title | Job title as published |
companyName | Hiring employer |
location | Location as Google shows it, e.g. New York, NY |
city / state / country | Location parsed into components |
via / sourceBoard | Board Google syndicated the posting from |
companyLogo | Employer logo image URL |
googleJobsUrl / shareLink | Google's own links for the posting |
Compensation & terms
| Field | Description |
|---|---|
salary | Salary exactly as displayed, e.g. 137,750–185,000 a year |
salaryMin / salaryMax | Parsed numeric bounds |
salaryCurrency / salaryPeriod | e.g. USD and YEAR, MONTH, HOUR |
hasSalary | Whether the posting displayed pay at all |
employmentType | FULLTIME, PARTTIME, CONTRACTOR, INTERN, TEMPORARY, VOLUNTEER |
scheduleType | Type as Google labels it, e.g. Full-time and Part-time |
isRemote / workMode | Remote flag, plus REMOTE / HYBRID / ONSITE |
seniorityLevel | INTERN, JUNIOR, MID, SENIOR, LEAD, EXECUTIVE |
degreeRequirement / noDegreeRequired | Education requirement Google extracted |
benefits, hasHealthInsurance, hasDentalInsurance, hasPaidTimeOff | Benefit chips and flags |
extensions | Every chip Google displayed, raw and in order |
Timing
| Field | Description |
|---|---|
postedAt | Age as printed, e.g. 16 hours ago |
postedAtDate | Absolute UTC ISO-8601 timestamp |
postedHoursAgo | Age in whole hours |
Content
| Field | Description |
|---|---|
description | Full posting text (4,700 characters on average) |
descriptionHtml | Same text with the employer's original HTML markup |
descriptionLength | Character count — handy for filtering out stub listings |
qualifications | Requirements Google identified |
responsibilities | Duties Google identified |
benefitHighlights | Benefit sentences Google identified |
Application
| Field | Description |
|---|---|
applyLink | Primary application URL |
applyOptions | Every option: board, url, isDirect |
applyOptionsCount / applyBoards | Count and board names |
hasDirectApply | True when at least one option applies on the employer's own site |
Employer contacts (only when scrapeEmails is enabled)
| Field | Description |
|---|---|
companyWebsite / companyDomain | Employer's own site, resolved from the apply links or posting text |
email / emails | Public employer addresses, HR and recruiting ones ranked first |
phone | Public phone number, when the site publishes one |
linkedin, facebook, twitter, instagram, youtube | Employer social profiles |
Provenance
searchQuery, searchLocation, searchFilter, searchUrl, position, countryCode, languageCode, scrapedAt — so you always know which search produced a row.
How to scrape Google Jobs step by step
- Open the Actor in the Apify Console and click Try for free — new accounts get $5 in free credits every month, no card required.
- Type your job titles or keywords into Job titles or keywords, one per line (e.g.
software engineer,registered nurse). - Add one or more Locations (e.g.
New York,Chicago). Google's jobs results are strongly location-driven, so this matters more than any other setting. - Set Maximum jobs — the total you want across all keywords and locations, after de-duplication.
- Optionally narrow with Posted within, Employment type, Remote jobs only or Only jobs with a salary.
- Click Start. Rows appear in the Output tab within seconds and keep streaming as they are found.
- Export from the Storage tab as Excel, CSV, JSON, XML or pull the dataset from the API.
How do I get more than 10 jobs per search?
This is the single most common Google Jobs question, so here is the honest answer: Google's jobs vertical returns about ten postings per search, and its "load more" control is JavaScript-only. There is no page-2 parameter.
Volume therefore comes from breadth, and the Actor handles it for you. With Expand the search automatically enabled (the default), each keyword is also asked through:
- Google's own filter chips (Remote, No degree) — measured to return 10 out of 10 different postings versus the plain search
- each employment type you tick — Google honours one type per search, so each becomes its own search
- seniority and intent wording (senior, junior, entry level, urgently hiring, …)
- recency windows — a genuinely different cut of Google's index
Everything is de-duplicated by Google's own jobId, so slices can overlap freely. In real runs this yields 4.4–6 new postings per Google request, e.g. 150 unique jobs from 32 requests across 3 keywords × 2 cities.
Practical rules:
- More keywords and more locations beat everything else. Two keywords × two cities realistically returns 100+ unique postings.
- One narrow keyword in one small city will run dry — and when it does, the Actor stops and says so in the log instead of spending your budget re-fetching the same ten postings.
How do I get only new jobs? (job-alert mode)
Enable Only new jobs. The Actor remembers every posting id it has returned, in its own key-value store, and emits only postings no previous run has produced. Combine it with a Schedule and datePosted: "today" for a daily or hourly job alert that never returns — or bills — the same posting twice.
How do I find employer emails?
Enable Find employer emails, phones and socials. For each posting the Actor resolves the employer's own website from the apply links (or from a domain printed in the posting text), then reads their contact and about pages for a public address.
Two things make the output usable rather than noisy:
- The domain has to match the employer. Google syndicates most postings through job boards, and a board's apply link leads to the board — so a host is only crawled when the employer's own name appears in it.
The Home Depot→careers.homedepot.comis crawled; a generic aggregator domain is not. - Recruiting mailboxes rank first, and hiring-platform or compliance addresses are pushed down or dropped. Real examples from a test run:
talentacquisition@intuit.com,physician.recruitment@mountsinai.org,cambiacareers@cambiahealth.com.
Each employer domain is visited once per run and shared by all their postings. In a mixed run about 1 posting in 4 yields an employer email — corporate careers sites often publish none at all, and you are only charged when one is actually found.
Input parameters
| Input | Type | Description |
|---|---|---|
queries | array | Job titles or keywords. Searched in every location. |
locations | array | Cities, states or regions. Adding locations is the main volume lever. |
maxItems | integer | Total cap across all searches, after de-duplication. 0 = no limit. |
startUrls | array | Google Jobs URLs to scrape directly. Legacy ibp=htl;jobs links are upgraded. |
countryCode | select | 34 markets. Controls local boards and salary currency. |
languageCode | string | Result language, e.g. en, de, es. |
datePosted | select | any, today, 3days, week, month. |
employmentTypes | array | FULLTIME, PARTTIME, CONTRACTOR, INTERN, TEMPORARY, VOLUNTEER. |
remoteOnly | boolean | Remote / work-from-home roles only. |
salaryOnly | boolean | Keep only postings that display pay. |
minSalary | integer | Drop postings below this figure, in the market's own currency. |
postedWithinHours | integer | Exact age cutoff, e.g. 24. |
companyFilter / excludeCompanies | array | Keep or drop employers by name. |
viaFilter | array | Only postings from certain boards, e.g. LinkedIn. |
titleIncludeKeywords / titleExcludeKeywords | array | Keep or drop by words in the job title. |
onlyNewJobs | boolean | Emit only postings not returned by earlier runs. |
scrapeEmails | boolean | Look up employer email, phone and socials. |
skipJobsWithoutEmail | boolean | Drop postings with no employer email found. |
expandSearch | boolean | Ask each keyword several ways to reach maxItems. Default on. |
googleDomain | string | e.g. www.google.co.uk. Usually leave as default. |
concurrency | integer | Parallel Google searches, 1–20. Default 6. |
maxRetries | integer | Retries per failed request, 1–12. Default 5. |
proxyConfiguration | object | Used only for employer-website lookups. |
Ready-to-paste input recipes
1. Broad multi-city sweep
{"queries": ["software engineer", "data analyst"],"locations": ["New York", "Chicago", "Austin"],"maxItems": 300,"countryCode": "us"}
2. Daily job alert — fresh postings only
{"queries": ["registered nurse"],"locations": ["Chicago"],"datePosted": "today","onlyNewJobs": true,"maxItems": 100,"countryCode": "us"}
3. Remote roles above a salary floor
{"queries": ["product manager"],"locations": ["United States"],"remoteOnly": true,"salaryOnly": true,"minSalary": 120000,"maxItems": 150,"countryCode": "us"}
4. Recruiting outreach list — employers with an email
{"queries": ["warehouse operative", "forklift driver"],"locations": ["Dallas", "Houston"],"scrapeEmails": true,"skipJobsWithoutEmail": true,"maxItems": 100,"countryCode": "us"}
5. Salary benchmarking across markets
{"queries": ["devops engineer"],"locations": ["London", "Manchester", "Edinburgh"],"salaryOnly": true,"employmentTypes": ["FULLTIME"],"maxItems": 250,"countryCode": "gb","languageCode": "en"}
6. Internships, no staffing agencies
{"queries": ["marketing internship"],"locations": ["Berlin"],"employmentTypes": ["INTERN"],"excludeCompanies": ["Randstad", "Adecco", "Manpower"],"postedWithinHours": 168,"maxItems": 80,"countryCode": "de"}
7. Scrape a Google Jobs URL directly
{"startUrls": ["https://www.google.com/search?q=nurse+jobs+in+chicago&udm=8"],"maxItems": 50}
Output examples
One job posting (trimmed — the real record carries 65 fields):
{"jobId": "DBBe-bRgshAtIKeNAAAAAA==","title": "Software Engineer III (Java & AWS)","companyName": "JPMorganChase","location": "New York, NY","city": "New York","state": "NY","via": "LinkedIn","sourceBoard": "LinkedIn","postedAt": "16 hours ago","postedAtDate": "2026-08-19T03:18:20Z","postedHoursAgo": 16,"salary": "137,750–185,000 a year","salaryMin": 137750,"salaryMax": 185000,"salaryCurrency": "USD","salaryPeriod": "YEAR","hasSalary": true,"employmentType": "FULLTIME","scheduleType": "Full-time","isRemote": false,"workMode": "ONSITE","seniorityLevel": "SENIOR","noDegreeRequired": true,"degreeRequirement": "No Degree Mentioned","benefits": ["Health insurance", "Dental insurance"],"hasHealthInsurance": true,"hasDentalInsurance": true,"extensions": ["16 hours ago","137,750–185,000 a year","Full-time","No Degree Mentioned","Health insurance","Dental insurance"],"descriptionLength": 5543,"qualifications": ["Formal training or certification on software engineering concepts and 3+ years applied experience","Hands-on practical experience in application development, testing and operational stability using Java, Spring Boot, RESTful API, JavaScript technologies"],"responsibilities": ["Executes standard software solutions, design, development, and technical troubleshooting"],"applyLink": "https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4452898282","applyOptionsCount": 6,"applyBoards": ["LinkedIn", "Indeed", "BeBee", "Built In", "SimplyHired", "EQuest Jobs"],"applyOptions": [{ "board": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/...", "isDirect": false },{ "board": "EQuest Jobs", "url": "https://jobs.equest.com/jobs/NY/...", "isDirect": true }],"hasDirectApply": true,"companyLogo": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSJGlBBMSH3KKcmylT5lMvWctF0mf1Ywm-2xFv5","googleJobsUrl": "https://www.google.com/search?udm=8&q=software+engineer+jobs+in+New+York&htidocid=DBBe-bRgshAtIKeNAAAAAA==","searchQuery": "software engineer in New York","searchLocation": "New York","searchFilter": "base","position": 1,"countryCode": "us","languageCode": "en","scrapedAt": "2026-08-19T19:18:20Z"}
With employer contacts (scrapeEmails: true), the same record gains:
{"companyWebsite": "https://careers.homedepot.com/","companyDomain": "careers.homedepot.com","email": "mythdhr@homedepot.com","emails": ["mythdhr@homedepot.com"],"linkedin": "https://www.linkedin.com/company/the-home-depot"}
How much does it cost to scrape Google Jobs?
Pay per result. You are charged for each posting delivered; the employer-contact lookup is a separate add-on billed only when a contact is actually found. Rows that could not be parsed are published for visibility and never billed.
| Event | Free plan | Paid plans (from) |
|---|---|---|
| Job posting | $0.0024 | $0.0020 |
| Employer contact (only when found) | $0.0050 | $0.0040 |
| Actor start | $0.0010 | $0.0001 |
Worked examples:
| What you run | Free plan | Paid plans (from) |
|---|---|---|
| 100 postings | $0.24 | $0.20 |
| 1,000 postings | $2.40 | $2.00 |
| 10,000 postings | $24.00 | $20.00 |
| 1,000 postings + 250 employer emails | $3.65 | $3.00 |
On the free Apify plan you get $5 in credits every month, which is roughly 2,000 Google Jobs postings per month at no cost.
The price is all-in — there is nothing extra to pay on top of the per-result price, and no separate proxy bill. Set Max total charge in the run options to cap any run, and the Actor stops cleanly when it reaches your limit.
Integrations
Connect Google Jobs data to the rest of your stack without writing glue code:
- Make and Zapier — trigger on a finished run, push rows onward
- Google Sheets, Airtable, Slack, Gmail — send new postings straight to a sheet or channel
- n8n — self-hosted automation with the Apify node
- Webhooks — fire on run success, failure or dataset item
- API clients for Python and JavaScript, plus a plain REST API
- Schedules — run hourly or daily; pair with
onlyNewJobsfor a clean job alert - Storage exports — Excel, CSV, JSON, XML, JSONL, RSS
Use with AI agents (MCP)
This Actor works as a tool for LLM agents through the Apify MCP server, so Claude, Cursor, VS Code or any MCP-capable client can run job searches and read the results directly.
Example prompt once the Actor is connected:
Find remote senior data engineer roles in the United States posted in the last 24 hours with a salary above $150k, and give me the employer, the salary range and the direct apply link for each.
Popular use cases
- Recruiters & staffing agencies — build employer lead lists with contact emails, spot who is hiring for which roles
- Job boards & aggregators — fill a niche board with fresh, structured postings and working apply links
- Salary benchmarking & compensation teams — parsed salary ranges by city, seniority and employment type
- HR & talent analytics — hiring-demand trends, remote vs onsite mix, skills appearing in requirements
- Job seekers & career coaches — a filtered feed of only the roles that match, with every apply route
- Market researchers & investors — headcount-growth signals from posting volume per company
- AI & LLM apps — clean job data for RAG, matching engines and résumé-to-role scoring
Is it legal to scrape Google Jobs?
Scraping publicly available job postings is generally legal, and this Actor only ever reads pages any visitor can open — no login, no paywall, no private data. Job postings are published by employers precisely to be found and shared.
Two cautions worth taking seriously:
- Employer contact details can be personal data under GDPR, CCPA and similar laws. If you collect them, have a lawful basis, respect opt-outs and keep only what you need.
- Google's terms and the terms of the originating boards apply to how you republish data. Aggregating for analysis is a very different act from re-hosting listings wholesale.
For a deeper treatment, see Apify's guide: Is web scraping legal?
FAQ
Does Google Jobs have a public API?
No. Google does not offer a documented, sign-up API for its jobs vertical. This Actor is the practical alternative: same data, delivered as JSON, CSV or Excel.
Why did I get fewer jobs than I asked for?
Google returns about ten postings per search, and each of the Actor's alternative searches overlaps the previous ones. When a keyword and location combination genuinely runs out of new postings, the run stops and logs that it did — rather than burning budget on repeats. Add more keywords or more locations to go wider.
How many jobs can I get for one keyword?
One keyword in one city typically yields 30–60 unique postings once every angle has been tried. Two keywords across two cities realistically returns 100+. Volume scales with keywords × locations, not with a page number.
Do I need proxies or a Google account?
No. There is nothing to configure — no login, no cookies, no API key, and no proxy setup. The proxy input only affects the optional employer-website lookup.
Can I export to CSV or Excel?
Yes. Every run's dataset exports to Excel, CSV, JSON, XML, JSONL and RSS from the Storage tab, or via the API.
Which countries work best?
The US, UK, Canada, Australia, India, Singapore, the UAE and South Africa return the richest results. Google has wound its jobs widget down across much of the EU, so German, French, Spanish and Italian searches return few or no postings.
Are the job descriptions complete?
Yes — the full posting text arrives with the listing, averaging about 4,700 characters, along with the qualification and responsibility lists Google extracts. There is no second request and no extra charge for it.
Why do some postings have no salary or no date?
Because Google did not display one. In real runs about 35–39% of postings show a salary and about 86–95% show a posting date; the rest simply do not publish it. Use salaryOnly if you want only the ones that do.
Will I be charged for searches that return nothing?
No. Charging is per delivered posting, so a search that returns no results costs nothing beyond the Actor start event. Rows that fail to parse are also never billed.
Will I be charged twice for the same job?
Not within a run — everything is de-duplicated by Google's job id. Across runs, enable onlyNewJobs and previously returned postings are skipped before they are ever billed.
How do I get employer email addresses?
Enable scrapeEmails. The Actor resolves the employer's own website from the posting's apply links and reads their public contact pages. Roughly one posting in four yields an email; you are charged only when one is found.
Why is the phone field often empty?
Only numbers published as real tel: links are taken. Digit runs in page text are far more often a job id or a statistic, and a wrong phone number is worse than no phone number.
Can I filter to remote jobs only?
Yes — remoteOnly uses Google's own remote filter and also checks the posting itself. Every row additionally carries workMode set to REMOTE, HYBRID or ONSITE.
Can I run this on a schedule?
Yes. Use Apify Schedules, and combine datePosted: "today" with onlyNewJobs: true for a job alert that only ever shows you new postings.
Does it return coordinates or company ratings?
No. Google's jobs vertical does not publish latitude/longitude or employer star ratings on these pages, so the Actor does not claim to provide them.
Feedback & support
Found a problem or need a field that is missing? Open an issue on the Actor's Issues tab with your input JSON and, if possible, a shared run link — that is the fastest route to a fix. Feature requests are welcome there too.
More scrapers by Raven
Lead generation & contacts
Google Maps Scraper — Places, emails, reviews, photos & hours
Website Contact Scraper — Bulk emails, phones & socials from any site list
TikTok Profile Scraper — Profiles, contacts & analytics
Facebook Ads Library Scraper — Meta & Instagram ad creatives and spend
SEO & web intelligence
Ahrefs SEO Scraper — DR, backlinks, keywords & traffic
Semrush Scraper — Domain traffic, authority & backlinks
SimilarWeb Scraper — Website traffic, rankings & audience
Reviews & business data
Trustpilot Scraper — Reviews, company data & TrustScore
G2 Scraper — Software reviews, ratings & competitors
TripAdvisor Scraper — Hotels, restaurants & reviews
Social media
Instagram Scraper — Profiles, posts, followers & comments
Threads Scraper — Posts, profiles & replies
Reddit Scraper — Posts, comments, users & subreddits
YouTube Scraper — Videos, transcripts & comments
Pinterest Scraper — Pins, profiles & boards
E-commerce
Amazon Scraper — Products, reviews, sellers & best sellers
AliExpress Scraper — Products, variants & reviews
Alibaba Scraper — Products, suppliers & prices
TikTok Shop Scraper — Products, shops & analytics
RedNote (Xiaohongshu) Scraper — Notes, creators & comments
Real estate & travel
Zillow Scraper — Listings & agent leads
Realtor.com Scraper — Listings, details & agents
Apartments.com Scraper — Rentals, prices & reviews
Idealista Scraper — Properties, prices & agencies
Booking.com Scraper — Hotels, prices & reviews
Tags: google jobs scraper, google jobs api, scrape google jobs, google for jobs scraper, job scraper, job listings api, job postings scraper, salary data scraper, apply links scraper, employer email scraper, recruiting leads, hiring data, job board data, remote jobs scraper, job alert automation, ats data, talent intelligence, labor market data, jobs dataset, google search jobs, no code job scraper, job data export csv excel