# Glassdoor Jobs Scraper - Listings, Salaries & Ratings (`haketa/glassdoor-jobs-scraper`) Actor

Scrape Glassdoor job listings by keyword and location. Export job title, company, company rating, salary estimate (min/median/max), location, posted date, skills, Easy Apply and the job URL. No login or API key required.

- **URL**: https://apify.com/haketa/glassdoor-jobs-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Glassdoor Jobs Scraper — Listings, Salaries & Company Ratings

Scrape **job listings from [Glassdoor](https://www.glassdoor.com/)** by keyword and location. For every job you get the **title, company, company rating, salary estimate (min / median / max), location, posted date, required skills, an Easy Apply flag and the job URL** — exported as a clean spreadsheet or JSON.

No login, no API key, no browser extension. Enter a job keyword (and optionally a city), press **Start**, and download the results as **JSON, CSV, Excel, HTML or XML** or pull them from the API.

***

### Why scrape Glassdoor jobs?

Glassdoor is one of the largest job marketplaces in the US and uniquely pairs each job with the **employer's Glassdoor rating** and a **salary estimate**. That makes it a great dataset for:

- **Job seekers & career tools** — pull every matching role in a city with salary ranges and company ratings side by side, instead of clicking through endless result pages.
- **Recruiters & sourcers** — monitor who is hiring for a role in a market, at what pay, and how the employer is rated.
- **Compensation & market research** — build salary benchmarks by title and location (min / median / max), track how many openings exist, and see which skills employers ask for.
- **Talent & labor-market analytics** — measure hiring demand by keyword and geography over time.
- **Lead generation** — collect hiring companies (with their Glassdoor rating and logo) for outreach.

***

### Features

- 🔎 **Search by keyword + location** — any job title/keyword (e.g. `software engineer`, `registered nurse`) and an optional city, state or country. Add multiple keywords; each is searched separately.
- 💰 **Salary estimates** — minimum, median and maximum pay, with the pay period and currency, plus whether the number is employer-provided or a Glassdoor estimate.
- ⭐ **Company rating on every job** — the employer's overall Glassdoor star rating, company id and logo.
- 🧠 **Extracted skills** — the skills/requirements Glassdoor parsed from each posting.
- 🗓️ **Freshness & Easy Apply** — how many days ago each job was posted and whether it supports Easy Apply.
- 📝 **Description snippet** — a short preview of the job description.
- ⚡ **Fast & deep** — powered by Glassdoor's job-search API behind the scenes; paginates through thousands of jobs per search.
- 🔗 **Direct job URLs** — clean Glassdoor links to every listing.

***

### Input

| Field | Type | Description |
|-------|------|-------------|
| `keyword` | array of strings | One or more job titles/keywords to search. Each is searched separately. |
| `location` | string | Optional city/state/country filter (e.g. `Austin, TX`, `New York, NY`, `United States`). Leave empty to search the whole US. |
| `maxItems` | integer | Maximum jobs to save across all keywords (default **100**). |
| `proxyConfiguration` | object | Proxy settings. **Residential is strongly recommended** (see *Proxy & Cloudflare*). Defaults to Apify Residential. |

#### Example input

```json
{
  "keyword": ["data scientist", "machine learning engineer"],
  "location": "Austin, TX",
  "maxItems": 300,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

***

### Output

One row per job listing.

#### Example record

```json
{
  "jobListingId": "1010176347009",
  "jobTitle": "Senior Data Scientist",
  "normalizedJobTitle": "data scientist",
  "jobUrl": "https://www.glassdoor.com/job-listing/senior-data-scientist-...-.htm?jl=1010176347009",
  "companyName": "Example Corp",
  "companyId": 35240,
  "companyRating": 4.3,
  "companyLogo": "https://media.glassdoor.com/sql/35240/example-squarelogo.png",
  "location": "Austin, TX",
  "locationType": "C",
  "salaryMin": 112000,
  "salaryMedian": 141200,
  "salaryMax": 168000,
  "payPeriod": "ANNUAL",
  "payCurrency": "USD",
  "salarySource": "GLASSDOOR_ESTIMATE",
  "ageInDays": 12,
  "easyApply": false,
  "isSponsored": false,
  "jobCategory": "engineer",
  "descriptionSnippet": "Build and deploy ML models that power...",
  "skills": ["Python", "SQL", "Machine learning", "Data modeling"],
  "searchKeyword": "data scientist",
  "searchLocation": "Austin, TX",
  "scrapedAt": "2026-10-12T12:30:00.000Z"
}
```

#### Field reference

| Field | Description |
|-------|-------------|
| `jobListingId` | Glassdoor job listing id. |
| `jobTitle` / `normalizedJobTitle` | The posted title and Glassdoor's normalized title. |
| `jobUrl` | Direct link to the job on Glassdoor. |
| `companyName` / `companyId` | Employer name and Glassdoor employer id. |
| `companyRating` | Employer's overall Glassdoor rating (1–5), when available. |
| `companyLogo` | Employer square logo URL. |
| `location` / `locationType` | Job location and its type (C=city, S=state, N=country, M=metro). |
| `salaryMin` / `salaryMedian` / `salaryMax` | Pay estimate (10th / 50th / 90th percentile), when available. |
| `payPeriod` | `ANNUAL`, `HOURLY`, `MONTHLY`, … |
| `payCurrency` | Currency code (e.g. `USD`). |
| `salarySource` | `EMPLOYER_PROVIDED` or `GLASSDOOR_ESTIMATE`. |
| `ageInDays` | How many days ago the job was posted. |
| `easyApply` | Whether the job supports Easy Apply. |
| `isSponsored` | Whether the listing is a sponsored/ad placement. |
| `jobCategory` | Glassdoor occupation group. |
| `descriptionSnippet` | Short preview of the job description. |
| `skills` | Skills/requirements Glassdoor extracted from the posting. |
| `searchKeyword` / `searchLocation` | What you searched. |
| `scrapedAt` | ISO timestamp. |

> **Note on coverage.** `companyRating`, salary fields and some attributes are data-dependent — they appear whenever Glassdoor has them for a posting. Core fields (title, company, location, URL, skills, posted date) are present on virtually every job.

***

### How it works

Glassdoor is protected by a Cloudflare challenge. This actor passes it for you: it opens Glassdoor once with a real browser to obtain a verified session, then reuses that session over fast HTTP to call Glassdoor's own job-search API and paginate through results. You don't need to configure anything.

***

### Proxy & Cloudflare

Because the verified Cloudflare session is tied to the IP that created it, the browser and all requests run through a single sticky proxy session. For reliability, use **Residential** proxies (the default) — datacenter IPs are more likely to be challenged by Cloudflare.

***

### Tips

- Add several keywords to cover a role's variations (e.g. `data scientist`, `ML engineer`, `applied scientist`).
- Narrow with `location` to benchmark a specific market; leave it empty for nationwide coverage.
- Set `maxItems` to control run length — a single keyword can have tens of thousands of jobs.

***

### FAQ

**Do I need a Glassdoor account or API key?** No.

**Can I search multiple keywords/cities?** Add multiple keywords; set one location per run. Run again for other cities.

**Why are some salaries or ratings empty?** Not every posting has an employer-provided salary or a rated employer; the actor returns them whenever Glassdoor has them.

**How many jobs can I get?** As many as the search has — set `maxItems` accordingly. Popular keywords have tens of thousands of openings.

**Does it get full job descriptions?** It returns a description snippet per job. (Full descriptions live on each job's detail page.)

***

### Related actors

Also check out scrapers for Indeed, LinkedIn, SEEK, StepStone and other job boards — plus a **Glassdoor Reviews Scraper** for company ratings and employee reviews — on the Apify Store.

***

### Legal & ethical use

This actor collects **publicly available** job-listing information. Use the data responsibly and in compliance with Glassdoor's Terms of Service and applicable laws. You are responsible for how you use the output.

# Actor input Schema

## `keyword` (type: `array`):

One or more job titles or keywords to search, e.g. <b>software engineer</b>, <b>registered nurse</b>, <b>product manager</b>. Each keyword is searched separately. Leave empty to run a small demo for "software engineer".

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

Filter jobs by a city, state or country, e.g. <b>Austin, TX</b>, <b>New York, NY</b>, <b>Remote</b> or <b>United States</b>. Leave empty to search across the whole US.

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

Maximum number of job listings to save across all keywords. Glassdoor has tens of thousands of jobs per keyword, so set a cap to control run time and cost.

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

Glassdoor is protected by Cloudflare. Residential proxies are strongly recommended — the actor solves the Cloudflare challenge once with a real browser and then reuses that session over fast HTTP, so the browser and all requests must share the same IP.

## Actor input object example

```json
{
  "keyword": [
    "software engineer"
  ],
  "location": "Austin, TX",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted job listings for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table view of the scraped jobs.

# 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 = {
    "keyword": [
        "software engineer"
    ],
    "location": "Austin, TX",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/glassdoor-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 = {
    "keyword": ["software engineer"],
    "location": "Austin, TX",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/glassdoor-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 '{
  "keyword": [
    "software engineer"
  ],
  "location": "Austin, TX",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call haketa/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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