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

Google Jobs scraper and API: every job Google shows for your searches, up to 200 per search, with full description, all apply links, salary normalised to yearly and hourly, posting date and remote flag. Failed searches are free.

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

## Pricing

$1.50 / 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** gets every job Google Jobs shows for your searches, up to 200 per search, with the full
description, every apply link (LinkedIn, Indeed, Glassdoor, the employer's own site...), salary turned into yearly and
hourly figures, the posting date as a real date, and a remote flag. **$1.50 per 1,000 jobs, no start fee.** Searches
that fail or find nothing are free. The form is pre-filled, so click **Start** to try it: 20 jobs cost $0.03.

### What does Google Jobs Scraper do?

You give it job searches (like "registered nurse" or "python developer") and places (like "Austin, TX", "Manchester, UK"
or "Germany"). For every search in every place it returns one row per job with:

- title, company, company logo, location, country
- the full job description, plus Google's "Job highlights": qualifications, benefits and responsibilities
- **every apply link** Google lists (up to 8 per job), with the site name and whether it is the employer's own page,
  plus `apply_url`, the best one to use
- salary as Google shows it, plus min, max, currency, period and **yearly and hourly equivalents**, so an hourly
  warehouse job and a salaried office job can be compared in one column
- `posted_at` as a real date (`2026-10-30T12:19:51Z`), not "3 days ago"
- employment type (full time, part time, contract, internship), remote flag, benefit labels (health insurance,
  dental, paid time off) and "no degree mentioned"
- Google's job ID (the same job keeps the same ID across runs, so you can spot new jobs) and a link that opens the
  job on Google Jobs

A job found by two of your searches is saved and charged once.

### Who uses it?

- **Job boards and aggregators** filling listings for a city or a niche
- **Recruiters and staffing agencies** watching who is hiring for a role
- **Salary and labour-market research**: pay ranges by role and city, normalised to yearly and hourly
- **AI agents and automations** that need fresh jobs as clean JSON (Apify API, MCP, Make, Zapier, n8n)

### How much does it cost?

**$1.50 per 1,000 jobs** (`job` event, $0.0015 each), charged only for jobs saved to your dataset. No start fee.

| Run | Jobs | Cost |
|---|---|---|
| The pre-filled run (1 search, 20 jobs) | 20 | $0.03 |
| 5 searches x 100 jobs | 500 | $0.75 |
| 20 searches x 200 jobs | 4,000 | $6.00 |

Free: one status row per search, searches that find nothing or fail, jobs removed by your filters, duplicates across
your searches, and anything past your spending limit. Free Apify accounts get up to 300 jobs per run.

### Input

| Field | What it does |
|---|---|
| `queries` | Job searches, one per line |
| `locations` | Cities, states or countries, one per line (default United States). Every search runs in every location |
| `maxJobsPerQuery` | 1 to 200 (default 100). Google Jobs shows at most about 200 jobs per search |
| `datePosted` | any, today, 3days, week or month |
| `employmentTypes` | fulltime, parttime, contractor, intern (empty = all) |
| `remoteOnly` | Adds "remote" to each search and keeps only jobs Google marks as work from home |
| `radiusKm` | How far around a city to search (optional) |
| `language` | Language code for Google's page (default en) |
| `includeDescription` | Turn off for smaller rows |
| `dedupe` | Save a job found by several searches once (default on) |
| `failOnErrors` | For schedules: mark the run failed (so Apify alerts you) if a search fails |

```json
{
  "queries": ["registered nurse", "data analyst"],
  "locations": ["Chicago, IL", "Manchester, UK"],
  "maxJobsPerQuery": 100,
  "datePosted": "week"
}
```

### Output example

```json
{
  "record_type": "job",
  "id": "TbAvbEmF5A4XwqteAAAAAA==",
  "title": "Senior Mission Management Software Engineer (Onsite)",
  "company": "RTX",
  "location": "Aurora, CO",
  "country": "US",
  "remote": false,
  "posted_at": "2026-10-31T12:43:31Z",
  "posted_ago": "2 days ago",
  "employment_type": "full_time",
  "salary": null,
  "via": "RTX Careers",
  "apply_url": "https://careers.rtx.com/global/en/job/01885979/Senior-Mission-Management-Software-Engineer-Onsite",
  "apply_links": [
    {"publisher": "RTX Careers", "url": "https://careers.rtx.com/global/en/job/01885979/...", "direct": false},
    {"publisher": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/...-4485252798", "direct": false},
    {"publisher": "Glassdoor", "url": "https://www.glassdoor.com/job-listing/jv?jl=1010311228362", "direct": false}
  ],
  "apply_link_count": 8,
  "description_text": "Date Posted:\n2026-10-29\n\nCountry:\nUnited States of America ...",
  "highlights": {
    "qualifications": ["Active and existing security clearance required on day 1", "..."],
    "benefits": ["... medical, dental, vision, life insurance ... 401(k) match ...", "..."],
    "responsibilities": ["Design, develop, test, deliver, and maintain software for satellite ground systems", "..."]
  },
  "benefits": ["Health insurance", "Dental insurance", "Paid time off"],
  "query": "software engineer",
  "search_location": "United States",
  "rank": 1
}
```

A salary looks like this: `{"min": 100000, "max": 115000, "currency": "USD", "period": "year", "yearly_min": 100000,
"yearly_max": 115000, "hourly_min": 48.08, "hourly_max": 55.29, "raw_text": "100K–115K a year"}`.

Each search also gets one free status row (`record_type: "search"`) saying how many jobs were found, saved, charged,
skipped as duplicates or removed by your filters. The **Jobs** and **Searches** tabs show them as tables.

### Where does it work?

Google Jobs runs in 76 countries, including the United States, United Kingdom, Canada, India, Germany, France, the
Netherlands, Spain, Italy, Singapore, the UAE and South Africa. Google does not run it in Australia, New Zealand or
Ireland; locations there get a free row saying so.

### Limitations

- Google shows at most about 200 jobs per search. For more, split a broad search into narrower ones (by city, or by
  adding words like "senior" or "night shift").
- Salary appears only when Google shows it (about 40% of jobs in our tests). Google shows a posting date on most jobs
  but not all; with a date filter on, jobs without a date are left out.
- Results usually arrive within 20 seconds to 2 minutes. A search Google has nothing for can sit in the queue; after
  5 minutes it gets a free "skipped" row.

### FAQ

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

The jobs come from Google's public job search results, collected through a licensed search-data provider, not by
logging in or getting past any protection. Job ads are business listings, not personal profiles, and personal emails
and phone numbers inside descriptions are removed. You are responsible for how you use the data; if in doubt, check
with a lawyer for your use case.

#### How is this different from other Google Jobs scrapers?

Up to 200 jobs per search, every apply link, salary normalised to yearly and hourly, real posting dates and Google's
own job IDs, at $1.50 per 1,000 jobs with no start fee. Runs don't open a browser, so they don't time out on slow pages.

#### What happens if a run times out or restarts?

Searches that finished are not run or charged again, and a search already sent to the data provider is collected, not
bought twice. Searches not finished get free `skipped` rows.

### More from Meridian Labs

- **[AI Visibility Tracker](https://apify.com/meridianlabs/ai-visibility-tracker)**: whether ChatGPT, Perplexity, Gemini and Claude name your brand, with share of voice vs competitors. From $0.008 per answer.
- **[Greenhouse, Lever & Ashby Jobs](https://apify.com/meridianlabs/greenhouse-lever-ashby-jobs-scraper)**: jobs straight from company job boards (Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor) with normalised salary, using the same field names as this Actor. $2 per 1,000 jobs.
- **[Google Trends Scraper & API](https://apify.com/meridianlabs/google-trends-scraper)**: Google Trends for hundreds of keywords at once, with a plain-English summary per keyword. $5 per 1,000 keyword lookups.
- **[Keyword Search Volume + Google Trends](https://apify.com/meridianlabs/keyword-search-volume)**: monthly search volume, CPC, competition and keyword difficulty plus a Google Trends summary for every keyword. From $5 per 1,000 keywords.
- **[Backlink Checker: Referring Domains & Spam Score](https://apify.com/meridianlabs/backlink-checker)**: domain rank, backlinks, referring domains and spam score for up to 1,000 domains per run. $0.03 per domain, $6 per 1,000 backlink rows.
- **[Instagram Transcript Scraper: Reels Transcript API](https://apify.com/meridianlabs/instagram-reels-transcript)**: what is said in each Instagram Reel, as text with timestamps and SRT subtitles, in its original language. $3 per 1,000 reels; music-only reels free.

### Support

Found a job that looks wrong? Open an issue on the **Issues** tab with the search and location. We read every one.

If this saved you time, a rating helps others find it; if something's off, open an issue and we'll fix it fast.

# Actor input Schema

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

One search per line, the way you would type it into Google Jobs: a job title or keywords, e.g. 'registered nurse', 'python developer', 'warehouse night shift'.

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

Cities, states or countries, one per line, e.g. 'Austin, TX', 'Manchester, UK', 'Toronto', 'Germany'. Every search runs in every location. Google Jobs covers 76 countries including the US, UK, Canada, India, most of Europe and the Gulf; it does not run in Australia, New Zealand or Ireland. Ambiguous names go to the biggest city (London means London, England); write 'London, Ontario' for another one. Each row of results shows the exact place searched.

## `maxJobsPerQuery` (type: `integer`):

Up to 200 (the most Google Jobs shows for one search). Broad searches usually have 150-200; narrow ones fewer. You are only charged for jobs saved.

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

Keep only jobs posted in this window. Google shows a date on most jobs but not all; jobs without one are left out when this is set. Removed jobs are not charged.

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

Keep only these types (empty = all). With one type picked, its words are also added to the search so Google returns more of them. Removed jobs are not charged.

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

Adds 'remote' to each search and keeps only jobs Google marks as work from home or 'Anywhere'.

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

Optional: how far around a city to search (for miles, multiply by 1.609). Empty = Google's default for that place.

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

Language code for Google's page, e.g. en, de, fr, es. English works everywhere.

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

Turn off for smaller rows. Highlights (qualifications, benefits, responsibilities) are always included.

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

A job found by two of your searches is saved and charged once.

## `failOnErrors` (type: `boolean`):

Useful for schedules: the run is marked failed (so Apify can alert you) if a search could not be completed. Failed searches are never charged.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "United States"
  ],
  "maxJobsPerQuery": 20,
  "datePosted": "any",
  "employmentTypes": [],
  "remoteOnly": false,
  "language": "en",
  "includeDescription": true,
  "dedupe": true,
  "failOnErrors": false
}
```

# Actor output Schema

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

Charged job rows (dataset view 'jobs').

## `searches` (type: `string`):

One free row per search: ok, no_jobs, error or skipped, with the reason.

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

Every row and field.

# 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": [
        "United States"
    ],
    "maxJobsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("meridianlabs/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": ["United States"],
    "maxJobsPerQuery": 20,
}

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

```

## MCP server setup

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