# Glassdoor Jobs, Reviews & Salary Scraper (`khadinakbar/glassdoor-scraper`) Actor

Scrape Glassdoor jobs, reviews, company profiles, and salary pages for recruiting, employer research, salary benchmarking, and HR analytics. Avoid private login-only data. Returns one record per job, review, company, salary, or diagnostic. Charged $0.006 per result.

- **URL**: https://apify.com/khadinakbar/glassdoor-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 glassdoor result scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Jobs, Reviews & Salary Scraper

**Glassdoor Scraper** extracts structured Glassdoor jobs, employee reviews, company profiles, and salary records into one MCP-ready dataset. Use it for recruiting research, employer reputation analysis, salary benchmarking, HR analytics, and competitive hiring intelligence.

Use this actor when you have a Glassdoor company/review/salary URL, a company name, or a job keyword plus location. Do not use it for LinkedIn, Indeed, private login-only Glassdoor data, or contact-email enrichment.

### Output

Each dataset row has a stable `recordType`:

| recordType | One row represents | Useful fields |
| --- | --- | --- |
| `job` | One Glassdoor job listing | `title`, `companyName`, `location`, `salaryText`, `datePosted`, `jobUrl`, `applyUrl` |
| `review` | One employee review | `rating`, `reviewTitle`, `pros`, `cons`, `reviewDate`, `jobTitle`, `employerResponse` |
| `company` | One company profile | `companyName`, `companyRating`, `companyReviewCount`, `website`, `industry`, `headquarters`, `size`, `revenue` |
| `salary` | One salary/pay row | `salaryTitle`, `salaryText`, `salaryMin`, `salaryMax`, `salaryMedian`, `salaryCurrency`, `salaryPeriod` |
| `diagnostic` | Non-billable run diagnostic | `diagnosticStatus`, `diagnosticMessage`, `sourceUrl` |

All rows include `sourceUrl` and `scrapedAt` so agents and downstream workflows can trace freshness and provenance.

### Pricing

This actor uses Pay per event + usage:

| Event | Price |
| --- | ---: |
| Actor start | $0.00005 |
| Glassdoor result scraped | $0.006 per saved job, review, company, or salary record |

Diagnostic rows are not charged. Apify platform usage, including compute and proxy usage, is charged separately by Apify under Pay per event + usage.

Example: a 25-result test run is capped at about `$0.150` in result events, plus platform usage.

### Input Examples

#### Scrape Glassdoor jobs

```json
{
  "includeJobs": true,
  "includeReviews": false,
  "includeCompanies": false,
  "searchQuery": "software engineer",
  "location": "New York, NY",
  "country": "US",
  "maxResults": 25
}
```

#### Scrape company reviews and profile data

```json
{
  "includeJobs": false,
  "includeReviews": true,
  "includeCompanies": true,
  "startUrls": [
    { "url": "https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm" }
  ],
  "maxResults": 50,
  "maxReviewsPerCompany": 50
}
```

#### Search by company name

```json
{
  "includeJobs": false,
  "includeReviews": true,
  "includeCompanies": true,
  "companyNames": ["Apify"],
  "maxResults": 25
}
```

### How It Works

Job search uses the maintained `khadinakbar/jobs-scraper` backend restricted to Glassdoor results. Company, review, and salary URL modes use Playwright with residential proxy support, session consistency, homepage session seeding, visible-page extraction, and JSON response capture when Glassdoor exposes structured data.

The actor validates each full row before writing it. Billable result events are attached to the validated `Actor.pushData(record, "result-scraped")` call, so result charging only happens with a persisted dataset row.

### Limitations

Glassdoor can hide data, change markup, or return security pages. The actor records `OUTPUT` and `RUN_SUMMARY` on every terminal path and returns truthful outcomes: `COMPLETE`, `PARTIAL`, `VALID_EMPTY`, `INVALID_INPUT`, `UPSTREAM_FAILED`, or `CONFIG_ERROR`.

Salary pages and deep review pagination are more likely to be blocked than job search. If a valid target produces no visible public rows, the run ends as `VALID_EMPTY` or an honest upstream diagnostic instead of fabricating records.

### API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~glassdoor-scraper/runs" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "data analyst",
    "location": "London",
    "country": "GB",
    "includeJobs": true,
    "includeReviews": false,
    "includeCompanies": false,
    "maxResults": 25
  }'
```

### MCP And Integrations

Use this actor through the Apify MCP Server when an agent needs Glassdoor jobs, employee-review text, company profile metadata, or salary rows in a single run. The output schema keeps one stable row shape with a `recordType` discriminator, which makes it easier for Claude, ChatGPT, LangChain, Make, Zapier, n8n, and CSV/Excel exports to consume.

For broad multi-board job aggregation, use [Jobs Scraper - Indeed, LinkedIn & Glassdoor](https://apify.com/khadinakbar/jobs-scraper). Use this actor when Glassdoor-specific reviews, company profiles, or salary pages matter.

### Is It Legal To Scrape Glassdoor?

This actor is designed for public Glassdoor pages and user-supplied public URLs. You are responsible for making sure your use case complies with applicable laws, Glassdoor terms, privacy rules, and Apify policies. Do not use the actor to collect private account data, bypass authentication, or process personal data without a lawful basis.

# Actor input Schema

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

Use this when you already have Glassdoor company, review, salary, or overview URLs. Accepts Request List objects such as \[{"url":"https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm"}]. Defaults to an empty list. NOT for LinkedIn, Indeed, or non-Glassdoor URLs.

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

Use this when you know company names but not Glassdoor URLs. Accepts a list such as \["Apify", "Stripe"]. Defaults to an empty list. NOT a place for job keywords; use searchQuery for jobs.

## `searchQuery` (type: `string`):

Use this when scraping Glassdoor job listings by keyword. Accepts plain text such as "software engineer" or "data analyst". Defaults to "software engineer" for health checks and quick tests. NOT a company review URL.

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

Location used with searchQuery for Glassdoor job search. Use a city, region, or country such as "New York, NY" or "London". Defaults to "New York, NY". NOT used to geocode company review URLs.

## `country` (type: `string`):

Two-letter country hint used for proxy routing and job-search context. Use ISO-style values such as "US", "GB", or "CA". Defaults to "US". NOT a free-form location; use location for city or region.

## `includeJobs` (type: `boolean`):

Turn this on to scrape Glassdoor jobs through the portfolio jobs backend. Uses searchQuery, location, country, jobType, daysOld, and remoteOnly. Defaults to true so the actor has a useful one-click run. Turn off for URL-only company review research.

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

Turn this on to extract Glassdoor employee reviews from review URLs or company searches. Returns ratings, pros, cons, review date, role, and employer responses when visible. Defaults to true for URL/company-name runs. NOT used for job-search-only runs without URLs.

## `includeCompanies` (type: `boolean`):

Turn this on to save one company profile record from each Glassdoor company page. Returns rating, review count, website, industry, headquarters, size, revenue, CEO, and about text when visible. Defaults to true. NOT a business-email enrichment mode.

## `includeSalaries` (type: `boolean`):

Turn this on to extract salary rows from Glassdoor salary pages. Returns job title, pay text, min/max/median pay, currency, period, location, and sample count when visible. Defaults to false because salary pages are more block-prone. NOT compensation verification.

## `maxResults` (type: `integer`):

Maximum number of billable Glassdoor records to save across all selected data types. Use a small number like 25 for tests or up to 5000 for larger batches. Defaults to 25. Diagnostic rows do not count toward this limit or result charges.

## `maxJobs` (type: `integer`):

Maximum Glassdoor job records to request from the jobs backend. Use this when jobs should consume only part of the total maxResults budget. Defaults to 25. NOT a page count; it is a result count.

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

Maximum number of employee reviews to save from each company target. Use this to prevent one large employer from consuming the whole run budget. Defaults to 25. NOT the global limit; maxResults still caps the whole run.

## `maxPagesPerTarget` (type: `integer`):

Maximum review pagination pages to visit for each Glassdoor URL. Use 1-5 for quick runs and higher values for deeper review collection. Defaults to 5. NOT a guarantee that Glassdoor exposes that many pages publicly.

## `daysOld` (type: `integer`):

Recency filter for Glassdoor job search. Use values like 1, 7, 14, or 30. Defaults to 14 days. NOT applied to employee reviews or salary pages.

## `jobType` (type: `string`):

Job type filter passed to the jobs backend. Use "all", "fulltime", "parttime", "contract", or "internship". Defaults to "all". NOT used for employee review role titles.

## `remoteOnly` (type: `boolean`):

Restrict the jobs backend to remote Glassdoor job listings when supported. Use this for remote-only recruiting or market research. Defaults to false. NOT a review or salary-page filter.

## `includeNoSalaryJobs` (type: `boolean`):

Keep job listings even when Glassdoor does not show salary data. Turn off when salary benchmarking requires only rows with compensation text. Defaults to true. NOT used for salary-page records.

## `sortReviewsBy` (type: `string`):

Sort order applied to Glassdoor review pages before extraction. Use "default" to keep the URL unchanged, "recent" for newest reviews, or "popular" for relevance. Defaults to "default" for reliability. NOT used for job listings.

## `responseFormat` (type: `string`):

Controls how much review context each item includes. Use "concise" for lighter agent output or "detailed" for subratings, advice, location, outlook, and employer responses when visible. Defaults to "detailed". NOT a CSV formatting option.

## `deduplicate` (type: `boolean`):

Skip repeated jobs, reviews, companies, and salary rows detected within the same run. Keep this on for most Glassdoor batches. Defaults to true. NOT cross-run monitoring or database syncing.

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

Maximum number of Glassdoor browser pages processed at once. Use 1 for reliability on Cloudflare-protected pages or up to 3 for faster small batches. Defaults to 1. NOT used by the internal jobs backend.

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

Optional override for Glassdoor browser-page traffic. Defaults to Apify Residential US proxies because Glassdoor uses anti-bot protection. Keep the default unless you know your proxy pool works. NOT where you enter Glassdoor cookies or passwords.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm"
    }
  ],
  "companyNames": [
    "Apify"
  ],
  "searchQuery": "software engineer",
  "location": "New York, NY",
  "country": "US",
  "includeJobs": true,
  "includeReviews": true,
  "includeCompanies": true,
  "includeSalaries": false,
  "maxResults": 25,
  "maxJobs": 25,
  "maxReviewsPerCompany": 25,
  "maxPagesPerTarget": 5,
  "daysOld": 14,
  "jobType": "all",
  "remoteOnly": false,
  "includeNoSalaryJobs": true,
  "sortReviewsBy": "default",
  "responseFormat": "detailed",
  "deduplicate": true,
  "maxConcurrency": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

API URL for saved Glassdoor job, review, company, salary, and diagnostic dataset rows.

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

API URL for RUN\_SUMMARY with outcome, counts, warnings, provider routes, storage IDs, and charge totals.

## `output` (type: `string`):

API URL for the compact OUTPUT record with terminal outcome, message, item counts, warnings, and charged events.

# 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": [
        {
            "url": "https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm"
        }
    ],
    "companyNames": [
        "Apify"
    ],
    "searchQuery": "software engineer",
    "location": "New York, NY",
    "country": "US",
    "includeJobs": true,
    "includeReviews": true,
    "includeCompanies": true,
    "includeSalaries": false,
    "maxResults": 25,
    "maxJobs": 25,
    "maxReviewsPerCompany": 25,
    "maxPagesPerTarget": 5,
    "daysOld": 14,
    "jobType": "all",
    "remoteOnly": false,
    "includeNoSalaryJobs": true,
    "sortReviewsBy": "default",
    "responseFormat": "detailed",
    "deduplicate": true,
    "maxConcurrency": 1,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "startUrls": [{ "url": "https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm" }],
    "companyNames": ["Apify"],
    "searchQuery": "software engineer",
    "location": "New York, NY",
    "country": "US",
    "includeJobs": True,
    "includeReviews": True,
    "includeCompanies": True,
    "includeSalaries": False,
    "maxResults": 25,
    "maxJobs": 25,
    "maxReviewsPerCompany": 25,
    "maxPagesPerTarget": 5,
    "daysOld": 14,
    "jobType": "all",
    "remoteOnly": False,
    "includeNoSalaryJobs": True,
    "sortReviewsBy": "default",
    "responseFormat": "detailed",
    "deduplicate": True,
    "maxConcurrency": 1,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/glassdoor-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": [
    {
      "url": "https://www.glassdoor.com/Reviews/Apify-Reviews-E3100324.htm"
    }
  ],
  "companyNames": [
    "Apify"
  ],
  "searchQuery": "software engineer",
  "location": "New York, NY",
  "country": "US",
  "includeJobs": true,
  "includeReviews": true,
  "includeCompanies": true,
  "includeSalaries": false,
  "maxResults": 25,
  "maxJobs": 25,
  "maxReviewsPerCompany": 25,
  "maxPagesPerTarget": 5,
  "daysOld": 14,
  "jobType": "all",
  "remoteOnly": false,
  "includeNoSalaryJobs": true,
  "sortReviewsBy": "default",
  "responseFormat": "detailed",
  "deduplicate": true,
  "maxConcurrency": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call khadinakbar/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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