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

Scrape Google Jobs to JSON, CSV or Excel: title, company, location, salary range, dates, job type, benefits, full description, qualifications and every apply link. Search by keyword and location or paste Google Jobs URLs. Pay per job delivered plus a small start fee, no platform fees.

- **URL**: https://apify.com/aaronoptimus/google-jobs-scraper.md
- **Developed by:** [Aaron Tuttle](https://apify.com/aaronoptimus) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 jobs

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 & API — Job Listings & Salaries

**Scrape Google Jobs into clean JSON, CSV or Excel, from $3.20 per 1,000 jobs.** Get the **job title, company, location, salary range, posting date, job type, remote flag, benefits, qualifications, responsibilities, the full job description and every apply link** (LinkedIn, Indeed, Glassdoor, the company's own site and more). Search by keyword and location, or paste **Google Jobs URLs**.

Google Jobs pulls postings from thousands of job boards and career sites into one list, collects job listings from every board Google indexes, and you can get them all in one run. Google also blocks automated access quickly, which is why many Google Jobs scrapers return empty or partial results. This one fetches results through Apify's own Google Search proxy and parses them offline, so it keeps working — and you pay per job delivered plus a small run-start fee, with no platform fees on top.

### ✅ Why use this Google Jobs scraper

- **Every field Google shows.** The full description, all job highlights and **every apply option**, not just the first one, plus a ready-to-use `applyUrl`.
- **Salaries you can sort and filter.** "$120K–$150K a year" becomes `min: 120000`, `max: 150000`, `currency: "USD"`, `period: "year"`. Hourly, monthly, K, lakh and crore amounts and over 25 currencies are understood.
- **Reliable by design.** Results come through Apify's Google Search proxy — the service built for exactly this — and are parsed offline, with a new IP whenever Google pushes back. Every search is bounded, so runs never hang.
- **No platform fees on top.** You pay a small fee per run plus a fee per job delivered. Compute and proxy costs are included. Searches that fail or find no jobs cost nothing beyond the run fee.
- **No duplicates.** A job found by two of your searches is delivered and charged once.
- **Many searches in one run.** Every search runs for every location you list, e.g. 5 job titles × 10 cities = 50 searches.
- **Privacy built in.** Recruiter emails, phone numbers and personal profile links inside descriptions are removed before anything is saved.

### 📊 What data you get

| Field | Example |
|---|---|
| `title`, `companyName`, `location` | Senior Software Engineer · Acme Corp · Austin, TX |
| `via` | The site Google found the job on, e.g. LinkedIn |
| `postedAgo`, `postedAt` | "3 days ago" and an estimated ISO date |
| `scheduleType`, `employmentType` | Full-time · `FULL_TIME` (also part-time, contractor, internship, temporary…) |
| `workFromHome` | `true` for remote / work-from-home jobs |
| `salary` | `text`, `min`, `max`, `currency`, `period` |
| `benefits` | Badges like Health insurance, Paid time off, Dental insurance |
| `qualifications`, `responsibilities`, `benefitsDetails` | The bullet lists from Google's job highlights |
| `description` | The full job description |
| `applyOptions`, `applyUrl` | Every "Apply on …" link with its source name |
| `jobId`, `googleJobsUrl` | Google's ID for the job and a link that opens it on Google |
| `searchQuery`, `searchLocation`, `position` | Which search found the job and its rank among the jobs delivered for that search |

Works for any job title or keyword, in **dozens of countries**, with Google's own filters for **date posted**, **job type** and **remote jobs**.

### 💸 How much does it cost?

You pay per job delivered, plus a small run-start fee. Compute and proxy costs are included, there are no platform fees, and the per-job price drops as your Apify plan's discount tier goes up:

| Event | Free plan | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Job delivered | $0.004 | $0.004 | $0.0036 | $0.0032 | $0.0032 | $0.0032 |
| Run start (once per run, at the default 2 GB) | $0.01 | $0.01 | $0.01 | $0.01 | $0.01 | $0.01 |

That is **$4 per 1,000 jobs on the free plan and from $3.20 per 1,000 jobs** on Gold.

| Example | Free plan | Gold |
|---|---|---|
| 1 search (~10 jobs) | $0.05 | $0.04 |
| 10 searches in one run (~100 jobs) | $0.41 | $0.33 |
| 1,000 jobs in one run | $4.01 | $3.21 |

Searches that fail after all retries, searches Google has no jobs for and duplicate jobs are **not charged**. To cap any run, set Apify's *Maximum cost per run*: the scraper stops cleanly at the limit.

### 🚀 How to scrape Google Jobs

1. Enter your **job searches**, one per line, e.g. `software engineer` or `nurse`. You can also paste Google Jobs URLs.
2. Optionally add **locations**, one per line, e.g. `Austin, TX` or `Remote`. Every search runs for every location.
3. Pick the **country** and how many **jobs per search** you want.
4. Optionally set the **date posted**, **job type** or **remote only** filters.
5. Click **Start**, then download your jobs as JSON, CSV or Excel, or get them through the API.

#### Input examples

One job title in two places:

```json
{ "queries": ["software engineer"], "locations": ["Austin, TX", "Remote"], "maxJobsPerSearch": 10 }
```

Part-time jobs posted in the last week:

```json
{ "queries": ["nurse", "medical assistant"], "locations": ["Boston, MA"], "datePosted": "week", "employmentType": "PARTTIME" }
```

Straight from a Google Jobs URL (search on Google, open the **Jobs** tab, copy the address):

```json
{ "queries": ["https://www.google.com/search?q=data+analyst+jobs+in+London&udm=8&gl=gb&hl=en"] }
```

#### Output example (shortened)

```json
{
  "position": 1,
  "title": "Senior Software Engineer",
  "companyName": "Acme Corp",
  "location": "Austin, TX",
  "via": "LinkedIn",
  "postedAgo": "3 days ago",
  "postedAt": "2026-10-02T12:00:00.000Z",
  "scheduleType": "Full-time",
  "employmentType": "FULL_TIME",
  "workFromHome": false,
  "salary": { "text": "$120K–$150K a year", "min": 120000, "max": 150000, "currency": "USD", "period": "year" },
  "benefits": ["Health insurance", "Dental insurance", "Paid time off"],
  "qualifications": ["3+ years of experience with Node.js", "Strong communication skills"],
  "responsibilities": ["Build and ship new features", "Review code"],
  "benefitsDetails": ["401(k) matching", "Health insurance"],
  "description": "About the role\nYou'll build the systems that…",
  "applyOptions": [
    { "source": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/…" },
    { "source": "Acme Careers", "url": "https://careers.acme.example/jobs/…" }
  ],
  "applyUrl": "https://www.linkedin.com/jobs/view/…",
  "jobId": "eyJqb2JfdGl0bGUiOi…",
  "googleJobsUrl": "https://www.google.com/search?q=software+engineer+in+Austin%2C+TX&udm=8#vhid=…",
  "searchQuery": "software engineer",
  "searchLocation": "Austin, TX",
  "country": "US",
  "scrapedAt": "2026-10-05T12:00:00.000Z"
}
```

The dataset has two ready-made table views: **Jobs** (the main fields) and **Full details** (salary numbers, highlights, description and apply links). The run's **OUTPUT** record lists every search with its job count, whether Google's list ended, and any errors.

### 🧭 What it doesn't do

- **About 10 jobs per search.** Google Jobs shows roughly 10 results per search; this scraper reads that first page. To cover more, run several focused searches — split by location, seniority, date or job type.
- **Public listings only.** It reads what Google shows anyone on the Jobs tab, logged out. It doesn't log in to LinkedIn, Indeed or any board, and it never solves CAPTCHAs.
- **No recruiter contact details.** Emails, phone numbers and personal profile links in descriptions are removed before anything is saved.
- **Not an official Google API.** Google offers no public API for its job results; this reads the same listings a person sees.

### 🔌 Use it from your code, Zapier, Make or AI agents

JavaScript:

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('aaronoptimus/google-jobs-scraper').call({ queries: ['software engineer'], locations: ['Austin, TX'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("MY_APIFY_TOKEN")
run = client.actor("aaronoptimus/google-jobs-scraper").call(run_input={"queries": ["software engineer"], "locations": ["Austin, TX"]})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**AI agents and MCP:** add the scraper as a tool through Apify's MCP server in Claude, Cursor or any MCP client, and ask for Google Jobs data in plain language:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=aaronoptimus/google-jobs-scraper" } } }
```

You can also schedule runs and send the results to Google Sheets, Slack, Zapier, Make or webhooks with Apify integrations.

### 💡 Tips

- **Need more jobs?** Google Jobs returns about 10 results per search. To get more, run several focused searches — split by location or seniority, or add a date or job-type filter.
- **Daily job feeds:** schedule a run with *Date posted: Past day*, and use `jobId` to skip jobs you already have.
- **Country and language:** Google shows jobs for the country you pick. English (`en`) gives the most complete date and salary parsing; job texts stay in the language they were posted in.
- **Faster runs:** raise *Parallel searches* when you have many of them.

### ❓ FAQ

**Why did I get fewer jobs than I asked for?** Google Jobs returns about 10 results per search, and sometimes fewer when its list for that search is short. The run's OUTPUT record shows `endOfList: true` for that search. Run more focused searches — by location, seniority or date — to get more jobs.

**What happens when Google blocks a request?** The scraper never solves CAPTCHAs. When Google's "unusual traffic" check blocks a request, it retries with a new IP through Apify's Google Search proxy. If a search still fails after all retries, it's listed in the OUTPUT record with the reason and **not charged**.

**Are recruiter contact details included?** No. Emails, phone numbers and personal profile links inside job descriptions are replaced with `[email removed]`, `[phone removed]` or `[profile link removed]`. Company names and all job details are kept.

**How exact are the posting dates?** Google only shows relative times like "3 days ago", so `postedAt` is estimated from the time of the scrape. For "30+ days ago" the date is marked with `postedAtIsUpperBound: true`.

**Is there an official Google Jobs API?** No. Google offers no public API for its job search results. This scraper reads the same listings anyone sees on Google's Jobs tab.

**Is it legal?** The scraper only collects job listings that Google shows publicly to anyone, without logging in. It doesn't solve CAPTCHAs, and it removes personal contact details. You're responsible for using the data in line with Google's terms and your local laws.

### Related tools

**Related tools** by the same developer: [Google Trends Scraper](https://apify.com/aaronoptimus/google-trends-scraper) for demand for a job title over time and by state, [Google Autocomplete Scraper](https://apify.com/aaronoptimus/google-autocomplete-scraper) for how people phrase job searches, [Google News Scraper](https://apify.com/aaronoptimus/google-news-scraper) for hiring and layoff headlines, [Google Ads Transparency Scraper](https://apify.com/aaronoptimus/google-ads-transparency-scraper) for employers' recruiting ads, [Google Analytics 4 Exporter](https://apify.com/aaronoptimus/google-analytics-4-exporter) for your job board's GA4 reports, [PageSpeed Insights Bulk Audit](https://apify.com/aaronoptimus/pagespeed-insights-bulk-audit) for your careers pages' Core Web Vitals, [Google Hotels Scraper](https://apify.com/aaronoptimus/google-hotels-scraper) and [Google Flights Scraper](https://apify.com/aaronoptimus/google-flights-scraper) for relocation and travel prices.

### 🛠 Support

Found a problem or need a feature? Open an issue on the **Issues** tab. See the **Changelog** for updates.

***

*This is an independent scraper and is not affiliated with, endorsed by or sponsored by Google. "Google" and "Google Jobs" are trademarks of Google LLC. It collects only data that Google shows publicly to logged-out visitors.*

# Changelog

This Actor's version history is a separate document: https://apify.com/aaronoptimus/google-jobs-scraper/changelog.md

# Actor input Schema

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

What you would type into Google, e.g. "software engineer" or "nurse in Boston". One search per line. You can also paste Google Jobs URLs (search on Google, open the Jobs tab, copy the address).

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

Optional. A city, state or region per line, e.g. "Austin, TX" or "Remote". Every search runs once for every location. Leave empty to search the whole country below.

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

Google shows jobs for this country (it sets Google's gl country parameter).

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

Language of Google's page, e.g. en, de, fr, es, pt-BR. English gives the most complete parsing of dates and salary ranges; job texts stay in the language they were posted in.

## `maxJobsPerSearch` (type: `integer`):

Stop each search after this many jobs. Google Jobs returns about 10 results per search, so run several focused searches (by title, location or date) to cover more.

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

Only jobs posted recently.

## `employmentType` (type: `string`):

Only this kind of job.

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

Only jobs Google marks as remote or work from home.

## `deduplicateAcrossSearches` (type: `boolean`):

When two searches find the same job, deliver (and charge) it once.

## `proxyConfiguration` (type: `object`):

Google blocks automated access from most IPs. This Actor always uses Apify's Google Search proxy (the GOOGLE_SERP group), the reliable source for Google results; other proxy choices are replaced by it. A new IP is used on every retry.

## `maxConcurrency` (type: `integer`):

How many searches run at the same time.

## `maxRetries` (type: `integer`):

When Google blocks a request (its "unusual traffic" check), it is retried with a new IP, up to this many times. CAPTCHAs are never solved, and jobs already delivered are never charged again.

## `debugSnapshots` (type: `boolean`):

For troubleshooting: saves the HTML and a screenshot of each search page to the run's key-value store.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [],
  "country": "US",
  "language": "en",
  "maxJobsPerSearch": 10,
  "datePosted": "any",
  "employmentType": "any",
  "remoteOnly": false,
  "deduplicateAcrossSearches": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  },
  "maxConcurrency": 3,
  "maxRetries": 6,
  "debugSnapshots": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (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": [
        "software engineer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "GOOGLE_SERP"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aaronoptimus/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": ["software engineer"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["GOOGLE_SERP"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("aaronoptimus/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": [
    "software engineer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}' |
apify call aaronoptimus/google-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aaronoptimus/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/X4ZbgrUPPd4mPeOTt/builds/fPVPueenKfxbtPLzC/openapi.json
