# Google Job Scraper (`crawl_craft/google-job-scraper`) Actor

Copying listings from Google Jobs by hand is slow, and pay is buried in text. Scrape Google Jobs in any country: title, company, location, salary as numbers, posting date, apply links and full description, with remote, date and pay filters. No duplicates.

- **URL**: https://apify.com/crawl_craft/google-job-scraper.md
- **Developed by:** [Crawl Craft](https://apify.com/crawl_craft) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What is Google Job Scraper?

Google Job Scraper is an Apify Actor and Google Jobs scraper that turns Google Jobs searches into clean rows with title, company, location, salary, posting date, apply links, highlights and the full description. Paste search links or plain phrases, add filters, and download the dataset. No Google account is needed.

- **Bulk searches:** Add many links, phrases and locations when you scrape job data for several roles and cities in one run.
- **Pay as numbers:** Salary comes as text plus minimum, maximum, currency, period and yearly equivalents whenever Google or the description shows it.
- **Every apply link:** Each job lists the places it can be applied for, plus a direct apply link on the employer's own site when one exists.
- **Filters for hiring work:** Narrow results by remote work, no degree, date posted, job type, seniority, salary and title words.
- **Only new jobs:** Scheduled runs can skip jobs the Actor already returned in earlier runs of your account.

Quick start: click **Try for free**, paste a link or phrase, and press **Start**.

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

Every job row from this Google Jobs data extractor holds the fields below, and a value stays empty (null) when Google shows nothing for it. Rows also carry a few more fields that are not listed here. Download the dataset as JSON, CSV, Excel, XML or HTML.

| Field | Description | Example |
|---|---|---|
| `position` | Order in which the job was found within its search. | 1 |
| `job_id` | Google's own ID of the job. | CS0hxrtrAnLdRsRNAAAAAA== |
| `title` | Title of the job posting. | Staff+ Fullstack Software Engineer |
| `company_name` | Employer that posted the job. | Anthropic |
| `location` | Where the job is located. | New York, NY |
| `search_location` | The location you searched for (empty when none was given). | New York, NY |
| `via` | Source Google shows the job from. | via LinkedIn |
| `is_remote` | True when the job can be done remotely. | false |
| `employment_type` | FULL_TIME, PART_TIME, CONTRACTOR, INTERN, TEMPORARY, PER_DIEM or VOLUNTEER. | FULL_TIME |
| `schedule_type` | Schedule exactly as Google writes it. | Full-time |
| `posted_at` | Posting age as Google writes it. | 1 day ago |
| `posted_at_datetime` | Estimated posting time in ISO format. | 2026-10-09T19:57:11+00:00 |
| `posted_hours_ago` | Estimated hours since the job was posted. | 24.0 |
| `salary` | Salary range as shown by Google or found in the description. | Range text with currency |
| `salary_min` | Lower end of the pay range. | 405000 |
| `salary_max` | Upper end of the pay range. | 485000 |
| `salary_currency` | Currency code of the pay range. | USD |
| `salary_period` | HOUR, DAY, WEEK, MONTH or YEAR. | YEAR |
| `salary_annual_min` | Lower end converted to a year. | 405000 |
| `salary_annual_max` | Upper end converted to a year. | 485000 |
| `salary_source` | `google` when Google shows the pay, `description` when it was found in the text. | description |
| `seniority_level` | INTERN, ENTRY, MID, SENIOR, LEAD, PRINCIPAL or EXECUTIVE, guessed from the title. | PRINCIPAL |
| `experience_years_min` | Smallest number of years the posting asks for. | 8 |
| `no_degree_mentioned` | True when the posting says no degree is required. | false |
| `direct_apply_link` | Apply link on the employer's own site or hiring system, when one exists. | https://boards.greenhouse.io/example/jobs/1 |
| `apply_options` | Every place to apply: title, link, domain, link type and hiring system. | Array of apply options |
| `apply_platforms_count` | How many places the job can be applied for. | 8 |
| `description` | Full job description text. | About the role ... |
| `description_length` | Number of characters in the description. | 6774 |
| `job_highlights` | Qualifications, responsibilities and benefits lists. | Array of highlight lists |
| `detected_extensions` | Job tags sorted into posted_at, schedule_type, benefits and similar. | posted_at: 1 day ago, schedule_type: Full-time |
| `extensions` | Short tags Google shows next to the job. | 1 day ago, Full-time |
| `thumbnail` | Employer logo link. | https://encrypted-tbn0.gstatic.com/images?q=tbn:example |
| `share_link` | Link that opens this job on Google. | https://www.google.com/search?q=example\&job=example |
| `duplicate_postings_count` | How many other copies of the same job Google merged into this one. | 7 |
| `query` | The phrase this job was found with. | software engineer |
| `country` | Country code the search ran for. | us |
| `language` | Interface language of the results. | en |
| `google_domain` | Google site that was searched. | `google.com` |
| `search_timestamp` | When the search started. | 2026-10-10T19:57:09+00:00 |
| `total_jobs_found` | Unique jobs found in this search up to the page where this job appeared. | 151 |

A Google Jobs extractor is most useful when pay and apply links must sit in the same row, and every job row has fields for both, filled when the data is available.

### Use cases for Google Jobs data

- **Salary benchmarking:** Compare pay ranges by role and city with `salary_annual_min` and `salary_annual_max` to build job salary data you can sort and chart.

- **Pay across countries:** Track Google Jobs salary figures for one role by changing `country` and `googleDomain` between runs.

- **Job board feeds:** Feed your own board or job aggregator API with fresh listings, apply links and company names.

- **Labor market research:** Build a job postings dataset from `title`, `seniority_level`, `experience_years_min` and `location` for trend analysis.

- **Remote and entry-level search:** Save a Google Jobs remote no degree search with the `remoteOnly` and `noDegreeOnly` options.

- **Hiring dashboards:** Power your own job market data API or dashboard with scheduled runs and the `posted_at_datetime` field.

- **Ongoing monitoring:** Keep a job postings database current by scheduling runs with `skipSeenJobs` turned on.

Teams that need a Google Jobs listings scraper for several countries can set `country` and `googleDomain` per run.

### How to scrape Google Jobs listings

You can extract Google Jobs for several roles and cities in one run. Follow these steps:

1. Create a free Apify account.
2. Open Google Job Scraper in Apify Store.
3. Add one Google Jobs link or search phrase per line in the **Google Jobs links or search phrases** field (`urls`), and add cities in **Locations** (`locations`).
4. Pick filters such as **Date posted**, **Job types** or **Remote jobs only**.
5. Click **Start** and wait for the run to finish.
6. Open the dataset and download it in the format you prefer.

#### How to download Google Jobs as CSV or Excel

Open the finished run, go to the dataset, choose CSV or Excel, and download the file. Google Jobs to CSV takes one download from the dataset.

Google Jobs to Excel works the same way. A Google Jobs export in JSON, XML or HTML uses the same dataset page.

Pick the format you need, and the dataset gives you a Google Jobs downloader for these files.

### How much does it cost to use Google Job Scraper?

Google Job Scraper uses tiered pay-per-event pricing: **$25 per 1,000 results on the Free plan, and less on paid plans**. One result is one saved job row (the `main_result` event, shown as Results in the Console). Each run also has a tiny Actor Start event of $0.00005 per run start.

| Apify plan | Price per 1,000 results |
|---|---|
| Free | $25 |
| Bronze | $22.5 |
| Silver | $20 |
| Gold / Platinum / Diamond | $17.5 |

On the Free plan price, a run that saves 1,000 jobs costs $25 for the results, plus the start event. Free plan users get a job scraper free to try, limited to 10 jobs per run with no monthly limit, and paid plans have no per-run job cap. When the spend limit for the run is reached, the run stops cleanly.

See the Pricing tab for current rates.

### Input

Google Job Scraper needs at least one Google Jobs link or search phrase in `urls`. Each line you add runs as a separate search in the Google Jobs search scraper. The Google Jobs scraping tool accepts links copied from Google Jobs or plain phrases such as `data analyst remote`.

![Job scraper tool input form with Google Jobs search phrases and locations](IMAGE_URL_PLACEHOLDER "google-job-scraper-input-form.png")

See the Input tab for every option. The main groups are:

- **What to search:** `urls`, `queries`, `locations`, `country`, `googleDomain`, `language`, `radiusKm`, `datePosted`, `employmentTypes`.
- **Result filters:** `remoteOnly`, `noDegreeOnly`, `strictFilters`, `salaryMinAnnual`, `requireSalary`, `directApplyOnly`, `maxPostedHoursAgo`, `titleMustInclude`, `titleMustExclude`, `excludeCompanies`, `excludeVia`, `seniorityLevels`.
- **Volume:** `maxResultsPerSearch`, `maxResultsTotal`, `maxPagesPerSearch`, `maxScanned`. A value of 0 means no cap for the first three.
- **Duplicates and monitoring:** `dedupeAcrossSearches`, `fuzzyDedupe`, `skipSeenJobs`.
- **Output options:** `includeDescription`, `includeHighlights`, `includeApplyOptions`, `includeRawExtensions`.
- **Speed and reliability:** `concurrency`, `requestDelay`, `maxRetries`, `proxyConfiguration`.

Example input (values taken from the input form's pre-filled and default values):

```json
{
  "urls": ["software engineer"],
  "locations": ["London"],
  "googleDomain": "google.com",
  "datePosted": "any",
  "includeDescription": true
}
```

💡 Start with a small run to check your filters before you scale up. ⚠️ The free plan stops each run at 10 jobs.

### Output

The scraped results are shown as a dataset in the **Storage** tab. The table view is for convenience and doesn't show **all the fields**.

![Google Job Scraper output table with job title, company and salary](IMAGE_URL_PLACEHOLDER "google-job-scraper-output-table.png")

The output opens in separate tables: Overview, Salary, Job details, Apply options, Apply links, Description, Highlights and Search info. A run summary with the counts of the run is saved in the key-value store. Export formats:

- JSON
- CSV
- Excel
- XML
- HTML

Every row from this Google job postings scraper is one posting with its own `job_id`. Example output (illustrative values from the dataset schema, not a captured run and not tied to the example input above; the `salary` text is left out here):

```json
{
  "position": 1,
  "job_id": "CS0hxrtrAnLdRsRNAAAAAA==",
  "title": "Staff+ Fullstack Software Engineer",
  "company_name": "Anthropic",
  "location": "New York, NY",
  "search_location": "New York, NY",
  "via": "via LinkedIn",
  "is_remote": false,
  "employment_type": "FULL_TIME",
  "schedule_type": "Full-time",
  "posted_at": "1 day ago",
  "posted_at_datetime": "2026-10-09T19:57:11+00:00",
  "posted_hours_ago": 24.0,
  "salary_min": 405000,
  "salary_max": 485000,
  "salary_currency": "USD",
  "salary_period": "YEAR",
  "salary_annual_min": 405000,
  "salary_annual_max": 485000,
  "salary_source": "description",
  "seniority_level": "PRINCIPAL",
  "experience_years_min": 8,
  "no_degree_mentioned": false,
  "direct_apply_link": "https://boards.greenhouse.io/example/jobs/1",
  "apply_options": [
    {
      "title": "Apply on LinkedIn",
      "link": "https://www.linkedin.com/jobs/view/1",
      "domain": "linkedin.com",
      "link_type": "job_board",
      "ats": null
    }
  ],
  "apply_platforms_count": 8,
  "description": "About the role ...",
  "description_length": 6774,
  "job_highlights": [
    {
      "title": "Qualifications",
      "items": ["8+ years of experience"],
      "truncated_items": 11
    }
  ],
  "detected_extensions": {
    "posted_at": "1 day ago",
    "schedule_type": "Full-time"
  },
  "extensions": ["1 day ago", "Full-time"],
  "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:example",
  "share_link": "https://www.google.com/search?q=example&job=example",
  "duplicate_postings_count": 7,
  "query": "software engineer",
  "country": "us",
  "language": "en",
  "google_domain": "google.com",
  "search_timestamp": "2026-10-10T19:57:09+00:00",
  "total_jobs_found": 151
}
```

### Limitations and error handling

- The free plan saves up to 10 jobs per run. Paid plans have no per-run job cap, and `maxResultsTotal` sets your own overall limit.
- The Google Jobs results scraper saves only what Google lists, so the number of jobs per search varies.
- Scraping Google Jobs without a location can return no jobs in some countries, so add a location when a search comes back empty.
- Forcing English in `language` can return no jobs in countries such as the Netherlands, Germany, Spain, Brazil or Japan. Leaving it empty is usually best.
- Salary is filled only when Google shows it or the description contains it, and jobs without pay are dropped when you set `salaryMinAnnual` or `requireSalary`.
- `seniority_level` is guessed from the job title, and `posted_at_datetime` and `posted_hours_ago` are estimates based on the age Google shows.
- `radiusKm` is a hint, so it may change little.
- Only public listings are collected, and no private data or login-only pages.

If Google Jobs cannot be reached, the run ends with a clear message, and everything collected up to that point is already saved. The run summary also records why each search stopped.

### Integrating Google Job Scraper with other apps

Run Google Job Scraper from code or on a schedule, and use webhooks to react when a run finishes. See the API tab for ready-made JavaScript, Python and CLI snippets.

- Run the Actor from code and you get a Google Jobs scraping API without managing servers.

- Call the Actor from Python or Node.js and treat the Apify API as a job scraper API.

- Pair the Actor with [webhooks](https://docs.apify.com/platform/integrations/webhooks) to push each finished run into your own job posting API or database.

- The dataset endpoint works like a simple job listings API for your scripts.

- Pick [integrations](https://docs.apify.com/platform/integrations) such as Make, Zapier or Google Sheets to move rows into other tools.

- Use [schedules](https://docs.apify.com/platform/schedules) to repeat a search daily, and combine them with `skipSeenJobs` to receive only new jobs.

- The [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) can expose Actors to AI agents.

### Other Actors by crawl_craft

#### A related job-data Actor

- [Ats Jobs API](https://apify.com/crawl_craft/ats-jobs-api): paste Greenhouse, Lever or Ashby board links and get open jobs as JSON with title, salary, location, skills, requirements, benefits and company profile. Use it when you need to scrape job postings straight from company career boards instead of Google Jobs. Developers who want a job data API for company career pages can start there.

#### More Apify Actors by crawl_craft

These Actors come from the same account and are not related to Google Jobs.

- [Telegram Scraper](https://apify.com/crawl_craft/telegram-scraper): scrape public Telegram channels in bulk for messages, views, reactions, media, links, polls and subscriber counts.
- [Apple App Store Review Scraper](https://apify.com/crawl_craft/apple-app-store-review-scraper): scrape App Store reviews with stars, text, app version, helpful votes and developer replies.

### Is it legal to collect Google Jobs data?

Google Job Scraper only extracts data that users have made publicly available on Google Jobs and does not extract private data such as email addresses or location. Results may still contain personal data, so collect it only with a legitimate reason and consider the GDPR (Regulation (EU) 2016/679) and the terms of the sites involved. Consult a lawyer if you are unsure.

Read Apify's posts on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) and [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/) for more background.

### FAQ

#### How much does Google Job Scraper cost?

It costs $25 per 1,000 results at the Free plan price and less on paid plans, plus an Actor Start event of $0.00005 per run start. The free plan saves up to 10 jobs per run.

#### Is there a Google Jobs API?

You can run Google Job Scraper and read the results through the Apify API, so your code gets JSON rows without a Google account. Start a run, then read the dataset items. That gives you job posting data API access to Google Jobs without hosting anything.

#### Do I need a Google account or API key?

No. The Actor needs no Google account, and you only need an Apify account to run it.

#### How many jobs can I get per run?

Free plan runs save up to 10 jobs. On paid plans you set the limits yourself with `maxResultsPerSearch` and `maxResultsTotal`, and the real count depends on what Google lists for each search.

#### Is this a SerpApi Google Jobs alternative?

It can cover similar Google Jobs searches by phrase, location, country and filters. The output field names are this Actor's own, listed above, so check them against what your code expects.

#### Is this a job board scraper?

Not exactly. Google Job Scraper reads Google Jobs, and the `via` field names the source of each listing. It does not scrape job boards one by one, so use Ats Jobs API for Greenhouse, Lever or Ashby company boards.

#### Is this a Google Jobs crawler?

No. The Actor reads the Google Jobs search results you ask for and saves each job as a row. It does not crawl whole sites.

#### Can I collect private data?

No. As a Google Jobs data scraper, the Actor collects public listings only. As a Google Jobs web scraper it does not need a login, and it does not read private data.

#### Do I need proxies?

No. The `proxyConfiguration` field is optional, and the default setting handles the connection automatically. You can choose your own proxy settings if you prefer.

#### Can I use it with Python or Node.js?

Yes. Start the Actor with the Apify API client for Python or JavaScript, then read the dataset items. See the API tab for ready-made snippets.

### Your feedback

Report bugs or request features in the Issues tab of this Actor. For custom solutions, such as extra fields or a tailored workflow, write to hello.crawlcraft@gmail.com.

# Actor input Schema

## `urls` (type: `array`):

One entry per line. Accepted: a Google Jobs search link copied from Google (starting with https://www.google.com/search?q=...) or a plain phrase such as 'data analyst remote', which is searched like a query. Bulk input is supported and duplicate links are skipped. Free plan: up to 10 jobs per run, with no monthly limit; paid plans have no limit.

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

Optional extra searches, one per line (for example 'nurse' or 'react developer'). Every phrase is searched once per location and per job type below.

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

Optional cities or regions, one per line (for example 'London' or 'Austin, TX'). Each job title or keyword above is searched in every location. Leave empty to search the whole country.

## `maxResultsPerSearch` (type: `integer`):

Stop each search after this many jobs (0 = no cap). Free plan: up to 10 jobs per run in total, with no monthly limit; paid plans have no limit.

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

Country the search targets. It drives the regional results, and when no location is given the country name is used as the location. Leave empty to derive it from the Google domain (for example google.de gives de). Only countries where Google Jobs serves listings are listed.

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

Google site to search. It also sets the default country when the country is empty (for example google.de gives de).

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

Optional interface language. Usually best left empty: Google then picks the language that matches the country, which many non-English markets need. Forcing English (en) can return no jobs in countries such as the Netherlands, Germany, Spain, Brazil or Japan.

## `radiusKm` (type: `integer`):

Optional distance around each location in kilometres. Google treats it as a hint, so it may change little.

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

Only jobs posted within this window.

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

Pick one or more. Every search is repeated once per selected type. Leave empty for all types.

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

Keep only jobs that can be done remotely.

## `noDegreeOnly` (type: `boolean`):

Keep only jobs that say no degree is needed.

## `strictFilters` (type: `boolean`):

Drop a job when its own data contradicts a filter you chose, for example a posting that is clearly older than the date window. Jobs with unknown values are kept.

## `salaryMinAnnual` (type: `integer`):

Keep only jobs whose top salary, converted to a year, reaches this amount. Jobs without a salary are dropped when this is set.

## `requireSalary` (type: `boolean`):

Keep only jobs that show a salary (from Google or found in the description).

## `directApplyOnly` (type: `boolean`):

Keep only jobs that have an apply link on the employer's own site or hiring system.

## `maxPostedHoursAgo` (type: `number`):

Finer than the date window, for example 12 keeps only jobs posted in the last 12 hours.

## `titleMustInclude` (type: `array`):

Keep a job only if its title contains at least one of these words (not case sensitive).

## `titleMustExclude` (type: `array`):

Drop jobs whose title contains any of these words, for example senior or staff.

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

Drop jobs from companies whose name contains any of these words, for example staffing agencies.

## `excludeVia` (type: `array`):

Drop jobs listed through these sources, for example LinkedIn.

## `seniorityLevels` (type: `array`):

Keep only these levels, guessed from the job title. Leave empty for all levels.

## `maxResultsTotal` (type: `integer`):

Overall cap for the whole run, across all searches (0 = no cap). Free plan: up to 10 jobs per run, with no monthly limit; paid plans have no limit.

## `maxPagesPerSearch` (type: `integer`):

Stop each search after this many result pages (0 = until Google has no more).

## `maxScanned` (type: `integer`):

Safety limit: a search stops after this many jobs have been checked without finding enough matches for your filters (0 = no limit).

## `dedupeAcrossSearches` (type: `boolean`):

Return each Google job only once even when several searches find it.

## `fuzzyDedupe` (type: `boolean`):

Also treat the same title, company and city as one job when it is listed under different IDs.

## `skipSeenJobs` (type: `boolean`):

Skip jobs this actor already returned in an earlier run of your account. Useful for scheduled runs.

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

Add the full job description text to every row.

## `includeHighlights` (type: `boolean`):

Add the qualifications, responsibilities and benefits lists.

## `includeApplyOptions` (type: `boolean`):

Add every place the job can be applied for, with link, site and type.

## `includeRawExtensions` (type: `boolean`):

Add the short tags Google shows next to a job (posted date, schedule, benefits) in raw and sorted form.

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

How many searches run at the same time (1 to 6).

## `requestDelay` (type: `number`):

Seconds to wait between steps of each search.

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

How many attempts are made before a search gives up (1 to 10).

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

Optional. Leave the default for automatic connection handling, or choose your own proxy settings.

## Actor input object example

```json
{
  "urls": [
    "software engineer"
  ],
  "locations": [
    "London"
  ],
  "maxResultsPerSearch": 10,
  "googleDomain": "google.com",
  "datePosted": "any",
  "remoteOnly": false,
  "noDegreeOnly": false,
  "strictFilters": true,
  "requireSalary": false,
  "directApplyOnly": false,
  "maxResultsTotal": 0,
  "maxPagesPerSearch": 0,
  "maxScanned": 3000,
  "dedupeAcrossSearches": true,
  "fuzzyDedupe": true,
  "skipSeenJobs": false,
  "includeDescription": true,
  "includeHighlights": true,
  "includeApplyOptions": true,
  "includeRawExtensions": true,
  "concurrency": 2,
  "requestDelay": 1,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One line per job: logo, title, company, place, pay and posting age.

## `salary` (type: `string`):

Pay range as text and numbers, with yearly equivalents.

## `details` (type: `string`):

Type, schedule, seniority, experience and tags.

## `apply` (type: `string`):

Where each job can be applied for.

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

One row per apply option of every job.

## `description` (type: `string`):

Full job description text.

## `highlights` (type: `string`):

Qualifications, responsibilities and benefits.

## `search` (type: `string`):

Which search found each job and how it was run.

## `summaryFile` (type: `string`):

SUMMARY file with the counts of this run.

# 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 = {
    "urls": [
        "software engineer"
    ],
    "locations": [
        "London"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawl_craft/google-job-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 = {
    "urls": ["software engineer"],
    "locations": ["London"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawl_craft/google-job-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 '{
  "urls": [
    "software engineer"
  ],
  "locations": [
    "London"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawl_craft/google-job-scraper --silent --output-dataset

```

## MCP server setup

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