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

Google Jobs listings as structured data: title, company, location, salary (min, max, currency, period), job type, posted date, full description and direct apply links. More than 10 jobs per search, without duplicates.

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

## Pricing

from $2.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.
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

Scrape job postings from **Google Jobs**, the job search built into Google that collects listings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, company career sites and hundreds of other job boards. Type a search like *"software engineer new york"* or *"registered nurse chicago"* and get clean, structured job data: title, company, location, salary, job type, highlights, the full description, and **direct apply links**.

- ✅ **Direct apply links.** Google's redirect links are converted into the real job page URLs (LinkedIn, Indeed, company career sites…).
- ✅ **Salary parsed into numbers**: minimum, maximum, currency and period, next to Google's original text.
- ✅ **More than 10 jobs per search.** Google only shows about 10 jobs per search. This scraper widens each query with recent-date windows and common refinements, then removes duplicates. One test run collected 99 unique jobs for "warehouse worker dallas".
- ✅ **Built for reliability.** Searches are retried automatically, and the run never fails because of one bad page.
- ✅ **Privacy-friendly.** Recruiter e-mail addresses and phone numbers in descriptions are removed by default.

### What data do you get?

| Field | Example |
|---|---|
| `title` | Entry Level Software Developer |
| `companyName` | SkillStorm |
| `location` | New York, NY |
| `via` | LinkedIn (where Google found the posting) |
| `postedAt` / `postedDate` | "2 days ago" / 2026-10-08 |
| `scheduleType` | Full-time |
| `salary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | "65K–70K a year", 65000, 70000, USD, year (when Google shows no currency symbol, the currency is taken from the country) |
| `tags` | Health insurance, Dental insurance, No degree mentioned |
| `highlights` | Qualifications, benefits and responsibilities as bullet lists |
| `description`, `descriptionIsPreview` | The full job description. In some countries Google only shows a short preview; then `descriptionIsPreview` is `true`. |
| `applyOptions` | Every place to apply, each with a direct URL |
| `googleJobUrl` | Link to the job on Google |
| `jobId`, `query`, `searchVariant`, `scrapedAt` | For de-duplication and tracking |

### How to use it

1. Add one or more **search queries**, including the location, the way you would type them into Google.
2. Set **max jobs per query** (default 50).
3. Optionally filter by **date posted** (past 24 hours, week or month) and set the **country** (default `us`).
4. Click **Start** and download your data as JSON, CSV, Excel or HTML, or use the API.

#### Example input

```json
{
  "queries": ["software engineer new york", "registered nurse chicago"],
  "maxJobsPerQuery": 50,
  "datePosted": "week",
  "country": "us"
}
```

#### Example output

```json
{
  "query": "software engineer new york",
  "searchVariant": "exact query",
  "jobId": "wR4_opIO4fL0CrG7AAAAAA==",
  "title": "Entry Level Software Developer",
  "companyName": "SkillStorm",
  "location": "New York, NY",
  "via": "LinkedIn",
  "postedAt": "2 days ago",
  "postedDate": "2026-10-08",
  "scheduleType": "Full-time",
  "salary": "65K–70K a year",
  "salaryMin": 65000,
  "salaryMax": 70000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "tags": ["Health insurance", "Dental insurance"],
  "highlights": {
    "qualifications": ["A bachelor's degree in a related technical field (Computer Science, Software Engineering, IT, or similar)", "At least 1 year of technical work experience"],
    "benefits": ["Competitive salary, paid from day one, with no training costs to you"],
    "responsibilities": ["Develop and improve applications using your client's languages, frameworks, and tools"]
  },
  "description": "Launch your software career with a company built to do exactly that. ...",
  "descriptionIsPreview": false,
  "applyOptions": [
    { "source": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/..." },
    { "source": "Indeed", "url": "https://www.indeed.com/viewjob?..." }
  ],
  "googleJobUrl": "https://www.google.com/search?ibp=htl;jobs&q=software+engineer+new+york&htidocid=...",
  "scrapedAt": "2026-10-10T15:08:41.000Z"
}
```

### Input options

| Option | What it does |
|---|---|
| **Search queries** | What you would type into Google, including the location. |
| **Max jobs per query** | Stops after this many unique jobs per query (1–500). |
| **Date posted** | Any time, past 24 hours, past week or past month. |
| **Widen the search** | On by default. Also searches date windows and refinements (remote, full time, part time, contract, senior, entry level, hybrid, internship) to get past Google's ~10 jobs per search. Turn it off to get only your exact query. |
| **Country** | Two-letter Google country code (`us`, `gb`, `de`, `in`…). |
| **Resolve direct apply links** | On by default. Turns Google redirect links into direct job page links. |
| **Include full job description** | On by default. |
| **Remove e-mail addresses and phone numbers** | On by default. |

### Pricing

You pay per job saved, plus a tiny fee per run start. There is no monthly rental, and failed searches cost you nothing. The exact price for your Apify plan is shown on the **Pricing** tab. For example, 100 jobs cost well under one dollar.

To cap spending, set a **maximum cost per run** in the run options. The scraper stops cleanly when it reaches your limit.

### Use cases

- **Job market research:** which companies are hiring for which roles, where, and at what salary.
- **Job boards and aggregators:** fresh listings with direct apply links.
- **Recruiting and staffing:** track new openings at target companies or in target cities.
- **Salary benchmarking:** structured salary ranges across roles and locations.
- **AI agents:** call this actor through the Apify API or MCP server to give an agent live job data.

### Use it as an API, from Python or from AI tools

Every run is also an API call. From Python, with the official [Apify client](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("ralfij/google-jobs-scraper").call(
    run_input={"queries": ["data analyst chicago"], "maxJobsPerQuery": 50}
)
for job in client.dataset(run.default_dataset_id).iterate_items():
    print(job["title"], "|", job["companyName"], "|", job["salary"])
```

More Python examples, including a salary report by city and a daily alert for new jobs, are on GitHub: [RalfIJ/google-jobs-api](https://github.com/RalfIJ/google-jobs-api).

To let an AI assistant such as Claude, Cursor or VS Code search Google Jobs for you, add this MCP server URL in its settings: `https://mcp.apify.com?tools=ralfij/google-jobs-scraper`

### FAQ

**Is there an official Google Jobs API?**
No. Google doesn't offer a public API for Google Jobs results. This actor gives you the same listings as structured data (JSON, CSV or Excel) through the Apify API.

**Is it free to try?**
Yes. Apify's free plan includes $5 of credit every month, with no credit card needed. That covers more than 1,000 jobs at the standard price.

**Which countries work?**
Google Jobs works in many countries, including the United States, the United Kingdom, Germany, India, Canada and Australia. It is **not available in every country**; the Netherlands, for example, returns no Google Jobs results. For local jobs, write the query in the local language (e.g. `pflegefachkraft berlin` with country `de`).

**Why did I get fewer jobs than I asked for?**
Google only has so many listings for each search. The scraper stops when new searches stop finding new jobs, so you never pay for duplicates. Broader queries ("nurse texas") return more than narrow ones.

**How fresh is the data?**
Every run searches Google live. Use **Date posted: past 24 hours** with an Apify schedule to collect new jobs every day.

**Is scraping Google Jobs legal?**
This actor only collects publicly available job postings and does not log in anywhere. By default it removes recruiter e-mail addresses and phone numbers from descriptions. You are responsible for how you use the data, especially under privacy laws such as the GDPR.

**Can I use it with an API, Make, Zapier or n8n?**
Yes. Like every Apify actor, you can run it through the Apify API, schedule it, and connect it to Make, Zapier, n8n, Google Sheets and other tools through Apify integrations.

**Something broke. What should I do?**
Open an issue on the **Issues** tab with your input, and it will be looked at quickly.

**Did it save you time?**
A short review on the **Reviews** tab helps other people find it.

*This actor is not affiliated with, endorsed by or sponsored by Google. Google Jobs is a trademark of Google LLC.*

# Actor input Schema

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

What you would type into Google, including the location, e.g. "software engineer new york" or "nurse chicago". One query per line.

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

Stop after this many unique jobs per query. Google shows about 10 jobs per search, so larger numbers need the widened search below.

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

Only return jobs posted within this time window.

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

Google shows about 10 jobs per search. When on, the scraper also searches recent date windows and common refinements (remote, full time, part time, contract, senior, entry level, hybrid, internship) and removes duplicates. Turn off to get only the results of your exact query.

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

Two-letter country code for Google, e.g. us, gb, de, in. Write your query in the local language for local jobs (e.g. "pflegefachkraft berlin" with de). Google Jobs is not available in every country (for example the Netherlands).

## `resolveApplyLinks` (type: `boolean`):

Turn Google's redirect links into direct links to the job page (LinkedIn, Indeed, company career sites...).

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

Include the full job description text in each result.

## `redactContactDetails` (type: `boolean`):

Replace recruiter e-mail addresses and phone numbers in descriptions with a placeholder.

## Actor input object example

```json
{
  "queries": [
    "software engineer new york"
  ],
  "maxJobsPerQuery": 20,
  "datePosted": "any",
  "expandSearch": true,
  "country": "us",
  "resolveApplyLinks": true,
  "includeDescription": true,
  "redactContactDetails": true
}
```

# Actor output Schema

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

All scraped jobs, one item per job.

# 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 new york"
    ],
    "maxJobsPerQuery": 20
};

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

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

```

## MCP server setup

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