# Google Careers Scraper (`googleapi/google-careers-scraper`) Actor

Extract public Google Careers job postings with structured qualifications, responsibilities, compensation, work arrangement, and application details when published.

- **URL**: https://apify.com/googleapi/google-careers-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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.

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

Extract public job listings from [Google Careers](https://www.google.com/about/careers/applications/jobs/results/). Search records include job identity, aliases, locations, experience labels, description and qualification text, responsibilities, skills explicitly mentioned in the posting, and public job/application links. Optional detail-page enrichment adds source-published compensation, benefits, and interview details when available.

The Actor uses bounded direct HTTPS requests and the page's public serialized job data plus rendered job-card metadata. It does not sign in, submit applications, solve CAPTCHAs, or bypass access controls.

### Use cases

- Build a lightweight public Google job feed for recruiting research.
- Track public job titles and locations for a bounded set of queries.
- Export qualification and detail-page links for manual review.

### Quick start

1. Open the Actor input tab.
2. Add queries, locations, or approved startUrls.
3. Set maxItems and, if needed, maxPages.
4. Run the Actor and review the dataset and run summary.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Input

Custom startUrls (or the sourceUrls, urls, or url aliases) take precedence over generated URLs. Without a custom URL, each query/location/company combination is converted into a public results URL. If no source inputs are supplied, the default Google Careers results page is used.

| Input | Description |
| --- | --- |
| queries | Array of job-title or keyword phrases. query and searchQuery are aliases. |
| locations | Array of location phrases used in generated URLs and row filtering. location is an alias. |
| companies | Array of company phrases used in generated URLs and row filtering. company is an alias. |
| startUrls | Approved https://www.google.com/about/careers/applications/jobs/results/... URLs. |
| maxItems | Global normal-row limit, 1–500; default 20. |
| maxPages | Maximum public result pages per source, 1–20; default 1. |
| startPage | One-based starting page, 1–100; default 1. |
| keyword | Case-insensitive row filter across public job text. |
| experienceLevel | Case-insensitive filter such as Early, Mid, or Advanced. |
| sortBy | recommended, title_asc, or location_asc. |
| includeDescription | Keep full public description text and sanitized HTML; default true. |
| includeQualifications | Keep public qualification/responsibility arrays; default true. |
| includeApplyUrl | Keep the public application route; default true. |
| includeDetails / maxDetailItems | Optionally enrich a bounded number of public detail pages; detail fetching is disabled by default. |
| proxyConfiguration | Accepted for compatibility but direct fetch remains in use; credentials are never logged. |
| page | Compatibility alias for startPage. |

`maxItems` is global across all input sources. `maxPages` applies per source. A positive `maxDetailItems` requires `includeDetails=true`.

### Dataset fields

Each dataset record contains source-backed job-posting data. Depending on what the public posting contains, it can include:

| Group | Fields |
| --- | --- |
| Identity | `jobId`, `title`, `jobTitle`, `company`, `companyName`, `employerName` |
| Locations and role | `location`, `jobLocation`, `locations`, `experienceLevel`, `seniorityLevel`, `experienceYears`, `employmentType`, `workArrangement`, `workArrangementText` |
| Full posting | `description`, `descriptionText`, `descriptionHtml`, `descriptionSections`, `minimumQualifications`, `minimumQualificationsText`, `preferredQualifications`, `preferredQualificationsText`, `responsibilities`, `responsibilitiesText`, `skills`, `educationRequirements`, `requiredLanguages` |
| Compensation | `salary`, `salaryText`, `salaryMin`, `salaryMax`, `salaryValue`, `salaryCurrency`, `salaryPeriod`, `salaryType`, `bonusText`, `bonusPercent`, `equityIncluded`, `benefitsIncluded`, `benefitsUrl` |
| Application window, interview, and links | `applicationWindowText`, `applicationWindowOpenThroughDate`, `applicationWindowDateQualifier`, `interviewRequirement`, `interviewRequirementText`, `detailUrl`, `jobUrl`, `applyUrl`, `applicationUrl`, `applicationType`, `applyOptions`, `isActive` |

Optional values are omitted when the source does not provide them; unknown booleans are not coerced to `false`. Salary bounds and work/interview classifications are populated only from explicit public wording. Application-window dates are extracted only from the detail-page statement; the original wording and qualifiers such as “at least” are retained so a lower-bound date is not presented as a guaranteed closing deadline.

`descriptionHtml` preserves full source prose and paragraph/list/emphasis markup, removing active content, attributes, and expansion controls. `experienceYears` summarizes minimum qualifications only: its lower bound is the lowest mentioned specialist or alternative requirement, not necessarily the overall career-experience requirement; retain the accompanying text for context.

Blocked, empty, invalid, and failed requests do not create job records. Check the run summary and logs for the collection status.

### Example input

```json
{
  "queries": ["data engineer", "technical program manager"],
  "locations": ["New York", "Dublin"],
  "maxItems": 10,
  "maxPages": 2,
  "sortBy": "title_asc"
}
```

### Example output

The values below illustrate the shape and aliases; optional fields are only present when the live posting publishes supporting content.

```json
{
  "jobId": "123456789",
  "title": "Senior Data Engineer",
  "jobTitle": "Senior Data Engineer",
  "company": "Google",
  "companyName": "Google",
  "employerName": "Google",
  "location": "Mountain View, CA, USA",
  "jobLocation": "Mountain View, CA, USA",
  "locations": ["Mountain View, CA, USA", "Sunnyvale, CA, USA"],
  "experienceLevel": "Mid",
  "seniorityLevel": "Mid",
  "experienceYears": { "min": 2, "max": null, "text": "2 years of experience with software development." },
  "workArrangement": "remote",
  "workArrangementText": "Remote eligible",
  "description": "Build reliable data systems that help teams work with information at scale.",
  "descriptionText": "Build reliable data systems that help teams work with information at scale.",
  "descriptionSections": [{ "title": "Responsibilities", "text": "Build and operate reliable data pipelines.", "items": ["Build and operate reliable data pipelines."] }],
  "minimumQualifications": ["Bachelor's degree or equivalent practical experience."],
  "minimumQualificationsText": "Bachelor's degree or equivalent practical experience.",
  "preferredQualifications": ["Experience designing distributed systems."],
  "preferredQualificationsText": "Experience designing distributed systems.",
  "responsibilities": ["Build and operate reliable data pipelines."],
  "responsibilitiesText": "Build and operate reliable data pipelines.",
  "skills": ["Python", "Distributed Systems"],
  "educationRequirements": ["Bachelor's degree or equivalent practical experience."],
  "salary": "US: $120000 - $160000 (USD) + 15% bonus target + equity + benefits",
  "salaryText": "US: $120000 - $160000 (USD) + 15% bonus target + equity + benefits",
  "salaryMin": 120000,
  "salaryMax": 160000,
  "salaryValue": 140000,
  "salaryCurrency": "USD",
  "salaryType": "employer_stated",
  "bonusText": "15% bonus target",
  "bonusPercent": 15,
  "equityIncluded": true,
  "benefitsIncluded": true,
  "benefitsUrl": "https://www.google.com/about/careers/applications/benefits/",
  "interviewRequirement": "in_person_interviews",
  "interviewRequirementText": "In most instances, this position requires in-person interviews as part of the hiring process.",
  "applicationWindowText": "The application window will be open until at least October 12, 2026. This opportunity will remain online based on business needs which may be before or after the specified date.",
  "applicationWindowOpenThroughDate": "2026-10-12",
  "applicationWindowDateQualifier": "at_least",
  "detailUrl": "https://www.google.com/about/careers/applications/jobs/results/123456789-senior-data-engineer",
  "jobUrl": "https://www.google.com/about/careers/applications/jobs/results/123456789-senior-data-engineer",
  "applyUrl": "https://www.google.com/about/careers/applications/apply?jobId=opaque",
  "applicationUrl": "https://www.google.com/about/careers/applications/apply?jobId=opaque",
  "applicationType": "Google Careers",
  "applyOptions": [{ "platform": "Google Careers", "originalUrl": "https://www.google.com/about/careers/applications/apply?jobId=opaque", "resolvedUrl": "https://www.google.com/about/careers/applications/apply?jobId=opaque", "destinationDomain": "www.google.com", "isEmployerSite": true, "directApply": true }],
  "isActive": true
}
```

Run totals and source issues are available separately from job records in the Output tab.

### Cost and limits

The Actor collects a bounded number of public results pages and can make additional detail requests when enrichment is enabled. Keep `maxItems`, `maxPages`, and `maxDetailItems` small for exploratory runs. Public pages can rate-limit automated requests; check the run summary and logs if a run stops early.

### FAQ

#### Does this submit an application?

No. applyUrl is a public link for manual follow-up only.

#### Can I use a custom filtered results URL?

Yes. Pass an approved Google Careers results URL in startUrls. URLs with credentials or non-Careers hosts are rejected.

#### Why is a run empty or blocked?

Check the run summary and logs for access limits or source availability. Also confirm that your query, location, company, and filters match the public jobs you expect.

### Disclaimer

Google Careers content, availability, job descriptions, locations, and application links can change. Confirm current details on the public Google Careers page before relying on a record.

# Actor input Schema

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

Optional job-title or keyword phrases. Each phrase becomes a public Google Careers results URL.

## `query` (type: `string`):

Compatibility alias for one job query.

## `searchQuery` (type: `string`):

Compatibility alias for one job query.

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

Optional location phrases used to build public result URLs and filter normalized rows.

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

Compatibility alias for one location phrase.

## `companies` (type: `array`):

Optional company phrases used to build public result URLs and filter normalized rows.

## `company` (type: `string`):

Compatibility alias for one company phrase.

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

Approved public Google Careers results URLs. When supplied, these take precedence over generated query/location/company URLs.

## `sourceUrls` (type: `array`):

Compatibility alias for custom public Google Careers results URLs.

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

Legacy alias for custom public Google Careers results URLs.

## `url` (type: `string`):

Compatibility alias for one custom public Google Careers results URL.

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

Global maximum number of normal public job records emitted across all sources and pages.

## `maxPages` (type: `integer`):

Bounded number of public result pages to inspect for each source.

## `startPage` (type: `integer`):

One-based Google Careers result page to start from.

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

Case-insensitive match against title, company, location, description, and public qualification text.

## `experienceLevel` (type: `string`):

Case-insensitive match against the public experience label, such as Early, Mid, or Advanced.

## `sortBy` (type: `string`):

Recommended keeps public source order. Other choices sort the bounded result set after collection.

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

Include full public job description text and sanitized HTML when published in the page data.

## `includeQualifications` (type: `boolean`):

Include public minimum, preferred, and responsibility list items when available.

## `includeApplyUrl` (type: `boolean`):

Include the public application route exposed by the page, if present. This Actor never submits an application.

## `includeDetails` (type: `boolean`):

Fetch a bounded number of public job detail pages after collection. Base records survive detail failures.

## `maxDetailItems` (type: `integer`):

Maximum public detail pages to fetch. Requires includeDetails=true.

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

Compatibility-only Apify proxy settings. This Actor uses direct fetch and does not route requests through the proxy; credentials are not logged.

## `page` (type: `integer`):

Compatibility alias for startPage. The Actor reads the selected page number from Google Careers and increments within maxPages.

## Actor input object example

```json
{
  "queries": [],
  "startUrls": [],
  "maxItems": 20,
  "maxPages": 1,
  "startPage": 1,
  "sortBy": "recommended",
  "includeDescription": true,
  "includeQualifications": true,
  "includeApplyUrl": true,
  "includeDetails": false,
  "maxDetailItems": 0,
  "page": 1
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `keyValueStore` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-careers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/google-careers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call googleapi/google-careers-scraper --silent --output-dataset

```

## MCP server setup

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