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

Scrape Glassdoor without login: jobs with salaries, thousands of employee reviews (all 6 sub-ratings, pros/cons, sentiment), salary percentiles by title, interview questions, and full company profiles. Real logos + shareable visual report. Request-only, fast, reliable.

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

## Pricing

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

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

<div align="center">

## 🏢 Glassdoor Scraper

#### Jobs, reviews, salaries, interviews & company profiles — one Actor, no login

Turn any Glassdoor company or job search into clean, analysis-ready data: **open roles with salary ranges, thousands of employee reviews with sub-ratings and sentiment, salary percentiles by title, interview experiences, and full company profiles** — with real logos and a shareable visual report.

**💼 Jobs · 💬 Reviews · 💰 Salaries · 🎤 Interviews · 🏢 Company profiles**

</div>

***

### 🚀 What this Actor gives you

Most Glassdoor scrapers give you one thing — just jobs, or just reviews. This one covers **five data types in a single run** and enriches each with structure the raw page hides.

| Capability | What you get |
|---|---|
| 💼 **Job listings** | Title, company, location, remote flag, salary min/median/max, easy-apply, age, description |
| 💬 **Employee reviews** | **Full history — thousands per company**, no small page cap: pros, cons, advice, overall + **6 sub-ratings**, recommend/CEO/outlook, employer replies |
| 💰 **Salary data** | Base pay **P10 / median / P90** percentiles by job title, report counts, currency |
| 🎤 **Interview experiences** | Difficulty, outcome, duration, questions asked, process description |
| 🏢 **Company profiles** | Industry, revenue, size, HQ, founded, stock — **plus aggregate ratings**: recommend %, CEO approval %, positive outlook %, and 6 category ★ scores |
| 🧠 **Sentiment analysis** | Optional score + label on every review |
| 🖼️ **Company logos** | Real logo images in the visual report, with the direct logo URL on every record |
| 📊 **Visual report** | A shareable HTML dashboard — jobs board + employer intelligence cards |

#### Great for

- 📈 Salary benchmarking and compensation research
- 🥊 Employer reputation and competitor intelligence
- 🎯 Voice-of-employee and culture analysis
- 🧑‍💼 Talent-market and hiring-trend dashboards
- 🎤 Interview-prep and candidate-experience datasets
- 🤖 RAG pipelines, classifiers, and AI summaries
- 📁 JSON, CSV, Excel, XML, API, webhook, Make, and Zapier workflows

***

### 🚦 Two ways to run it

| Source | What it collects |
|---|---|
| 🔎 **Search keywords** | Job listings for one or more job titles, optionally in a specific location |
| 🔗 **Company URLs** | Reviews, salaries, interviews, and the company profile for each company — toggle exactly what you need |

You can combine both in the same run. Everything below is optional and controlled by simple toggles.

***

### ⚡ Quick start

#### Scrape jobs for a keyword

```json
{
  "keywords": ["software engineer"],
  "location": "Austin, TX",
  "maxJobsPerSearch": 50
}
```

#### Get a company's reviews with sentiment

```json
{
  "startUrls": [{ "url": "https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm" }],
  "scrapeReviews": true,
  "reviewSort": "recent",
  "sentiment": true,
  "maxReviewsPerCompany": 200
}
```

#### Everything about a company — reviews, salaries, interviews & profile

```json
{
  "startUrls": [{ "url": "https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.htm" }],
  "scrapeReviews": true,
  "scrapeSalaries": true,
  "scrapeInterviews": true,
  "scrapeCompanyProfile": true,
  "sentiment": true
}
```

> \[!TIP]
> Any Glassdoor company URL works — `/Reviews/`, `/Salary/`, `/Interview/`, or `/Overview/`. The Actor derives the company automatically, so you don't need a specific page type.

***

### 🎛️ Input reference

| Field | Type | Default | Description |
|---|---|---:|---|
| `keywords` | string list | — | Job titles to search, e.g. `software engineer`, `nurse` |
| `location` | string | — | Optional location for the job search |
| `startUrls` | url list | — | Glassdoor company URLs (any page type) |
| `scrapeReviews` | boolean | `true` | Collect employee reviews for each company URL |
| `reviewSort` | select | `relevance` | `relevance`, `recent`, `highest`, or `lowest` |
| `maxReviewsPerCompany` | integer | `100` | Cap on reviews per company |
| `maxJobsPerSearch` | integer | `30` | Cap on jobs per keyword |
| `scrapeSalaries` | boolean | `false` | Collect salary data by job title |
| `maxSalariesPerCompany` | integer | `50` | Cap on salary rows per company |
| `scrapeInterviews` | boolean | `false` | Collect interview experiences |
| `maxInterviewsPerCompany` | integer | `50` | Cap on interview rows per company |
| `scrapeCompanyProfile` | boolean | `false` | Add a company profile row |
| `sentiment` | boolean | `false` | Add sentiment score + label to each review |
| `htmlReport` | boolean | `true` | Build a shareable HTML report in the key-value store |
| `dedupe` | boolean | `true` | Save each job/review only once per run |
| `maxItems` | integer | `200` | Global cap across all data types (0 = unlimited) |
| `proxyConfiguration` | object | Residential US | Advanced; the default is recommended |

> \[!IMPORTANT]
> Glassdoor blocks datacenter traffic with Cloudflare, so the Actor uses **residential proxies** by default. Keep the default proxy setting for reliable access.

***

### 📦 Example results

#### Job

```json
{
  "dataType": "job",
  "jobId": "1009876543210",
  "title": "Senior Software Engineer",
  "company": "Amazon",
  "companyRating": 3.5,
  "location": "Austin, TX",
  "isRemote": null,
  "salaryMin": 145000,
  "salaryMedian": 178000,
  "salaryMax": 215000,
  "salaryCurrency": "USD",
  "easyApply": false,
  "ageInDays": 3,
  "url": "https://www.glassdoor.com/job-listing/..."
}
```

#### Review

```json
{
  "dataType": "review",
  "reviewId": "88123456",
  "ratingOverall": 4,
  "summary": "Challenging work and good pay, but poor work-life balance",
  "pros": "Great compensation, smart teammates, real ownership.",
  "cons": "On-call load is heavy and work-life balance suffers.",
  "recommendToFriend": "POSITIVE",
  "ceoApproval": "POSITIVE",
  "subRatings": {
    "ratingWorkLifeBalance": 3,
    "ratingCultureAndValues": 4,
    "ratingCareerOpportunities": 5,
    "ratingCompensationAndBenefits": 5
  },
  "jobTitle": "Software Engineer II",
  "employmentStatus": "REGULAR",
  "sentimentLabel": "positive",
  "employerReply": "Thank you for your feedback...",
  "reviewDate": "2026-07-26"
}
```

#### Company profile

```json
{
  "dataType": "company",
  "companyId": "6036",
  "companyName": "Amazon",
  "overallRating": 3.5,
  "reviewCount": 210326,
  "recommendToFriendPercent": 60,
  "ceoApprovalPercent": 50,
  "businessOutlookPercent": 57,
  "cultureAndValuesRating": 3.2,
  "workLifeBalanceRating": 3.1,
  "careerOpportunitiesRating": 3.5,
  "compensationAndBenefitsRating": 3.7,
  "industry": "Internet & Web Services",
  "revenue": "$10+ billion (USD)",
  "size": "10000+ Employees",
  "headquarters": "Seattle, WA",
  "founded": 1994,
  "stock": "AMZN",
  "website": "https://www.aboutamazon.com/"
}
```

***

### 🧾 Output fields

| Type | Key fields |
|---|---|
| 💼 **Job** | `title`, `company`, `companyRating`, `location`, `isRemote`, `salaryMin/Median/Max`, `salaryCurrency`, `easyApply`, `ageInDays`, `description`, `url` |
| 💬 **Review** | `summary`, `pros`, `cons`, `advice`, `ratingOverall`, `subRatings`, `recommendToFriend`, `ceoApproval`, `businessOutlook`, `jobTitle`, `employmentStatus`, `employerReply`, `sentimentLabel`, `reviewDate`, `url` |
| 💰 **Salary** | `jobTitle`, `baseP10`, `baseMedian`, `baseP90`, `totalMedian`, `currency`, `salaryCount`, `mostRecent` |
| 🎤 **Interview** | `jobTitle`, `difficulty`, `experience`, `outcome`, `durationDays`, `questions`, `processDescription`, `location`, `interviewDate` |
| 🏢 **Company** | `overallRating`, `reviewCount`, `recommendToFriendPercent`, `ceoApprovalPercent`, `businessOutlookPercent`, 6 category ★ ratings, `industry`, `revenue`, `size`, `headquarters`, `founded`, `stock`, `website` |

Every record also carries `companyLogo` (embedded image), `companyName`, `companyId`, and `scrapedAt`. Empty optional fields are removed to keep CSV and JSON exports clean.

The Dataset ships with ready-made **views** — Overview, Jobs, Reviews, Salaries, Interviews, and Companies — so each data type is easy to read in the Console table.

***

### 📊 Visual report

With `htmlReport` enabled (default), the Actor builds a shareable HTML dashboard in the key-value store under **`report`**:

- 💼 A **jobs board** with company logos, salaries, and locations
- 🏢 **Employer intelligence** cards — sub-rating bars, recommend / CEO approval, sentiment split, and top praises vs. complaints

Open it from the run's **Key-value store → `report`**.

***

### 💰 Usage and performance

Run size is mainly controlled by:

1. Number of keywords and company URLs
2. Which data types you enable
3. The `max…PerCompany` and `maxItems` limits

For lean runs, turn off the data types you don't need and lower the `max…PerCompany` limits. For continuous monitoring, pair the Actor with an **Apify Schedule**.

***

### ❓ FAQ

#### Which company URL should I use?

Any of them — `/Reviews/`, `/Salary/`, `/Interview/`, or `/Overview/Working-at-...`. The Actor extracts the company ID and collects whatever you toggled on.

#### Do I need a Glassdoor login?

No. The Actor collects publicly available data only, no account required.

#### Why did I get fewer reviews than `maxReviewsPerCompany`?

The limit is a maximum. Collection stops when the company's available public reviews run out.

#### Why is `isRemote` empty on most jobs?

Glassdoor only flags a listing as remote when its location is explicitly remote. The Actor stays honest and doesn't guess.

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

Yes. Open the run's Dataset and choose JSON, CSV, Excel, XML, or another format — or use the [Apify API](https://docs.apify.com/api/v2), webhooks, Make, or Zapier.

#### Why are residential proxies required?

Glassdoor uses Cloudflare to block datacenter IPs. Residential proxies (the default) provide reliable access.

***

### ⚖️ Responsible use

This Actor collects publicly available data for legitimate business intelligence and research. You are responsible for complying with Glassdoor's terms and applicable laws, including GDPR and CCPA. Do not use the data to contact, identify, or profile individual reviewers or employees.

***

<div align="center">

**Five data types. One run. Real answers about any employer.** 🚀

</div>

# Actor input Schema

## `keywords` (type: `array`):

Job titles or keywords to search on Glassdoor, e.g. "software engineer", "nurse".

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

Optional location for the job search — city, state, or country (e.g. "New York, NY").

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

Glassdoor company reviews URLs, e.g. https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm

## `scrapeReviews` (type: `boolean`):

For each company URL, collect employee reviews (ratings, sub-ratings, pros/cons, employer replies).

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

Cap on reviews collected per company URL.

## `reviewSort` (type: `string`):

Ordering for collected reviews.

## `maxJobsPerSearch` (type: `integer`):

Cap on jobs collected per keyword search.

## `scrapeSalaries` (type: `boolean`):

For each company URL, collect salary data by job title (base pay percentiles, count).

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

Cap on salary rows per company URL.

## `scrapeInterviews` (type: `boolean`):

For each company URL, collect interview experiences (difficulty, outcome, questions).

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

Cap on interview rows per company URL.

## `scrapeCompanyProfile` (type: `boolean`):

For each company URL, add a company profile row (industry, revenue, size, HQ, stock).

## `sentiment` (type: `boolean`):

Add a sentiment score and label to each review.

## `htmlReport` (type: `boolean`):

Build a shareable HTML report (jobs board + employer intelligence: ratings, sub-ratings, sentiment, salaries, pros/cons) saved to the key-value store as 'report'.

## `dedupe` (type: `boolean`):

Save each job/review only once per run.

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

Global cap across jobs + reviews. 0 = unlimited.

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

Glassdoor requires residential proxies (Cloudflare blocks datacenter). The default is tuned for reliable access.

## `maxConcurrency` (type: `integer`):

Sources processed at once.

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

Retries for a failed request.

## `requestTimeoutSecs` (type: `integer`):

Maximum time for one request.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "scrapeReviews": true,
  "maxReviewsPerCompany": 100,
  "reviewSort": "relevance",
  "maxJobsPerSearch": 30,
  "scrapeSalaries": false,
  "maxSalariesPerCompany": 50,
  "scrapeInterviews": false,
  "maxInterviewsPerCompany": 50,
  "scrapeCompanyProfile": false,
  "sentiment": false,
  "htmlReport": true,
  "dedupe": true,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxConcurrency": 5,
  "maxRetries": 5,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

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

No description

## `jobs` (type: `string`):

No description

## `reviews` (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 = {
    "keywords": [
        "software engineer"
    ],
    "maxJobsPerSearch": 30,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/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 = {
    "keywords": ["software engineer"],
    "maxJobsPerSearch": 30,
    "maxItems": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "software engineer"
  ],
  "maxJobsPerSearch": 30,
  "maxItems": 50
}' |
apify call trakk/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trakk/glassdoor-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/XKRwLZXdcxPpjI6Y7/builds/SuFufWufUtASv2QTK/openapi.json
