# Google Jobs Scraper - Salary, Apply Links & Descriptions (`pro100chok/google-jobs-scraper`) Actor

Scrape Google Jobs by keyword and location: title, employer, location, salary (min/max/currency/period), employment type, remote flag, posting date, full description, requirements and every apply link. Optional employer emails. Export to Excel/CSV/JSON or run via API.

- **URL**: https://apify.com/pro100chok/google-jobs-scraper.md
- **Developed by:** [Raven](https://apify.com/pro100chok) (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.00 / 1,000 job postings

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/platform/actors/running/actors-in-store#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 — Salaries, Apply Links & Full Descriptions

Scrape **Google Jobs** — the aggregated jobs feed Google builds from LinkedIn, Indeed, ZipRecruiter, Glassdoor and thousands of company career sites — by keyword and location, from **$2.40 per 1,000 job postings** on the free plan (from **$2.00 per 1,000** on paid plans). No login, no API key, no code, no proxies to configure. Every posting comes back with **65 fields**: the full job description, a parsed salary, the exact posting age, and **every apply link** Google syndicated — plus optional employer emails.

![Google Jobs Scraper — scrape job postings with salaries, full descriptions and apply links](https://raw.githubusercontent.com/PRO100CHOK/apify-readme-assets/main/google-jobs-scraper/hero.png)

<table>
<tr>
<td colspan="4" style="padding:10px 14px;background:#356AC3;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">Raven &middot; Recruiting &amp; lead generation</span>
<span style="color:#D9E7FD;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Google&nbsp;Jobs &middot; Google&nbsp;Maps &middot; Website&nbsp;contacts &middot; Trustpilot</span>
</td>
</tr>
<tr>
<td style="background:#DDE9FD;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-3INlwRjD5teX8k2Xd-7pqry4x2wP-ff4c675d-3247-4187-a7b5-44dde2e01f49.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/google-jobs-scraper" style="color:#2E5DAB;text-decoration:none;font-weight:700;font-size:13px">Google&nbsp;Jobs&nbsp;Scraper</a></span><br>
<span style="color:#2E5DAB;font-size:11px;font-weight:600">&#10148; You are here</span>
</td>
<td style="background:#F0F5FE;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-w0yugQzf3ETbRbAC2-ehi6JwVR72-ae55cffc-cd6e-481f-bb22-f89a349f7287.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/google-maps-scraper" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">Google&nbsp;Maps&nbsp;Scraper</a></span><br>
<span style="color:#71717A;font-size:11px">Places, emails, reviews</span>
</td>
<td style="background:#F0F5FE;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-1X9ZSt3urlN5pptAO-Nyu91cUNLw-9d50dd18-fb66-400e-85c7-413263018bd8.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/extract-emails" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">Website&nbsp;Contact&nbsp;Scraper</a></span><br>
<span style="color:#71717A;font-size:11px">Bulk emails, phones, socials</span>
</td>
<td style="background:#F0F5FE;padding:10px 12px;border:1px solid #E4E4E7;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-lFLILoeJarJWgpyfA-7BP7SUkgSm-50326886-1a52-4c64-bd8d-be2556872aa9.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/trustpilot-all-in-one-scraper" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">Trustpilot&nbsp;Scraper</a></span><br>
<span style="color:#71717A;font-size:11px">Company reviews & TrustScore</span>
</td>
</tr>
</table>

### What does this Google Jobs Scraper do?

Google has **no public Google Jobs API** — the jobs vertical is a search surface, not a documented endpoint, and it is not covered by any official Google API you can sign up for. This Actor is the **unofficial Google Jobs API**: you give it keywords and locations (or a Google Jobs URL) and it returns structured JSON, CSV or Excel rows.

| You give it | You get back |
|---|---|
| Job titles or keywords (`queries`) | One row per posting, deduplicated by Google's own job id |
| Cities, states or regions (`locations`) | Title, employer, location split into city / state / country |
| Optional filters (date, type, remote, salary) | Parsed salary min/max/currency/period, employment type, work mode |
| Optional Google Jobs URLs (`startUrls`) | Full description + the qualification and responsibility lists Google extracts |
| Optional employer lookup (`scrapeEmails`) | Employer website, public email, phone and social profiles |

Every row also carries **all** application options — on average **5.7 apply links per posting** (LinkedIn, Indeed, SimplyHired, BeBee, the employer's own careers site …), each flagged for whether it applies directly with the employer.

### Why use this scraper?

- ✅ **65 fields per posting** — not a title and a URL, the whole record
- ✅ **Full job descriptions included** — 4,700 characters on average, at no extra cost or extra step
- ✅ **Every apply link, not just one** — 5.7 per posting on average, with `hasDirectApply` marking employer-direct applications
- ✅ **Salaries actually parsed** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, not just the raw string
- ✅ **Absolute posting dates** — `postedAtDate` as UTC ISO-8601 plus `postedHoursAgo`, so you can sort and filter properly
- ✅ **Location split out** — `city`, `state`, `country` as separate fields
- ✅ **Derived classifications** — `workMode` (REMOTE / HYBRID / ONSITE), `seniorityLevel`, `noDegreeRequired`
- ✅ **Employer contacts on demand** — public email, phone and socials from the employer's own website
- ✅ **Job-alert mode** — `onlyNewJobs` remembers postings across runs, so a scheduled run never returns (or bills) the same job twice
- ✅ **Automatic search expansion** — Google shows ~10 postings per search; the Actor asks each keyword several different ways to reach the number you asked for
- ✅ **34 country markets**, results localized by country and language

| | Official Google API | Typical Google Jobs scrapers | This Actor |
|---|---|---|---|
| Availability | No public jobs API exists | Varies | Live, on demand |
| Full description | — | Often a preview or a paid extra step | Always included |
| Apply links | — | Usually one link per posting | All of them, average 5.7 |
| Salary | — | Usually the raw string only | Raw **and** min/max/currency/period |
| Posting date | — | Usually "3 days ago" text only | Text **and** absolute UTC timestamp |
| Employer contacts | — | Rarely | Optional email, phone, socials |
| Cross-run dedup | — | Rarely | `onlyNewJobs` mode |

### What data can you extract from Google Jobs?

**Identity & employer**

| Field | Description |
|---|---|
| `jobId` | Google's own posting id — stable, used for de-duplication |
| `title` | Job title as published |
| `companyName` | Hiring employer |
| `location` | Location as Google shows it, e.g. `New York, NY` |
| `city` / `state` / `country` | Location parsed into components |
| `via` / `sourceBoard` | Board Google syndicated the posting from |
| `companyLogo` | Employer logo image URL |
| `googleJobsUrl` / `shareLink` | Google's own links for the posting |

**Compensation & terms**

| Field | Description |
|---|---|
| `salary` | Salary exactly as displayed, e.g. `137,750–185,000 a year` |
| `salaryMin` / `salaryMax` | Parsed numeric bounds |
| `salaryCurrency` / `salaryPeriod` | e.g. `USD` and `YEAR`, `MONTH`, `HOUR` |
| `hasSalary` | Whether the posting displayed pay at all |
| `employmentType` | `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN`, `TEMPORARY`, `VOLUNTEER` |
| `scheduleType` | Type as Google labels it, e.g. `Full-time and Part-time` |
| `isRemote` / `workMode` | Remote flag, plus `REMOTE` / `HYBRID` / `ONSITE` |
| `seniorityLevel` | `INTERN`, `JUNIOR`, `MID`, `SENIOR`, `LEAD`, `EXECUTIVE` |
| `degreeRequirement` / `noDegreeRequired` | Education requirement Google extracted |
| `benefits`, `hasHealthInsurance`, `hasDentalInsurance`, `hasPaidTimeOff` | Benefit chips and flags |
| `extensions` | Every chip Google displayed, raw and in order |

**Timing**

| Field | Description |
|---|---|
| `postedAt` | Age as printed, e.g. `16 hours ago` |
| `postedAtDate` | Absolute UTC ISO-8601 timestamp |
| `postedHoursAgo` | Age in whole hours |

**Content**

| Field | Description |
|---|---|
| `description` | Full posting text (4,700 characters on average) |
| `descriptionHtml` | Same text with the employer's original HTML markup |
| `descriptionLength` | Character count — handy for filtering out stub listings |
| `qualifications` | Requirements Google identified |
| `responsibilities` | Duties Google identified |
| `benefitHighlights` | Benefit sentences Google identified |

**Application**

| Field | Description |
|---|---|
| `applyLink` | Primary application URL |
| `applyOptions` | Every option: `board`, `url`, `isDirect` |
| `applyOptionsCount` / `applyBoards` | Count and board names |
| `hasDirectApply` | True when at least one option applies on the employer's own site |

**Employer contacts** (only when `scrapeEmails` is enabled)

| Field | Description |
|---|---|
| `companyWebsite` / `companyDomain` | Employer's own site, resolved from the apply links or posting text |
| `email` / `emails` | Public employer addresses, HR and recruiting ones ranked first |
| `phone` | Public phone number, when the site publishes one |
| `linkedin`, `facebook`, `twitter`, `instagram`, `youtube` | Employer social profiles |

**Provenance**

`searchQuery`, `searchLocation`, `searchFilter`, `searchUrl`, `position`, `countryCode`, `languageCode`, `scrapedAt` — so you always know which search produced a row.

### How to scrape Google Jobs step by step

1. Open the Actor in the [Apify Console](https://console.apify.com/) and click **Try for free** — new accounts get **$5 in free credits every month**, no card required.
2. Type your job titles or keywords into **Job titles or keywords**, one per line (e.g. `software engineer`, `registered nurse`).
3. Add one or more **Locations** (e.g. `New York`, `Chicago`). Google's jobs results are strongly location-driven, so this matters more than any other setting.
4. Set **Maximum jobs** — the total you want across all keywords and locations, after de-duplication.
5. Optionally narrow with **Posted within**, **Employment type**, **Remote jobs only** or **Only jobs with a salary**.
6. Click **Start**. Rows appear in the **Output** tab within seconds and keep streaming as they are found.
7. Export from the **Storage** tab as **Excel, CSV, JSON, XML** or pull the dataset from the API.

### How do I get more than 10 jobs per search?

This is the single most common Google Jobs question, so here is the honest answer: **Google's jobs vertical returns about ten postings per search**, and its "load more" control is JavaScript-only. There is no page-2 parameter.

Volume therefore comes from **breadth**, and the Actor handles it for you. With **Expand the search automatically** enabled (the default), each keyword is also asked through:

- Google's own filter chips (**Remote**, **No degree**) — measured to return **10 out of 10 different postings** versus the plain search
- each **employment type** you tick — Google honours one type per search, so each becomes its own search
- seniority and intent wording (**senior**, **junior**, **entry level**, **urgently hiring**, …)
- **recency windows** — a genuinely different cut of Google's index

Everything is de-duplicated by Google's own `jobId`, so slices can overlap freely. In real runs this yields **4.4–6 new postings per Google request**, e.g. 150 unique jobs from 32 requests across 3 keywords × 2 cities.

Practical rules:

- **More keywords and more locations beat everything else.** Two keywords × two cities realistically returns 100+ unique postings.
- One narrow keyword in one small city will run dry — and when it does, the Actor **stops and says so in the log** instead of spending your budget re-fetching the same ten postings.

### How do I get only new jobs? (job-alert mode)

Enable **Only new jobs**. The Actor remembers every posting id it has returned, in its own key-value store, and emits only postings no previous run has produced. Combine it with a **Schedule** and `datePosted: "today"` for a daily or hourly job alert that never returns — or bills — the same posting twice.

### How do I find employer emails?

Enable **Find employer emails, phones and socials**. For each posting the Actor resolves the employer's own website from the apply links (or from a domain printed in the posting text), then reads their contact and about pages for a public address.

Two things make the output usable rather than noisy:

- **The domain has to match the employer.** Google syndicates most postings through job boards, and a board's apply link leads to the board — so a host is only crawled when the employer's own name appears in it. `The Home Depot` → `careers.homedepot.com` is crawled; a generic aggregator domain is not.
- **Recruiting mailboxes rank first**, and hiring-platform or compliance addresses are pushed down or dropped. Real examples from a test run: `talentacquisition@intuit.com`, `physician.recruitment@mountsinai.org`, `cambiacareers@cambiahealth.com`.

Each employer domain is visited **once per run** and shared by all their postings. In a mixed run about **1 posting in 4** yields an employer email — corporate careers sites often publish none at all, and you are only charged when one is actually found.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `queries` | array | Job titles or keywords. Searched in every location. |
| `locations` | array | Cities, states or regions. Adding locations is the main volume lever. |
| `maxItems` | integer | Total cap across all searches, after de-duplication. `0` = no limit. |
| `startUrls` | array | Google Jobs URLs to scrape directly. Legacy `ibp=htl;jobs` links are upgraded. |
| `countryCode` | select | 34 markets. Controls local boards and salary currency. |
| `languageCode` | string | Result language, e.g. `en`, `de`, `es`. |
| `datePosted` | select | `any`, `today`, `3days`, `week`, `month`. |
| `employmentTypes` | array | `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN`, `TEMPORARY`, `VOLUNTEER`. |
| `remoteOnly` | boolean | Remote / work-from-home roles only. |
| `salaryOnly` | boolean | Keep only postings that display pay. |
| `minSalary` | integer | Drop postings below this figure, in the market's own currency. |
| `postedWithinHours` | integer | Exact age cutoff, e.g. `24`. |
| `companyFilter` / `excludeCompanies` | array | Keep or drop employers by name. |
| `viaFilter` | array | Only postings from certain boards, e.g. `LinkedIn`. |
| `titleIncludeKeywords` / `titleExcludeKeywords` | array | Keep or drop by words in the job title. |
| `onlyNewJobs` | boolean | Emit only postings not returned by earlier runs. |
| `scrapeEmails` | boolean | Look up employer email, phone and socials. |
| `skipJobsWithoutEmail` | boolean | Drop postings with no employer email found. |
| `expandSearch` | boolean | Ask each keyword several ways to reach `maxItems`. Default on. |
| `googleDomain` | string | e.g. `www.google.co.uk`. Usually leave as default. |
| `concurrency` | integer | Parallel Google searches, 1–20. Default 6. |
| `maxRetries` | integer | Retries per failed request, 1–12. Default 5. |
| `proxyConfiguration` | object | Used only for employer-website lookups. |

### Ready-to-paste input recipes

**1. Broad multi-city sweep**

```json
{
  "queries": ["software engineer", "data analyst"],
  "locations": ["New York", "Chicago", "Austin"],
  "maxItems": 300,
  "countryCode": "us"
}
```

**2. Daily job alert — fresh postings only**

```json
{
  "queries": ["registered nurse"],
  "locations": ["Chicago"],
  "datePosted": "today",
  "onlyNewJobs": true,
  "maxItems": 100,
  "countryCode": "us"
}
```

**3. Remote roles above a salary floor**

```json
{
  "queries": ["product manager"],
  "locations": ["United States"],
  "remoteOnly": true,
  "salaryOnly": true,
  "minSalary": 120000,
  "maxItems": 150,
  "countryCode": "us"
}
```

**4. Recruiting outreach list — employers with an email**

```json
{
  "queries": ["warehouse operative", "forklift driver"],
  "locations": ["Dallas", "Houston"],
  "scrapeEmails": true,
  "skipJobsWithoutEmail": true,
  "maxItems": 100,
  "countryCode": "us"
}
```

**5. Salary benchmarking across markets**

```json
{
  "queries": ["devops engineer"],
  "locations": ["London", "Manchester", "Edinburgh"],
  "salaryOnly": true,
  "employmentTypes": ["FULLTIME"],
  "maxItems": 250,
  "countryCode": "gb",
  "languageCode": "en"
}
```

**6. Internships, no staffing agencies**

```json
{
  "queries": ["marketing internship"],
  "locations": ["Berlin"],
  "employmentTypes": ["INTERN"],
  "excludeCompanies": ["Randstad", "Adecco", "Manpower"],
  "postedWithinHours": 168,
  "maxItems": 80,
  "countryCode": "de"
}
```

**7. Scrape a Google Jobs URL directly**

```json
{
  "startUrls": ["https://www.google.com/search?q=nurse+jobs+in+chicago&udm=8"],
  "maxItems": 50
}
```

### Output examples

One job posting (trimmed — the real record carries 65 fields):

```json
{
  "jobId": "DBBe-bRgshAtIKeNAAAAAA==",
  "title": "Software Engineer III (Java & AWS)",
  "companyName": "JPMorganChase",
  "location": "New York, NY",
  "city": "New York",
  "state": "NY",
  "via": "LinkedIn",
  "sourceBoard": "LinkedIn",
  "postedAt": "16 hours ago",
  "postedAtDate": "2026-08-19T03:18:20Z",
  "postedHoursAgo": 16,
  "salary": "137,750–185,000 a year",
  "salaryMin": 137750,
  "salaryMax": 185000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "hasSalary": true,
  "employmentType": "FULLTIME",
  "scheduleType": "Full-time",
  "isRemote": false,
  "workMode": "ONSITE",
  "seniorityLevel": "SENIOR",
  "noDegreeRequired": true,
  "degreeRequirement": "No Degree Mentioned",
  "benefits": ["Health insurance", "Dental insurance"],
  "hasHealthInsurance": true,
  "hasDentalInsurance": true,
  "extensions": [
    "16 hours ago",
    "137,750–185,000 a year",
    "Full-time",
    "No Degree Mentioned",
    "Health insurance",
    "Dental insurance"
  ],
  "descriptionLength": 5543,
  "qualifications": [
    "Formal training or certification on software engineering concepts and 3+ years applied experience",
    "Hands-on practical experience in application development, testing and operational stability using Java, Spring Boot, RESTful API, JavaScript technologies"
  ],
  "responsibilities": [
    "Executes standard software solutions, design, development, and technical troubleshooting"
  ],
  "applyLink": "https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4452898282",
  "applyOptionsCount": 6,
  "applyBoards": ["LinkedIn", "Indeed", "BeBee", "Built In", "SimplyHired", "EQuest Jobs"],
  "applyOptions": [
    { "board": "LinkedIn", "url": "https://www.linkedin.com/jobs/view/...", "isDirect": false },
    { "board": "EQuest Jobs", "url": "https://jobs.equest.com/jobs/NY/...", "isDirect": true }
  ],
  "hasDirectApply": true,
  "companyLogo": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSJGlBBMSH3KKcmylT5lMvWctF0mf1Ywm-2xFv5",
  "googleJobsUrl": "https://www.google.com/search?udm=8&q=software+engineer+jobs+in+New+York&htidocid=DBBe-bRgshAtIKeNAAAAAA==",
  "searchQuery": "software engineer in New York",
  "searchLocation": "New York",
  "searchFilter": "base",
  "position": 1,
  "countryCode": "us",
  "languageCode": "en",
  "scrapedAt": "2026-08-19T19:18:20Z"
}
```

With employer contacts (`scrapeEmails: true`), the same record gains:

```json
{
  "companyWebsite": "https://careers.homedepot.com/",
  "companyDomain": "careers.homedepot.com",
  "email": "mythdhr@homedepot.com",
  "emails": ["mythdhr@homedepot.com"],
  "linkedin": "https://www.linkedin.com/company/the-home-depot"
}
```

### How much does it cost to scrape Google Jobs?

Pay per result. You are charged for each posting delivered; the employer-contact lookup is a separate add-on billed **only when a contact is actually found**. Rows that could not be parsed are published for visibility and **never billed**.

| Event | Free plan | Paid plans (from) |
|---|---|---|
| Job posting | $0.0024 | $0.0020 |
| Employer contact (only when found) | $0.0050 | $0.0040 |
| Actor start | $0.0010 | $0.0001 |

Worked examples:

| What you run | Free plan | Paid plans (from) |
|---|---|---|
| 100 postings | $0.24 | $0.20 |
| 1,000 postings | $2.40 | $2.00 |
| 10,000 postings | $24.00 | $20.00 |
| 1,000 postings + 250 employer emails | $3.65 | $3.00 |

On the **free Apify plan you get $5 in credits every month**, which is roughly **2,000 Google Jobs postings** per month at no cost.

The price is **all-in** — there is nothing extra to pay on top of the per-result price, and no separate proxy bill. Set **Max total charge** in the run options to cap any run, and the Actor stops cleanly when it reaches your limit.

### Integrations

Connect Google Jobs data to the rest of your stack without writing glue code:

- **Make** and **Zapier** — trigger on a finished run, push rows onward
- **Google Sheets**, **Airtable**, **Slack**, **Gmail** — send new postings straight to a sheet or channel
- **n8n** — self-hosted automation with the Apify node
- **Webhooks** — fire on run success, failure or dataset item
- **API clients** for [Python](https://docs.apify.com/api/client/python/) and [JavaScript](https://docs.apify.com/api/client/js/), plus a plain REST API
- **Schedules** — run hourly or daily; pair with `onlyNewJobs` for a clean job alert
- **Storage exports** — Excel, CSV, JSON, XML, JSONL, RSS

### Use with AI agents (MCP)

This Actor works as a tool for LLM agents through the **[Apify MCP server](https://mcp.apify.com)**, so Claude, Cursor, VS Code or any MCP-capable client can run job searches and read the results directly.

Example prompt once the Actor is connected:

> Find remote senior data engineer roles in the United States posted in the last 24 hours with a salary above $150k, and give me the employer, the salary range and the direct apply link for each.

### Popular use cases

- **Recruiters & staffing agencies** — build employer lead lists with contact emails, spot who is hiring for which roles
- **Job boards & aggregators** — fill a niche board with fresh, structured postings and working apply links
- **Salary benchmarking & compensation teams** — parsed salary ranges by city, seniority and employment type
- **HR & talent analytics** — hiring-demand trends, remote vs onsite mix, skills appearing in requirements
- **Job seekers & career coaches** — a filtered feed of only the roles that match, with every apply route
- **Market researchers & investors** — headcount-growth signals from posting volume per company
- **AI & LLM apps** — clean job data for RAG, matching engines and résumé-to-role scoring

### Is it legal to scrape Google Jobs?

Scraping **publicly available** job postings is generally legal, and this Actor only ever reads pages any visitor can open — no login, no paywall, no private data. Job postings are published by employers precisely to be found and shared.

Two cautions worth taking seriously:

- Employer contact details can be **personal data** under GDPR, CCPA and similar laws. If you collect them, have a lawful basis, respect opt-outs and keep only what you need.
- Google's terms and the terms of the originating boards apply to how you **republish** data. Aggregating for analysis is a very different act from re-hosting listings wholesale.

For a deeper treatment, see Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### FAQ

#### Does Google Jobs have a public API?

No. Google does not offer a documented, sign-up API for its jobs vertical. This Actor is the practical alternative: same data, delivered as JSON, CSV or Excel.

#### Why did I get fewer jobs than I asked for?

Google returns about ten postings per search, and each of the Actor's alternative searches overlaps the previous ones. When a keyword and location combination genuinely runs out of new postings, the run stops and logs that it did — rather than burning budget on repeats. Add more keywords or more locations to go wider.

#### How many jobs can I get for one keyword?

One keyword in one city typically yields 30–60 unique postings once every angle has been tried. Two keywords across two cities realistically returns 100+. Volume scales with keywords × locations, not with a page number.

#### Do I need proxies or a Google account?

No. There is nothing to configure — no login, no cookies, no API key, and no proxy setup. The proxy input only affects the optional employer-website lookup.

#### Can I export to CSV or Excel?

Yes. Every run's dataset exports to Excel, CSV, JSON, XML, JSONL and RSS from the Storage tab, or via the API.

#### Which countries work best?

The US, UK, Canada, Australia, India, Singapore, the UAE and South Africa return the richest results. Google has wound its jobs widget down across much of the EU, so German, French, Spanish and Italian searches return few or no postings.

#### Are the job descriptions complete?

Yes — the full posting text arrives with the listing, averaging about 4,700 characters, along with the qualification and responsibility lists Google extracts. There is no second request and no extra charge for it.

#### Why do some postings have no salary or no date?

Because Google did not display one. In real runs about **35–39%** of postings show a salary and about **86–95%** show a posting date; the rest simply do not publish it. Use `salaryOnly` if you want only the ones that do.

#### Will I be charged for searches that return nothing?

No. Charging is per delivered posting, so a search that returns no results costs nothing beyond the Actor start event. Rows that fail to parse are also never billed.

#### Will I be charged twice for the same job?

Not within a run — everything is de-duplicated by Google's job id. Across runs, enable `onlyNewJobs` and previously returned postings are skipped before they are ever billed.

#### How do I get employer email addresses?

Enable `scrapeEmails`. The Actor resolves the employer's own website from the posting's apply links and reads their public contact pages. Roughly one posting in four yields an email; you are charged only when one is found.

#### Why is the `phone` field often empty?

Only numbers published as real `tel:` links are taken. Digit runs in page text are far more often a job id or a statistic, and a wrong phone number is worse than no phone number.

#### Can I filter to remote jobs only?

Yes — `remoteOnly` uses Google's own remote filter and also checks the posting itself. Every row additionally carries `workMode` set to `REMOTE`, `HYBRID` or `ONSITE`.

#### Can I run this on a schedule?

Yes. Use Apify Schedules, and combine `datePosted: "today"` with `onlyNewJobs: true` for a job alert that only ever shows you new postings.

#### Does it return coordinates or company ratings?

No. Google's jobs vertical does not publish latitude/longitude or employer star ratings on these pages, so the Actor does not claim to provide them.

### Feedback & support

Found a problem or need a field that is missing? Open an issue on the Actor's **Issues** tab with your input JSON and, if possible, a shared run link — that is the fastest route to a fix. Feature requests are welcome there too.

### More scrapers by Raven

**Lead generation & contacts**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-w0yugQzf3ETbRbAC2-ehi6JwVR72-ae55cffc-cd6e-481f-bb22-f89a349f7287.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Google Maps Scraper](https://apify.com/pro100chok/google-maps-scraper)** — Places, emails, reviews, photos & hours
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-1X9ZSt3urlN5pptAO-Nyu91cUNLw-9d50dd18-fb66-400e-85c7-413263018bd8.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Website Contact Scraper](https://apify.com/pro100chok/extract-emails)** — Bulk emails, phones & socials from any site list
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-JqqB6QS6amqcpfgE3-BLZ8dE1o0T-5ca2b9db-4363-49b9-839f-c0fc336567a0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TikTok Profile Scraper](https://apify.com/pro100chok/tiktok-profile-pro)** — Profiles, contacts & analytics
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z01iuGOkBqJUvTaUn-xpWgbgKXLn-8ae33b0d-b338-4184-a1cd-2565a3f82a98.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Facebook Ads Library Scraper](https://apify.com/pro100chok/meta-ads-library-scraper)** — Meta & Instagram ad creatives and spend

**SEO & web intelligence**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-pC8gsptNv2RwJm0QE-W9y7YrikQ2-Gemini_Generated_Image_sweylvsweylvswey.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Ahrefs SEO Scraper](https://apify.com/pro100chok/ahrefs-seo-tools)** — DR, backlinks, keywords & traffic
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-9FWL3X6mVI2izVfeJ-4DKlEMxqE4-26ac0cec-e6fd-4020-abbb-d4d8885f3bf1.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Semrush Scraper](https://apify.com/pro100chok/semrush-scraper)** — Domain traffic, authority & backlinks
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-aqPbs3KeH9aD8b22w-7uDzdHiNaF-9358b53b-cd06-42f2-bc53-6c5ac7d9558c.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[SimilarWeb Scraper](https://apify.com/pro100chok/similarweb-scraper)** — Website traffic, rankings & audience

**Reviews & business data**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-lFLILoeJarJWgpyfA-7BP7SUkgSm-50326886-1a52-4c64-bd8d-be2556872aa9.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Trustpilot Scraper](https://apify.com/pro100chok/trustpilot-all-in-one-scraper)** — Reviews, company data & TrustScore
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Jwxb2NnpjBqbwi3JH-4dKwhMiZZZ-5d4c5e15-276d-4891-af28-db4e69ee7c77.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[G2 Scraper](https://apify.com/pro100chok/g2-scraper)** — Software reviews, ratings & competitors
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-caoIAzJRQpPYIg12M-tRWDnGB6Xs-7d9d7a8f-dbff-412c-b8ee-789318d445f2.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TripAdvisor Scraper](https://apify.com/pro100chok/tripadvisor-all-in-one)** — Hotels, restaurants & reviews

**Social media**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-7fyOP12UzHR5Zlnc5-j1W3HZr7l6-cba15940-85de-4f61-b150-a2401b420876.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Instagram Scraper](https://apify.com/pro100chok/instagram-scraper-all-in-one)** — Profiles, posts, followers & comments
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ghOKnIbTDC0SWZw8d-u6S7UJLN3o-Gemini_Generated_Image_67uo2167uo2167uo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Threads Scraper](https://apify.com/pro100chok/threads-scraper-usage)** — Posts, profiles & replies
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Uj3ZMPy7TF7mva0cS-8PeAb55WaO-f7a3aba8-97a5-40be-b4c0-aa0d29819722.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Reddit Scraper](https://apify.com/pro100chok/reddit-scraper-all-in-one)** — Posts, comments, users & subreddits
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ZgqqqOMdHEIwgTqnj-lmCG4i7xP0-76e561e2-9f4d-44a2-aa6d-922b86e2833f.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[YouTube Scraper](https://apify.com/pro100chok/youtube-scraper-all-in-one)** — Videos, transcripts & comments
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-whxpPO8sOs8OF6dd0-3xUlLeWRav-92d40d46-7a32-4031-bf05-04b3338d5b30.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Pinterest Scraper](https://apify.com/pro100chok/pinterest-scraper-all-in-one)** — Pins, profiles & boards

**E-commerce**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-kaoNl8Aod80TyV1eZ-HMK8j1Pfit-6e72a428-ec01-4d5e-b2fa-80fc6313a008.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Amazon Scraper](https://apify.com/pro100chok/amazon-scraper)** — Products, reviews, sellers & best sellers
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-mBQQG1GlbZlkcetR5-eMoPkpmd5b-71e03f8b-8565-41c8-8fc8-fe73a3dd6f12.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[AliExpress Scraper](https://apify.com/pro100chok/aliexpress-scraper)** — Products, variants & reviews
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-BVortsfndmSNtL0Mq-dikv6hX55m-4b204a93-b28c-4951-aa28-d72b1650900c.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Alibaba Scraper](https://apify.com/pro100chok/alibaba-scraper)** — Products, suppliers & prices
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-FzXXmis0AF2EYyyii-53r5wDrRmH-5ed275b8-951f-4995-a100-189ea3a131d0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TikTok Shop Scraper](https://apify.com/pro100chok/tiktok-shop-scraper-usage)** — Products, shops & analytics
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-r3YXQ95TB2FiMAMDE-hLw7rKePQh-5fb846a2-1b5c-4ebf-ac90-dce3c1e1bcb8.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[RedNote (Xiaohongshu) Scraper](https://apify.com/pro100chok/rednote-xiaohongshu-scraper)** — Notes, creators & comments

**Real estate & travel**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z8DnUeXHDZ8h3bwz5-GDpI3VmWWb-a7fb663b-39ca-4e6b-a8aa-579b94bee1b1.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Zillow Scraper](https://apify.com/pro100chok/zillow-scraper-all-in-one)** — Listings & agent leads
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-vness86lujcu7VTrh-auosYMY7dG-d2bc6ff1-0fba-4ff7-850b-ad33072e09f0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Realtor.com Scraper](https://apify.com/pro100chok/realtor-com-scraper)** — Listings, details & agents
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-2bXBHs5BF7iBki2rV-8EhrRpAVWj-c84534b4-ba6f-4d40-8d93-801e9658109b.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Apartments.com Scraper](https://apify.com/pro100chok/apartments-scraper-usage)** — Rentals, prices & reviews
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z2kaPRD9dlPAfA95f-87i0TUrkQC-cb5e7474-9c72-45e9-ad20-1c1140238495.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Idealista Scraper](https://apify.com/pro100chok/idealista-scraper)** — Properties, prices & agencies
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ndx8v7vE2UZLdaPh3-NC4fnRCqgk-da7cb5e3-a110-4774-9f5a-0672d4a60ccf.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Booking.com Scraper](https://apify.com/pro100chok/booking-all-in-one-scraper)** — Hotels, prices & reviews

**Tags:** google jobs scraper, google jobs api, scrape google jobs, google for jobs scraper, job scraper, job listings api, job postings scraper, salary data scraper, apply links scraper, employer email scraper, recruiting leads, hiring data, job board data, remote jobs scraper, job alert automation, ats data, talent intelligence, labor market data, jobs dataset, google search jobs, no code job scraper, job data export csv excel

# Actor input Schema

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

What to search for on Google Jobs — job titles, skills or free-text phrases. Every keyword is searched in every location, so this is the main lever for volume. Examples: "software engineer", "registered nurse", "warehouse operative".

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

Cities, states or regions to search in, e.g. "New York", "London", "Texas". IMPORTANT: Google's jobs results are strongly location-driven — a keyword searched with no location returns far fewer postings. Adding locations is the most reliable way to get more jobs.

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

Hard cap on the total number of jobs returned across all keywords and locations, after de-duplication. Set 0 for no limit (the run then stops when Google has no new postings left). Google shows ~10 jobs per search, so the realistic ceiling is roughly keywords x locations x 60.

## `startUrls` (type: `array`):

Paste any Google jobs-vertical URL to scrape it directly, e.g. https://www.google.com/search?q=nurse+jobs+in+chicago\&udm=8. Older ibp=htl;jobs links are accepted and upgraded automatically. Use this instead of keywords when you already have a search URL you like.

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

Which country's Google results to use. This controls which local job boards appear and which currency salaries are reported in. NOTE: Google has wound its jobs widget down across much of the EU — the US, UK, Canada, Australia, India and Singapore return the richest results.

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

Two-letter language code for the results, e.g. "en", "de", "es". Job titles, descriptions and date labels come back in this language. Match it to your chosen country for the best coverage.

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

Only return jobs published in this window. Because Google returns about ten jobs per search, filtering here gives you ten FRESH postings instead of ten mixed-age ones. Choose "Any time" to disable.

## `employmentTypes` (type: `array`):

Only return these employment types. Google honours one type per search, so each type you tick becomes its own search — which WIDENS coverage as well as filtering, because each type returns a largely different set of postings. Leave empty for all types.

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

Only return remote / work-from-home roles, using Google's own remote filter plus a check on the posting itself. Enable this when you want work-from-home listings exclusively.

## `salaryOnly` (type: `boolean`):

Keep only postings where Google displayed a salary. Roughly a third of listings show one, so this filter cuts volume substantially — raise Maximum jobs to compensate.

## `minSalary` (type: `integer`):

Drop postings whose advertised salary is below this number, in the country's own currency and in whatever period the posting uses (yearly, hourly, …). Leave 0 to keep every salary. Postings without a salary are dropped by this filter.

## `postedWithinHours` (type: `integer`):

Keep only postings published in the last N hours, checked against the exact age Google reports. 24 = last day, 168 = last week. Leave 0 to keep all ages. Useful for hourly job alerts where the "Posted within" dropdown is too coarse.

## `companyFilter` (type: `array`):

Keep only postings whose employer name contains one of these values (case-insensitive). Example: "Amazon", "Google". Leave empty for all employers.

## `excludeCompanies` (type: `array`):

Drop postings whose employer name contains one of these values. Useful for filtering out staffing agencies and recruitment mills that repost the same roles.

## `viaFilter` (type: `array`):

Keep only postings Google syndicated from these boards, matched against the "via" field and the apply links. Example: "LinkedIn", "Indeed". Leave empty for all sources.

## `titleIncludeKeywords` (type: `array`):

Keep only postings whose job title contains one of these words. Use it to tighten a broad search, e.g. keep only "senior" or "lead" roles.

## `titleExcludeKeywords` (type: `array`):

Drop postings whose job title contains one of these words, e.g. "intern", "unpaid", "commission".

## `onlyNewJobs` (type: `boolean`):

Return only postings no previous run of this Actor has already returned. Job identity is remembered in the Actor's key-value store, so scheduling this daily gives you a clean job alert and you are never charged twice for the same posting.

## `scrapeEmails` (type: `boolean`):

For each posting, resolve the employer's own website from the apply links and scrape its contact and about pages for a public email address, phone number and social profiles. Adds the email, emails, phone, companyWebsite, linkedin and facebook fields. Each employer site is visited once per run and shared by all their postings.

## `skipJobsWithoutEmail` (type: `boolean`):

Drop postings for which no employer email could be found. Requires the employer contact option above. Turn this on when you are building a recruiting outreach list rather than a job feed.

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

Google returns only ten jobs per search, so the Actor asks each keyword several different ways — its own filter chips, employment types, seniority wording and recency windows — to reach the number of jobs you asked for. Turn this off to run only your exact keywords and get at most ten jobs each.

## `googleDomain` (type: `string`):

Which Google domain to query, e.g. "www.google.co.uk" or "www.google.ca". Leave as the default unless you specifically need a country domain; the Country setting above already localizes the results.

## `concurrency` (type: `integer`):

How many Google searches run at the same time. Higher is faster; 6 is a good balance. Lower it only if you want a gentler, slower run.

## `maxRetries` (type: `integer`):

How many times a single failed Google request is retried on a fresh connection before that search slice is skipped. The default handles normal hiccups; raise it for very large runs on slow networks.

## `proxyConfiguration` (type: `object`):

Proxy used when visiting employer websites for the email lookup. Google itself is always fetched through the Actor's own built-in route, so this setting has no effect unless the employer contact option is enabled. Residential proxies give the best results on company sites.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "New York"
  ],
  "maxItems": 100,
  "startUrls": [],
  "countryCode": "us",
  "languageCode": "en",
  "datePosted": "any",
  "employmentTypes": [],
  "remoteOnly": false,
  "salaryOnly": false,
  "minSalary": 0,
  "postedWithinHours": 0,
  "companyFilter": [],
  "excludeCompanies": [],
  "viaFilter": [],
  "titleIncludeKeywords": [],
  "titleExcludeKeywords": [],
  "onlyNewJobs": false,
  "scrapeEmails": false,
  "skipJobsWithoutEmail": false,
  "expandSearch": true,
  "googleDomain": "www.google.com",
  "concurrency": 6,
  "maxRetries": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `salaries` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `applyLinks` (type: `string`):

No description

## `full` (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"
    ],
    "locations": [
        "New York"
    ],
    "maxItems": 100,
    "countryCode": "us",
    "languageCode": "en",
    "datePosted": "any",
    "concurrency": 6
};

// Run the Actor and wait for it to finish
const run = await client.actor("pro100chok/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"],
    "locations": ["New York"],
    "maxItems": 100,
    "countryCode": "us",
    "languageCode": "en",
    "datePosted": "any",
    "concurrency": 6,
}

# Run the Actor and wait for it to finish
run = client.actor("pro100chok/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"
  ],
  "locations": [
    "New York"
  ],
  "maxItems": 100,
  "countryCode": "us",
  "languageCode": "en",
  "datePosted": "any",
  "concurrency": 6
}' |
apify call pro100chok/google-jobs-scraper --silent --output-dataset

```

## MCP server setup

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