# Glassdoor Scraper (`mherzog/glassdoor-scraper`) Actor

- **URL**: https://apify.com/mherzog/glassdoor-scraper.md
- **Developed by:** [Matt Herzog](https://apify.com/mherzog) (community)
- **Categories:** Jobs
- **Stats:** 11 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

Fast and reliable Glassdoor scraper for job listings, company reviews, salaries, and interview data. Built with CheerioCrawler and residential proxies for high success rates.

### Features

- **Job Search**: Scrape job listings with full descriptions, salaries, and company info
- **Company Data**: Extract company profiles, ratings, CEO info, and employee insights
- **Reviews**: Get employee reviews with pros, cons, and detailed ratings
- **Salaries**: Extract salary data by job title and company
- **Anti-blocking**: Advanced fingerprint rotation, session management, and residential proxies
- **Deduplication**: Track seen items across runs to avoid duplicates
- **Flexible Input**: Support for search queries and direct Glassdoor URLs

### Input

| Field | Type | Description |
|-------|------|-------------|
| `scrapeType` | string | What to scrape: `jobs`, `reviews`, `salaries`, `interviews`, `companies` |
| `searchQueries` | array | List of job titles or keywords to search |
| `startUrls` | array | Direct Glassdoor URLs to scrape |
| `location` | string | Location filter (e.g., "San Francisco, CA") |
| `maxItemsPerQuery` | number | Max items per search query (default: 50) |
| `jobType` | string | Filter: `fulltime`, `parttime`, `contract`, `internship`, `temporary` |
| `seniorityType` | string | Filter: `entrylevel`, `midseniorlevel`, `director`, `executive` |
| `postedWithin` | string | Filter by days: `1`, `3`, `7`, `14`, `30` |
| `remoteOnly` | boolean | Only show remote jobs |
| `easyApplyOnly` | boolean | Only show Easy Apply jobs |
| `minRating` | number | Minimum company rating (1.0-5.0) |
| `minSalary` | number | Minimum annual salary (USD) |
| `includeJobDetails` | boolean | Scrape full job descriptions (default: true) |
| `includeCompanyData` | boolean | Scrape additional company info |
| `includeSalaryData` | boolean | Scrape salary insights |
| `storageName` | string | Deduplication storage name |
| `proxy` | object | Proxy configuration |

### Output

#### Job Listing

```json
{
  "jobId": "1234567890",
  "url": "https://www.glassdoor.com/job-listing/...",
  "title": "Senior Software Engineer",
  "company": "Acme Inc",
  "companyId": "12345",
  "location": "San Francisco, CA",
  "city": "San Francisco",
  "state": "CA",
  "remote": false,
  "salary": "$150K - $200K",
  "salaryMin": 150000,
  "salaryMax": 200000,
  "salaryPeriod": "yearly",
  "rating": 4.2,
  "reviewCount": 1500,
  "description": "Full job description...",
  "benefits": ["Health Insurance", "401(k)", "Remote Work"],
  "skills": ["Python", "AWS", "Kubernetes"],
  "jobType": "Full-time",
  "easyApply": true,
  "sponsored": false,
  "postedDate": "2024-01-15",
  "scrapedAt": "2024-01-20T10:30:00Z",
  "searchQuery": "software engineer",
  "searchLocation": "San Francisco, CA"
}
```

### Usage Examples

#### Search for jobs

```json
{
  "scrapeType": "jobs",
  "searchQueries": ["software engineer", "data scientist"],
  "location": "New York, NY",
  "maxItemsPerQuery": 100,
  "jobType": "fulltime",
  "remoteOnly": false
}
```

#### Scrape from specific URL

```json
{
  "scrapeType": "jobs",
  "startUrls": [
    { "url": "https://www.glassdoor.com/Job/san-francisco-software-engineer-jobs-SRCH_IL.0,13_IC1147401_KO14,31.htm" }
  ],
  "maxItemsPerQuery": 50
}
```

#### Get jobs with company details

```json
{
  "scrapeType": "jobs",
  "searchQueries": ["product manager"],
  "location": "United States",
  "includeJobDetails": true,
  "includeCompanyData": true,
  "minRating": 4.0
}
```

### Proxy Configuration

Residential proxies are required for reliable scraping. The scraper uses Apify Proxy by default:

```json
{
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Rate Limits

Glassdoor has strict anti-bot measures. The scraper uses:

- 4-10 second delays between requests
- Session rotation on blocks
- Browser fingerprint rotation
- Realistic headers and referer chains

### Legal Notice

Scraping Glassdoor may be subject to their Terms of Service. Use responsibly and ensure compliance with applicable laws and regulations.

### Support

For issues or feature requests, please open an issue on GitHub.

# Actor input Schema

## `command` (type: `string`):

What type of data to scrape. Use 'auto' to detect from URL.

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

Glassdoor URLs to scrape. Examples: company reviews page, salary page, jobs page, or company overview page.

## `searchQueries` (type: `array`):

Keywords to search for jobs (only works with 'jobs' command). Our unique feature - search jobs by keyword!

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

Location filter for job searches (e.g., 'New York, NY', 'San Francisco, CA')

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

Maximum number of items to scrape per URL

## `includeAllReviews` (type: `boolean`):

Include reviews in all languages, not just English

## `includeCompanyReviewStats` (type: `boolean`):

Include aggregate company statistics with reviews (ratings breakdown, CEO approval, etc.)

## `reviewsStartDate` (type: `string`):

Only include reviews after this date (ISO format: YYYY-MM-DD)

## `includeCompanyInterviewStats` (type: `boolean`):

Include aggregate interview statistics (difficulty, experience breakdown)

## `interviewsStartDate` (type: `string`):

Only include interviews after this date (ISO format: YYYY-MM-DD)

## `includeAllSalaries` (type: `boolean`):

Include salary data for all job titles at the company

## `jobTitleFilter` (type: `string`):

Filter salaries/interviews by job title keyword

## `easyApplyOnly` (type: `boolean`):

Only include jobs with Easy Apply option

## `includeSponsored` (type: `boolean`):

Include sponsored/promoted job listings

## `minPay` (type: `integer`):

Filter jobs by minimum estimated pay (median, annual equivalent)

## `benefitsStartDate` (type: `string`):

Only include benefits reviews after this date (ISO format: YYYY-MM-DD)

## `categoryFilter` (type: `string`):

Filter culture/diversity data by category

## `proxy` (type: `object`):

Configure proxy settings. Residential proxies recommended for Glassdoor.

## Actor input object example

```json
{
  "command": "auto",
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
    }
  ],
  "searchQueries": [],
  "location": "",
  "maxItems": 100,
  "includeAllReviews": false,
  "includeCompanyReviewStats": true,
  "includeCompanyInterviewStats": true,
  "includeAllSalaries": true,
  "easyApplyOnly": false,
  "includeSponsored": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "command": "auto",
    "startUrls": [
        {
            "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
        }
    ],
    "searchQueries": [],
    "location": "",
    "maxItems": 100,
    "reviewsStartDate": "",
    "interviewsStartDate": "",
    "jobTitleFilter": "",
    "benefitsStartDate": "",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mherzog/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 = {
    "command": "auto",
    "startUrls": [{ "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm" }],
    "searchQueries": [],
    "location": "",
    "maxItems": 100,
    "reviewsStartDate": "",
    "interviewsStartDate": "",
    "jobTitleFilter": "",
    "benefitsStartDate": "",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mherzog/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 '{
  "command": "auto",
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
    }
  ],
  "searchQueries": [],
  "location": "",
  "maxItems": 100,
  "reviewsStartDate": "",
  "interviewsStartDate": "",
  "jobTitleFilter": "",
  "benefitsStartDate": "",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call mherzog/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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