# Glassdoor Scraper — Company Reviews & Ratings (`solidcode/glassdoor-scraper`) Actor

\[💰 $4.0 / 1K] Extract employee reviews from Glassdoor.com: pros, cons, advice to management, an overall star rating plus six category sub-ratings, job title, tenure, location and review date. Add 11 company firmographics per row. Export to JSON, CSV or Excel.

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

## Pricing

from $4.00 / 1,000 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 — Company Reviews & Ratings

Pull employee reviews from Glassdoor.com at scale — pros, cons, advice to management, an overall star rating plus six category sub-ratings, job title, employment status, tenure band, location and review date on every row. Built for HR analytics teams, employer-brand and talent-acquisition leads, and competitive-intelligence researchers who need a structured, exportable picture of what a workforce actually says about a company, without reading review pages three at a time and retyping them into a spreadsheet.

### Why This Scraper?

- **40 fields per review** — the reviewer's pros, cons and advice to management, the 1–5 overall star rating and six category sub-ratings, job title, employment status, length of employment, location, review date, helpful-vote counts, and the company's own public reply where one was posted.
- **Nine core fields populated on 42 of 42 reviews** — review ID, company ID, review link, review date, overall rating, pros, cons, company name and the current-vs-former employee flag, measured across a mixed sample of four languages and three company-size bands covering seven employers. Not a single-company sample, and not an estimate.
- **Six category sub-ratings, and never a fake zero** — career opportunities, compensation and benefits, culture and values, diversity and inclusion, senior leadership, and work-life balance. Reviewers can skip these, and a skipped category is stored as a zero; those rows ship empty instead, so a reviewer who rated nothing never drags your category averages toward 0 out of 5.
- **Tenure that means what it says** — length of employment arrives as one of four labelled bands (Less than 1 year, More than 1 year, More than 3 years, More than 5 years), reconciled against the wording the site itself displays, so a tenure band is never mistaken for a count of years.
- **11 company firmographics ride along with each review** — turn on full details and every row also carries headquarters, company size, company type, revenue band, founding year, industry, sector, website, description, mission statement and the company's overall rating. Headquarters, size, type and the company rating came back for all seven employers sampled. One export doubles as a firmographic table; no second lookup, no joining by hand.
- **Employer replies captured verbatim, with their posting dates** — where HR answered a review publicly, the full reply text and the date it went up ship in the same row, so you can measure response rate and response lag.
- **A direct link back to every review** — each row carries its own review link, so anything flagged in a spreadsheet is one click from its source.
- **Deep pagination, proven rather than promised** — one company was walked 98 consecutive pages in a single run for 294 reviews with zero repeated review IDs. Depth is verified by ID, not assumed from a page counter.
- **Named reporting when a search comes up short** — if a search cannot be completed, the run says so and prints the exact URL it failed on, so a short dataset is never a silent one.

### Use Cases

#### Employer Brand & Talent Acquisition

- Track your own overall rating and all six sub-ratings month over month, and see which one is actually moving.
- Benchmark against a named competitor set by pulling their reviews on the same schedule.
- Find the job titles and tenure bands where culture and work-life scores drop, and target retention work there.
- Pull real, quotable pros for careers-page and job-ad copy instead of writing them from scratch.

#### HR Analytics & Retention

- Segment sentiment by tenure band, employment status and location to see where attrition risk concentrates.
- Split current employees from former ones and compare what each group says.
- Measure whether reviews that received a public HR reply are followed by better ratings.
- Feed pros and cons text into your own topic modelling or sentiment classifier.

#### Competitive & Market Intelligence

- Compare compensation-and-benefits sub-ratings across a peer set before a comp-band review.
- Watch a competitor's culture and senior-leadership scores after a layoff, merger or leadership change.
- Build an industry or sector baseline using the company industry and sector fields that ship with every enriched row.

#### Investment & Diligence

- Screen an acquisition target for people risk: rating trend, senior-leadership score and business-outlook direction.
- Monitor a whole portfolio on one schedule and diff on the review date to see only what is new.
- Combine company size, revenue band and founding year with the rating trend for a single-table diligence view.

#### Data Enrichment & Integration

- Enrich a CRM or HRIS record with the employer firmographics that ride along on every review row.
- Export to Google Sheets, a warehouse or a BI tool straight from the dataset, in JSON, CSV or Excel.
- Schedule a recurring run and diff on `reviewDateTime` to surface only new reviews rather than reprocessing the whole history.

### Getting Started

#### Simplest run

Open the company's reviews page on Glassdoor.com, copy the address bar URL, and paste it in.

```json
{
  "searchUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "maxItems": 100
}
```

#### A deeper run on one company

```json
{
  "searchUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "maxItems": 300
}
```

#### Several companies in one run

`maxItems` applies per search URL, so three URLs at 150 gives a 450-review run.

```json
{
  "searchUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm",
    "https://www.glassdoor.com/Reviews/Reliance-Industries-Reviews-E10052.htm",
    "https://www.glassdoor.com/Reviews/Azaé-Reviews-E1360610.htm"
  ],
  "maxItems": 150
}
```

#### Everything, with full company details

```json
{
  "searchUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "reviewLanguage": "eng",
  "maxItems": 500,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Glassdoor.com search result URLs. Set your filters on Glassdoor.com, then paste the address bar URL here. Overrides the individual filters below when provided. |
| `slug` | string | — | Only used when Search URLs is empty. Glassdoor's own URL slug for the company, e.g. "Google" or "Azaé" -- the text between the language word and "-E<number>" in a Glassdoor reviews URL. Leave blank and use Search URLs instead; this exists only as a fallback. |
| `id` | integer | — | Only used when Search URLs is empty. The numeric ID Glassdoor assigns the company -- the digits after "-E" in a Glassdoor reviews URL. Leave blank and use Search URLs instead; this exists only as a fallback. |
| `maxItems` | integer | `100` | Maximum reviews per search URL (0 = collect everything each search returns). |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `reviewLanguage` | string | \`\` | Only include reviews written in one language. Glassdoor's review pages only show one language's reviews at a time -- leaving this on "Any language" gets you the set the company's own page shows by default (often already the largest one). Picking a specific language narrows results down to just the reviews written in it, which for some companies means far fewer results, not more, so only pick one if you specifically need that language. |
| `enrichDetails` | boolean | `false` | Add 11 extra fields per review. Adds one request per review and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every review is one dataset row. Enabling `enrichDetails` adds 11 further fields to the same row — there is no second record type to join.

The example below is a real captured review, taken from a run with full company details on. Reviewer names are never published by the source and never appear in the data, but job title, tenure, location and free text do — treat every review row as personal data.

```json
{
  "reviewId": 104247947,
  "reviewDateTime": "2026-06-03T15:40:31.040",
  "summary": "Nickel",
  "pros": "À l écoute et bienveillance . Bonne ambiance",
  "cons": "Comité d entreprise un peu pauvre .",
  "advice": "Ras",
  "ratingOverall": 5,
  "jobTitle": "Auxiliaire De Vie",
  "employmentStatus": "PART_TIME",
  "isCurrentEmployee": true,
  "employmentLength": "More than 1 year",
  "companyId": 1360610,
  "companyName": "Azaé",
  "locationName": "Brignoles",
  "companyLogoUrl": "https://media.glassdoor.com/sql/1360610/azaé-squareLogo-1714657271778.png",
  "ratingCareerOpportunities": 5,
  "ratingCompensationAndBenefits": 4,
  "ratingCultureAndValues": 5,
  "ratingDiversityAndInclusion": 5,
  "ratingSeniorLeadership": 5,
  "ratingWorkLifeBalance": 5,
  "ratingBusinessOutlook": "NEUTRAL",
  "ratingCeoApproval": "APPROVE",
  "ratingRecommendToFriend": "POSITIVE",
  "countHelpful": 0,
  "countNotHelpful": 0,
  "employerResponses": [
    {
      "response": "Bonjour, merci d'avoir partagé votre expérience positive à nos côtés. Nous sommes heureux de voir que vous appréciez votre environnement de travail.",
      "responseDateTime": "2026-06-08T08:07:35.697"
    }
  ],
  "featured": false,
  "companyHeadquarters": "Strasbourg, France",
  "companySize": "5001 to 10000 Employees",
  "companyType": "Company - Private",
  "companyFoundedYear": 2005,
  "companyIndustry": "Private Households",
  "companySector": "Personal Consumer Services",
  "companyWebsite": "https://www.azae.com",
  "companyOverallRating": 4.1
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | number | Review ID |
| `reviewDateTime` | string | Review date |
| `summary` | string | Headline |
| `pros` | string | Pros |
| `cons` | string | Cons |
| `advice` | string | Advice to management |
| `ratingOverall` | number | Overall rating |
| `jobTitle` | string | Job title |
| `employmentStatus` | string | Employment type |
| `isCurrentEmployee` | boolean | Current employee |
| `employmentLength` | string | Time at company |
| `companyId` | number | Company ID |
| `companyName` | string | Company |
| `locationName` | string | Location |
| `url` | string | Review URL |
| `companyLogoUrl` | string | Company logo |

#### Ratings & Engagement

| Field | Type | Description |
|-------|------|-------------|
| `ratingCareerOpportunities` | number | Career opportunities |
| `ratingCompensationAndBenefits` | number | Compensation and benefits |
| `ratingCultureAndValues` | number | Culture and values |
| `ratingDiversityAndInclusion` | number | Diversity and inclusion |
| `ratingSeniorLeadership` | number | Senior leadership |
| `ratingWorkLifeBalance` | number | Work-life balance |
| `ratingBusinessOutlook` | string | Business outlook |
| `ratingCeoApproval` | string | CEO approval |
| `ratingRecommendToFriend` | string | Recommends to a friend |
| `countHelpful` | number | Helpful votes |
| `countNotHelpful` | number | Not-helpful votes |
| `employerResponses` | array | Employer response |
| `featured` | boolean | Featured review |

#### With `enrichDetails` enabled

| Field | Type | Description |
|-------|------|-------------|
| `companyHeadquarters` | string | Headquarters |
| `companySize` | string | Company size |
| `companyType` | string | Company type |
| `companyRevenue` | string | Revenue |
| `companyFoundedYear` | number | Year founded |
| `companyIndustry` | string | Industry |
| `companySector` | string | Sector |
| `companyWebsite` | string | Website |
| `companyDescription` | string | About the company |
| `companyMission` | string | Company mission |
| `companyOverallRating` | number | Company overall rating |

### Tips for Best Results

- **Reviews come back one language at a time — plan for it.** Glassdoor's review pages show a single language, and there is no "all languages" setting to turn on. Leave `reviewLanguage` on "Any language" to get the set the company's own page shows by default, then run again for each additional language you need and combine the datasets. It is worth doing: on one large employer, 686, 331, 847 and 232 reviews were reachable across four different languages.
- **An empty result usually means the wrong language, not a missing company.** A company with thousands of reviews overall can have none at all in the language you picked. If a search returns nothing, clear `reviewLanguage` or try another one before concluding the company has no reviews.
- **Read a blank sub-rating as "not answered", not as zero.** Reviewers can submit an overall star rating without touching any of the six category ratings — in a 42-review sample, 17 skipped all six. Average each sub-rating over the rows that actually carry it, or you will understate every category.
- **Pull the company details once, then run the bulk pass without them.** The 11 firmographics are identical for every review of the same company, so a short run with `enrichDetails` on gets you the company record, and the large sentiment run afterwards can leave it off and pay the base rate.
- **Watch the final status message, not just the row count.** When a search cannot be completed the run names the exact URL it failed on. Re-run that one URL rather than the whole set.
- **`maxItems` is per search URL, not per run.** Three URLs at 150 is a 450-review run. Set it to 0 to take everything each search returns.
- **Diff on `reviewDateTime` to monitor a company.** Schedule a recurring run and compare on this field to surface only new reviews instead of reprocessing the entire history each time.

### Pricing

**From $4.00 per 1,000 results** (reviews only) or **from $6.00 per 1,000 results** (with full company details).

| Results | Reviews Only | With Company Details |
|---------|--------------|----------------------|
| 100 | $0.40 | $0.60 |
| 1,000 | $4.00 | $6.00 |
| 10,000 | $40.00 | $60.00 |
| 100,000 | $400.00 | $600.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Reviews Only | With Company Details |
|-----------------|--------------|----------------------|
| No discount | $4.80 | $7.20 |
| Bronze | $4.50 | $6.75 |
| Silver | $4.25 | $6.40 |
| **Gold and above** | **$4.00** | **$6.00** |

Per 1,000 results.

A "result" is one company review in the output dataset. When you run several searches at once, a review matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same review. The company-details rate applies only to rows that actually came back with those fields — if a company record is unavailable, the review is still delivered and charged at the reviews-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Glassdoor.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research, employer-brand analytics and workforce research. You are responsible for complying with applicable laws and with Glassdoor.com's Terms of Service.

Every review is written by an individual. Job title, tenure, location and free-text opinions can identify a person, especially at a small employer or in a narrow role — treat all of it as personal data, do not use it to identify, contact, harass or retaliate against any reviewer, and follow applicable privacy rules when storing or processing it. Reviews are subjective opinions, not verified facts: do not use them to make hiring, promotion, termination or other employment decisions about individuals, and do not use them in any way that would discriminate against a protected group.

# Actor input Schema

## `searchUrls` (type: `array`):

Glassdoor.com search result URLs. Set your filters on Glassdoor.com, then paste the address bar URL here. Overrides the individual filters below when provided.

## `slug` (type: `string`):

Only used when Search URLs is empty. Glassdoor's own URL slug for the company, e.g. "Google" or "Azaé" -- the text between the language word and "-E<number>" in a Glassdoor reviews URL. Leave blank and use Search URLs instead; this exists only as a fallback.

## `id` (type: `integer`):

Only used when Search URLs is empty. The numeric ID Glassdoor assigns the company -- the digits after "-E" in a Glassdoor reviews URL. Leave blank and use Search URLs instead; this exists only as a fallback.

## `reviewLanguage` (type: `string`):

Only include reviews written in one language. Glassdoor's review pages only show one language's reviews at a time -- leaving this on "Any language" gets you the set the company's own page shows by default (often already the largest one). Picking a specific language narrows results down to just the reviews written in it, which for some companies means far fewer results, not more, so only pick one if you specifically need that language.

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

Maximum reviews per search URL (0 = collect everything each search returns).

## `enrichDetails` (type: `boolean`):

Add 11 extra company fields to every review, such as headquarters, size, industry, and website. Each company's details are looked up only once and reused across all of its reviews, so cost depends on how many different companies you scrape, not how many reviews. Billed at the higher rate for reviews that include these details.

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

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run. Defaults to residential -- Glassdoor's edge reputation-blocks Apify's datacenter IPs (measured stage 7b: 0/9 rows on datacenter vs 9/9 on residential).

## Actor input object example

```json
{
  "searchUrls": [],
  "reviewLanguage": "",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each review.

## `financial` (type: `string`):

Price & Value for each review.

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

Location for each review.

## `contact` (type: `string`):

Contacts for each review.

## `media` (type: `string`):

Media for each review.

## `meta` (type: `string`):

Details & Timestamps for each review.

# 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("solidcode/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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 '{}' |
apify call solidcode/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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