Google Jobs is one of the best sources of job postings on the web. It aggregates listings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, company career pages and dozens of niche boards, and shows them in one place. If you need job data — for recruiting, salary research or a job board — it's the obvious place to start.
The problem: Google offers no official API for it, and scraping it yourself means dealing with JavaScript walls, CAPTCHAs, and HTML that changes every few weeks.
In this guide I'll show you how to get Google Jobs data without writing a scraper, and how to call it from code if you want to automate it.
What data can you get?
For every job posting:
| Field | Example |
|---|---|
| Title | 1-1 School Registered Nurse (RN) |
| Company | White Glove Community Care |
| Location | New York, NY |
| Salary | 65–75 an hour |
| Job type | Full-time and Part-time |
| Posted | 5 days ago |
| Source | Indeed |
| Highlights | Qualifications, benefits, responsibilities |
| Description | The full job description |
| Apply links | Direct URLs to every site where the job is posted |
The apply links matter most. Google normally hides them behind its own redirect URLs. Here you get the real ones, like https://www.indeed.com/viewjob?jk=... or https://www.linkedin.com/jobs/view/....
Option 1: No code (2 minutes)
Disclosure: I built this scraper. I wrote this guide because I needed this data myself and couldn't find a clean way to get it.
- Open the Google Jobs Scraper on Apify and click Try for free.
- Under Job titles, add what you're looking for, for example
registered nurseorpython developer. - Under Locations, add one or more cities, for example
Chicago, IL. - Set Max jobs per search, for example
50. - Click Start.
When the run finishes, download the results as CSV, Excel or JSON, or view them in a table right in the browser.
Two tips that make a big difference
Always add a location. Google Jobs ties results to a place. In my tests, searches with a city returned 10 jobs per query almost every time (13 out of 14), while searches without one returned jobs only about a third of the time. The exception is searches like "remote customer service".
You can get more than 10 jobs per search. Google Jobs shows about 10 jobs per query, and its "page 2" doesn't work for automated requests. The scraper gets around this by running variations of your search ("full time …", "remote …", "entry level …", "senior …") and keeping only the jobs it hasn't seen before. It stops early when the variations stop finding new jobs.
Option 2: From code
Python
pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nahuedev/google-jobs-scraper").call(run_input={
"queries": ["data analyst"],
"locations": ["New York, NY", "Seattle, WA"],
"maxJobsPerSearch": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], "|", job["company"], "|", job["salary"])
JavaScript / Node.js
npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('nahuedev/google-jobs-scraper').call({
queries: ['software engineer'],
locations: ['Austin, TX'],
maxJobsPerSearch: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((job) => `${job.title} @ ${job.company}`));
Plain HTTP (one request, results back)
curl -X POST "https://api.apify.com/v2/acts/nahuedev~google-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["warehouse worker"],"locations":["Dallas, TX"],"maxJobsPerSearch":30}'
Example output
{
"id": "eMcqFV57T6rMpQnmAAAAAA==",
"title": "1-1 School Registered Nurse (RN)",
"company": "White Glove Community Care",
"location": "New York, NY",
"via": "Indeed",
"postedAt": "5 days ago",
"salary": "65–75 an hour",
"employmentType": "Full-time and Part-time",
"tags": ["No degree mentioned", "Health insurance"],
"highlights": {
"qualifications": ["Valid RN license", "1 year of experience as an RN needed"],
"benefits": ["Weekly pay – Direct Deposit", "Health Insurance"],
"responsibilities": ["Protecting and maintaining students’ health..."]
},
"description": "BECOME A SCHOOL NURSE! Our kids need you...",
"applyLinks": [
{ "source": "Indeed", "direct": true, "url": "https://www.indeed.com/viewjob?jk=..." }
],
"searchQuery": "registered nurse",
"searchLocation": "New York, NY"
}
The id is Google's job ID and stays the same across runs. Use it to find new postings since your last run.
What people use this for
- Recruiting and staffing agencies: find companies hiring for a role in a city right now, and pitch them.
- Salary research: compare pay for the same role across cities.
- Job boards and newsletters: schedule a daily run and publish fresh, niche listings, like "remote Python jobs" or "nursing jobs in Texas".
- Competitive intelligence: see which competitors are hiring, and for which roles.
- Market research: track hiring demand for a skill over time.
Automate it: daily new jobs
On Apify you can schedule the scraper (for example, every morning) and send the results to Google Sheets, Slack, email or a webhook. Combine that with the id field and you get a "new jobs today" feed with zero maintenance.
Pricing
You pay per job saved: $4 per 1,000 jobs. Duplicates found by more than one search variation are saved and charged only once. Apify's free plan includes monthly platform credit, so you can try it without paying anything upfront.
Wrapping up
Google Jobs has some of the best job data on the web, but no API. With the Google Jobs Scraper you can get it as clean JSON or CSV in a couple of minutes, with no code, or plug it into your own pipeline with a few lines of Python or JavaScript.
Questions or a field you'd like added? Leave a comment. I read them all.


Top comments (0)