Google Jobs Scraper - Salary, Apply Links & Descriptions avatar

Google Jobs Scraper - Salary, Apply Links & Descriptions

Pricing

from $2.00 / 1,000 job postings

Go to Apify Store
Google Jobs Scraper - Salary, Apply Links & Descriptions

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

Raven

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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.

Google Jobs Scraper — scrape job postings with salaries, full descriptions and apply links

Raven · Recruiting & lead generation   •  Google Jobs · Google Maps · Website contacts · Trustpilot
 Google Jobs Scraper
➤ You are here
 Google Maps Scraper
Places, emails, reviews
 Website Contact Scraper
Bulk emails, phones, socials
 Trustpilot Scraper
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 itYou 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 hasDirectApply marking employer-direct applications
  • Salaries actually parsedsalaryMin, salaryMax, salaryCurrency, salaryPeriod, not just the raw string
  • Absolute posting datespostedAtDate as UTC ISO-8601 plus postedHoursAgo, so you can sort and filter properly
  • Location split outcity, state, country as separate fields
  • Derived classificationsworkMode (REMOTE / HYBRID / ONSITE), seniorityLevel, noDegreeRequired
  • Employer contacts on demand — public email, phone and socials from the employer's own website
  • Job-alert modeonlyNewJobs remembers 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 APITypical Google Jobs scrapersThis Actor
AvailabilityNo public jobs API existsVariesLive, on demand
Full descriptionOften a preview or a paid extra stepAlways included
Apply linksUsually one link per postingAll of them, average 5.7
SalaryUsually the raw string onlyRaw and min/max/currency/period
Posting dateUsually "3 days ago" text onlyText and absolute UTC timestamp
Employer contactsRarelyOptional email, phone, socials
Cross-run dedupRarelyonlyNewJobs mode

What data can you extract from Google Jobs?

Identity & employer

FieldDescription
jobIdGoogle's own posting id — stable, used for de-duplication
titleJob title as published
companyNameHiring employer
locationLocation as Google shows it, e.g. New York, NY
city / state / countryLocation parsed into components
via / sourceBoardBoard Google syndicated the posting from
companyLogoEmployer logo image URL
googleJobsUrl / shareLinkGoogle's own links for the posting

Compensation & terms

FieldDescription
salarySalary exactly as displayed, e.g. 137,750–185,000 a year
salaryMin / salaryMaxParsed numeric bounds
salaryCurrency / salaryPeriode.g. USD and YEAR, MONTH, HOUR
hasSalaryWhether the posting displayed pay at all
employmentTypeFULLTIME, PARTTIME, CONTRACTOR, INTERN, TEMPORARY, VOLUNTEER
scheduleTypeType as Google labels it, e.g. Full-time and Part-time
isRemote / workModeRemote flag, plus REMOTE / HYBRID / ONSITE
seniorityLevelINTERN, JUNIOR, MID, SENIOR, LEAD, EXECUTIVE
degreeRequirement / noDegreeRequiredEducation requirement Google extracted
benefits, hasHealthInsurance, hasDentalInsurance, hasPaidTimeOffBenefit chips and flags
extensionsEvery chip Google displayed, raw and in order

Timing

FieldDescription
postedAtAge as printed, e.g. 16 hours ago
postedAtDateAbsolute UTC ISO-8601 timestamp
postedHoursAgoAge in whole hours

Content

FieldDescription
descriptionFull posting text (4,700 characters on average)
descriptionHtmlSame text with the employer's original HTML markup
descriptionLengthCharacter count — handy for filtering out stub listings
qualificationsRequirements Google identified
responsibilitiesDuties Google identified
benefitHighlightsBenefit sentences Google identified

Application

FieldDescription
applyLinkPrimary application URL
applyOptionsEvery option: board, url, isDirect
applyOptionsCount / applyBoardsCount and board names
hasDirectApplyTrue when at least one option applies on the employer's own site

Employer contacts (only when scrapeEmails is enabled)

FieldDescription
companyWebsite / companyDomainEmployer's own site, resolved from the apply links or posting text
email / emailsPublic employer addresses, HR and recruiting ones ranked first
phonePublic phone number, when the site publishes one
linkedin, facebook, twitter, instagram, youtubeEmployer 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

  1. Open the Actor in the Apify Console and click Try for free — new accounts get $5 in free credits every month, no card required.
  2. Type your job titles or keywords into Job titles or keywords, one per line (e.g. software engineer, registered nurse).
  3. 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.
  4. Set Maximum jobs — the total you want across all keywords and locations, after de-duplication.
  5. Optionally narrow with Posted within, Employment type, Remote jobs only or Only jobs with a salary.
  6. Click Start. Rows appear in the Output tab within seconds and keep streaming as they are found.
  7. Export from the Storage tab as Excel, CSV, JSON, XML or pull the dataset from the API.

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 Depotcareers.homedepot.com is 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

InputTypeDescription
queriesarrayJob titles or keywords. Searched in every location.
locationsarrayCities, states or regions. Adding locations is the main volume lever.
maxItemsintegerTotal cap across all searches, after de-duplication. 0 = no limit.
startUrlsarrayGoogle Jobs URLs to scrape directly. Legacy ibp=htl;jobs links are upgraded.
countryCodeselect34 markets. Controls local boards and salary currency.
languageCodestringResult language, e.g. en, de, es.
datePostedselectany, today, 3days, week, month.
employmentTypesarrayFULLTIME, PARTTIME, CONTRACTOR, INTERN, TEMPORARY, VOLUNTEER.
remoteOnlybooleanRemote / work-from-home roles only.
salaryOnlybooleanKeep only postings that display pay.
minSalaryintegerDrop postings below this figure, in the market's own currency.
postedWithinHoursintegerExact age cutoff, e.g. 24.
companyFilter / excludeCompaniesarrayKeep or drop employers by name.
viaFilterarrayOnly postings from certain boards, e.g. LinkedIn.
titleIncludeKeywords / titleExcludeKeywordsarrayKeep or drop by words in the job title.
onlyNewJobsbooleanEmit only postings not returned by earlier runs.
scrapeEmailsbooleanLook up employer email, phone and socials.
skipJobsWithoutEmailbooleanDrop postings with no employer email found.
expandSearchbooleanAsk each keyword several ways to reach maxItems. Default on.
googleDomainstringe.g. www.google.co.uk. Usually leave as default.
concurrencyintegerParallel Google searches, 1–20. Default 6.
maxRetriesintegerRetries per failed request, 1–12. Default 5.
proxyConfigurationobjectUsed 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.

EventFree planPaid 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 runFree planPaid 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 onlyNewJobs for 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.

  • 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

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

SEO & web intelligence

Reviews & business data

Social media

E-commerce

Real estate & travel

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