# Google Jobs Scraper: Listings, Salaries and Apply Links (`dtkfoundry/google-jobs`) Actor

Google Jobs scraper for job listings in any search and location: title, company, source, salary, job type, benefits, every apply link, Google's job highlights and the full description. Pay per job.

- **URL**: https://apify.com/dtkfoundry/google-jobs.md
- **Developed by:** [DTK Foundry](https://apify.com/dtkfoundry) (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 $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: Listings, Salaries and Apply Links

Job listings from Google Jobs for any search: title, company, location, source, posting age, job type, salary,
benefits, every "Apply on ..." link, Google's job highlights (qualifications, responsibilities, benefits) and
the full description. Search the way you would on Google: "registered nurse jobs in Chicago".

- **Complete jobs, not just cards.** Each job comes with its full description and all of its apply options
  (often 5-8 sites: the employer, LinkedIn, Indeed, ZipRecruiter, Glassdoor ...).
- **More than Google's first 10.** Google shows 10 jobs per search page. Ask for more and the actor also runs
  your search with Google's own filter phrasings ("in the last 3 days", "part time", "contract", "entry level"
  ...) and merges the unique jobs: typically 40-60 per search, up to about 90 with the wider filters. Every
  job says which search found it.
- **Reliable.** Tested on Apify: the first page answered for 80 of 82 varied searches (with up to 3 tries
  each), and a 15-search run at 50 jobs each returned 661 unique jobs with no failed search.
- **Pay per job: $0.003.** Searches that fail or find nothing are never charged, and a job found by two
  searches is delivered and charged once.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | `[]` | One search per line: `software engineer jobs in Austin`, `data analyst remote`, `barista`. "jobs" is added when missing. Empty = a free format example. |
| `location` | string | none | Added to every search that does not mention it: `Denver, CO`. |
| `maxJobsPerQuery` | integer | `30` | 1-100. Above 10, the filter fan-out described above is used. |
| `widerSearch` | boolean | `false` | Also merge Google's "remote", "internship" and "no degree" filters (more jobs, but they can fall outside your location or seniority). |
| `country` | string | `us` | Google country code (`gl`). |
| `language` | string | `en` | Google interface language (`hl`). The filter fan-out works in English only; other languages get the first 10 jobs per search. |
| `includeDescription` | boolean | `true` | Turn off for smaller datasets. |

```json
{
    "queries": ["registered nurse jobs in Chicago", "software engineer jobs in Austin"],
    "maxJobsPerQuery": 50,
    "country": "us",
    "includeDescription": true
}
```

### Output (one record per job)

A real record from a run on 2026-10-20 (lists, links and description shortened):

```json
{
    "query": "warehouse associate jobs near dallas",
    "country": "us",
    "language": "en",
    "status": "ok",
    "rank": 12,
    "matchedSearch": "warehouse associate jobs near dallas in the last 3 days",
    "jobId": "WlkNMbRrGWiv1pvfAAAAAA==",
    "title": "TX Career:Overnight Warehouse Associate in Dallas | Hiring",
    "company": "Amazon",
    "location": "Dallas, TX",
    "via": "Easy Careers",
    "postedAgo": "1 day ago",
    "jobType": "Full-time",
    "salary": "22.58–26.25 an hour",
    "workFromHome": false,
    "tags": [
        "Health insurance",
        "Dental insurance"
    ],
    "applyOptions": [
        {
            "site": "Easy Careers",
            "direct": false,
            "url": "https://www.google.com/goto?url=CAES9AEB6zswFbuM9SYiSESWbtHw16oLmlUqMO..."
        },
        {
            "site": "Amazon Careers",
            "direct": false,
            "url": "https://www.google.com/goto?url=CAES9gEB6zswFb6J_7mdsOo127TfDihev02oiu..."
        }
    ],
    "highlights": {
        "Benefits": [
            "Pay: $22-$26/Hour (approx",
            "$50.8k/Year) Benefits: This role offers competitive pay"
        ],
        "Responsibilities": [
            "The warehouse floor, free from daytime administrative tours, feels more focused and tightly knit",
            "High-Octane Order Processing: Your primary directive is to clear the digital backlog of orders placed during the evening"
        ]
    },
    "description": "Dallas Role Highlights\n\nFlexible Role in Dallas: Overnight Warehouse Associate Company: Amazon Worksite: Dallas, TX\n\nPay: $22-$26/Hour (approx. $50.8k/Year) Benefits: This role offers competitive pay. Set your own schedule.\nPosition Scope\n\nApply your your professional skills skil ...",
    "googleJobsUrl": "https://www.google.com/search?ibp=htl;jobs&q=warehouse%20associate%20jobs%20near%20dallas%20in%20the%20last%203%20days&htidocid=WlkNMbRrGWiv1pvfAAAAAA%3D%3D"
}
```

- `matchedSearch` is the exact search that found the job (your search, or your search plus a filter phrase).
- `postedAgo`, `jobType`, `salary` and `tags` are what Google shows on the job: not every job has a salary.
  `tags` holds the other chips, such as benefits or "No Degree Mentioned".
- `applyOptions[].url` is Google's link to the site (it redirects there when opened). `direct: true` marks the
  employer's own site.
- `highlights` is Google's summary of the posting; `description` is the full text as Google has it.
- A search with no jobs gives one record with `status: "no-results"`; a search that could not be completed
  gives `status: "failed"` and an `error`. Neither is charged.

### Pricing

Pay per event, no subscription.

| Event | Price | When it is charged |
|---|---|---|
| Job | **$0.003** | Once per unique job delivered. 50 jobs = $0.15. |

Set a maximum charge in the run options and the actor stops before it would go over. Apify's standard
run-start event adds $0.00005 per run.

### Limits, stated plainly

- Google returns 10 jobs per search page and loads the rest only inside a browser as you scroll. This actor
  does not drive a browser; it widens your search with Google's own filters instead. For very broad searches
  ("jobs in New York") that is fewer jobs than scrolling Google by hand would show. Splitting a search by title
  or neighborhood finds more.
- Google search pages through Apify's Google proxy are slow: about 30 seconds for 10 jobs and about 3 minutes
  for 50 (the filtered searches run three at a time). Several searches run in parallel.
- Apply links point to Google's redirect, not straight to the job site.
- Public data only: no login, no personal data.

### Privacy

Only your search terms are sent to Google. Results are stored only in your run's dataset. The actor runs with
limited permissions and reads nothing else in your account.

# Actor input Schema

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

One per line, the way you would search Google: "registered nurse jobs in Chicago", "data analyst remote", "barista". "jobs" is added when missing. Leave empty for a free format example.

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

Added to every search that does not mention it, e.g. "Denver, CO" or "remote".

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

Up to 100. Google shows 10 jobs per search page; for more, the actor also runs the search with the phrasings of Google's own filters ("in the last 3 days", "part time", "contract" ...) and merges the unique jobs. Each job is one charged result.

## `widerSearch` (type: `boolean`):

Also merge in Google's "remote", "internship" and "no degree" filters. More jobs, but they can fall outside your location or seniority. English searches only.

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

2-letter country code for Google (gl): us, gb, ca, au, de, in ...

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

Google interface language (hl): en, de, fr, es ... Field names in the results stay the same; chips such as job type are matched in English.

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

The full job description text (often several thousand characters). Turn off for smaller datasets.

## Actor input object example

```json
{
  "queries": [
    "software engineer jobs in Austin",
    "registered nurse jobs in Chicago"
  ],
  "maxJobsPerQuery": 30,
  "widerSearch": false,
  "country": "us",
  "language": "en",
  "includeDescription": true
}
```

# Actor output Schema

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

Every job with company, location, salary, apply links, highlights and description.

## `resultsCsv` (type: `string`):

The same jobs as CSV.

# 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",
        "registered nurse jobs in Chicago"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dtkfoundry/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 jobs in Austin",
        "registered nurse jobs in Chicago",
    ] }

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

```

## MCP server setup

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