# Google Jobs Scraper - Job Listings & Salaries (`adyg/google-jobs-scraper`) Actor

Scrape Google Jobs (the jobs panel in Google Search) by keyword and location: title, company, location, salary (parsed), posted date, employment type, full description, highlights, and every apply link with board names. Deduplicated, 70+ countries.

- **URL**: https://apify.com/adyg/google-jobs-scraper.md
- **Developed by:** [Adyanth Ganesh](https://apify.com/adyg) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Jobs Scraper – Job Listings, Salaries & All Apply Links

**Google Jobs Scraper** extracts job postings from **Google Jobs** (the jobs panel in Google Search, "Google for Jobs") by keyword and location. Get the job title, company, location, the job board it came from ("via LinkedIn"), posted date, employment type, **parsed salary**, the **full job description**, Google's **job highlights** (qualifications, responsibilities, benefits) and **every "Apply on …" link** with board names – deduplicated across all your searches.

Google Jobs aggregates postings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, company career sites and thousands of other job boards, so one search gives you the whole market. No Google account, no browser, no proxies to configure.

### What does Google Jobs Scraper do?

- 🔎 **Search by keyword and location** – many queries × many locations in one run (`data analyst` in `Austin, TX`, `London`, `Bengaluru` …)
- 🌍 **76 countries** where Google Jobs is available (US, UK, India, Germany, Canada, France, Spain, Italy, Netherlands, Brazil, Japan, Singapore, UAE, South Africa and more), any interface language
- 💰 **Salary parsed into numbers** – `min`, `max`, `currency`, `interval` (YEAR/MONTH/HOUR) from Google's salary chip (`122K–134K a year`, `£49,401–£59,152 a year`, `₹4L–₹6L a year`, `40.000 € bis 60.000 € pro Jahr`), with a fallback that reads pay ranges from the description
- 🔗 **All apply links** – LinkedIn, Indeed, the company's own site, Glassdoor, ZipRecruiter… each with the board name and the resolved URL (no Google redirect links)
- 📝 **Full description + job highlights** – qualifications, responsibilities and benefits as clean lists
- 🎯 **Filters**: date posted (24h, 3 days, week, month), employment type (full-time, part-time, contractor, internship), remote only, search radius
- 🧹 **Deduplicated** across queries and locations, so you only pay once per job
- 🧾 **Run summary** per search (found, saved, duplicates, filtered, errors)

### Use cases

- **Job market & salary research** – compare pay ranges for a role across cities and countries
- **Lead generation for recruiters and staffing agencies** – find companies hiring for roles you place
- **Job boards and aggregators** – feed fresh postings with descriptions and apply links into your site
- **Job alerts** – schedule daily runs with "Past 24 hours" and send new jobs to Slack, email or a Google Sheet
- **Competitive and hiring intelligence** – track which companies are hiring for what, where
- **AI agents and RAG** – structured job data with clean text descriptions

### How to scrape Google Jobs

1. Click **Try for free** / **Start**.
2. Enter one or more **search queries** (job titles or keywords) and optionally **locations** (one per line).
3. Pick the **country** and, if you like, filters (date posted, employment type, remote only).
4. Set **Max jobs per query and location** (Google shows up to ~200 jobs per search).
5. Run and download the results as JSON, CSV, Excel or HTML – or use the Apify API, Make, Zapier, n8n or the MCP server.

Tip: make searches specific. Google Jobs returns up to ~200 jobs per query × location, so to collect thousands of jobs, add more cities or related titles (`data analyst`, `business analyst`, `BI analyst`).

### Input example

```json
{
    "queries": ["data analyst", "registered nurse"],
    "locations": ["Austin, TX", "Seattle, WA", "Remote"],
    "country": "US",
    "datePosted": "week",
    "employmentTypes": ["FULLTIME"],
    "maxResultsPerQuery": 50,
    "includeDetails": true,
    "includeAllApplyLinks": true
}
```

**Locations** are matched to Google's own location list inside the selected country: cities (`Austin, TX`, `Manchester`, `Pune`), states/regions (`California`, `Bavaria`, `Maharashtra`) or `Remote`. Add the state for ambiguous US cities (`Portland, ME`). Leave locations empty to search the whole country. The resolved location for every search is shown in the output (`searchLocation`) and in the run summary.

### Output example

```json
{
    "title": "Software Engineer in Test (SDET)",
    "company": "Charles Schwab",
    "location": "Austin, TX",
    "remote": false,
    "via": "Schwab Jobs",
    "postedAt": "2026-10-07T23:51:00Z",
    "postedAgo": "1 day ago",
    "employmentType": "Full-time",
    "salaryMin": 57.69,
    "salaryMax": 65.38,
    "salaryCurrency": "USD",
    "salaryInterval": "HOUR",
    "salaryText": "57.69–65.38 an hour",
    "salarySource": "google",
    "benefits": ["Health insurance", "Dental insurance", "Paid time off"],
    "applyUrl": "https://www.schwabjobs.com/job/austin/software-engineer-in-test-sdet/33727/101702506864",
    "applyOptions": [
        { "title": "Schwab Jobs", "url": "https://www.schwabjobs.com/job/austin/software-engineer-in-test-sdet/33727/101702506864?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic", "domain": "schwabjobs.com", "direct": false }
    ],
    "description": "Your opportunity\nAs a Software Development Engineer in Test, you will…",
    "highlights": {
        "qualifications": ["3+ years of experience in Quality Assurance engineering", "Experience testing REST APIs and web applications"],
        "responsibilities": ["Design and maintain scalable test automation frameworks"],
        "benefits": ["401(k) with company match and Employee stock purchase plan", "Tuition reimbursement"]
    },
    "shareLink": "https://www.google.com/search?ibp=htl;jobs&q=software+engineer&htidocid=WH3kp0EdIW_OIWmwAAAAAA%3D%3D…",
    "companyLogo": "https://encrypted-tbn0.gstatic.com/images?q=tbn:…",
    "jobId": "WH3kp0EdIW_OIWmwAAAAAA==",
    "query": "software engineer",
    "searchLocation": "Austin,Texas,United States",
    "position": 1,
    "scrapedAt": "2026-10-09T00:58:53Z"
}
```

The dataset has ready-made views: **Overview**, **Salaries**, **Apply links** and **Full details**. Field names (`company`, `title`, `location`, `remote`, `employmentType`, `postedAt`, `salaryMin`/`salaryMax`/`salaryCurrency`/`salaryInterval`, `applyUrl`, `jobId`, `scrapedAt`) match our [ATS Jobs API](https://apify.com/adyg/ats-jobs-api) Actor, so you can merge Google Jobs with jobs pulled directly from Greenhouse, Lever, Ashby and Workday.

### How much does it cost to scrape Google Jobs?

This Actor uses **pay-per-result** pricing: you pay a small fee for each job saved to your dataset – duplicates, filtered-out jobs and failed searches are never charged, and there is no extra charge for descriptions or apply links. Platform usage is included. See the **Pricing** tab for the current price per 1,000 jobs. Apify's free plan includes monthly credits, enough to try the Actor on thousands of jobs.

You can always limit spending with **Max jobs in total** or the run's **maximum cost** setting; the Actor stops cleanly when the limit is reached.

### Related tools

Google Jobs finds who is hiring; ATS Jobs API pulls every opening straight from those companies.

- [ATS Jobs API (Greenhouse, Lever, Ashby, Workday)](https://apify.com/adyg/ats-jobs-api): pull every open job straight from company career sites
- [Company Name to Domain](https://apify.com/adyg/company-name-to-domain): turn a list of company names into official website domains
- [Website Contact Scraper](https://apify.com/adyg/website-contact-scraper): get emails, phone numbers and social links for each domain

All of these are maintained by the same developer and export flat JSON, CSV or Excel, so you can feed one tool's dataset into the next.

### FAQ

**Is it legal to scrape Google Jobs?**
The Actor only collects publicly visible job postings. Job postings may still contain personal data (e.g. a recruiter's name) and the content belongs to the employers and job boards. Make sure your use complies with applicable laws (e.g. GDPR) and the terms of the sites involved. If in doubt, consult a lawyer.

**How many jobs can I get per search?**
Google Jobs shows up to about 200 jobs for one query in one location. Use more specific locations and related job titles to get more jobs; duplicates are removed automatically.

**Why are some descriptions short in Germany / the EU?**
In some EU countries Google only shows a preview of the description and links to the job board for the rest. These jobs have `descriptionIsPreview: true`; all apply links are still included.

**Why do results differ from what I see in my browser?**
Google personalizes results by location, language and history. The Actor searches from the location you choose, without personalization. If you leave locations empty, Google picks results for the country as a whole.

**Which countries are supported?**
The 76 countries in the Country dropdown – the countries where Google Jobs is available. Google Jobs is not offered in some countries (e.g. Australia).

**How fresh is the data?**
Every run searches Google Jobs live. `postedAt` is derived from Google's "3 days ago" label, so it is accurate to the day.

**Can I get only new jobs every day?**
Yes – schedule the Actor daily with **Date posted = Past 24 hours**.

**Can I use it with the API, Make, Zapier or AI agents?**
Yes. Run it via the Apify API or client libraries, connect it to Make, Zapier, n8n or Google Sheets, or call it from AI agents through the Apify MCP server.

**Something isn't working?**
Open an issue in the Issues tab with your run link – we usually respond within a day.

### Acceptable use

- This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Google, DataForSEO or the job boards and employers whose listings appear.
- Don't use the data to build a competing search engine, or otherwise to compete with or harm Google or the other search engines the data comes from.
- The Actor may not be used from, or for people or organizations in, Russia, Belarus, Cuba, Iran, Syria, Myanmar, North Korea, Crimea or the Russian-occupied territories of Ukraine.
- You are responsible for using the results lawfully, including privacy laws such as GDPR for any personal data (e.g. recruiter names) in job postings.

# Actor input Schema

## `queries` (type: `array`):

What you would type into Google Jobs, one per line, e.g. <code>data analyst</code>, <code>registered nurse</code>, <code>python developer</code>. Each query is searched in every location.

## `locations` (type: `array`):

Cities, states or regions, one per line, e.g. <code>Austin, TX</code>, <code>London</code>, <code>Bengaluru</code>, <code>Bavaria</code>. Matched to Google's own locations inside the selected country (add the state for ambiguous US cities: <code>Portland, ME</code>). Leave empty to search the whole country. Enter <code>Remote</code> for remote jobs.

## `country` (type: `string`):

Country to search in (Google Jobs is available in these countries).

## `language` (type: `string`):

2-letter language code of the Google interface and results, e.g. <code>en</code>, <code>de</code>, <code>fr</code>. Leave empty for the country's main language (English for US, UK and India).

## `maxResultsPerQuery` (type: `integer`):

Maximum number of jobs to return for each query × location combination. Google Jobs shows up to about 200 jobs per search.

## `maxResults` (type: `integer`):

Optional cap on the total number of jobs in this run (all queries and locations together). Leave empty for no cap.

## `datePosted` (type: `string`):

Only return jobs posted within this period.

## `employmentTypes` (type: `array`):

Only return these employment types. Leave empty for all.

## `remoteOnly` (type: `boolean`):

Only return remote / work-from-home jobs.

## `radiusKm` (type: `integer`):

Optional radius around each city in kilometers (1-300). Leave empty for Google's default.

## `includeDetails` (type: `boolean`):

Include the job description and Google's job highlights (qualifications, responsibilities, benefits). Turn off for smaller, list-only results.

## `includeAllApplyLinks` (type: `boolean`):

Return every 'Apply on ...' option (LinkedIn, Indeed, the company site, ...) with board names and URLs. When off, only the main apply link is returned.

## `dedupe` (type: `boolean`):

Return each job only once, even if it appears in several queries or locations.

## Actor input object example

```json
{
  "queries": [
    "data analyst"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "US",
  "language": "en",
  "maxResultsPerQuery": 10,
  "datePosted": "anytime",
  "remoteOnly": false,
  "includeDetails": true,
  "includeAllApplyLinks": true,
  "dedupe": true
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `salaries` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "data analyst"
    ],
    "locations": [
        "Austin, TX"
    ],
    "country": "US",
    "language": "en",
    "maxResultsPerQuery": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("adyg/google-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["data analyst"],
    "locations": ["Austin, TX"],
    "country": "US",
    "language": "en",
    "maxResultsPerQuery": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("adyg/google-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "data analyst"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "US",
  "language": "en",
  "maxResultsPerQuery": 10
}' |
apify call adyg/google-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,adyg/google-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lHXUb7IJNJgeT4FGT/builds/D577jcJe2bZ5T6uPi/openapi.json
