Google Jobs Scraper | Jobs by City, Apply Links, Full Coverage
Pricing
from $2.00 / 1,000 jobs
Google Jobs Scraper | Jobs by City, Apply Links, Full Coverage
Scrape Google Jobs without a browser or SerpApi: the jobs of the city you ask (not the proxy's), salary, every apply link and the full description. Complete coverage goes past Google's 10 per request; duplicates and jobs outside your filters are never charged. New-jobs-only mode and webhook.
Pricing
from $2.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Alexis Morain
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
What does Google Jobs Scraper do?
Google Jobs Scraper collects the job listings that Google Jobs shows for a job title and a city. It is a Google Jobs API alternative that needs no browser and no SerpApi key. For every job you get the company, location, posting age, salary when Google shows it, every apply link, the highlights and the full description.
It does not scrape the employer sites behind the links. It returns what Google Jobs itself lists, with the apply links Google gives.
Why use Google Jobs Scraper?
Google Jobs gathers listings from employer career pages and from job boards such as Indeed, LinkedIn, Glassdoor and ZipRecruiter into one list. Two things get in the way of collecting it, and this Actor handles both.
1. Google picks the city for you when the query has none. Through a proxy, Google localizes on the IP address of the proxy, not on your location field. We ran the same search, software engineer, three times without a place in the query, then twice with Austin, TX in the query (one Google request each, 10 jobs each, measured on 31 October 2026):
| Run | Location in the query | Cities of the 10 jobs | Jobs in common |
|---|---|---|---|
| A | none | United States, Colorado, Colorado Springs | A and B: 0 of 10 |
| B | none | Eagan, St Paul, Minneapolis (Minnesota) | B and C: 0 of 10 |
| C | none | United States, Colorado Springs, Colorado | A and C: 8 of 10 |
| D | Austin, TX | Austin, TX (10 of 10) | D and E: 7 of 10 |
| E | Austin, TX | Austin, TX (10 of 10) |
An Actor that passes the location as a separate setting, or leaves it out, returns the jobs of whichever city the proxy exits from, and the results change at every run. This Actor writes your location into the Google query (<job title> jobs in <location>), and warns you in the log and in the run summary when a search has no location.
2. Google shows 10 jobs per request and cannot be paged. We tested start=, ijn= and the scroll token through the proxy: none of them returns anything new. The way to get more jobs is to ask Google different questions. With Complete coverage on, the Actor adds dates, job types, seniority words, then the companies and job titles it has already found, and keeps every distinct job once:
| Search (measured 31 October 2026) | Google requests | Distinct jobs returned |
|---|---|---|
software engineer jobs in Austin, TX, one request | 1 | 10 |
| same search, Complete coverage | 60 | 297 |
nurse jobs in Manchester, Complete coverage | 60 | 221 |
Those 60 requests read 514 and 417 jobs: the rest were repeats, removed before they reach the dataset and before you pay. The Actor stops a search earlier when its last 10 requests bring fewer than 10 new jobs, or when, after 20 requests, it averages fewer than 2 new jobs per request. A search with no jobs at all stops after 3 requests.
Also worth knowing:
- ⏱️ Schedule it on Apify, run it from the API, send results to Make, Zapier, Google Sheets or a webhook.
- 🔁 New jobs only mode remembers what each monitor already delivered, so a daily run returns only fresh jobs.
- 🌍 23 countries, with the matching Google domain and language.
- 💾 Runs in 512 MB of memory: no browser, no JavaScript rendering.
What data can Google Jobs Scraper extract?
| Field | Type | Description |
|---|---|---|
title, companyName, location | string | The job as Google shows it |
via | string | The site Google lists the job from |
postedAgo, postedAt | string | Age as worded by Google (in the search language) and an estimated date |
employmentType, employmentTypes | string, array | Label shown by Google and recognised types (fulltime, parttime, contractor, internship) |
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod | string, number | Salary when Google shows one, parsed |
remote | boolean | True when Google marks the job as work from home |
benefits, badges, highlights | array | Benefit tags, other tags, and the Qualifications, Benefits and Responsibilities lists when Google shows them |
descriptionText | string | The full description as plain text |
applyUrl, applyOptions | string, array | Every apply link Google lists (site, URL, whether Google labels it "apply directly"), tracking parameters removed |
shareLink, companyLogoUrl | string | The job on Google, and the logo when Google has one |
searchQuery, searchLocation, foundBy, rank | string, integer | Which search, which exact Google query and which position found the job |
Fields Google does not show for a job are null. In our runs highlights were filled for the United States only; the United Kingdom, Germany and France pages did not carry them.
How to scrape Google Jobs
- Open the Actor and go to the Input tab.
- Type one or more Job titles or keywords, for example
software engineer. - Type one or more Locations, for example
Austin, TX. Always fill this in. - Pick the Country (it sets google.com, google.co.uk, google.de and so on) and, if needed, the Language.
- Set Max jobs and press Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
To follow a market, turn on New jobs only, choose Posted within: Past 24 hours, name the monitor, and schedule a daily run.
How much will it cost to scrape Google Jobs?
You pay per event: a small amount when the run starts and an amount for each job returned. The exact prices are in the Pricing tab and drop with your Apify plan. Duplicates, jobs already delivered in New jobs only mode, and jobs outside your date, type or remote filter are never charged. The Google proxy is included in the price.
| Apify plan | Price per 1,000 jobs |
|---|---|
| Free | $3.00 |
| Starter (Bronze) | $2.50 |
| Scale (Silver) | $2.20 |
| Business (Gold) and above | $2.00 |
The run start costs $0.002 at the default 512 MB of memory. A Complete coverage search that returns 300 jobs costs about $0.60 on the Gold tier, a single request of 10 jobs about $0.03.
Input
See the Input tab for every option. The ones that need a word:
- Job titles and Locations are combined: 2 titles and 3 locations make 6 searches.
- Complete coverage (on by default) spends up to Max requests per search Google requests per search. Off, the Actor makes one request and returns the 10 jobs Google ranks first.
- Google Jobs URLs accepts search URLs with
udm=8oribp=htl;jobs. The query,hlandglare read from the URL. - Posted within, Job types and Remote only are described below.
How the filters work
Google has no real filter parameter for Google Jobs that we could use through the proxy. We tested them on 31 October 2026:
| Filter | What Google does with it | What the Actor does |
|---|---|---|
| Posted within | Words such as since yesterday and in the last week added to the query narrow the results (10 of 10 jobs within the window in English, 3 of 3 in German, 5 of 5 in French). The tbs=qdr:d parameter lets 2 and 3 day old jobs through in English and jobs up to 26 days old in German. | Sends the words, never tbs, then checks the age shown on each job and drops older ones before charging. |
| Job types | Words such as contract and internship lean towards the type but do not filter: in our tests 2 of 10 contract results and at least 4 of 10 internship results were full-time jobs. | Sends the word, then checks the type shown on each job and drops the others before charging. A job labelled "Full-time and Contractor" matches Contractor. |
| Remote only | The word remote returned 10 of 10 jobs carrying the work from home mark. | Sends the word, then keeps only jobs with the mark. |
The date and type words were checked in English, German and French. In other languages the Actor still checks each job, but the words sent to Google may not narrow the search as well. A job that does not show its age or its type is kept, and counted in the run summary.
Output
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. A shortened item:
{"jobId": "vOPKYQc9G8yqj5dpAAAAAA","title": "Full Stack/ Angular Software Development Engineer","companyName": "Charles Schwab","location": "Austin, TX","via": "Schwab Jobs","postedAgo": "4 days ago","postedAt": "2026-10-27","employmentType": "Full-time","employmentTypes": ["fulltime"],"salaryText": "126K–143K a year","salaryMin": 126000,"salaryMax": 143000,"salaryCurrency": "USD","salaryPeriod": "year","remote": false,"applyUrl": "https://hiringcafe.com/job/full-stack-angular-software-development-engineer-charles-schwab-et8d1dxhh8okmrik","applyOptions": [{ "title": "Schwab Jobs", "url": "https://www.schwabjobs.com/job/southlake/full-stack-angular-software-development-engineer/33727/102568886544", "direct": false },{ "title": "Hiring Cafe", "url": "https://hiringcafe.com/job/full-stack-angular-software-development-engineer-charles-schwab-et8d1dxhh8okmrik", "direct": true }],"searchQuery": "software engineer","searchLocation": "Austin, TX","foundBy": "software engineer jobs in Austin, TX","rank": 1}
Each run also writes a SUMMARY record to the key-value store. For every search it gives the Google requests made, empty and failed ones, distinct jobs found, jobs returned, jobs dropped by the date, type and remote checks, whether the location was missing, and why the search stopped (max-items, max-requests, low-yield, exhausted, no-results, blocked).
Tips
- Fill in the location. It is the difference between a stable result and a random city.
- Raise Max requests per search (up to 1000) to go past the default 60. In our two Complete coverage runs a request brought 4 to 5 new jobs on average, and the last 10 of 60 requests still brought 47 and 25 new jobs. The
low-yieldstop reason in the summary tells you when a search ran dry: past that point more requests would mostly return jobs you already have. - One run, several cities. Several locations in one run share the Max jobs limit.
- Daily feed. New jobs only, Posted within past 24 hours, a monitor name and a webhook URL.
FAQ, disclaimers, and support
Is it legal to scrape Google Jobs?
Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. Check Google's terms for your use case as well.
Why did my run return fewer jobs than Max jobs?
Google had no more distinct jobs for the search, or the budget of requests ran out. Read the endReason of each search in the SUMMARY record.
Why does a job have no salary or no posting age?
Google does not show them for every job. The field is null.
Why did the run fail?
A run fails when the input is invalid, or when Google refused every request of the run. Nothing is charged in that case. Try again in a few minutes.
Can I call it from code?
Yes, see the API tab for the endpoints and client libraries. Something wrong or missing? Open a ticket in the Issues tab and it will be fixed.