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

🔥 Up to 30% OFF! Glassdoor employer intelligence — no login. Company overview with the full 1-5 star rating distribution (per category), size, industry, HQ, plus latest reviews with pros/cons and employer replies. Monitor any company. ⚡

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

## Pricing

from $3.50 / 1,000 item scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Company Reviews & Intelligence Scraper

Turns any company's Glassdoor page into a clean, structured **Employer Intelligence** record — the
full firmographic profile, the complete rating breakdown and distribution, and the latest
fully-structured employee reviews — from either a **Reviews page URL** or a **company name**.

**No login. No cookies. No captcha key. No browser.** Public data only.

### How it works

Glassdoor sits behind Cloudflare's *managed* Turnstile challenge and behaves like a DataDome-class
target that blocks at the IP level. Stealth headless browsers (and even a rebrowser-patched headful
Chromium) through residential proxies could not clear it.

This actor instead routes a single plain HTTPS `GET` through **Apify Proxy's `UNBLOCKER` group**,
which solves the anti-bot challenge on the proxy side and returns the final, fully-rendered HTML.
Glassdoor is a Next.js **App Router** app, so the data streams inside `self.__next_f.push([1,"..."])`
chunks (React Server Components payload); the actor concatenates those chunks and extracts the
employer profile, rating summary, rating distribution and review objects straight from them. **It
only ever returns real data — nothing is fabricated.**

#### One cheap request per company

Unlike scrapers that fire 6–12 Unblocker fetches per company chasing sort/filter permutations that
Glassdoor simply ignores, this actor does the job in **one request** — the cheapest and fastest way
to a complete snapshot.

### Input

| Field | Type | Notes |
|-------|------|-------|
| `companyUrls` | string\[] | Glassdoor Reviews page URLs, e.g. `https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm` |
| `companyName` | string | Plain company name (e.g. `Google`, `Nubank`) — searched on Glassdoor |
| `maxReviews` | integer | Cap on reviews per company (1–50, default 10) — see the anonymous limit below |
| `includeReviews` | boolean | Output individual reviews too (default `true`); `false` = overview only |
| `sort` | enum | Preferred review sort (best-effort; anonymous Glassdoor usually ignores it) |
| `language` | enum | Content language sent as `Accept-Language` (en, pt, es, fr, de, it, nl) |
| `proxyCountry` | string | ISO code for the Unblocker proxy (US, BR, GB, …). Auto-derived from the URL host if empty |
| `proxyGroups` | string\[] | Apify Proxy groups; defaults to `["UNBLOCKER"]` |
| `timeoutSecs` | integer | Per-request timeout (20–180, default 90) |
| `debugStoreHtml` | boolean | Store the fetched HTML in the key-value store for inspection |

At least one of `companyUrls` / `companyName` is required.

### Output

One **`company_overview`** item per company, plus (by default) one **`review`** item per review.

#### `company_overview`

The most complete company record in the niche:

`employer_id`, `name`, `legal_name`, `website`, `headquarters`, `industry`, `sector`, `size`,
`founded_year`, `revenue`, `company_type`, `description`, `logo`, `overall_rating`, `review_count`,
`rating_count`, `all_reviews_count`, `recommend_to_friend_pct`, `ceo_approval_pct`,
`business_outlook_pct`, `ratings_by_category` (work-life balance, career opportunities,
compensation & benefits, culture & values, senior management, diversity & inclusion), and
**`rating_distribution`** — the full 1★–5★ histogram for the overall score *and every category*,
plus recommend / won't-recommend counts. (Fields absent from a given company's page come back `null`.)

#### `review`

`review_id`, `review_url`, `title`, `rating`, `pros`, `cons`, `advice`, `job_title`, `location`,
`employment_status`, `is_current_job`, `length_of_employment`, `date`, `recommend_to_friend` (+ raw),
`ceo_approval` (+ raw), `business_outlook` (+ raw), `subratings` (6 categories), `count_helpful`,
`count_not_helpful`, `featured`, `original_language_id`, `is_translated`, and **`employer_responses`**
— the official company replies (text, date, responder) with `has_employer_response`.

### The anonymous limit — the honest truth

Logged out, Glassdoor's current site serves **only the 3 most-recent full reviews** per company and
hard-blocks every path that would surface more without an account (verified Oct 2026):

- `_P2.htm` / `_P3.htm` deep pagination → **502** (refused to anonymous clients)
- `?sort.sortType=…` / `?filter.*=…` → **ignored** (identical 3 reviews every time)
- the `/graph` GraphQL review API → **502** over the Unblocker (needs a logged-in CSRF token)

This actor therefore does **not** pretend to return hundreds of reviews it cannot legitimately reach
without logging in. It positions instead as the **richest, cheapest company-intelligence snapshot**:
one request → a complete employer profile + full rating distribution + the 3 latest structured
reviews with employer replies. For bulk historical review mining you would need a logged-in session,
which this actor intentionally does not use.

# Actor input Schema

## `companyUrls` (type: `array`):

Glassdoor company Reviews page URLs, e.g. https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm . Also accepts Overview URLs. Optional if companyName is set — at least one of the two is required.

## `companyName` (type: `string`):

A plain company name (e.g. "Google" or "Nubank"). The actor searches Glassdoor and uses the best-matching employer's Reviews page. Optional if companyUrls is set — at least one of the two is required.

## `maxReviews` (type: `integer`):

Maximum number of individual reviews to return per company. IMPORTANT: logged out, Glassdoor's current site exposes only the 3 most-recent full reviews per company (deep pagination, sorting and the GraphQL review API are all blocked to anonymous clients — getting hundreds of reviews requires a logged-in account, which this actor does NOT do). The full company-intelligence overview item is always returned in addition.

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

If true (default), output the individual review items in addition to the company overview. Set to false to get only the rich company-intelligence overview (ratings, firmographics, full rating distribution) and nothing else.

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

Preferred sort for the returned reviews. Best-effort only: anonymous Glassdoor usually ignores review sorting, so this may not change which reviews come back.

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

Preferred content language. Sent as the Accept-Language header so Glassdoor localises the page (UI strings and, where available, localised reviews).

## `proxyCountry` (type: `string`):

ISO country code for the Unblocker proxy (e.g. US, BR, GB, IN, CA, DE, FR). Leave empty to auto-pick from the target URL host (glassdoor.com.br -> BR, glassdoor.co.uk -> GB, else US).

## `proxyGroups` (type: `array`):

Apify Proxy groups to route requests through. Defaults to \["UNBLOCKER"], which solves Glassdoor's Cloudflare/anti-bot challenge on the proxy side and returns final HTML — this is what makes the scrape work without a captcha key or login. Change only if you know what you are doing.

## `timeoutSecs` (type: `integer`):

How long to wait for each Unblocker HTTP request to return the rendered Glassdoor page, in seconds (20-180). The Unblocker solves the challenge server-side, so requests routinely take 20-60s.

## `debugStoreHtml` (type: `boolean`):

When enabled, saves each company's fetched page HTML into the run's key-value store under debug-html-\* keys, for inspecting Glassdoor's current structure if extraction returns nothing. Off by default.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "maxReviews": 10,
  "includeReviews": true,
  "sort": "RELEVANCE",
  "language": "",
  "proxyGroups": [
    "UNBLOCKER"
  ],
  "timeoutSecs": 90,
  "debugStoreHtml": false
}
```

# Actor output Schema

# 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 = {
    "companyUrls": [
        "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bgfc97/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 = { "companyUrls": ["https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"] }

# Run the Actor and wait for it to finish
run = client.actor("bgfc97/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 '{
  "companyUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ]
}' |
apify call bgfc97/glassdoor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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