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

Search public Google Jobs by keyword, country and language. Get up to 10 jobs per query with salary ranges, descriptions, highlights, all shown apply links and clear availability notes.

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

## Pricing

from $3.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: salaries, descriptions and apply links

Get **job titles, companies, locations, salary ranges, descriptions, highlights and every application link shown by Google Jobs**. Enter a search such as `software engineer jobs in austin` and export up to ten jobs from the first response.

**$0.003 per job, with a $0.018 minimum per successful query covering its first six jobs.** A ten-job query costs $0.03. Searches that deliver no jobs have no Actor event charge.

### What you get

| Field | What it holds |
|---|---|
| Jobs | A plain `verdict` first, followed by `title`, `company`, `location`, `via`, `postedAgo`, `employmentType` and the original `tags`. |
| Salary evidence | `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryCurrencySource`, `salaryPeriod` and `salaryIsEstimate`. Missing values stay null. |
| Descriptions and highlights | `description`, `descriptionSource`, `descriptionStatus`, grouped `highlights`, and `benefitTags`. These are the source text, without AI rewriting. |
| Application links | Every shown apply option as `applyLinks`: board name, original URL, URL type and the Google redirect when present. Also `sourceUrl`, `googleJobId` and `googleJobsUrl`. |
| Search context | `query`, `country`, `language`, `queryPosition`, `page`, `fetchedAt`, `includedInSearch` and a stable `resultId`. |
| Free notes and SUMMARY | Unavailable searches, source refusals, skipped records, spending-limit stops and the first-response boundary are explicit. Filter `kind = job` for jobs only. |

### What people use it for

- **Hiring research:** Collect the openings and advertised pay that appear for a role and location.
- **Job discovery:** Build a shortlist with multiple application options for each listing.
- **Pay comparisons:** Compare the salary labels actually published, retaining pay periods and missing-currency notes.
- **Scheduled monitoring:** Repeat the same searches and compare Google job IDs across runs. Each new run is billed separately.

### How to use it

1. Enter one or more **Search queries**, including a city, region or remote wording.
2. Choose the **Country** and **Result language**. Leave **Maximum jobs per query** at ten for a full first response.
3. Set **Maximum cost per run** to at least **$0.03005** for one ten-job query, including Apify’s start charge.
4. Start the Actor and open the **Jobs** table. Filter `kind` to `job` to exclude free note rows; export JSON for nested application links and highlights.

### Input

| Field | Example | Notes |
|---|---|---|
| `queries` | `["software engineer jobs in austin"]` | Up to 20 strings, each at most 300 characters. Duplicate searches are combined. Empty input uses this search. |
| `country` | `us` | Two-letter search setting; examples: `gb`, `za`, `de`. It is not proof of the request’s physical location. |
| `language` | `en` | English (`en`) or German (`de`) interface labels. Source job text is not translated. |
| `maxJobsPerQuery` | `10` | 1–10 from the first response. The six-job minimum price applies even when fewer jobs are requested or found. |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "verdict": "Job found; 8 apply options; salary shown.",
  "kind": "job",
  "title": "Senior Software Engineer",
  "company": "Example Company",
  "location": "Example City, Region",
  "via": "Example Careers",
  "postedAgo": "3 days ago",
  "employmentType": "full-time",
  "salaryText": "155K–170K a year",
  "salaryMin": 155000,
  "salaryMax": 170000,
  "salaryCurrency": null,
  "salaryPeriod": "year",
  "applyLinkCount": 8,
  "googleJobId": "example-source-job-id",
  "applyLinks": [
    {
      "board": "Example Board 1",
      "url": "https://jobs1.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 2",
      "url": "https://jobs2.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 3",
      "url": "https://jobs3.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 4",
      "url": "https://jobs4.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 5",
      "url": "https://jobs5.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 6",
      "url": "https://jobs6.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 7",
      "url": "https://jobs7.example.org/posting/example-job",
      "urlType": "direct"
    },
    {
      "board": "Example Board 8",
      "url": "https://jobs8.example.org/posting/example-job",
      "urlType": "direct"
    }
  ],
  "note": "Salary currency was not stated in the salary label.",
  "queryPosition": 1,
  "includedInSearch": true
}
```

This example comes from the 25 October 2026 fixture replay of a real public search response. Company names, board names, location, job ID and site addresses have been replaced, and the technology name in the title has been removed. The salary, posting age, employment type, number of apply options and missing-currency note are retained. Description and highlight text are omitted from this example. SUMMARY records the searches, delivered rows, notes and event counts.

### Pricing

- **$0.018 per successful query**, including its first six delivered jobs. The `job-search` event is charged with the first delivered job.
- **$0.003 per additional delivered job** in that query. A query with ten jobs costs **$0.03**.
- The minimum applies when only one to five jobs are found or requested. No extra charge is made for an absent job.
- Empty results, unavailable pages, blocked searches and diagnostic notes have no Actor event charge.
- The same price on every Apify plan. No AI charge, account login or separate proxy subscription is required.

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| One query with 1–6 jobs | $0.018 |
| One query with 7 jobs | $0.021 |
| One query with 10 jobs | $0.030 |
| Five queries with 10 jobs each | $0.150 |
| Twenty queries with 10 jobs each | $0.600 |
| A query with no delivered jobs | $0 in Actor events |

Apify’s **$0.00005 start charge counts towards the buyer’s Maximum cost per run** and is additional to the examples above. Allow at least **$0.01805** for one successful query or **$0.03005** for ten jobs. The Actor checks the budget before requesting a page. The first six jobs remain included if the minimum consumes the remaining budget; later jobs stop at the limit. A restart of the same run does not charge again for acknowledged rows.

### Tips

- Put location and any remote wording in the search itself. Search wording is not a strict job filter.
- Keep the default ten-job limit for the lowest effective price on a full response.
- Keep original salary text beside numeric ranges. A missing currency, pay period or advertised salary is not guessed.
- Use both `googleJobId` and the search context when comparing scheduled runs; a job can appear in several searches.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/google-jobs-scraper").call(run_input={"queries": ["software engineer jobs in austin"], "country": "us", "language": "en", "maxJobsPerQuery": 10})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/google-jobs-scraper').call({"queries": ["software engineer jobs in austin"], "country": "us", "language": "en", "maxJobsPerQuery": 10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~google-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"queries": ["software engineer jobs in austin"], "country": "us", "language": "en", "maxJobsPerQuery": 10}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "find software engineer jobs in austin with advertised salaries and application links". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- This release reads the **first response only, usually ten jobs per query**. Further paging is not supported. `start=10` is not a working Jobs continuation. SUMMARY never claims that all matching jobs were collected.
- The source may show fewer jobs, no salary, an abbreviated description, stale postings or application links that later expire. A job found here is not confirmation that the vacancy is still open.
- The Actor uses Google’s returned text and job data. It does not visit application boards, submit applications, verify employer claims or infer missing pay.
- If a direct application URL is absent, its Google redirect is retained with `urlType = google-redirect`. It is not followed.
- Only public, signed-out pages are read. Login walls, bot checks, unsupported responses and HTTP errors are reported. No CAPTCHA is solved.
- English and German labels are supported. Country is a search setting; results may include other locations. Search wording can request remote work, but no strict remote, date or employment filter is applied.
- Up to 20 queries per run, one request per query, with a 35-second request timeout and a 16 MiB decoded-response limit. No automatic source retries are made.
- Malformed cards are skipped individually and listed in SUMMARY. Diagnostic rows are free and can still appear after the spending limit.

### FAQ

**Can I collect hundreds of matching jobs from one query?**

No. This version returns up to ten jobs from the first response. Use more specific, separate searches when useful; it does not claim to exhaust all results.

**Do descriptions or apply links need extra requests?**

No. They come from the same page’s embedded public job data. Description text can still be incomplete at the source.

**What happens if only one job is found?**

The successful-query charge is $0.018. The first six jobs are included in that price, so receiving one job does not create five placeholder rows or separate charges for missing jobs.

**What happens after a restart?**

The page’s parsed rows are checkpointed together before delivery. A restart of the same run resumes that batch and skips acknowledged result IDs. A separate scheduled run is a new billable run.

**Are repeated jobs across different queries removed?**

No. One row per Google job ID per distinct query preserves which searches found the job. Repeated identical input queries and duplicate cards within a response are combined.

**Why is salaryCurrency null?**

Google sometimes shows a range without a currency. The Actor leaves it null. A dollar symbol is interpreted using the country setting and marked symbol-and-country.

**Can I export application links?**

Yes. JSON retains every nested link and highlight. The dataset also supports CSV and Excel exports.

### Related Actors from Zaiq

- [ats-jobs-scraper](https://apify.com/zaiq/ats-jobs-scraper): public vacancies from employers’ supported applicant tracking systems
- [workday-jobs-scraper](https://apify.com/zaiq/workday-jobs-scraper): public vacancies from Workday career sites

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: google jobs scraper, job search API, job listings, job salaries, job descriptions, job application links.

# Actor input Schema

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

Up to 20 searches, including location or remote wording. Empty input uses the example search. Exact duplicate searches are combined.

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

Two-letter country setting, such as us, gb, za or de. This is a Google search setting, not a verified exit-IP location.

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

Google interface language. English and German labels are supported; job text remains in its source language.

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

Return 1–10 jobs from the first response. The $0.018 successful-query minimum still applies when fewer than six are requested or found. Later pages are not supported.

## Actor input object example

```json
{
  "queries": [
    "software engineer jobs in austin"
  ],
  "country": "us",
  "language": "en",
  "maxJobsPerQuery": 10
}
```

# Actor output Schema

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

Dataset: the results.

## `summary` (type: `string`):

What each input returned, and notes.

# 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 jobs in austin"
    ],
    "country": "us",
    "maxJobsPerQuery": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/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 jobs in austin"],
    "country": "us",
    "maxJobsPerQuery": 10,
}

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

```

## MCP server setup

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