# Google Jobs Scraper - Salaries & Apply Links (`scrapewise/google-jobs`) Actor

Scrape Google Jobs in 23 countries: title, company, location, normalized salary (min, max, currency, period), direct apply links, posted date, job type, remote flag and description. Filter by date, job type, remote and location. Pay per unique job, no duplicates.

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

## Pricing

from $2.55 / 1,000 job delivereds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Jobs Scraper

Scrape job listings from Google Jobs in any country and language, with normalized salaries, every direct apply link, posting date, job type, remote flag and the full description. Built for recruiters, job boards, HR analytics and anyone who needs fresh job data without duplicates.

### Why this one

- **Pay per unique job, not per page.** Duplicates across searches, jobs outside your filters and searches with no results are free.
- **More than Google's 10 jobs per search.** Google Jobs shows 10 jobs per query. With `expandSearch` on, the Actor repeats your search across the largest cities of the country, posting dates and job types, removes duplicates and stops by itself when Google starts repeating jobs.
- **Salary you can sort by:** `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` (HOUR, DAY, WEEK, MONTH, YEAR), parsed from "$190K–$286K a year", "R$ 3.199,00 a R$ 4.977,39 por mês" or "36.000 € bis 60.000 € pro Jahr", plus the original `salaryText`.
- **Every apply option with its direct URL** (company career site, LinkedIn, Indeed, Glassdoor...), not a Google redirect, with tracking parameters removed.
- **Filters that are checked on every job:** date posted, job type, remote only, location, country (`gl`) and language (`hl`). A job that does not match is dropped, not charged.
- **23 countries tested,** each with its own Google domain, language and currency: US, UK, Canada, India, Singapore, South Africa, Philippines, Malaysia, UAE, Nigeria, Pakistan, Brazil, Germany, Austria, Switzerland, France, Italy, Denmark, Japan, Indonesia, Saudi Arabia, Egypt and Kenya.
- **HTTP only, no browser:** fast runs, no 5-minute timeouts.
- **Drop-in replacement:** accepts the input field names of other Google Jobs scrapers (`query`, `searchTerm`, `jobType`, `searchTerms`, `countryCode`, `languageCode`, `posted_within`, `hoursOld`, `workFromHome`, `isRemote`, `num_results`, `maxResults`, `locationName`, `targetLocations`, `countryName`).
- **No personal contact data:** e-mail addresses and phone numbers inside descriptions are masked.

### Use cases

- Build or refresh a niche job board with daily scheduled runs and `datePosted: "today"`.
- Track salaries for a role across cities and countries with numbers you can average.
- Find companies that are hiring for a skill right now, with the career-site link to reach them.

### Input

```json
{
  "queries": ["software engineer", "data analyst"],
  "location": "Austin, TX",
  "country": "us",
  "language": "en",
  "datePosted": "week",
  "jobTypes": ["FULLTIME", "CONTRACTOR"],
  "remoteOnly": false,
  "maxItems": 200,
  "expandSearch": true
}
```

- Leave `location` empty to search the whole country; the Actor then also searches its largest cities.
- `datePosted`: `all`, `today`, `3days`, `week`, `month`. Jobs whose posting date Google does not show are left out when a window is set.
- `jobTypes`: `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN`.
- `maxItems` limits the whole run; `maxItemsPerQuery` limits each term and location; `maxPagesPerQuery` limits Google pages per term.

### Output

One item per unique job (real output, description and lists shortened):

```json
{
  "jobId": "yV5T9_pVfXBlkJvLAAAAAA==",
  "title": "Part Time School Data Analyst",
  "companyName": "Stride, Inc.",
  "location": "United States",
  "via": "Jobgether",
  "postedAgo": null,
  "postedAt": null,
  "employmentType": "Part-time",
  "employmentTypes": ["PARTTIME"],
  "isRemote": true,
  "salaryText": "This is a PART time position that will pay $25.00 per hour",
  "salaryMin": 25.0,
  "salaryMax": 25.0,
  "salaryCurrency": "USD",
  "salaryPeriod": "HOUR",
  "benefits": [],
  "description": "This a Full Remote job, the offer is available from: Florida (USA)\n\nJob Description\n\nResidency Requirement - Florida ...",
  "jobHighlights": [
    { "title": "Qualifications", "items": ["Knowledge of quality management, systems, and strategic planning are required"] }
  ],
  "applyOptions": [
    { "title": "Apply on Jobgether", "url": "https://jobgether.com/offer/6a77053b490731f1e18d0e71-part-time-school-data-analyst", "domain": "jobgether.com" },
    { "title": "Apply on Career.com", "url": "https://www.career.com/job/stride-inc/part-time-school-data-analyst/j202508221750113444951", "domain": "career.com" }
  ],
  "applyUrl": "https://jobgether.com/offer/6a77053b490731f1e18d0e71-part-time-school-data-analyst",
  "jobUrl": "https://www.google.com/search?ibp=htl;jobs&q=data+analyst+part+time&htidocid=yV5T9_pVfXBlkJvLAAAAAA%3D%3D",
  "searchQuery": "data analyst",
  "country": "us",
  "language": "en",
  "scrapedAt": "2026-09-13T02:10:00+00:00",
  "error": null,
  "errorCode": null
}
```

- `postedAt` is computed from Google's "2 days ago" and is a date, not an exact time.
- `salaryText` comes from Google's salary chip; when there is none, from the first highlight line that states a pay amount.
- A search with no matching job produces one free item with `errorCode: "NO_JOBS_FOUND"` (`JOBS_NOT_AVAILABLE` for a country without Google Jobs, `BLOCKED` if Google did not answer), so scheduled workflows never break on an empty result.

### Pricing

**US$ 3.00 per 1,000 jobs delivered, no monthly fee.** One charge = one unique job saved to the dataset. Duplicates, filtered-out jobs and empty searches cost nothing.

### How to use

- **Console:** type your search terms, pick the country and filters, click Start, download JSON, CSV or Excel.
- **API:** `POST https://api.apify.com/v2/acts/scrapewise~google-jobs/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input above as the body.
- **Schedule:** run daily with `datePosted: "today"` to collect only new postings.
- **Integrations:** n8n, Make, Zapier, Google Sheets and webhooks through the Apify integrations.

### Limitations

- Google Jobs shows at most 10 jobs per search and has no paging for automated clients; large result sets are built from city, date and job-type variations, so the total for a narrow search can be lower than what the Google Jobs page scrolls to in a browser.
- Google Jobs did not return a jobs tab for Australia, New Zealand, Ireland, Spain, Portugal, Mexico and the rest of Latin America, the Netherlands, Belgium, Poland, the Nordics except Denmark, Turkey, Korea and Israel in our tests (September 2026). Those searches return a free item with `errorCode: "JOBS_NOT_AVAILABLE"`.
- Date filters: Google's own date filter is unreliable for automated clients, so the Actor also checks the posting date of every job. With `today` or `3days`, only jobs that show a posting date are returned, and narrow searches can return few jobs.
- Posting date, salary and job type are only filled in when Google shows them for that job.
- Descriptions are the text Google shows; some providers show only a preview.
- Something broke? Open an issue on the Actor page. Issues are answered within 12 hours.

This Actor collects only public data and respects the site's terms. Job postings belong to their publishers; you are responsible for how you use them.

### Em português

Vagas do Google Jobs em qualquer país e idioma, com salário normalizado (mínimo, máximo, moeda e período), todos os links diretos de candidatura, data de publicação, tipo de contrato, remoto e descrição completa.

- Montar ou atualizar um site de vagas com execução diária e `datePosted: "today"`.
- Pesquisa salarial de um cargo por cidade e país.
- Descobrir empresas contratando agora, com o link da página de carreiras.

**US$ 3,00 por 1.000 vagas entregues, sem mensalidade.** Vaga repetida, fora do filtro ou busca sem resultado não é cobrada.

# Actor input Schema

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

Job titles or keywords, one per line (for example "software engineer", "enfermeiro", "marketing manager"). Each term is searched separately and results are deduplicated. Also accepts 'query', 'searchTerm' or 'searchTerms' from other Google Jobs scrapers.

## `location` (type: `string`):

City, state or region, for example "Austin, TX", "London" or "São Paulo, SP". Leave empty to search the whole country: the Actor then also searches the largest cities to return more than Google's 10 jobs per search.

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

Several locations; every search term is run in each one.

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

Two-letter country code (Google's gl), for example us, gb, br, de, fr, in, ca, au. Empty = us. Sets the Google domain, the default language and the salary currency.

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

Interface language (Google's hl), for example en, pt-BR, de, es. Empty = the country's main language.

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

Only jobs posted within this window. Jobs whose posting date Google does not show are left out when a window is set.

## `jobTypes` (type: `array`):

Only these employment types. Empty = all. The field name 'jobType' (array or comma-separated text) from other Google Jobs scrapers also works.

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

Only jobs Google marks as work from home.

## `maxItems` (type: `integer`):

Maximum number of unique jobs in this run, across all search terms and locations.

## `maxItemsPerQuery` (type: `integer`):

Cap for each term and location, so one term does not use the whole 'Maximum jobs'.

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

Google shows at most 10 jobs per search. When on, the Actor repeats the search across major cities, posting dates and job types and removes duplicates. It stops by itself when Google starts repeating jobs.

## `maxPagesPerQuery` (type: `integer`):

Upper limit of Google result pages (about 10 jobs each) per term and location. You pay per job, not per page.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "datePosted": "all",
  "jobTypes": [],
  "remoteOnly": false,
  "maxItems": 30,
  "expandSearch": true,
  "maxPagesPerQuery": 25
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/google-jobs").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"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/google-jobs").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"
  ]
}' |
apify call scrapewise/google-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/google-jobs"
        }
    }
}
```

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/WA6QeHY6twWYJ3Xt0/builds/IMdvOfZZHIytjgJbu/openapi.json
