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

Scrape Google Jobs by keyword and location. Returns job title, company, salary, employment type, full description, and apply links from multiple platforms. Automatic session management — no API key or cookies required. Pay only for what you use

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

## Pricing

from $5.00 / 1,000 results

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?

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

Search Google Jobs and extract structured job listings at scale — no API key, no manual browsing, no rate-limit headaches.

Point it at any job title and city. Get back a clean dataset with full descriptions, salary ranges, employment type, and direct apply links from LinkedIn, Indeed, company career pages, and more.

***

### Who is this for?

**Recruiters & HR teams**
Stop copying job listings by hand. Run a search, download a spreadsheet, and have every open role in your target market in minutes.

**Compensation analysts**
Collect salary data from hundreds of listings across cities and roles. Build benchmarks without expensive HR data subscriptions.

**Developers & data engineers**
Plug job data directly into your ATS, CRM, or data pipeline via API or webhook. Full JSON output, Apify dataset storage, and SDK support for Python and JavaScript.

**Market researchers & academics**
Track hiring trends by company, location, or role type. Analyze which skills are in demand, where hiring is growing, and how job descriptions change over time.

***

### What you get

Every job listing comes with:

| Field | Example |
|-------|---------|
| `title` | Senior Software Engineer |
| `companyName` | Travelers |
| `location` | London, United Kingdom |
| `via` | via LinkedIn |
| `description` | Job description text (truncated ~400 chars) |
| `jobHighlights` | Qualifications, Responsibilities, Benefits (structured) |
| `applyLink` | Links to LinkedIn, Indeed, company site, and others |
| `metadata.postedAt` | 3 days ago |
| `metadata.scheduleType` | Full-time |
| `metadata.salary` | $120,000–$150,000/yr |
| `extras` | Benefits tags (e.g. `health_insurance`, `paid_time_off`) |
| `logo` | Company logo image URL |

Enable **Fetch Job Details** to also get:

| Field | Example |
|-------|---------|
| `detailInfo.fullDescription` | Full job description (untruncated) |
| `detailInfo.companyWebsite` | `wandb.ai` |
| `detailInfo.companyRatings` | Glassdoor, RepVue, AmbitionBox ratings + review counts |

#### Sample record

```json
{
  "title": "Senior Software Engineer - Python",
  "companyName": "Travelers",
  "location": "London, United Kingdom",
  "via": "via Travelers Careers",
  "description": "Taking care of our customers, our communities and each other…",
  "jobHighlights": [
    {
      "title": "Qualifications",
      "items": [
        "5+ years of Python experience",
        "Experience with microservices architecture"
      ]
    },
    {
      "title": "Benefits",
      "items": ["Competitive salary", "Hybrid working", "Health insurance"]
    }
  ],
  "applyLink": [
    { "title": "careers.travelers.com", "link": "https://careers.travelers.com/..." },
    { "title": "indeed.com", "link": "https://uk.indeed.com/..." },
    { "title": "linkedin.com", "link": "https://uk.linkedin.com/..." }
  ],
  "extras": ["health_insurance", "paid_time_off"],
  "metadata": {
    "postedAt": "16 days ago",
    "scheduleType": "Full-time",
    "salary": null
  },
  "logo": "https://encrypted-tbn0.gstatic.com/images?q=...",
  "detailInfo": {
    "fullDescription": "Taking care of our customers, our communities and each other. That's the Travelers Promise...(full text)",
    "companyWebsite": "travelers.com",
    "companyRatings": [
      {
        "source": "Glassdoor",
        "rating": 3.9,
        "reviewCount": 2341,
        "url": "https://www.glassdoor.com/Reviews/..."
      }
    ]
  }
}
```

***

### Getting started

#### 1. Set your search

| Parameter | Required | Description |
|-----------|----------|-------------|
| `keyword` | Yes | Job title or role (e.g. `"Data Scientist"`, `"Marketing Manager"`) |
| `location` | Yes | City or region (e.g. `"London"`, `"New York, NY"`) |
| `maxResults` | No | How many jobs to collect — between 10 and 500 (default: 50) |
| `gl` | No | Country code for search results (default: `us`) |
| `datePosted` | No | Filter by posting date: `any`, `day`, `week`, `week2`, `month`, `month6`, `year` (default: `any`). See note below on language support. |
| `hl` | No | Language code for results (default: `en`) |
| `fetchJobDetails` | No | Fetch full description, company ratings, and website for each job. One extra request per job (default: `false`) |

##### Note on `datePosted` and language (`hl`)

Google recognizes date filters from natural-language phrases in the search query (e.g. `"devops engineer in France le mois dernier"`). The expected phrasing varies by language, so this scraper uses language-specific phrases where verified.

The table below shows which `datePosted` values are verified per language. **Unverified values fall back to English**, which Google may not recognize correctly.

| `hl` | `day` | `week` | `week2` | `month` | `month6` | `year` |
|------|-------|--------|---------|---------|----------|--------|
| `en` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| `fr` | ✅ `hier` | ✅ `la semaine dernière` | ⚠️ en | ✅ `le mois dernier` | ⚠️ en | ⚠️ en |
| others | ⚠️ en | ⚠️ en | ⚠️ en | ⚠️ en | ⚠️ en | ⚠️ en |

> ✅ Verified — native phrase used. ⚠️ Unverified — English phrase used, results may vary.
>
> If you need an unverified date range, set `datePosted: any` and filter by `metadata.postedAt` in the results.

#### 2. Run it

Click **Start** in the Apify console, or use the API:

```json
{
  "keyword": "Software Engineer",
  "location": "London",
  "maxResults": 100
}
```

#### 3. Get your data

Results are saved to an Apify dataset the moment each batch completes. Export as **JSON**, **CSV**, or **Excel** — or stream directly into your app via the Apify API.

***

### For developers

#### JavaScript / TypeScript

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('YOUR_ACTOR_ID').call({
  keyword: 'Software Engineer',
  location: 'New York, NY',
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_API_TOKEN')

run = client.actor('YOUR_ACTOR_ID').call(run_input={
    'keyword': 'Data Scientist',
    'location': 'London',
    'maxResults': 100,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

***

### You might also need

Whether you're sourcing candidates, benchmarking compensation, or researching labor market trends, pairing this actor with Upwork data gives you a fuller view of the job market:

- **[Upwork Job Search Scraper](https://apify.com/crw/upwork-job-search-scraper)** — Job postings on Upwork: project budgets, required skills, and contract demand by category
- **[Upwork Talent Scraper](https://apify.com/crw/upwork-talent-scraper)** — Talent profiles on Upwork: rates, skills, reviews, and work history for direct sourcing

***

### Limitations

- **Supported regions:** Google Jobs is available in select countries. Use the `gl` parameter to specify your target country from the supported country code list.
- **Volume:** Up to 500 jobs per run.

# Actor input Schema

## `keyword` (type: `string`):

The job search query (e.g., 'Software Engineer', 'Data Scientist', 'Marketing Manager')

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

Job location (city, state, or country). e.g. 'London', 'New York, NY', 'San Francisco, CA'.

## `maxResults` (type: `integer`):

Maximum number of job postings to collect (min 10, max 500)

## `gl` (type: `string`):

Google country code for search results. Default: 'us'

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

Filter jobs by posting date

## `hl` (type: `string`):

Language code for search results

## `fetchJobDetails` (type: `boolean`):

If enabled, fetches detailed info for each job: full description, company ratings (Glassdoor, RepVue, etc.), and company website. Requires one additional request per job.

## Actor input object example

```json
{
  "maxResults": 50,
  "gl": "us",
  "datePosted": "any",
  "fetchJobDetails": false
}
```

# Actor output Schema

## `api` (type: `string`):

REST API endpoint to download the dataset programmatically.

# 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 = {};

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

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

```

## MCP server setup

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