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

Get Google Jobs listings for any job search and city, gathered from LinkedIn, Indeed, ZipRecruiter and company career sites: title, company, location, salary (min/max/period), job type, posting date, job board and apply link. 20 countries. Only-new-jobs mode for daily alerts. Pay per job.

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

## Pricing

from $0.80 / 1,000 job listings

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: Listings, Salaries & Apply Links

Get **Google Jobs** listings for any job search: **job title, company, location, salary (with parsed minimum, maximum, period and currency), job type, posting date, the job board it comes from and the apply link**, up to 200 jobs per search, in 20 countries.

It calls a commercial search data API instead of driving a browser: **no proxies, no CAPTCHAs, no Google account**, results in under a minute. **Until October 25, 2026 you only pay for jobs returned**; from October 25, 2026 each run also costs $0.001 to start and each page of results with jobs $0.0016. Searches with no job, duplicates and input mistakes are free (from October 25, 2026, apart from the $0.001 start fee per run).

### Typical uses

- **Job market and salary research**: who is hiring for a role in a city, at which pay, on which job boards.
- **Recruiting and staffing leads**: companies hiring right now for the roles you place, with the link to each job.
- **Job board and newsletter feeds**: fresh jobs for a niche (remote, nursing, data...) every day; turn on **Only new jobs** to get and pay for each job once.
- **Competitor hiring watch**: search a company name to follow the roles it opens.
- **Automations and AI agents**: feed n8n, Make, Zapier, Google Sheets or an MCP client with structured JSON.

### What you get

One row per job listing:

| Field | Description |
|---|---|
| `query`, `position` | Your search and the job's position in Google Jobs |
| `jobId` | Google Jobs ID of the listing, stable across runs (use it to detect new jobs) |
| `title`, `company`, `location` | Job title, hiring company, location as shown by Google |
| `employmentType` | Full-time, Part-time, Contractor, Internship... (in the search language) |
| `salary` | Pay as Google shows it, e.g. "135K–175K a year" (missing on many listings) |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | The same pay as numbers: 135000, 175000, `year`, `USD`. Period is `hour`, `day`, `week`, `month` or `year`; the currency is the symbol shown, else the country's currency |
| `postedAt`, `postedAgo` | Posting date (UTC, computed from Google's "2 days ago") and the text itself |
| `via`, `applyUrl`, `applyDomain` | Job board or career site (LinkedIn, Indeed, company site...), link to the job there, its domain |
| `searchCountry`, `languageCode`, `observedAt` | Market, language and when the data was fetched (UTC) |

Missing values are always `null`, never guessed.

### Input

```json
{
  "queries": ["data engineer in Austin, TX", "registered nurse in Denver", "remote python developer"],
  "country": "US",
  "maxJobsPerQuery": 50
}
```

- **queries**: what you would type in Google Jobs, up to 1,000 per run. **Put the city in the search** ("nurse in Austin, TX"): Google Jobs then returns jobs around that city. Without a city you get jobs from the whole country.
- **country**: US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP. **languageCode** (optional) defaults to the country's main language.
- **maxJobsPerQuery**: 1 to 200 (default 50). Google Jobs rarely lists more than 100 to 200 jobs for one search.
- **onlyNewJobs** (optional, monitoring): return only jobs never delivered to you before for the same search, country and language. See below.
- **monitorName** (optional): name of the key-value store in your account that remembers delivered jobs (default `plainrows-google-jobs-monitor`).

### Get only new jobs (scheduled runs)

Turn on **Only new jobs** (`"onlyNewJobs": true`) and add an Apify **schedule** (daily, for example). The first run returns every job it finds and remembers them in a key-value store of your own Apify account; each later run returns **and bills only jobs it has never delivered**. A search with nothing new gets a free row with `notFoundReason: "no-new-jobs"`.

**Check fee in this mode:** each page of up to 10 Google Jobs results checked costs one small `page-checked` event (about what the data source charges us), even when nothing new is found. It is never charged for a search the data source answered in an unexpected format (no results list): the run warns about it in the log and in its summary. Keep **maxJobsPerQuery** close to the number of new jobs you expect per run. Runs without **Only new jobs** never pay it.

- A job is recognized by its title, company and location, so the same job re-listed on another job board is not delivered twice (Google's `jobId` changes in that case).
- Each search checks up to `maxJobsPerQuery` jobs; jobs left out by that limit or your run budget stay new for the next run. Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.

### Output example

Real row from a run on 2026-10-08 (US, search `registered nurse in Austin, TX`):

```json
{
  "query": "registered nurse in Austin, TX",
  "found": true,
  "position": 4,
  "jobId": "d5V1MFARqL192WraAAAAAA==",
  "title": "RN Mother Baby",
  "company": "Lifeline Medical Staffing",
  "location": "Austin, TX",
  "employmentType": "Part-time",
  "salary": "40–75 an hour",
  "salaryMin": 40,
  "salaryMax": 75,
  "salaryPeriod": "hour",
  "salaryCurrency": "USD",
  "postedAt": "2026-10-07T00:25:59.000Z",
  "postedAgo": "22 hours ago",
  "via": "Monster",
  "applyUrl": "https://www.monster.com/job-openings/rn-mother-baby-austin-tx--109947a9-1dcf-4697-82e6-03005cf3b48b",
  "applyDomain": "monster.com",
  "searchCountry": "US",
  "languageCode": "en",
  "observedAt": "2026-10-08T00:30:00.000Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per result, no subscription, no proxy costs; no fee per run until October 25, 2026, then $0.001 per run start. See the **Pricing** tab for current prices: one event per **job listing returned**, cheaper on higher Apify plans. With **Only new jobs**, each page of up to 10 results checked also costs a small `page-checked` event. Salary parsing, apply links and posting dates are included (no "details" add-on).

Price change on October 25, 2026: $0.001 per run start; one `results-page` event ($0.0016, all plans) per page of up to 10 results for a search that returns at least one job (not with **Only new jobs**); `page-checked` becomes $0.0016 on all plans. The job price does not change.

Searches with no job, duplicates and input mistakes cost nothing (from October 25, 2026, apart from the $0.001 start fee per run). The run never spends more than the maximum cost you set. If many searches in a row return nothing billable (about $0.01 of data-provider calls), the run stops early and says so in its status; the searches not run are not charged.

**Free Apify plan:** each run returns up to 20 jobs for up to 2 searches, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~google-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["data engineer in Austin, TX"], "country": "US", "maxJobsPerQuery": 20}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/google-jobs-scraper`, schedule it daily and append new `jobId`s to Google Sheets, Airtable or Slack.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/google-jobs-scraper` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **No full job description.** You get the listing summary shown in Google Jobs and the apply link; open the link for the full text. For complete descriptions straight from company career pages, see [ATS Job Postings](https://apify.com/plainrows/ats-job-postings) (Greenhouse, Lever, Ashby).
- No recruiter names or contact details.
- Not a live feed: each row carries `observedAt`; `postedAt` is approximate (Google shows "2 days ago").
- Not affiliated with Google, LinkedIn, Indeed or ZipRecruiter.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): searches submitted and run, how many returned nothing, jobs billed, searches Google did not answer, duplicates and invalid values, and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I scrape Google Jobs for a city?**
Put the city in the search, as in Google: `data engineer in Austin, TX`. Without a city you get jobs from the whole country.

**Does it include Indeed and LinkedIn jobs?**
It returns what Google Jobs lists, and Google Jobs gathers listings from many job boards and career sites; `via` tells you where each job comes from (LinkedIn, Indeed, company sites...).

**Are salaries included?**
When Google shows one (often not). The text is kept in `salary` and parsed into `salaryMin`, `salaryMax`, `salaryPeriod` and `salaryCurrency`.

**How do I get only new jobs every day?**
Schedule the run daily and keep the `jobId`s you have not seen before.

**Does it return the full job description?**
No: open `applyUrl` for it, or use [ATS Job Postings](https://apify.com/plainrows/ats-job-postings) for full descriptions from company career pages.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Companies hiring right now](https://nadaho.github.io/plainrows/companies-hiring-sales-leads/) · [Greenhouse, Lever, Ashby and Workday jobs in one JSON format](https://nadaho.github.io/plainrows/greenhouse-lever-ashby-jobs-api/) · [SerpApi Google Jobs alternative](https://nadaho.github.io/plainrows/serpapi-google-jobs-alternative/)

### Support

Missing a field, a country or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

What you would type in Google Jobs, one per line: a job title, skill or company, with the city if you want one, e.g. "data engineer in Austin, TX", "nurse Manchester", "remote python developer". Up to 1,000 per run.

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

Google Jobs market: jobs posted for this country, in its main language by default. Put the city in the search itself ("nurse in Austin, TX").

## `languageCode` (type: `string`):

Two-letter language code, e.g. "en" or "fr". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium).

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

Google Jobs lists up to about 200 jobs per search. Each job returned is billed; see Pricing.

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

Return only jobs this tool has never delivered to you for the same search, country and language. The first run returns every job and remembers them; later runs (for example a daily schedule) return and bill only new jobs.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered jobs (default "plainrows-google-jobs-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "queries": [
    "data engineer in Austin, TX"
  ],
  "country": "US",
  "maxJobsPerQuery": 50,
  "onlyNewJobs": false
}
```

# Actor output Schema

## `results` (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 engineer in Austin, TX"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/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 engineer in Austin, TX"],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/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 engineer in Austin, TX"
  ],
  "country": "US"
}' |
apify call plainrows/google-jobs-scraper --silent --output-dataset

```

## MCP server setup

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