# Google Jobs Scraper: Salaries, Apply Links & Descriptions (`cleanscrape/google-jobs-scraper`) Actor

Scrape Google Jobs in 36 countries: title, company, location, salary as numbers, job type, posted date, full description, highlights and direct apply links (LinkedIn, Indeed, company sites). Only-new-jobs monitoring. $1.95 per 1,000 jobs. Maintained by CleanScrape.

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

## Pricing

$1.95 / 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.

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

Collect job listings from Google Jobs, the job search built into Google that gathers postings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, company career sites and many local job boards. For each job you get:

- **The job:** title, company, location, the site it was posted on, posted date (as text and as a number of days), job type (full-time, part-time, contractor, internship), work from home.
- **Salary as numbers:** minimum, maximum, currency and period (hour, month, year), plus Google's original text.
- **The full description**, and Google's highlights (qualifications, benefits, responsibilities) as lists.
- **Direct apply links:** every site where you can apply, such as the company's own page, LinkedIn and Indeed, with the first one in its own column.

Type job titles and locations, or paste a Google search link. Works in 36 countries. Turn on monitoring and a scheduled run returns only jobs that are new since the last run.

**$1.95 per 1,000 jobs.** No start fee. Jobs that are duplicates or that monitoring skips are not charged. Maintained by CleanScrape.

### Watch the walkthrough

Let's use data analyst jobs as an example: search New York, Chicago and Austin, get 150 jobs in about 40 seconds, and compare what each city pays. Use your own job titles and cities for another search.

https://www.youtube.com/watch?v=mh-6QyoREqw

### Quick start

1. Under **Job titles or keywords**, type one or more titles, such as `registered nurse` or `python developer`.
2. Under **Locations**, type a city, region or `remote` (optional; leave it empty to search the whole country).
3. Pick the **Country** and click **Start**.

Each title is searched in each location. The results open in a table you can export to Excel, CSV or JSON.

Input for the API or a scheduled task:

```json
{
  "queries": ["registered nurse", "nurse practitioner"],
  "locations": ["Chicago, IL", "Remote"],
  "country": "us",
  "maxJobsPerSearch": 100,
  "postedWithin": "week"
}
```

### How it finds more than 10 jobs

Google Jobs shows 10 jobs per search. To find more, the Actor also runs close variations of each search: only jobs posted today, this week or this month, and refinements such as full time, remote, entry level or senior (in the country's own language: Vollzeit and Homeoffice in Germany, télétravail in France, 正社員 in Japan). Each job is saved once. The `foundBy` column shows which variation found it.

A search stops when its variations stop finding new jobs, so a narrow search (a rare title in a small town) ends below your maximum instead of paying for pages that only repeat jobs. Broad searches in big cities usually reach 100 to 200 jobs.

Several searches run at once, and a slow Google answer is retried in parallel instead of waited for. Measured in our tests:

| Job | Time |
| --- | --- |
| 50 nurse jobs in Chicago (the default input) | 31 seconds |
| 240 jobs from 4 searches in Germany | 1 minute |
| 191 jobs from 2 searches across India | 84 seconds |
| 600 jobs from 20 searches (10 titles in 2 cities) | 2 minutes 20 seconds |

### Choose a ready-to-run example

Each example opens with its input filled in. Change the titles or places and run it.

| Example | What it does |
| --- | --- |
| [Export registered nurse jobs in Chicago with salaries](https://apify.com/cleanscrape/google-jobs-scraper/examples/nurse-jobs-chicago-with-salaries) | 50 nurse jobs with pay as numbers, job type and apply links. About $0.10. |
| [Find remote software engineer jobs in the US](https://apify.com/cleanscrape/google-jobs-scraper/examples/remote-software-engineer-jobs) | 100 remote software jobs with full descriptions. About $0.20. |
| [Get new full-time warehouse jobs every day](https://apify.com/cleanscrape/google-jobs-scraper/examples/new-warehouse-jobs-every-day) | Jobs posted in the last 3 days; schedule it and each run returns only new jobs. |
| [Compare data analyst salaries across US cities](https://apify.com/cleanscrape/google-jobs-scraper/examples/compare-data-analyst-salaries) | 120 jobs in New York, Chicago and Austin, shown in the Salaries view. About $0.23. |
| [Scrape job listings in Germany from Google Jobs](https://apify.com/cleanscrape/google-jobs-scraper/examples/job-listings-in-germany) | 160 Buchhalter and Pflegefachkraft jobs in Berlin and München. About $0.31. |
| [Scrape Java developer and data analyst jobs in India](https://apify.com/cleanscrape/google-jobs-scraper/examples/tech-jobs-in-india) | 120 tech jobs across India. About $0.23. |

### Use it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/cleanscrape~google-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["registered nurse"], "locations": ["Chicago, IL"], "maxJobsPerSearch": 50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("cleanscrape/google-jobs-scraper").call(run_input={
    "queries": ["registered nurse"],
    "locations": ["Chicago, IL"],
    "maxJobsPerSearch": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["company"], job["salaryMin"], job["applyUrl"])
```

### What you get

One row per job (a real row from a test run; the description and lists are shortened here):

```json
{
  "jobId": "aIEjd-PJfUav6kqxAAAAAA==",
  "title": "Illinois Masonic Registered Nurse Hiring Event - October 28, 2026",
  "company": "Advocate Health Care",
  "location": "Chicago, IL",
  "via": "LinkedIn",
  "postedAgo": "20 hours ago",
  "postedDaysAgo": 0.83,
  "postedAtEstimate": "2026-10-05T18:38:25.943Z",
  "employmentType": "Full-time",
  "workFromHome": null,
  "salaryText": "$38.20–$57.30 an hour",
  "salaryMin": 38.2,
  "salaryMax": 57.3,
  "salaryCurrency": "USD",
  "salaryPeriod": "hour",
  "qualification": null,
  "benefits": null,
  "description": "Please join us for an upcoming Nursing Job Fair.\n\n📅 Wednesday, October 28, 2026\n\n⏰ 9:30 a.m. – 3:00 p.m.\n\n📍 Ringel Room, Center for Education Building\n\n🏥…",
  "descriptionIsPreview": false,
  "highlights": {
    "Qualifications": [
      "Be dressed and prepared to interview",
      "Must have valid IL RN license",
      "…"
    ],
    "Responsibilities": [
      "Engages in unit councils, professional governance, and quality initiatives to improve care processes and apply evidence-based practices",
      "Utilizes the nursing process to assess, plan, diagnose, implement, and evaluate nursing care, engaging patients and families through the continuum of care",
      "…"
    ]
  },
  "applyUrl": "https://www.linkedin.com/jobs/view/illinois-masonic-registered-nurse-hiring-event-october-28-2026-at-advocate-health-care-4473668925?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
  "applyOptions": [
    {
      "source": "LinkedIn",
      "url": "https://www.linkedin.com/jobs/view/illinois-masonic-registered-nurse-hiring-event-october-28-2026-at-advocate-health-care-4473668925?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"
    }
  ],
  "companyLogoUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTMBXnH7kWEM0KCou93-cJr_bDU3xAkhG43tuKz&s=0",
  "googleJobsUrl": "https://www.google.com/search?ibp=htl;jobs&q=registered+nurse+Chicago%2C+IL&htidocid=aIEjd-PJfUav6kqxAAAAAA%3D%3D&hl=en&gl=us",
  "searchQuery": "registered nurse",
  "searchLocation": "Chicago, IL",
  "country": "US",
  "foundBy": "search",
  "scrapedAt": "2026-10-06T14:38:26.367Z"
}
```

The dataset has three views: **Overview**, **Salaries** (the salary numbers side by side) and **Details** (descriptions, highlights and all apply links). A blank value means Google did not show it, not zero.

### Countries

United States, United Kingdom, Canada, India, Germany, France, Spain, Italy, Austria, Switzerland, Denmark, Portugal, Greece, Brazil, Mexico, Argentina, Chile, Colombia, Peru, Japan, Singapore, Malaysia, the Philippines, Indonesia, Thailand, Vietnam, Hong Kong, Taiwan, Pakistan, the United Arab Emirates, Saudi Arabia, Qatar, Egypt, South Africa, Nigeria and Kenya.

Google does not offer Google Jobs in Australia, New Zealand, Ireland, the Netherlands, Belgium, the Nordic countries other than Denmark, Poland, Czechia, Romania, Hungary, Türkiye, Israel or South Korea, so those cannot be searched.

Pick the country of your locations. A location that names its country, such as `Berlin, Germany`, is searched in that country whatever the Country setting.

Outside English-speaking countries, type the title in the local language (`Buchhalter`, not `accountant`, in Germany): Google matches the words against postings written in that language. Field names and labels such as "Full-time" are always in English; titles and descriptions stay in the language they were posted in.

### Monitoring: only new jobs

Turn on **Only jobs not saved before**, save the input as a task and schedule it (daily, for example). Each run returns only jobs that earlier runs did not save, and the skipped jobs are not charged.

Runs with the same searches share one history automatically. To keep the history when you change the searches, give it a **Watch name**, such as `Nurse jobs Chicago`. Jobs are remembered for 90 days, in a key-value store in your own Apify account. Two runs with the same watch cannot overlap.

### Pricing

$1.95 per 1,000 jobs saved ($0.00195 per job). There is no start fee, and you pay nothing for searches that find no jobs. Some examples:

| Run | Jobs | Price |
| --- | ---: | ---: |
| One search, default settings | 50 | $0.10 |
| 10 titles in 2 cities, 30 each | 600 | $1.17 |
| One broad search at the maximum | 300 | $0.59 |

Set **Maximum cost per run** under Run options to cap a run; the Actor stops cleanly just below it.

### Run report

Each run saves a readable summary (Output tab > Run summary) and the same as JSON (`SUMMARY`): every search with its outcome, jobs saved and any note, such as a search that Google had no jobs for.

### Common questions

#### Is there an official Google Jobs API?

No. Google has no public API for Google Jobs search results. Google's Cloud Talent Solution is a different product for searching your own job postings. This Actor reads the public Google Jobs results.

#### Why do I get fewer jobs than I asked for?

Google shows 10 jobs per search page, and the Actor finds more through variations of the search. When the variations stop finding new jobs, the search ends. That happens with rare titles, small places and strict filters. Try a broader title, a nearby bigger city, or more titles.

#### How do I get only new jobs every day?

Turn on **Only jobs not saved before**, save the input as a task, then add a schedule to it (Schedules > Create new). Each run then returns only new jobs.

#### Can I search remote jobs?

Yes. Type `remote` as the location, or leave the location empty and add `remote` to the title. Jobs Google marks as remote have `workFromHome: true`.

#### How do I export Google Jobs to Excel or CSV?

Open the run's Output or Storage tab and click Export. Pick Excel, CSV or JSON.

#### Are salaries converted?

No. Each salary keeps its currency (`salaryCurrency`) and period (`salaryPeriod`), as numbers you can sort and filter. Only about a third to half of jobs show a salary on Google.

#### Is it legal to scrape Google Jobs?

The Actor collects job listings that Google shows publicly, without logging in. Job listings are published to be found. Check the rules that apply to how you use the data, especially for personal data in descriptions, and follow the terms of the sites you apply through.

### More tools from CleanScrape

- [Bilibili Scraper](https://apify.com/cleanscrape/bilibili-scraper): Bilibili videos, danmaku, comments and creators
- [App Store & Google Play Reviews Scraper](https://apify.com/cleanscrape/app-store-reviews-scraper): reviews from both app stores in one table
- [Google Trends Scraper API](https://apify.com/cleanscrape/google-trends-scraper): search interest over time, by region, related queries and trending searches
- [Map Your Show Exhibitor Scraper API](https://apify.com/cleanscrape/event-exhibitor-monitor): trade show exhibitor lists and booth changes
- [Shopify Product Reviews Scraper API](https://apify.com/cleanscrape/shopify-reviews-scraper): Judge.me and Okendo reviews from Shopify product links
- [Google News Scraper API](https://apify.com/cleanscrape/google-news-scraper): headlines from Google News and publisher feeds
- [Pinterest Scraper API](https://apify.com/cleanscrape/pinterest-scraper): pins from searches, boards and profiles
- [Google Hotels Scraper API](https://apify.com/cleanscrape/google-hotels-scraper): hotel prices and booking offers for your dates
- [TikTok Shop Product Scraper](https://apify.com/cleanscrape/tiktok-shop-product-scraper): US TikTok Shop prices, sellers and ratings
- [Threads Scraper API](https://apify.com/cleanscrape/threads-scraper): public Threads posts from accounts or post links
- [Likee Scraper API](https://apify.com/cleanscrape/likee-scraper): Likee videos and comments
- [Tennis Scraper API](https://apify.com/cleanscrape/tennis-match-data): tennis results, statistics, point-by-point and head-to-head

### Support

Questions, a missing field or a search that does not work as expected: open an issue on the Actor's Issues tab or write to contact.cleanscrape@gmail.com.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Google.

# Actor input Schema

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

One per line, such as "registered nurse" or "python developer". Outside English-speaking countries, type them in the local language ("Buchhalter" in Germany). You can also paste a Google Jobs or Google search link.

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

Optional. One per line: a city, state or region, or "remote". Every title is searched in every location. Leave empty to search the whole country.

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

The country of your locations. A location that names its country ("Berlin, Germany") is searched there anyway. Field names and labels are in English; titles and descriptions stay as posted.

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

For each title in each location. Google shows 10 jobs per search; the Actor finds more by running close variations of it. Broad searches usually reach 100–200. 50 jobs cost about $0.10.

## `postedWithin` (type: `string`):

Only jobs posted in this period.

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

Only jobs of this type. Jobs whose type Google does not show are left out.

## `includeDescription` (type: `boolean`):

Turn off for smaller exports. Highlights (qualifications, benefits, responsibilities) and apply links are kept either way.

## `onlyNewJobs` (type: `boolean`):

For scheduled runs: skips jobs that earlier runs already saved, so each run gives only new jobs. Skipped jobs are not charged. Jobs are remembered for 90 days.

## `watchName` (type: `string`):

Leave empty, and runs with the same searches share one history. Or give a name, such as "Nurse jobs Chicago", to keep the history when you change the searches.

## Actor input object example

```json
{
  "queries": [
    "registered nurse"
  ],
  "locations": [
    "Chicago, IL"
  ],
  "country": "us",
  "maxJobsPerSearch": 50,
  "postedWithin": "any",
  "employmentType": "any",
  "includeDescription": true,
  "onlyNewJobs": false
}
```

# Actor output Schema

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

No description

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

No description

## `report` (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": [
        "registered nurse"
    ],
    "locations": [
        "Chicago, IL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanscrape/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": ["registered nurse"],
    "locations": ["Chicago, IL"],
}

# Run the Actor and wait for it to finish
run = client.actor("cleanscrape/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": [
    "registered nurse"
  ],
  "locations": [
    "Chicago, IL"
  ]
}' |
apify call cleanscrape/google-jobs-scraper --silent --output-dataset

```

## MCP server setup

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