# Glassdoor Reviews Scraper & Employer Brand Monitor (`fascinating_lentil/glassdoor-reviews-scraper`) Actor

Collect public Glassdoor employee reviews, ratings and employer replies for employer-brand research. Track new reviews and rating changes with named watchlists and CSV/Markdown reports. $4/1,000 saved reviews plus the start event. No login.

- **URL**: https://apify.com/fascinating_lentil/glassdoor-reviews-scraper.md
- **Developed by:** [Md Jakaria Mirza](https://apify.com/fascinating_lentil) (community)
- **Categories:** Jobs, Lead generation, Other
- **Stats:** 2 total users, 0 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 review scrapeds

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/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 & Employer Brand Monitor

Turn public Glassdoor employee reviews into employer-brand and employee-experience research for HR, recruiting and people-analytics teams. Export available ratings, pros, cons and employer replies, then reuse a named watchlist to identify newly observed reviews and company-rating changes.

No Glassdoor login, cookies, or API key is required.

### What makes this Actor useful

- **Available public review data:** overall and six category ratings, headline, pros, cons, advice, recommendation/CEO/outlook signals, job title, current/former status, employment type, tenure, location, date, helpful votes, review URL, and available employer replies. Missing source fields remain null rather than being invented.
- **Company rating snapshot:** overall rating, total review count, recommend-to-friend, CEO approval, business outlook, and available category ratings.
- **Recurring monitoring:** named watchlists label every row as `baseline`, `new`, or `seen` and preserve per-review first-seen time and observation count.
- **Only-new mode:** after the first baseline, emit only newly observed reviews to avoid duplicate dataset charges. Checking the source still uses resources even when there are no new reviews.
- **Change signals:** identify company-rating fields that changed since the previous complete observation.
- **Ready-to-use reports:** dataset JSON, formula-safe CSV, Markdown summary, company snapshots, and an honest run report.
- **Reliable bounded access:** one sessionless specialist Unblocker request per reviews API page replaces the direct, datacenter, and Residential routes that Glassdoor blocked in live tests.
- **Safe partial results:** blocked or incomplete pages are reported as partial and are never treated as deleted reviews.

### Pricing: Saved Reviews + Actor Start

The Actor uses Pay Per Event pricing:

| Event | Price |
| --- | ---: |
| `review-scraped` | `$0.004` per successfully saved review, or `$4.00` per 1,000 |
| `apify-actor-start` | `$0.00005` per GB when the Actor starts, minimum one event |

Failed company requests and unsaved reviews do not trigger `review-scraped`. Reviews already saved before a partial failure retain their normal result charges. The Actor Start fee can still apply to empty or failed runs: Apify counts one start event per GB of memory, with at least one event. At the unchanged 256 MB default, that is `$0.00005` for the start event.

Platform usage is included under the current Store pricing. The monitoring reports have no separate report event. Check the [live Pricing tab](https://apify.com/fascinating_lentil/glassdoor-reviews-scraper/pricing) for current event prices, discounts and platform-usage terms before running. A saved-review subtotal is not the entire event bill: add the start fee.

### Quick start

Use a Glassdoor company Reviews URL:

```json
{
  "companyUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "maxReviewsPerCompany": 3,
  "watchlistName": "us-tech-employers",
  "onlyNewReviews": false
}
```

For recurring monitoring:

1. Run once with `onlyNewReviews: false` to create a baseline.
2. Save the input as an Apify Task.
3. Schedule the Task with the same `watchlistName`.
4. Turn on `onlyNewReviews` when you want later runs to emit only unseen reviews.

### Input

| Field | Purpose | Default |
|---|---|---:|
| `companyUrls` | Up to 20 Glassdoor company Reviews URLs | Google Reviews URL |
| `companyNames` | Optional company names to resolve | none |
| `maxReviewsPerCompany` | Maximum matching reviews saved per company | 3 |
| `filterByEmploymentStatus` | All, current, or former employees | all |
| `filterByJobTitle` | Case-insensitive job-title filter | none |
| `filterByLocation` | Case-insensitive location filter | none |
| `watchlistName` | Private key separating recurring monitors | `default` |
| `onlyNewReviews` | Emit only reviews unseen in earlier matching runs | `false` |
| `useUnblocker` | Use the recommended bounded anti-blocking route | `true` |
| `maxRunMinutes` | Stop new collection work near this limit | 5 |
| `proxyConfiguration` | Optional custom proxy override | automatic strategy |

Direct Glassdoor Reviews URLs are recommended when exact company matching matters.

### Review output

Each dataset row can include:

```json
{
  "companyName": "Example Co",
  "overallRating": 4,
  "ratingBand": "positive",
  "ratingWorkLifeBalance": 4,
  "ratingCultureAndValues": 5,
  "ratingDiversityAndInclusion": 4,
  "ratingSeniorLeadership": 3,
  "ratingCareerOpportunities": 4,
  "ratingCompensationAndBenefits": 5,
  "recommendToFriend": "POSITIVE",
  "ceoApproval": "APPROVE",
  "businessOutlook": "POSITIVE",
  "headline": "Supportive remote team",
  "pros": "Great culture and benefits.",
  "cons": "Some workload pressure.",
  "jobTitle": "Software Engineer",
  "employmentStatus": "Current Employee",
  "employmentType": "REGULAR",
  "employmentTenure": "4 years",
  "employmentTenureYears": 4,
  "location": "New York, NY",
  "reviewDate": "2026-10-10",
  "helpfulCount": 17,
  "topics": ["compensation", "culture", "remote-work", "workload"],
  "dataQualityWarnings": [],
  "monitoringStatus": "new",
  "firstObservedAt": "2026-10-11T00:00:00.000Z",
  "observationCount": 1,
  "companyChangeDetected": true,
  "companyChangedFields": ["overallRating", "totalReviewsCount"],
  "sourceQuality": "complete"
}
```

Topic labels are transparent keyword signals, not AI sentiment scores. `ratingBand` is deterministic: 4–5 positive, 3–3.9 mixed, below 3 negative.

### Saved outputs

- **Default dataset:** review rows.
- **`COMPANIES`:** company rating snapshots.
- **`MONITORING-REPORT`:** per-company coverage and change evidence.
- **`MONITORING-REPORT.md`:** readable monitoring summary.
- **`MONITORING-REPORT.csv`:** spreadsheet-ready review export with formula-injection protection.
- **`OUTPUT`:** run status, completed and failed company counts, budget status, and concise failure reasons.

### Reliability and cost controls

The Actor uses lightweight HTTP rather than a full browser. The default memory is 256 MB, the automated-test input requests only three reviews, and work is bounded by company, page, response-size, request-time, and total-run limits.

The automatic strategy makes one sessionless Unblocker request per reviews API page. It does not repeat a premium request through an HTML fallback. If you provide `proxyConfiguration`, that explicit choice replaces the automatic strategy.

Remaining review charges are checked before access setup, company resolution, collection and each dataset push. An exhausted limit is reported as `BUDGET_LIMITED`; it is not called an access block. A smaller affordable sample is explicitly partial and cannot overwrite a complete monitoring baseline. Startup/report storage costs can still apply.

Readable earlier pages are retained if a later page fails, with partial coverage and no monitoring-baseline update. Repeated pages, failed history writes and unresolved company names are not labeled `COMPLETE`. CSV and other report exports must succeed before history advances; an error after a history write reports confirmed commits rather than claiming rollback. `OUTPUT` separates output-billing/report failures from source failures and preserves the count of reviews actually saved.

Each request also respects the remaining total-run time. The run report distinguishes completed companies from unattempted companies. Source access failures remain visible; a total block never becomes a fabricated empty success.

The sessionless Unblocker request window is at most 75 seconds, shortened when the collection deadline is nearer. This allows headroom for slower challenge-solving responses without adding automatic retries, duplicate premium requests or a Residential fallback. Ordinary direct/custom routes retain their existing request limits.

The Unblocker connection accepts the proxy's interception certificate only for that managed route; ordinary direct connections retain normal TLS verification.

### Limits

Glassdoor can change its public pages or block access. A run can therefore return partial results or fail for a company. The Actor reports that condition instead of fabricating data or silently claiming completion. Filters may require reading additional public pages before enough matching reviews are found.

This Actor reads public information only. Use the data lawfully, respect applicable privacy and employment laws, and do not use it to make automated decisions about individual employees or job applicants.

# Actor input Schema

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

Up to 20 Glassdoor Reviews URLs. Direct URLs are the fastest and most reliable input.

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

Optional company names to resolve on Glassdoor. Use direct review URLs when exact matching matters.

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

Maximum matching reviews saved for each company. The quality-test default is deliberately small and finishes within five minutes.

## `filterByEmploymentStatus` (type: `string`):

Return all reviews or only current/former employees.

## `filterByJobTitle` (type: `string`):

Case-insensitive job-title filter, such as engineer or sales.

## `filterByLocation` (type: `string`):

Case-insensitive location filter, such as New York or Texas.

## `watchlistName` (type: `string`):

Stable private name for recurring comparisons, for example US SaaS competitors. Reuse it in scheduled runs.

## `onlyNewReviews` (type: `boolean`):

After the first baseline, save and charge only reviews not seen in earlier runs of this watchlist.

## `useUnblocker` (type: `boolean`):

Recommended. Make one sessionless Apify Unblocker request per review page. This replaces the blocked direct, datacenter, and Residential routes and prevents repeated premium requests.

## `maxRunMinutes` (type: `integer`):

Stops additional collection work near this limit and saves an honest partial report.

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

Optional advanced override. Leave empty for the bounded specialist Unblocker strategy.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
  ],
  "companyNames": [],
  "maxReviewsPerCompany": 3,
  "filterByEmploymentStatus": "",
  "filterByJobTitle": "",
  "filterByLocation": "",
  "watchlistName": "default",
  "onlyNewReviews": false,
  "useUnblocker": true,
  "maxRunMinutes": 5
}
```

# Actor output Schema

## `reviews` (type: `string`):

Default dataset with employee reviews and monitoring fields.

## `companies` (type: `string`):

Company ratings and category-level employer-brand metrics.

## `monitoringReport` (type: `string`):

Per-company access evidence, new-review counts, changes, and completion status.

## `monitoringMarkdown` (type: `string`):

Readable summary for recurring review checks.

## `monitoringCsv` (type: `string`):

Spreadsheet-ready export with formula-injection protection.

## `runSummary` (type: `string`):

Completed/failed company counts, budget status, and honest partial-run evidence.

# 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("fascinating_lentil/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("fascinating_lentil/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 fascinating_lentil/glassdoor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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