# Google Jobs Scraper (`nahuedev/google-jobs-scraper`) Actor

Scrape Google Jobs listings by job title and location: title, company, salary, job type, highlights, full description and direct apply links.

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

## Pricing

from $4.00 / 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

Scrape job listings from **Google Jobs** by job title and location. Get the title, company, location, salary, job type, posting date, job highlights, full description and **direct apply links** (LinkedIn, Indeed, Glassdoor, ZipRecruiter and the employer's own site) as clean JSON, CSV or Excel.

### What you get for each job

| Field | Example |
|---|---|
| `title` | Registered Nurse, EP Lab, Evening Shift |
| `company` | NYU Langone Health |
| `location` | New York, NY |
| `salary` | 65–75 an hour |
| `employmentType` | Full-time |
| `postedAt` | 2 days ago |
| `via` | LinkedIn |
| `tags` | Paid time off, Health insurance |
| `highlights` | Qualifications, benefits and responsibilities, as lists |
| `description` | Full job description text |
| `applyLinks` | Every apply option, with its source and the direct URL |
| `googleJobUrl` | Link to the job on Google |
| `id` | Google's job ID, stable across runs, so you can dedupe |

Each job also records `searchQuery`, `searchLocation`, `matchedQuery` and `scrapedAt`.

### How to use it

1. Add one or more **job titles**, for example `registered nurse` or `python developer`.
2. Add one or more **locations**, for example `Chicago, IL`. Google Jobs returns many more results when you give a location.
3. Set **Max jobs per search**: the maximum number of unique jobs saved for each title + location pair.
4. Click **Start** and download the results.

Each job title is searched in every location you list.

### More than 10 jobs per search

Google Jobs shows about 10 jobs per query. With **Expand search** on (the default), the Actor also runs variations of your search: full time, part time, remote, entry level, senior, contract, posted this week and more. It saves only jobs it hasn't already saved. It stops expanding when it reaches your limit or when several variations in a row bring nothing new, so you don't pay for empty requests.

### Pricing

You pay per job saved. A job found by more than one search is saved and charged only once per run.

### Example output

```json
{
  "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=..." }
  ],
  "googleJobUrl": "https://www.google.com/search?ibp=htl;jobs&htidocid=...",
  "searchQuery": "registered nurse",
  "searchLocation": "New York, NY",
  "matchedQuery": "registered nurse jobs in New York, NY",
  "scrapedAt": "2026-10-20T12:00:00.000Z"
}
```

### Limitations

- The Actor reads Google's English interface, so keep **Language** set to `en`. Any country works via **Country**.
- Searches without a location often return no jobs, except searches like `remote`.
- Google decides which jobs to show, so results vary between runs.

### Use cases

- Job market and salary research by role and city
- Lead generation for staffing and recruiting agencies: find companies hiring right now
- Job board aggregation and alerts (schedule the Actor daily)
- Tracking which competitors are hiring and for what roles

# Actor input Schema

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

What to search for, e.g. "registered nurse" or "python developer". Each title is searched in every location.

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

Cities or regions, e.g. "Chicago, IL". Google Jobs returns far more results when a location is given. Leave empty only for searches like "remote".

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

Upper limit of unique jobs saved for each job title + location pair.

## `expandSearch` (type: `boolean`):

Google Jobs shows about 10 jobs per query. When on, the Actor also runs variations (full time, remote, entry level...) and keeps only new jobs. Turn off to get just the first 10.

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

Two-letter country code for Google (gl), e.g. us, gb, ca.

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

Google interface language (hl). Parsing relies on English labels, so keep "en".

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

How many searches run at the same time.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxJobsPerSearch": 50,
  "expandSearch": true,
  "country": "us",
  "language": "en",
  "maxConcurrency": 5
}
```

# Actor output Schema

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

All unique jobs found in this run.

## `stats` (type: `string`):

Searches, requests, jobs saved and duplicates skipped.

# 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"
    ],
    "locations": [
        "New York, NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nahuedev/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"],
    "locations": ["New York, NY"],
}

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

```

## MCP server setup

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