# Glassdoor Scraper — Reviews, Salaries, Interviews & Jobs (`crawloop/glassdoor-scraper`) Actor

Scrape Glassdoor employer intelligence: ratings, employee reviews, interview questions, salary bands, and job listings with pay ranges. Resolve company names, IDs, or URLs; keyword job search across 15+ domains. HTTP + residential proxy — Glassdoor API alternative for HR.

- **URL**: https://apify.com/crawloop/glassdoor-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 3 total users, 2 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 employee reviews

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

## Glassdoor Scraper — Reviews, Salaries, Interviews & Jobs

> **Disclaimer:** Unofficial tool for publicly accessible Glassdoor employer and job pages. **Glassdoor** and related names are trademarks of their respective owners. Not affiliated with, sponsored by, or endorsed by Glassdoor / Indeed / Recruit Holdings. For informational, research, and recruiting-intelligence use only. Respect applicable terms of use and law.

Scrape **Glassdoor** employer intelligence as structured JSON: **company ratings**, **employee reviews** (pros/cons, titles, dates), **interview questions**, **salary bands**, and **job listings with pay ranges**. Resolve plain **company names**, paste **Overview / Reviews / Jobs** URLs, or pass **employer IDs**. Run **keyword × location job search** across **15+ country domains**. A practical **Glassdoor API alternative** — call from **Python**, **Node.js**, **cURL**, or **Apify MCP**.

Ideal for **HR due diligence**, **employer-brand monitoring**, **compensation research**, **interview prep**, and **recruiting pipelines**.

> **Crawloop Jobs Suite** — global Glassdoor employer intel + DACH board coverage.

| Glassdoor (global employer intel) | Arbeitsagentur (DE public jobs) | Stepstone (DACH commercial board) |
| :--- | :--- | :--- |
| **Glassdoor Scraper** ◄── you are here | [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) | [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) |

### When to use this Actor

- You need a **Glassdoor scraper** for reviews, interviews, salaries, or jobs as JSON
- You want **company name resolve** instead of hunting employer URLs by hand
- You chain **DACH job boards → Glassdoor** for global reputation on the same employers
- You want a **Glassdoor API alternative** from Python, Node.js, or an MCP / AI assistant

### When not to use this Actor

- **Germany public Jobbörse only** — use [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper)
- **DACH commercial board search** — use [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper)
- **Login-walled / give-to-get full review text** — public pages and JSON only; this Actor does not log in
- **Guaranteed thousands of reviews per employer** — public HTML/JSON-LD often ships a rated sample; extra pages are collected while they return data

### Key Features

- **Company-centric + job search** — names, URLs, employer IDs, or keyword × city
- **Typed dataset rows** — `company`, `review`, `interview`, `salary`, `job`
- **Ratings & review snippets** from public Overview / Reviews pages (JSON-LD + cards)
- **Jobs with pay ranges** — listing cards include title, location, salary band, URL
- **15+ domains** — `.com`, `.co.uk`, `.de`, `.fr`, `.ca`, `.com.au`, `.in`, and more
- **Incremental monitor mode** — KV watermarks; emit only new reviews/jobs or changed scores
- **Compact mode** — token-efficient rows for MCP / LLM pipelines
- **HTTP-only** — Chrome TLS impersonation, no headless browser; fail-fast on Cloudflare/DataDome
- **Suite chain** — enrich employers discovered via Arbeitsagentur or Stepstone

### Use Cases

| Use case | What you get |
| :--- | :--- |
| **Employer due diligence** | Overall rating, review count, culture snapshot before a hire or investment |
| **Employer-brand monitoring** | Newest public review snippets with titles, ratings, and job titles |
| **Compensation benchmarking** | Salary bands by title (median / p10–p90) when the salaries feed is available |
| **Interview prep** | Questions, difficulty, and offer outcomes when interview pages return data |
| **Hiring-signal feed** | Open roles + estimated pay + employer score |
| **Multi-market research** | Same employer on `.com` vs `.de` vs `.co.uk` |

### Quick Start

**Company intel (name resolve):**

```json
{
  "companyNames": ["Amazon", "Google"],
  "domain": "com",
  "maxItems": 50,
  "includeReviews": true,
  "maxReviewsPerCompany": 20,
  "sortReviewsBy": "DATE",
  "includeJobs": true,
  "maxJobsPerCompany": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

**Keyword job search:**

```json
{
  "jobKeywords": ["software engineer"],
  "location": "New York, NY",
  "maxJobs": 50,
  "sortJobsBy": "date",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

**Overview URL:**

```json
{
  "startUrls": [
    { "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm" }
  ],
  "includeReviews": true,
  "maxReviewsPerCompany": 30
}
```

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `companyNames` | Array | — | Plain company names to resolve |
| `startUrls` | Array | — | Overview / Reviews / Jobs / Interview / Salary / job-search URLs |
| `employerIds` | Array | — | Numeric IDs (`6036`) or `E6036` |
| `jobKeywords` | Array | — | Keyword job search |
| `location` | String | — | City/region for job search |
| `domain` | String | `com` | Regional site (`co.uk`, `de`, `fr`, …) |
| `language` | String | domain default | iso3 review language (`eng`, `deu`, `fra`, …) |
| `maxItems` | Integer | `100` | Hard cap on all row types (`0` = unlimited) |
| `includeReviews` | Boolean | `false` | Employee reviews |
| `maxReviewsPerCompany` | Integer | `50` | Cap per employer |
| `sortReviewsBy` | String | `DATE` | `DATE` (newest) or `RELEVANCE` |
| `includeInterviews` | Boolean | `false` | Interview experiences |
| `maxInterviewsPerCompany` | Integer | `50` | Cap per employer |
| `includeSalaries` | Boolean | `false` | Salary band rows |
| `maxSalariesPerCompany` | Integer | `50` | Cap per employer |
| `includeJobs` | Boolean | `false` | Open jobs for each employer |
| `maxJobsPerCompany` | Integer | `50` | Cap per employer |
| `maxJobs` | Integer | `50` | Cap per keyword search |
| `remoteOnly` | Boolean | `false` | Remote jobs filter |
| `jobPostedWithinDays` | Integer | — | Optional recency filter (`1`, `7`, `30`, …) |
| `incrementalMode` | Boolean | `false` | Emit only deltas vs KV baseline |
| `compact` | Boolean | `false` | Core fields only |
| `proxyConfiguration` | Object | US residential | Match country to `domain` |

### Output Format

Each dataset item has a `type` discriminator.

| Type | Key fields |
| :--- | :--- |
| `company` | `employerId`, `name`, `overallRating`, `reviewCount`, `recommendToFriendPct`, `ceoApprovalPct`, culture sub-ratings, `headquarters`, `industry`, `size`, `url` |
| `review` | `rating`, `title`, `pros`, `cons`, `advice`, sub-ratings, `jobTitle`, `location`, `isCurrentJob`, `reviewDate` |
| `interview` | `jobTitle`, `difficulty`, `experience`, `outcome`, `questions`, `processDescription` |
| `salary` | `jobTitle`, `median`, `min`, `max`, `payPercentiles`, `salaryCount`, `currency` |
| `job` | `title`, `location`, `salaryMin` / `salaryMax`, `employerScore`, `datePosted`, `url` |

**Example — company row:**

```json
{
  "type": "company",
  "employerId": 6036,
  "name": "Amazon",
  "overallRating": 3.5,
  "reviewCount": 210876,
  "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm"
}
```

**Example — review row:**

```json
{
  "type": "review",
  "reviewId": "105203492",
  "companyName": "Amazon",
  "title": "Great learning opportunities but demanding workload",
  "rating": 4.0,
  "pros": "Great learning opportunities but demanding workload",
  "jobTitle": "Software Engineer",
  "reviewDate": "2026-08-17"
}
```

**Example — job row:**

```json
{
  "type": "job",
  "jobId": "1010226886266",
  "title": "Fulfillment Center Warehouse Associate",
  "companyName": "Amazon",
  "location": "Modesto, CA",
  "salaryMin": 21.75,
  "salaryMax": 23.25,
  "url": "https://www.glassdoor.com/job-listing/fulfillment-center-warehouse-associate-amazon-JV_IC1146953_KO0,38_KE39,45.htm?jl=1010226886266"
}
```

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/glassdoor-scraper').call({
  companyNames: ['Amazon'],
  includeReviews: true,
  maxReviewsPerCompany: 20,
  maxItems: 30,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'US',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/glassdoor-scraper").call(
    run_input={
        "companyNames": ["Amazon"],
        "includeReviews": True,
        "maxReviewsPerCompany": 10,
        "maxItems": 30,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "US",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("type"), item.get("name") or item.get("title") or item.get("jobTitle"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~glassdoor-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyNames":["Amazon"],"includeJobs":true,"maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/glassdoor-scraper`.

Example prompts:

- "Run Glassdoor Scraper for Amazon and Google, include the newest reviews, return ratings plus pros/cons as JSON"
- "Scrape Glassdoor software engineer jobs in New York and summarize pay ranges"
- "Chain Arbeitsagentur Jobs Scraper for Pflege in Berlin, take unique employers, enrich via Glassdoor Scraper"

### Suite next step

1. Pull Germany public openings with [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) or DACH commercial listings with [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper)
2. Deduplicate employer names
3. Enrich here — Glassdoor scores, reviews, interviews, and pay bands

For global review monitoring beyond employers, use [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper).

### FAQ

**Do I need a Glassdoor login?**\
No. This Actor reads publicly accessible pages and JSON. It does not submit credentials or bypass give-to-get walls.

**Why residential proxies?**\
Glassdoor fronts Cloudflare (and sometimes DataDome). Datacenter IPs are usually blocked. Match `apifyProxyCountry` to `domain` (US for `.com`, DE for `.de`, GB for `.co.uk`).

**Can I scrape Glassdoor with Python or Node.js?**\
Yes — use the Apify client examples above, or call the Actor from an AI assistant via Apify MCP.

**Can I search all Glassdoor jobs by keyword?**\
Yes — set `jobKeywords` and optional `location`. Company-mode `includeJobs` is per employer.

**Which domain should I use?**\
Use the market whose reviews and jobs you need. Ratings and review language differ by site (`.com` vs `.de` vs `.co.uk`).

**Is this a Glassdoor API?**\
There is no official public Glassdoor API for this data. This Actor is an HTTP **Glassdoor API alternative** that exports a dataset you can pipe into BI, ATS, or LLM tools.

### Related Actors

| Actor | Focus |
| :--- | :--- |
| **Glassdoor Scraper** ◄── you are here | Global employer reviews, interviews, salaries, jobs |
| [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) | Germany BA Jobsuche listings |
| [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) | DACH commercial job board |
| [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) | Company review monitoring (global) |

# Actor input Schema

## `companyNames` (type: `array`):

Plain employer names to resolve on Glassdoor (e.g. Amazon, Google, Microsoft).

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

Glassdoor Overview / Reviews / Jobs / Interview / Salary / job-search URLs. Employer ID is parsed from EI\_IE / E{id}.

## `employerIds` (type: `array`):

Numeric Glassdoor employer IDs (e.g. 6036 for Amazon) or E6036.

## `jobKeywords` (type: `array`):

Keyword job search (independent of company intel). Example: software engineer.

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

City/region for job search (resolved via Glassdoor location typeahead). Example: New York, NY

## `domain` (type: `string`):

Regional Glassdoor site. Reviews/interviews language defaults to the market.

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

Override default language for reviews/interviews (eng, deu, fra, spa, por, ita, nld). Leave empty to use the domain default.

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

Hard cap on dataset rows (all types). 0 = unlimited.

## `includeReviews` (type: `boolean`):

Employee reviews from public Overview/Reviews pages (JSON-LD and cards). Extra pages are collected while they return data.

## `maxReviewsPerCompany` (type: `integer`):

Cap employee review rows per employer.

## `sortReviewsBy` (type: `string`):

DATE returns newest first (better for monitoring). RELEVANCE is Glassdoor's default ranking.

## `includeInterviews` (type: `boolean`):

Interview questions, difficulty, outcome, and process text.

## `maxInterviewsPerCompany` (type: `integer`):

Cap interview experience rows per employer.

## `includeSalaries` (type: `boolean`):

Salary rows by job title when the employer salaries BFF is available.

## `maxSalariesPerCompany` (type: `integer`):

Cap salary-band rows per employer.

## `includeJobs` (type: `boolean`):

Open jobs for each resolved employer (employer rating attached when known).

## `maxJobsPerCompany` (type: `integer`):

Cap open job rows per employer.

## `maxJobs` (type: `integer`):

Cap for jobKeywords / job-search URL mode.

## `sortJobsBy` (type: `string`):

Sort keyword job search by newest date or relevance.

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

When true, restrict keyword job search to remote roles.

## `jobPostedWithinDays` (type: `integer`):

Optional Glassdoor fromAge filter (e.g. 1, 3, 7, 14, 30). Empty = any time.

## `compact` (type: `boolean`):

Return core fields only (token-efficient for MCP / LLM pipelines).

## `incrementalMode` (type: `boolean`):

Emit only new reviews/interviews/jobs and changed company fingerprints since the last run.

## `stateKey` (type: `string`):

KV key inside the monitor store for this watchlist baseline.

## `monitorStoreName` (type: `string`):

Named Apify Key-Value Store for incremental watermarks.

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

Residential proxies recommended. Match country to the Glassdoor domain (US for .com, DE for .de).

## Actor input object example

```json
{
  "companyNames": [
    "Amazon"
  ],
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm"
    }
  ],
  "domain": "com",
  "maxItems": 100,
  "includeReviews": false,
  "maxReviewsPerCompany": 50,
  "sortReviewsBy": "DATE",
  "includeInterviews": false,
  "maxInterviewsPerCompany": 50,
  "includeSalaries": false,
  "maxSalariesPerCompany": 50,
  "includeJobs": false,
  "maxJobsPerCompany": 50,
  "maxJobs": 50,
  "sortJobsBy": "date",
  "remoteOnly": false,
  "compact": false,
  "incrementalMode": false,
  "stateKey": "MONITOR_STATE",
  "monitorStoreName": "glassdoor-monitor-store",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "companyNames": [
        "Amazon"
    ],
    "startUrls": [
        {
            "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/glassdoor-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 = {
    "companyNames": ["Amazon"],
    "startUrls": [{ "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/glassdoor-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 '{
  "companyNames": [
    "Amazon"
  ],
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Overview/Working-at-Amazon-EI_IE6036.htm"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call crawloop/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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