# Google Jobs Scraper - UK, Germany, US Salaries & Apply Links (`kamerozkan/google-jobs-scraper`) Actor

Google Jobs scraper for the UK, Germany, the US and 27 more countries: Google for Jobs listings by keyword and location with title, company, source site, posted date, salary, job type, highlights, full description and all apply links. No login, pay per job.

- **URL**: https://apify.com/kamerozkan/google-jobs-scraper.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (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 $2.40 / 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 - UK, Germany, US Salaries & Apply Links

Scrape Google Jobs (Google for Jobs) listings in the UK, Germany, the US or any other country by
keyword and location, with salary, job type, highlights, the full description and every apply link
resolved to the job site.

### What does Google Jobs Scraper do?

Google Jobs collects job postings from LinkedIn, Indeed, Glassdoor, company career sites and
hundreds of job boards into one search. This Actor runs your Google Jobs searches and returns each
listing as a clean row: title, company, location, the site it came from, when it was posted, salary,
employment type, qualifications, benefits, responsibilities, the full job description and all apply
options with direct URLs. It needs no login, no API key and no proxy setup; results come through
Apify's Google SERP access.

### Who is it for?

- **Recruiters and staffing agencies**: see who is hiring for a role in a city, with salary ranges
  and the original postings, in one table instead of ten job boards.
- **Job boards and aggregators**: feed fresh listings with direct apply links into your own site or app.
- **HR, salary and labour-market analysts**: track demand, salary ranges and employment types for
  roles and regions over time with scheduled runs.
- **Sales and lead-gen teams**: find companies that are hiring right now (a strong buying signal) by
  role and location.

### What data can you get?

| Field | Example |
|---|---|
| `title` | Entry Level Software Developer |
| `companyName` | SkillStorm |
| `location` | New York, NY |
| `via` | LinkedIn (the site Google took the listing from) |
| `postedAgo` | 3 days ago |
| `salary` | $65K–$70K a year |
| `employmentType` | Full-time |
| `extensions` | All chips Google shows: posted, salary, type, benefits such as Health insurance |
| `qualifications`, `benefits`, `responsibilities` | Job highlights as lists (where Google provides them) |
| `description` | Full job description text |
| `applyOptions` | Every apply option: source, direct `url`, Google `googleUrl` |
| `applyUrl` | Direct URL of the first apply option |
| `jobId`, `googleJobsUrl` | Google's job id and a link to the listing on Google Jobs |
| `query`, `position`, `country`, `scrapedAt` | Which search found it, rank, country, time |

Coverage depends on what Google shows per country: in our tests US listings carried highlights and
full descriptions, UK listings full descriptions, and German listings title, company, salary, type
and apply links but no description.

### How much does it cost?

You pay only for jobs delivered: **$3.00 per 1,000 jobs** ($0.003 per job) on the Free plan, with
lower prices on paid Apify plans ($2.70 Bronze, $2.55 Silver, $2.40 Gold and above per 1,000).
Platform usage and the Google SERP access are included in that price.

Worked example: 5 searches return up to 50 jobs, which costs at most 50 x $0.003 = $0.15.
Duplicates across your searches are removed before delivery and are not charged. Set "Max jobs" or
a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Enter one or more searches the way you would type them into Google, for example
   `software engineer jobs in New York` or `nurse jobs in London`. Optionally add **Locations**:
   every query is then run once per location. Google needs a place to show jobs: if a search
   without a place (for example `remote data analyst jobs`) returns nothing, the Actor repeats it
   once with the country name added.
3. Pick the **Country** (Google domain and market). Keep the language empty for English field labels.
4. Click **Start** and download results as JSON, CSV, Excel or via API.

Each search returns up to 10 jobs (Google's first results page). For more jobs, add more specific
searches or more locations, for example one search per city or per seniority level.

### Input example

```json
{
  "queries": ["data analyst jobs", "data engineer jobs"],
  "locations": ["Chicago", "Austin", "Remote"],
  "countryCode": "us",
  "maxItems": 60,
  "resolveApplyLinks": true,
  "includeDescription": true
}
```

### Output example

Real row from QA run nvQXXF153f4fADwtv (default input), lists and description shortened:

```json
{
  "query": "software engineer jobs in New York",
  "country": "US",
  "position": 2,
  "title": "Entry Level Software Developer",
  "companyName": "SkillStorm",
  "location": "New York, NY",
  "via": "LinkedIn",
  "postedAgo": "3 days ago",
  "salary": "$65K–$70K a year",
  "employmentType": "Full-time",
  "extensions": ["3 days ago", "65K–70K a year", "Full-time", "Dental insurance", "Health insurance"],
  "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. ...",
  "applyOptions": [
    {"source": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/entry-level-software-developer-at-skillstorm-4477198635", "googleUrl": "https://www.google.com/goto?url=..."},
    {"source": "Dice", "url": "https://www.dice.com/job-detail/e506586a-5fa1-4a1f-99c2-9ec76ada9677", "googleUrl": "https://www.google.com/goto?url=..."}
  ],
  "applyUrl": "https://www.linkedin.com/jobs/view/entry-level-software-developer-at-skillstorm-4477198635",
  "jobId": "wR4_opIO4fL0CrG7AAAAAA==",
  "googleJobsUrl": "https://www.google.com/search?ibp=htl;jobs&q=software+engineer+jobs+in+New+York&htidocid=wR4_opIO4fL0CrG7AAAAAA%3D%3D...",
  "scrapedAt": "2026-10-11T08:33:45Z"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it daily in Apify,
or connect it to Make, n8n, Zapier, Google Sheets or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/google-jobs-scraper").call(run_input={
    "queries": ["data analyst jobs"], "locations": ["Chicago", "Remote"], "maxItems": 20})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job["salary"], job["applyUrl"])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/kamerozkan~google-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["nurse jobs in London"], "countryCode": "gb", "maxItems": 10}'
```

### FAQ

**How many jobs does one search return?** Up to 10, the jobs Google shows on its first results page.
Use more specific searches or the Locations field to collect more; duplicates are removed for free.

**Are the apply links direct?** Yes. Google's redirect links are resolved to the job site URL
(LinkedIn, Indeed, the company career page and so on). If one cannot be resolved, the Google link is
kept in `url` so you never get an empty link. Turn this off with "Resolve apply links" for faster runs.

**Which countries work?** 30 Google country domains, including the US, UK, Canada, Australia,
India, Germany, France, the Netherlands, Spain, Italy, Brazil and Mexico. Highlights and full
descriptions are shown by Google mostly for English-speaking markets.

**Why are salary or posted date sometimes empty?** Google only shows them when the original posting
has them. `extensions` always holds every chip Google showed.

**Can I monitor new jobs every day?** Yes. Schedule the Actor in Apify with the same input and
compare `jobId` values between runs.

**Is it legal to collect this data?** It collects publicly listed job postings only, published by
employers and job boards. It does not log in anywhere. You are responsible for how you use the data,
including privacy laws like GDPR.

**Something is not working?** Open an issue on the Issues tab with your run link and we will fix it fast.

### Support and feedback

- Found a bug or missing a field? Open an issue on the **Issues** tab of this Actor. We reply within
  48 hours and ship most fixes within a few days.
- Have an idea for a feature? Issues are the fastest way to get it built.
- If the Actor saves you time, a short review on this page helps other users find it.

# Actor input Schema

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

What you would type into Google to find jobs, for example 'software engineer jobs in New York' or 'nurse jobs remote'. Each search returns up to 10 jobs from Google Jobs, so add several queries (or use Locations below) for more.

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

Optional. Every query is run once per location, for example query 'data analyst jobs' with locations 'Chicago', 'Austin', 'Remote'. Leave empty to use the queries as they are.

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

Stop after this many jobs in total. You are charged per job, so this also caps the cost of the run. Duplicates across searches are removed and not charged.

## `countryCode` (type: `string`):

Google country to search in.

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

Google interface language as a 2-letter code. Leave empty for English (recommended): the country above still decides which jobs you get, and job texts stay in their original language. With another language, postedAgo, salary and employmentType stay empty (the values are still in extensions) and highlight sections land in otherHighlights.

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

Turn Google's redirect links into the direct URL on LinkedIn, Indeed, the company career site and so on. If a link cannot be resolved, the Google link is kept.

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

Include the full job description text. Turn off for smaller datasets.

## Actor input object example

```json
{
  "queries": [
    "software engineer jobs in New York"
  ],
  "maxItems": 10,
  "countryCode": "us",
  "resolveApplyLinks": true,
  "includeDescription": true
}
```

# Actor output Schema

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

One row per result in the default dataset.

# 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 New York"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/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 New York"],
    "maxItems": 10,
}

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

```

## MCP server setup

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