# Glassdoor Scraper: Jobs, Reviews, Salaries & Interviews (`deltaspider/glassdoor-scraper`) Actor

Scrape Glassdoor jobs with full descriptions, employee reviews, interview reports, salary percentiles, benefits reviews and company profiles in one Actor. Glassdoor API alternative, no login, no 200-review cap. JSON, CSV, Excel.

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

## Pricing

Pay per event

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

### What does Glassdoor Scraper do?

It collects six kinds of public Glassdoor data and returns them as structured rows:

- **Jobs** from a keyword and location search, filtered by posting age, job type, remote, Easy Apply, company rating, pay range, company size, seniority, industry sector, radius and hiring company, with salary ranges and occupation. With details on, each job also carries the full description, employment type, address with coordinates, and the hiring company's profile and every rating.
- **Employee reviews** for any company: every star sub-rating, pros, cons, advice, recommend, CEO and outlook verdicts, employment status, tenure, language, original text of translated reviews, and employer replies.
- **Interview reports**: difficulty, experience, outcome, how the candidate got the interview, location, the full process write-up, and the interview questions candidates shared.
- **Salary estimates**: base, bonus, stock, profit sharing, commission, tips and total pay as 10th to 90th percentiles, per company and job title, optionally by years of experience, broken down by demographic group, and with up to 50 recent individual salary reports (United States).
- **Benefits reviews**: employees' ratings and comments on a company's benefits package, per country.
- **Company profiles**: size, revenue, industry, HQ, website, offices, description, every rating with its star distribution, CEO approval, business outlook, ratings by demographic group, interview statistics, rated benefits, photos and awards.

No login, no browser and no cookies. Results arrive in seconds: 3,000 reviews take about 20 seconds.

### Why use it

- **No 200-review cap.** Page as deep as Glassdoor goes. Tested past review 30,000 of Google's 65,000+ in English.
- **Every rating, as numbers.** Work-life balance, culture, diversity, leadership, career and compensation ratings on every review, company and detailed job.
- **Real salary distributions.** Percentiles for each pay component, not one average, plus pay by demographic group and the individual reports behind them.
- **Deeper job searches.** Deep search reaches several times the listings one Glassdoor search serves.
- **Companies by name, ID or URL.** Type "Google", paste `9079`, or paste any Glassdoor company link.
- **Pay only for rows.** No monthly fee and no start fee. Nothing is charged for a run that returns nothing.

### How to use it

1. Pick **What to scrape**.
2. For jobs, enter a keyword and optionally a location and filters. Turn on **Include full job descriptions** for the detail fields, and **Deep search** to reach past Glassdoor's per-search limit.
3. For reviews, interviews, benefits reviews and company profiles, list the companies.
4. For salaries, list companies, a job title, or both. A title alone lists every company's pay for it.
5. Set **Max results** (per company for company data), run, and export as JSON, CSV or Excel.

### Input examples

One company's ratings, CEO approval, benefits and interview statistics, in one row:

```json
{ "scrapeType": "companies", "companies": ["Stripe"] }
```

What a job title pays across companies in one city:

```json
{ "scrapeType": "salaries", "jobTitle": "Data Scientist", "location": "London", "maxItems": 50 }
```

This week's remote jobs, with full descriptions:

```json
{
  "scrapeType": "jobs",
  "keyword": "product manager",
  "remoteOnly": true,
  "postedWithinDays": "7",
  "sortBy": "date",
  "includeJobDetails": true,
  "maxItems": 50
}
```

The latest English reviews of two companies:

```json
{
  "scrapeType": "reviews",
  "companies": ["Google", "https://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm"],
  "maxItems": 500,
  "reviewsSort": "DATE",
  "reviewsLanguage": "eng"
}
```

### Output

Every run returns one row type. Ratings are 1 to 5 stars, with `null` where nobody rated. Shares such as `ceoApprovalPercent` are whole percentages. Links are absolute URLs.

#### Jobs

| Fields                                                                                                                                                                                                                                         | Notes                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `jobId`, `url`, `title`, `normalizedTitle`, `occupation`, `occupationCodes`                                                                                                                                                                    | Occupation is Glassdoor's normalized role, e.g. "registered nurse"           |
| `companyId`, `companyName`, `companyLogoUrl`, `companyRating`                                                                                                                                                                                  |                                                                              |
| `location`, `locationId`, `countryId`                                                                                                                                                                                                          |                                                                              |
| `salaryMin`, `salaryMedian`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salarySource`                                                                                                                                                     | 10th, 50th and 90th percentile; source is `EMPLOYER_PROVIDED` or an estimate |
| `ageInDays`, `postedDate`, `easyApply`, `isSponsored`                                                                                                                                                                                          | `postedDate` is the listing's own date when details are on                   |
| `industry`, `industryId`, `sector`, `sectorId`                                                                                                                                                                                                 |                                                                              |
| With details: `description`, `descriptionHtml`, `applyUrl`, `discoverDate`, `employmentTypes`, `remoteWorkTypes`                                                                                                                               | e.g. `["fulltime"]`                                                          |
| With details: `address`, `city`, `state`, `country`, `postalCode`, `latitude`, `longitude`                                                                                                                                                     |                                                                              |
| With details: `companyUrl`, `companyReviewsUrl`, `companySalariesUrl`, `companyBenefitsUrl`, `companyWebsite`, `companyHeadquarters`, `companySize`, `companyRevenue`, `companyType`, `companyYearFounded`, `companyCeo`, `companyCeoPhotoUrl` |                                                                              |
| With details: `companyRating*` for six categories, `companyCeoApprovalPercent`, `companyCeoRatingsCount`, `companyRecommendToFriendPercent`, `companyBusinessOutlookPercent`                                                                   |                                                                              |

#### Reviews

| Fields                                                                                                                                  | Notes                                                                                       |
| --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `reviewId`, `url`, `companyId`, `companyName`, `date`, `title`, `pros`, `cons`, `adviceToManagement`                                    |                                                                                             |
| `ratingOverall` and six sub-ratings                                                                                                     |                                                                                             |
| `recommendToFriend`, `ceoApproval`, `businessOutlook`                                                                                   | `POSITIVE`/`NEGATIVE`, `APPROVE`/`DISAPPROVE`/`NO_OPINION`, `POSITIVE`/`NEUTRAL`/`NEGATIVE` |
| `jobTitle`, `jobTitleId`, `location`, `locationId`, `isCurrentEmployee`, `employmentStatus`, `lengthOfEmploymentYears`, `jobEndingYear` | Status is `REGULAR`, `PART_TIME`, `CONTRACT`, `INTERN` and similar                          |
| `language`, `translationMethod`, `titleOriginal`, `prosOriginal`, `consOriginal`, `adviceToManagementOriginal`                          | The `*Original` fields hold the source text of machine-translated reviews                   |
| `helpfulCount`, `unhelpfulCount`, `isFeatured`, `employerResponses`                                                                     |                                                                                             |

#### Interviews

`interviewId`, `companyId`, `companyName`, `date`, `jobTitle`, `jobTitleId`, `location`, `locationId`, `difficulty`, `experience`, `outcome`, `source` (how the candidate got the interview), `process`, `negotiation`, `advice`, `questions` (`{ question, answerCount }` for each question the candidate shared, usually one; empty for most reports), `helpfulCount`, `unhelpfulCount`, `isFeatured`, `employerResponses`.

#### Salaries

| Fields                                                                                                   | Notes                                                                                                                                                                                                                                                                                                                                                                            |
| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `companyId`, `companyName`, `companyRating`, `companyJobCount`                                           |                                                                                                                                                                                                                                                                                                                                                                                  |
| `jobTitle`, `jobTitleId`, `occupationId`, `location`                                                     |                                                                                                                                                                                                                                                                                                                                                                                  |
| `payPeriod`, `currency`, `salaryCount`, `confidence`, `estimateUpdatedAt`                                |                                                                                                                                                                                                                                                                                                                                                                                  |
| `totalPay`, `basePay`, `additionalPay`, `cashBonus`, `stockBonus`, `profitSharing`, `commission`, `tips` | Each `{ mean, p10, p25, p50, p75, p90 }`, or `null`                                                                                                                                                                                                                                                                                                                              |
| `payByDemographic` (optional)                                                                            | `{ group, code, label, salaryCount, meanBasePay, currency, payPeriod }` per group; "Not disclosed" covers everyone who did not answer. Always spans every experience level                                                                                                                                                                                                       |
| `individualSalaries` (optional)                                                                          | Up to 50 most recent reports, newest first, United States only: `{ source, jobTitle, date, yearsOfExperience, payPeriod, annualBasePay, annualCashBonus, annualStockBonus, annualAdditionalPay, annualTotalPayMin, annualTotalPayMax, city, state, country }`. `source` is `title`, or `occupation` when Glassdoor pools reports across similar titles (those carry less detail) |

#### Benefits reviews

`benefitReviewId`, `companyId`, `companyName`, `countryId`, `date`, `rating`, `comment`, `helpfulCount`, `jobTitle`, `isCurrentEmployee`, `city`, `state`, `country`.

#### Company profiles

| Fields                                                                                                                                                                                       | Notes                                                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `companyId`, `name`, `shortName`, `url`, `logoUrl`, `coverPhotoUrl`, `website`, `headquarters`, `size`, `revenue`, `type`, `yearFounded`, `industry`, `industryId`, `description`, `mission` |                                                                                                          |
| `overallRating` and six category ratings, `recommendToFriendPercent`, `ceoApprovalPercent`, `ceoRatingsCount`, `businessOutlookPercent`, `ceo`                                               |                                                                                                          |
| `ratingDistribution`                                                                                                                                                                         | Star counts per category, plus recommend and won't-recommend votes                                       |
| `demographicRatings`                                                                                                                                                                         | Overall rating, recommend, CEO approval and outlook per self-reported group                              |
| `interviewStats`                                                                                                                                                                             | Interview count, average difficulty, experience shares, how candidates got interviews                    |
| `benefitsRating`, `benefitsReviewCount`, `benefitsSummary`, `benefits`                                                                                                                       | Each benefit's average rating, rating count and whether the employer verified it, for the chosen country |
| `reviewCount`, `salaryCount`, `interviewCount`, `benefitCount`, `photoCount`, `jobCount`                                                                                                     |                                                                                                          |
| `awards`, `officeLocations`, `photos` (first 20), `parentCompany`, `subsidiaries`, `siblingCompanies`                                                                                        |                                                                                                          |
| `reviewsUrl`, `salariesUrl`, `interviewsUrl`, `jobsUrl`, `benefitsUrl`                                                                                                                       |                                                                                                          |

#### Example: a review

```json
{
  "reviewId": 105844453,
  "url": "https://www.glassdoor.com/Reviews/Employee-Review-Google-E9079-RVW105844453.htm",
  "companyName": "Google Inc.",
  "date": "2026-10-04T17:27:18.477",
  "title": "Great work-life balance, but issues with management",
  "pros": "Great wlb and coworking culture",
  "cons": "Managers can be hit or miss",
  "ratingOverall": 4,
  "ratingWorkLifeBalance": 5,
  "ratingCultureAndValues": 3,
  "jobTitle": "SWE New Grad",
  "isCurrentEmployee": true,
  "employmentStatus": "PART_TIME",
  "lengthOfEmploymentYears": 2,
  "language": "eng"
}
```

#### Example: a salary estimate

```json
{
  "companyName": "Google Inc.",
  "jobTitle": "Software Engineer",
  "location": "New York, NY",
  "payPeriod": "ANNUAL",
  "currency": "USD",
  "totalPay": { "p10": 202569, "p25": 244980, "p50": 303783, "p75": 386076, "p90": 473902 },
  "basePay": { "mean": 182136, "p10": 132014, "p25": 153745, "p50": 182136, "p75": 215770, "p90": 251288 },
  "estimateUpdatedAt": "2026-09-29T16:24:42.357"
}
```

### Good to know

- **No proxy setup needed.** Requests go direct. If Glassdoor ever refuses one, the run retries it and continues through Apify Proxy on its own.
- **Job searches stop at a few hundred listings.** Glassdoor serves each search only so deep, whatever total it advertises. **Deep search** repeats the search narrowed by sector, company size, seniority, job type and posting age and adds what each finds: 2,524 of 3,602 New York software engineer jobs, against 884 without. Listings outside every narrower search stay out of reach.
- **Reviews come one language at a time.** Pick the language in the input.
- **Benefits are per country.** The location's country is used, or the United States when no location is set.
- **Salary job titles match Glassdoor's title families.** "software engineer" also matches Software Developer; a generic word such as "engineer" matches only titles named exactly that.
- **Most interview reports share no questions.** Sorting interviews by difficulty brings the ones that do to the top.
- **Individual salaries are capped at 50** per company, job title, location and experience band, and are only served for the United States. Location and Years of experience pick a different 50.
- **Company names resolve through Glassdoor's company search**, preferring an exact name match. The run log shows each resolution; use an ID or URL to be exact.

### Is it legal to scrape Glassdoor?

This Actor only reads data Glassdoor shows to any visitor without logging in. It does not access accounts or private data. Reviews contain text written by individuals, so check your local rules, such as GDPR, before storing or republishing personal information. Demographic breakdowns are aggregates Glassdoor publishes; they contain no individual's answers. This independent Actor is not affiliated with Glassdoor.

# Actor input Schema

## `scrapeType` (type: `string`):

Jobs come from a search. Reviews, interviews, benefits reviews and company profiles come from the companies you list. Salaries come from your companies, a job title, or both.

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

For jobs and title-only salary searches, the total. For company data, the limit per company. Glassdoor serves one job search only a few hundred listings deep; Deep search reaches more.

## `keyword` (type: `string`):

Jobs only. Job title, skill or company to search jobs for.

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

City, state or country, for example "New York", "California" or "Germany". Glassdoor's first match is used and logged. Also narrows salary estimates, and picks the country for benefits (United States when empty).

## `postedWithinDays` (type: `string`):

Only jobs posted within this window.

## `sortBy` (type: `string`):

Order of the job search results.

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

Only jobs of this employment type.

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

Only remote jobs.

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

Only jobs you can apply to on Glassdoor with Easy Apply.

## `minRating` (type: `string`):

Only jobs at companies rated at least this high.

## `minSalary` (type: `integer`):

Lowest annual pay, in the listing's currency.

## `maxSalary` (type: `integer`):

Highest annual pay, in the listing's currency, compared with the middle of the listing's pay range (salaryMedian): the top of a range can be higher.

## `companySize` (type: `string`):

Only jobs at companies of this size, in employees. Glassdoor's filter can place a company one band away from the size on its profile.

## `seniority` (type: `array`):

Only jobs at these levels. Leave empty for every level.

## `sectors` (type: `array`):

Only jobs at companies in these Glassdoor sectors, as job rows name them in `sector`. Leave empty for every sector.

## `radiusMiles` (type: `integer`):

How far from the location to search, in miles. Glassdoor uses 25 when empty; 0 keeps to the location itself.

## `hiringCompanies` (type: `array`):

Only jobs at these companies: names ("Google"), Glassdoor employer IDs ("9079") or company URLs. Names resolve like Companies and the run log shows each resolution. The run fails if none resolve.

## `deepSearch` (type: `boolean`):

Glassdoor stops serving a search after a few hundred listings, whatever its total. With this on, the search is then repeated narrowed by sector, company size, seniority, job type and posting age, adding listings it had not served. In a test it reached 2,524 of 3,602 jobs, against 884 without. Takes more requests and time; same price per job.

## `includeJobDetails` (type: `boolean`):

Adds the full description (text and HTML), apply link, exact posting date, employment type, address with coordinates, and the hiring company's profile: size, revenue, HQ, website, CEO and every rating. One extra request per job, so runs take longer. Same price per job.

## `companies` (type: `array`):

Required for reviews, interviews, benefits reviews and company profiles; optional for salaries. Company names ("Google"), Glassdoor employer IDs ("9079") or any Glassdoor company URL. Names resolve through Glassdoor's company search, preferring an exact name match; the run log shows each resolution.

## `reviewsSort` (type: `string`):

Order in which reviews are collected.

## `reviewsLanguage` (type: `string`):

Glassdoor serves reviews one language at a time.

## `onlyCurrentEmployees` (type: `boolean`):

Reviews only.

## `interviewsSort` (type: `string`):

Order in which interview reports are collected.

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

Salaries only. With companies, narrows their salaries to this title. Without companies, lists every company's pay for it.

## `yearsOfExperience` (type: `string`):

Salaries only. Narrows estimates to people with this much experience.

## `includeSalaryDemographics` (type: `boolean`):

Salaries only. Adds mean base pay by self-reported gender, race or ethnicity, birth year, sexual orientation, transgender identity, disability, veteran and parent or caregiver status. One extra request per salary row. The breakdown covers every experience level, even when Years of experience is set.

## `includeIndividualSalaries` (type: `boolean`):

Salaries only, United States only. Adds up to 50 of the most recent individual salary reports for each company and job title: the submitter's title, yearly pay (base, bonus and stock, or a rounded total range), experience band, city and date. Location and Years of experience narrow them. Up to two extra requests per salary row.

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

Usually not needed: Glassdoor's app API answers Apify's own servers, and if it ever refuses one, the run switches to Apify Proxy by itself. Set your own proxy to use it for every request.

## Actor input object example

```json
{
  "scrapeType": "jobs",
  "maxItems": 100,
  "keyword": "software engineer",
  "location": "New York",
  "postedWithinDays": "",
  "sortBy": "relevance",
  "jobType": "",
  "remoteOnly": false,
  "easyApplyOnly": false,
  "minRating": "",
  "companySize": "",
  "seniority": [],
  "sectors": [],
  "deepSearch": false,
  "includeJobDetails": false,
  "companies": [
    "Google"
  ],
  "reviewsSort": "DATE",
  "reviewsLanguage": "eng",
  "onlyCurrentEmployees": false,
  "interviewsSort": "DATE",
  "yearsOfExperience": "",
  "includeSalaryDemographics": false,
  "includeIndividualSalaries": false
}
```

# Actor output Schema

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

No description

# 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 = {
    "keyword": "software engineer",
    "location": "New York",
    "companies": [
        "Google"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deltaspider/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 = {
    "keyword": "software engineer",
    "location": "New York",
    "companies": ["Google"],
}

# Run the Actor and wait for it to finish
run = client.actor("deltaspider/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 '{
  "keyword": "software engineer",
  "location": "New York",
  "companies": [
    "Google"
  ]
}' |
apify call deltaspider/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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