Google Jobs Scraper
Pricing
from $1.79 / 1,000 results
Google Jobs Scraper
Scrape Google Jobs postings for one or more search terms: title, company, location, posting age, employment type, salary when listed, full description and apply options. Resolves Google's apply redirects to the employer or job-board URL. Up to 500 jobs per run.
Pricing
from $1.79 / 1,000 results
Rating
0.0
(0)
Developer
Axiom Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
What does Google Jobs Scraper do?
Google Jobs Scraper collects job postings from the Google Jobs search results for any keyword and location you give it. For every posting it returns the title, company, location, the source board, the posting age, the employment type, a parsed salary range, the qualification chip, benefit chips, the highlight lists (qualifications, benefits, responsibilities), the full job description and every "Apply" link that Google lists for the job.
The Actor needs no login and no third-party search API key. It reads the public Google Jobs results page through the Apify Proxy group GOOGLE_SERP, parses the job cards and the detail panes in the page, and follows Google's redirect links to give you the real employer or job-board address instead of a tracking link.
Google shows only ten jobs per search page and offers no working next-page request for this kind of access. To return more than ten jobs, the Actor runs a small set of related searches for each of your terms (for example "senior", "junior", "full time", "remote", or "in the last week") and merges the results, removing duplicates by Google's job id. In practice a single search term yields roughly 100 to 200 distinct jobs at most; asking for more than Google can supply returns everything found.
Typical uses:
- Tracking hiring demand for a role in a city over time.
- Building a job board or alert feed from several sources at once.
- Collecting salary data where employers publish it.
- Finding the direct employer career-site link for a posting.
What data can you get?
| Field | Type | Description |
|---|---|---|
id, jobId | string | Google's stable job id, used to remove duplicates |
query | string | The search term from your input |
searchVariant | string | The related search that surfaced the job; null for the base search |
title | string | Job title |
companyName | string | Hiring company |
location | string | Location shown by Google |
via | string | Board or site that listed the job |
postedAt | string | Relative posting age, such as "2 days ago" |
postedAtDate | string | Approximate ISO date computed from postedAt (accurate to about a day) |
employmentType | array | Normalized types: Full-time, Part-time, Contractor, Internship. Combined values are split and dashes are plain hyphens |
employmentTypes | array | The same types as codes matching the input enum: fulltime, parttime, contractor, internship |
employmentTypeText | string | Raw employment type text as Google shows it |
salary | string | Salary text from Google's chip, or the pay phrase found in the description |
salaryMin, salaryMax | number | Parsed range from the salary chip, or from a pay range found in the highlights or description. null when the pay period cannot be determined |
salaryPeriod | string | hour, day, week, month or year |
salaryCurrency | string | ISO currency code |
qualification | string | Education or experience chip, for example "No degree mentioned" |
benefits | array | Benefit chips such as "Health insurance". Google shows these mainly on US postings; often empty elsewhere |
highlights | object | Lists under Qualifications, Benefits and Responsibilities. When Google shows no highlights for a job (common outside the US), the bulleted sections of the description are grouped under the same headings |
description | string | Full description, including the part Google hides behind "Show full description" |
applyOptions | array | Every apply option as {title, url} with resolved addresses |
applyUrl | string | Best apply link; prefers "Apply directly" options |
shareUrl | string | Google share link for the posting |
sourceUrl | string | Google search page the record came from |
scrapedAt | string | ISO timestamp of the scrape |
Salary is shown for only a minority of Google Jobs postings, so the salary fields are often empty. Empty values are returned as null.
How to use Google Jobs Scraper
- Open the Actor in Apify Console and go to the Input tab.
- Enter one or more job search terms, for example
registered nurse. - Optionally add a location such as
Chicago, IL, a country code, and filters for date posted, employment type or remote work. - Set the maximum number of jobs.
- Leave the proxy setting on the
GOOGLE_SERPgroup. - Click Start. When the run ends, open the Output tab to view or download the dataset as JSON, CSV, Excel or HTML.
Runs are not fast. Each Google request through the SERP proxy takes between 2 and 70 seconds, and the Actor runs a few of them in parallel. A run for 10 jobs finishes in well under a minute in most cases; a run for 200 jobs takes several minutes. Resolving apply links adds a short delay per link.
Input
| Field | Type | Description |
|---|---|---|
queries | array of strings | Required. Job keywords to search. Each runs separately. |
location | string | Free-text place added to every query, such as New York, NY. |
country | string | Two-letter Google country code sent as gl, such as us, uk or gb. Uppercase is lowercased. Default us. |
language | string | Language code sent as hl. Default en. |
datePosted | enum | any, today, 3days, week, month. Applied as a phrase in the query, so it is approximate. |
employmentType | enum | any, fulltime, parttime, contractor, internship. Applied as a phrase in the query. |
remoteOnly | boolean | Adds "remote" to the search. |
maxItems | integer | Total unique jobs to return, 1 to 500. Default 50. With several queries the limit is shared between them. |
includeDescription | boolean | Include the full description. Default true. |
resolveApplyLinks | boolean | Resolve Google redirect links to the real destination. Default true. |
proxyConfiguration | object | Must be Apify Proxy with the GOOGLE_SERP group. |
Example input:
{"queries": ["registered nurse"],"location": "Chicago, IL","datePosted": "week","maxItems": 20}
If queries is empty, maxItems is out of range, or a different proxy group is set, the run stops immediately with a message that names the problem.
Output
This is one real record from a local run, with the long fields shortened:
{"id": "3r-GD0I5V7PddFlRAAAAAA==","jobId": "3r-GD0I5V7PddFlRAAAAAA==","query": "software engineer","searchVariant": null,"title": "Full-Stack Engineer 4 - AML Reporting","companyName": "Capital One","location": "New York, NY","via": "LinkedIn","postedAt": "7 hours ago","postedAtDate": "2026-09-29","employmentType": ["Full-time"],"employmentTypes": ["fulltime"],"employmentTypeText": "Full–time","salary": "$197,300 - $225,100 for Full-stack Engineer 4","salaryMin": 197300,"salaryMax": 225100,"salaryPeriod": "year","salaryCurrency": "USD","qualification": null,"benefits": ["Health insurance"],"highlights": {"Qualifications": ["Bachelor's Degree or higher in Computer Science or a related quantitative field (Statistics, Economics, Operations Research, Analytics, Mathematics, Engineering)","At least 4 years of experience in software engineering (Internship experience does not apply)"],"Benefits": ["Salaries for part-time roles will be prorated based upon the agreed upon number of hours to be regularly worked","McLean, VA: $197,300 - $225,100 for Full-stack Engineer 4"],"Responsibilities": ["In this role, you’ll be at the forefront of driving a major transformation across Capital One","Lead a portfolio of diverse technology projects and a team of developers with deep experience in distributed microservices, and full stack systems to create solutions that help meet regulatory needs for the company"]},"description": "Do you love building and pioneering in the technology space? Do you enjoy solving complex business problems in a fast-paced, collaborative, inclusive and iterative delivery environment? At Capital One, you'll be part of a big group of makers, breakers, doers and disruptors who solve real problems and meet real customer needs. We are seeking Full-stack Software Engineers who are passionate about le…","applyOptions": [{"title": "Apply on LinkedIn","url": "https://www.linkedin.com/jobs/view/full-stack-engineer-4-aml-reporting-at-capital-one-4473252837?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"},{"title": "Apply on Built In","url": "https://builtin.com/job/full-stack-engineer-4-aml-reporting/11424567?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"}],"applyUrl": "https://www.linkedin.com/jobs/view/full-stack-engineer-4-aml-reporting-at-capital-one-4473252837?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic","shareUrl": "https://www.google.com/search?ibp=htl;jobs&q=software+engineer+New+York,+NY&htidocid=3r-GD0I5V7PddFlRAAAAAA%3D%3D&hl=en-…","sourceUrl": "https://www.google.com/search?q=software+engineer+New+York%2C+NY&udm=8&hl=en&gl=us","scrapedAt": "2026-09-29T20:51:59.558Z"}
You can download the dataset in JSON, CSV, Excel, XML or HTML from the Output tab or through the API.
How much does it cost?
The Actor charges per result: one charge for each unique job written to the dataset. The current price is shown on the Pricing tab of the Actor page, so check it there before large runs. Proxy and compute costs are included in the per-job price. Setting maxItems low is the simplest way to control the cost of a run.
Use with the API
Run the Actor from code with the Apify client.
Python:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("axiomworks/google-jobs-scraper").call(run_input={"queries": ["software engineer"],"location": "New York, NY","maxItems": 30,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], job["companyName"], job["applyUrl"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('axiomworks/google-jobs-scraper').call({queries: ['software engineer'],location: 'New York, NY',maxItems: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length);
cURL:
curl -X POST "https://api.apify.com/v2/acts/axiomworks~google-jobs-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"queries": ["software engineer"], "location": "New York, NY", "maxItems": 30}'
You can also connect the dataset to webhooks, schedules, Make, Zapier, Google Sheets and other Apify integrations.
Use with AI agents (MCP)
You can call this Actor from an AI assistant through the Apify MCP server. Add it to your MCP client configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=axiomworks/google-jobs-scraper","headers": { "Authorization": "Bearer $APIFY_TOKEN" }}}}
Example prompts:
- "Find 20 barista jobs in London posted this week and list the company, salary and apply link."
- "Get data analyst jobs in Austin, TX that are full time and show the ones with a published salary."
- "Search for remote registered nurse jobs and summarise the most common benefits."
FAQ
Why do I get fewer jobs than I asked for? Google Jobs has a limited number of results per search. The Actor stops when three related searches in a row add fewer than two new jobs. Narrow searches (a small town, a rare title) can hold fewer than ten jobs in total.
Why is the salary empty? Google shows a salary for only a minority of postings. The Actor also looks for a pay range in the benefits list and in the description, but if the employer did not publish one, the field stays empty.
Why is postedAtDate only approximate?
Google gives a relative age such as "3 days ago". The date is computed from the scrape time and is accurate to about a day.
Does maxItems apply per query?
It is a total across all queries in the run. With two queries and maxItems of 20, each query gets a share of about ten, and any unused share passes to the next query.
Can I use another proxy group? No. Other groups, including residential proxies, return a page that needs JavaScript and contains no job data. The Actor stops with an error if another group is set.
Do the apply links always resolve? Almost always. If a Google redirect cannot be resolved within ten seconds, the Actor keeps the Google link, which still redirects when opened in a browser.
A run returned nothing. What now?
If Google reports no matching jobs, the run finishes with an empty dataset. If every request fails, the run stops with an error; retry later or check that the GOOGLE_SERP proxy group is available for your account.
Is it legal to scrape Google Jobs?
This Actor collects only information that is publicly visible without logging in. It does not bypass logins or CAPTCHAs. Whether collecting it is lawful depends on your country, on how you use the data, and on any personal data it contains; job postings normally name companies rather than people. Google's terms of service restrict automated queries, so review them and take legal advice if you plan commercial use. You are responsible for using the data in line with the law and with privacy rules such as GDPR. This Actor is an independent tool and is not affiliated with or endorsed by Google.
Feedback
Found a bug or a field that is missing? Open an issue from the Issues tab on the Actor page and include the input you used and the run link. Feedback on layout changes is especially useful, because the Google Jobs page structure changes from time to time.