# Glassdoor Reviews Scraper & API (`quarra/glassdoor-reviews-scraper`) Actor

Every Glassdoor employee review of a company, from its link or name: rating, six sub-ratings, recommend, CEO approval, outlook, pros, cons, advice, job title, location, tenure, employer replies. Filters by date, rating, language, job title. No reviewer name.

- **URL**: https://apify.com/quarra/glassdoor-reviews-scraper.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.10 / 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/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 Reviews Scraper & API

Get every employee review of any company on Glassdoor, in bulk. Paste company links or names. Each review comes back with
the overall rating and the six sub-ratings (work/life balance, culture and values, diversity and inclusion, career
opportunities, compensation and benefits, senior management), recommend to a friend, CEO approval, business outlook,
headline, pros, cons, advice to management, job title, location, employment status, current or former employee, time at
the company, helpful votes, language, date, and the company's responses. Filter by date, rating, language, job title,
location or current employees. Export as JSON, CSV or Excel, or read it through the Apify API.

**No reviewer name, profile or ID.** We deliver what was said about the company, not who said it. Names and signatures in
employer replies are removed.

### Quick start

1. Paste one or more company links into **Glassdoor links** (`https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm`,
   from any Glassdoor country site), or names into **Company names** (`Sixt`).
2. Set **Max reviews per company** (empty reads them all) and **Max results in total**.
3. Click **Start** and read the reviews in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### What it is used for

- **Employer reputation**: what staff say about your company, or only the reviews since last week, every day.
- **Competitor and talent research**: pay, culture and management ratings of the companies you hire against.
- **HR analytics and market studies**: one chain across cities, job titles and years, with the six sub-ratings.
- **Sentiment analysis and AI training**: one clean record per review, pros and cons apart, the company's response
  next to it, a stable ID to deduplicate between runs.

### What you get

| | |
|---|---|
| Review ID (unique on Glassdoor: use it to deduplicate between runs) | yes |
| Overall rating (1 to 5), headline, pros, cons | yes |
| Advice to management | when given |
| Six sub-ratings (1 to 5) | when the reviewer rated them |
| Recommend to a friend, CEO approval, business outlook | when answered |
| Job title, location | when given |
| Employment status (full-time, part-time, contract, intern…), current or former employee | yes |
| Time at the company (`less than 1 year`, `more than 3 years`…) | when given |
| Helpful and not helpful votes | yes |
| Language of the review (`en`, `fr`, `de`, `nl`, `pt`, `es`, `it`) | yes |
| Date of the review | yes |
| The company's responses: text and date | when there is one |
| Link of the review and of the company, company name and ID | yes |
| Reviewer name, profile, ID | **no, never** |
| Names and signatures in the company's responses | **removed**: a person's sign-off (name, with the job title and team lines under it), a name in the greeting, a person named in the text (`[name]`). A sign-off with only the team or company name stays. An email address is kept only when it is a service address such as `hr@`, `jobs@`, `careers@` |

Name removal is good, not perfect. It is done by a name recognition model plus layout rules, tested on about 2,700 written cases and 467 real
replies; we found no leaked name in the standard layouts, and a few leaks or damaged words in the hardest sets, so we do not promise
zero. Known weak spots: a first name that is also a common word or the company's own name, a name written in a script the model
cannot read (Cyrillic, Greek, Korean, Japanese, Chinese, Arabic, Hebrew, Thai) in the middle of a sentence rather than in a greeting
or sign-off, a lone initial, and unusual sign-off layouts. Teams and company names are kept on purpose.

A field Glassdoor does not give for a review is `null`, never missing. A sub-rating the reviewer skipped is `null`
(never 0).

### Inputs

- **Glassdoor links**: any page of the company (reviews, overview, salaries, jobs) on any Glassdoor site. A link that
  already filters a city or a state keeps that filter.
- **Company names**: as written on Glassdoor. A name that matches exactly one company is used; a name that matches
  several gets a free error record that lists them, so you can pick the link.
- **Max reviews per company** (empty: all) and **Max results in total** (1,000 by default: raise it when you want more;
  Amazon alone has over 250,000 reviews). Both are counted exactly, also when a company is given both by link and by
  name.
- **Order**: newest first (default) or oldest first.
- **Since** and **Until**: a date such as `2026-01-31`, or a duration such as `30 days`. The reading starts and stops at
  your dates, without reading the years in between. Glassdoor keeps one list per language, so a date far in the past is looked up in each
  of them: on a very large company (Amazon), reading this far back in every language can cost more than one run can
  cover. The run then says so; pick one or two review languages.
- **Minimum rating** and **Maximum rating**: 1 to 5 stars.
- **Languages**: `en`, `fr`, `de`, `nl`, `pt`, `es`, `it`, one per line. Empty: every review.
- **Job title**: as Glassdoor writes it (`Software Engineer`, `Cook`). Glassdoor includes closely related titles
  (`Software Developer` with `Software Engineer`). A title Glassdoor does not know gets a free error record with the
  closest titles it lists.
- **Location**: a city, state or country as Glassdoor writes it (`Seattle, WA`, `Texas`, `Germany`). One that matches
  several places gets a free error record that lists them.
- **Current employees only**, and **Review contains** (up to 50 words, one per line, matched as whole words in the
  headline, pros, cons and advice).

Example, through the API:

```json
{
  "startUrls": ["https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm"],
  "companyNames": ["Sixt"],
  "since": "90 days",
  "maxRating": 2,
  "location": "Seattle, WA",
  "maxReviewsPerCompany": 500
}
```

### Output

One record per review in the dataset. A shortened review:

```json
{
  "type": "review",
  "status": "ok",
  "reviewId": "105785119",
  "companyId": "10875",
  "companyName": "Sixt",
  "rating": 2,
  "title": "Bonnes primes, mais management limité et heures supp négligées",
  "pros": "Grosses primes si bon commercialement",
  "cons": "Cela dépend sur quel secteur mais management très limite et heures sup…",
  "advice": null,
  "recommend": "negative",
  "ceoApproval": null,
  "businessOutlook": "positive",
  "workLifeBalanceRating": 3,
  "cultureAndValuesRating": 2,
  "diversityAndInclusionRating": 5,
  "careerOpportunitiesRating": 3,
  "compensationAndBenefitsRating": 2,
  "seniorManagementRating": 2,
  "jobTitle": "RSA",
  "location": "Paris",
  "employmentStatus": "full-time",
  "currentEmployee": false,
  "tenure": "more than 1 year",
  "helpfulVotes": 0,
  "notHelpfulVotes": 0,
  "language": "fr",
  "date": "2026-09-29T20:58:03Z",
  "employerResponse": "Chère ancienne collaboratrice / Cher ancien collaborateur,\n\nMerci pour…",
  "employerResponseDate": "2026-10-05T06:51:03Z",
  "employerResponses": [{"text": "Chère ancienne collaboratrice / Cher ancien collaborateur,\n\nMerci pour…", "date": "2026-10-05T06:51:03Z"}],
  "reviewUrl": "https://www.glassdoor.com/Reviews/Employee-Review-Sixt-RVW105785119.htm",
  "companyUrl": "https://www.glassdoor.com/Reviews/Sixt-Reviews-E10875.htm",
  "input": "Sixt",
  "position": 1,
  "scrapedAt": "2026-10-22T05:40:32Z"
}
```

- `status`: `ok` (delivered, charged) or `error` (free; `errorCode` and `error` say why, `retryable` says if a later run
  may work).
- `recommend` is `positive` or `negative`; `ceoApproval` is `approve`, `disapprove` or `no_opinion`; `businessOutlook`
  is `positive`, `neutral` or `negative`.
- `language` is the language of the review. Glassdoor sorts reviews in seven languages; the very few written in another
  language come with `null` (3 of Amazon's 254,716 reviews).
- `position` is the rank of the review in the chosen order for that company.

The run summary (counts per company, name, Glassdoor's overall rating and review count, why the run stopped, notes) is
the `OUTPUT` record of the run's key-value store.

### Pricing

Pay per event. Reviews cost less on higher Apify plans:

| Apify plan | Review |
|---|---|
| Free | $4.30 per 1,000 |
| Starter (Bronze) | $4.30 per 1,000 |
| Scale (Silver) | $4.20 per 1,000 |
| Business (Gold) | $4.10 per 1,000 |
| Platinum | $4.10 per 1,000 |
| Diamond | $4.10 per 1,000 |

On every plan, the run start is $0.005 per GB of memory (1 GB minimum, which is also the default memory). So 1,000 reviews of
one company come to $4.305 on the Free plan and $4.105 on Business.

Never charged: reviews that do not match your filters, error records, repeats (a review already delivered in the same
run, for example a company given both by link and by name, is skipped). Set **Maximum cost per run** in the run options
and the run stops before going over it, with the results delivered so far.

### Limits

- **Every review**: the Actor reads the whole history of a company, 100 reviews at a time. On Amazon, about 20,000 reviews
  in a few minutes.
- **Several ratings, words**: one rating (for example 1 star only) is filtered by Glassdoor itself; several ratings and
  **Review contains** are filtered here, so a rare word on a large company means reading many pages. Reviews that do not
  match are not charged. Set **Max reviews per company** or **Since** to bound it.
- **Dates** are in UTC, converted from the US Pacific time in which Glassdoor writes them.
- **Companies with similar names**: use the link when a name is ambiguous.
- If a run stops early (your maximum cost, Max results in total, its timeout), every company it did not read in full
  and gave nothing for gets a free `not_read` record, so no input is ever left without an answer.
- Anything missing from a result is said: in the run's status, in the `note` of each company in the `OUTPUT` record, or
  in a free error record. If Glassdoor limits access during a run, the run says so and keeps what it delivered; running
  it again later gives the rest.

### FAQ

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

**Why are reviewer names not included?** Glassdoor reviews are anonymous, and we add nothing that could point to a
person: no profile, no ID. Names and signatures in employer replies are removed. The review ID and link let you find
any review on Glassdoor.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: results already in
the dataset are not delivered or charged again. If it cannot (its saved progress is missing), it stops at once and says
so: what is in the dataset is not charged again, and a new run gives the rest.

**Is it legal?** It collects public reviews shown to any visitor of Glassdoor, without any personal data. Check the
rules that apply to your use of the data.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error
type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never
your input, your results, your account or the run ID.

# Actor input Schema

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

One per line: links of company pages, from any Glassdoor site (glassdoor.com, .co.uk, .de, .fr…). Reviews, overview, salaries or jobs page: any link with the company number works. Example: https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm

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

One per line, as written on Glassdoor (Amazon, Deloitte, Sixt). A name that matches several companies gets a free error record listing them: then use the link.

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

Stop a company after this many reviews. Empty: all of them (within 'Max results in total').

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

Stop the run after this many reviews, all companies together. Default 1,000: raise it for more (Amazon alone has over 250,000).

## `sort` (type: `string`):

Order of the reviews for each company.

## `since` (type: `string`):

Only reviews from this date on: 2026-01-31, or a duration such as '30 days', '3 months'. Empty keeps all.

## `until` (type: `string`):

Only reviews up to this date (included). Empty keeps all.

## `minRating` (type: `integer`):

Keep only reviews with at least this many stars (1 to 5). Empty keeps all.

## `maxRating` (type: `integer`):

Keep only reviews with at most this many stars. Set both to 1 for one-star reviews only.

## `languages` (type: `array`):

Review languages, one per line: en, fr, de, nl, pt, es, it. Empty: every review, each tagged with its language.

## `jobTitle` (type: `string`):

Only reviews for this job title, as Glassdoor writes it (Software Engineer, Cook, Warehouse Associate). Empty keeps all.

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

Only reviews for this city, state or country, as Glassdoor writes it (Seattle, WA; Texas; Germany). Empty keeps all.

## `currentEmployeesOnly` (type: `boolean`):

Keep only reviews written by people who still work there.

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

Keep only reviews whose title, pros, cons or advice contain one of these words, as a whole word (not case-sensitive). One per line, 50 at most.

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

Connection. Keep the default (automatic). Costs are included in the price.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.glassdoor.com/Reviews/MOD-Pizza-Reviews-E366264.htm"
  ],
  "maxReviewsPerCompany": 50,
  "maxItems": 1000,
  "sort": "newest",
  "currentEmployeesOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every record with all its fields, and free error records.

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

One line per review.

## `summary` (type: `string`):

Counts per company, why the run stopped, errors.

# 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 = {
    "startUrls": [
        "https://www.glassdoor.com/Reviews/MOD-Pizza-Reviews-E366264.htm"
    ],
    "maxReviewsPerCompany": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/glassdoor-reviews-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 = {
    "startUrls": ["https://www.glassdoor.com/Reviews/MOD-Pizza-Reviews-E366264.htm"],
    "maxReviewsPerCompany": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/glassdoor-reviews-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 '{
  "startUrls": [
    "https://www.glassdoor.com/Reviews/MOD-Pizza-Reviews-E366264.htm"
  ],
  "maxReviewsPerCompany": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call quarra/glassdoor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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