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

Scrape Glassdoor reviews, interviews, salaries, jobs, company overviews, office locations, benefits and culture ratings. No login or cookies. Search jobs with filters, monitor new reviews and score jobs against your skills. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/glassdoor-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.49 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 Scraper

**Glassdoor Scraper** extracts company data from [Glassdoor](https://www.glassdoor.com): employee reviews, interview reports, salaries, jobs, company overviews, office locations, benefit reviews and culture ratings. Paste company URLs and choose a data type, or run a filtered job search. You don't need a Glassdoor account, cookies or an API key.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
One actor for all eight Glassdoor data types, with one flat row per item. Mix any companies in one run, monitor new reviews on a schedule, and score jobs against your own skills.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/glassdoor-scraper. Scrapes Glassdoor company data and job searches without login or cookies. Call via ApifyClient: client.actor("parsebird/glassdoor-scraper").call(run_input={"startUrls": [{"url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"}], "command": "reviews", "sortReviewsBy": "DATE", "maxItems": 100}). Give startUrls, or searchJobsByKeyword with searchKeyword and/or searchLocation. Inputs: startUrls (array of {url}, any Glassdoor company tab), command ("reviews" | "interviews" | "locations" | "salaries" | "jobs" | "overview" | "benefits" | "culture"; omitted = follow each URL's tab), includes (string[] keyword filter), maxItems (integer per URL and per job search, 0 = all, default 100), sortReviewsBy ("RELEVANCE" | "DATE" | "DATE_ASC" | "RATING" | "RATING_ASC"), reviewsStartDate, interviewsStartDate, benefitsStartDate (YYYY-MM-DD), monitoringModeForReviews (only reviews newer than the previous run), includeAllReviews (every language), includeCompanyReviewStats, includeCompanyInterviewStats, includeCompanyBenefitsStats, includeAllSalaries (every country), saveOnlyUniqueItems (default true), maxConcurrency, minConcurrency, maxRequestRetries, proxy. Job search: searchJobsByKeyword (boolean), searchKeyword, searchLocation, sortBy ("date_desc" | "date_asc"), maxDaysOld ("1" | "3" | "7" | "14" | "30"), remoteWorkType ("0" | "1" = remote only), applicationType ("0" | "1" = Easy Apply only), jobType ("CF3CP" full-time | "75GKK" part-time | "NJXCK" contract | "4HKF7" temporary | "7SBAT" temp-to-hire | "internship" | "apprenticeship" | "entrylevel"), minSalary, maxSalary (strings), minRating ("1.0"-"4.0"), employerSize ("1"-"5"), radius ("0" | "5" | "10" | "15" | "25" | "50" | "100"), industryNid, sgocId (Glassdoor IDs as strings), deepSearch (boolean), expandKeywords (string[]), resumeKeywords (array of {keyword}; adds description, matchScore, matchedSkills, missingSkills). Output: one flat row per item, with fields that depend on command; see the README. Pricing: pay per result, plus a small run start fee. Full API spec: https://apify.com/parsebird/glassdoor-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is Glassdoor Scraper?

**Glassdoor Scraper** turns [Glassdoor](https://www.glassdoor.com) company pages and job searches into a dataset. Paste a company address from any tab, choose what you want, and click **Start**. To try it, keep the prefilled Google address, which saves 20 reviews.

It works as a **Glassdoor API alternative**, since Glassdoor has no open public API for this data. Download the results as **JSON, CSV or Excel**, or read them through the [Apify API](https://docs.apify.com/api/v2).

### What can Glassdoor Scraper do?

- ⭐ **Scrape reviews.** Get pros, cons, advice and every sub-rating. Sort them, filter by keyword or date, and read every language.
- 🔔 **Monitor new reviews.** Schedule a run that saves only reviews newer than the previous run.
- 💬 **Scrape interviews.** Get difficulty, experience, outcome, the process description and interview questions.
- 💰 **Scrape salaries.** Get pay percentiles by job title for one country or all of them, or the detail for one job title.
- 💼 **Scrape jobs.** List a company's open jobs, or search all of Glassdoor with filters for date, pay, job type, remote work, rating, company size, radius, industry and job function.
- 🎯 **Score jobs against your skills.** Add resume keywords to get a match score and the full description for each job.
- 🏢 **Get company data.** Read overviews, office locations, benefit reviews and culture ratings by demographic group.
- 📈 **Add company stats.** Attach review, interview or benefit statistics to each row.

Because it runs on Apify, you also get:

- [Scheduling](https://docs.apify.com/platform/schedules) to refresh your data daily, weekly or at any interval
- [API access](https://docs.apify.com/api/v2) with [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) clients
- [Integrations](https://docs.apify.com/platform/integrations) with Make, Zapier, Google Sheets, Slack and webhooks
- Export to JSON, CSV, Excel, XML and HTML

### What data can you extract from Glassdoor?

Which fields you get depends on the data type. These are the main ones.

| Data type | Main fields |
|-----------|-------------|
| `reviews` | `reviewId`, `reviewDateTime`, `summary`, `pros`, `cons`, `advice`, `ratingOverall` and 9 other ratings, `jobTitle`, `location`, `employmentStatus`, `isCurrentJob`, `lengthOfEmployment`, `countHelpful`, `employer`, `employerResponses`, and `companyReviewStats` when turned on |
| `interviews` | `id`, `reviewDateTime`, `jobTitle`, `location`, `difficulty`, `experience`, `outcome`, `source`, `durationDays`, `processDescription`, `negotiationDescription`, `userQuestions`, and `companyInterviewStats` when turned on |
| `salaries` | `jobTitle`, `salaryCount`, `payPeriod`, `currency`, `employer`, `country`, and mean and percentiles for base, total, bonus, stock, commission, profit sharing and tips |
| `jobs` | `listingId`, `jobTitleText`, `employerNameFromSearch`, `locationName`, `ageInDays`, `payCurrency`, `payPeriod`, `payPeriodAdjustedPay`, `rating`, `easyApply`, `sponsored`, `remoteWorkTypes`, `jobLink`, `seoJobLink`, and `description`, `matchScore`, `matchedSkills`, `missingSkills` with resume keywords |
| `overview` | `id`, `shortName`, `headquarters`, `size`, `revenue`, `type`, `yearFounded`, `website`, `primaryIndustry`, `ratings`, `counts`, `overview`, `competitors`, `awards`, `bestPlacesToWork`, `squareLogoUrl` |
| `locations` | `id`, `addressLine1`, `cityName`, `administrativeAreaName1`, `countryName`, `postalCode`, `latitude`, `longitude`, `metroId` |
| `benefits` | `id`, `rating`, `createDate`, `currentJob`, `userEnteredJobTitle`, `city`, `state`, `benefitComments`, and `companyBenefitStats` when turned on |
| `culture` | `category`, such as gender or ethnicity, and `categoryRatings` with review counts and every rating for each group |

Fields a reviewer left out, or that Glassdoor doesn't list, are `null` or empty.

### How to scrape Glassdoor step by step

1. Open [Glassdoor Scraper](https://apify.com/parsebird/glassdoor-scraper) and sign in to Apify.
2. Add **Company URLs**, such as `https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm`. Or turn on **Search jobs by keyword** and enter a keyword and location.
3. Choose a **Data type**.
4. Set **Max items**, the most rows to save for each URL and for the job search.
5. Open the other sections for dates, sorting, statistics and job filters.
6. Click **Start** and wait for the run to finish.
7. Download your Glassdoor data as JSON, CSV or Excel from the **Output** tab.

### Which Glassdoor URLs can you use?

| Tab | Address format |
|-----|----------------|
| Reviews | `/Reviews/{Company}-Reviews-E{id}.htm` |
| Jobs | `/Jobs/{Company}-Jobs-E{id}.htm` |
| Salaries | `/Salary/{Company}-Salaries-E{id}.htm` |
| Interviews | `/Interview/{Company}-Interview-Questions-E{id}.htm` |
| Overview | `/Overview/Working-at-{Company}-EI_IE{id}.htm` |
| Benefits | `/Benefits/{Company}-Benefits-EI_IE{id}.htm` |

Only the employer ID matters, so any tab works with any **Data type**. A salary address that names a job title returns one detailed row for that title.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| startUrls | array | — | Glassdoor company addresses from any tab |
| command | string | Follows each URL's tab | `reviews`, `interviews`, `locations`, `salaries`, `jobs`, `overview`, `benefits` or `culture` |
| includes | string\[] | — | Keep only rows containing at least one of these words |
| maxItems | integer | 100 | Most rows per URL and per job search. `0` means everything available. |
| sortReviewsBy | string | `RELEVANCE` | `RELEVANCE`, `DATE`, `DATE_ASC`, `RATING` or `RATING_ASC` |
| reviewsStartDate | string | — | Skip older reviews. Format: `2026-01-31`. |
| monitoringModeForReviews | boolean | `false` | Save only reviews newer than the previous run |
| includeAllReviews | boolean | `false` | Read reviews in every language |
| includeCompanyReviewStats | boolean | `false` | Add `companyReviewStats` to each review |
| interviewsStartDate | string | — | Skip older interviews |
| includeCompanyInterviewStats | boolean | `false` | Add `companyInterviewStats` to each interview |
| benefitsStartDate | string | — | Skip older benefit reviews |
| includeCompanyBenefitsStats | boolean | `false` | Add `companyBenefitStats` to each benefit review |
| includeAllSalaries | boolean | `false` | Read salaries in every country Glassdoor lists |
| saveOnlyUniqueItems | boolean | `true` | Skip rows already saved in this run |
| maxConcurrency, minConcurrency | integer | 3, 1 | Requests at once. Glassdoor rate-limits fast clients. |
| maxRequestRetries | integer | 4 | Retries for a failed request |
| proxy | object | — | Leave empty. Residential proxies are built in at no extra cost. |

#### Job search parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| searchJobsByKeyword | boolean | Turn on job search |
| searchKeyword, searchLocation | string | Job title or skill, and a city, state or country |
| sortBy | string | `date_desc` or `date_asc`. Empty means most relevant. |
| maxDaysOld | string | `1`, `3`, `7`, `14` or `30` |
| remoteWorkType | string | `1` for remote only |
| applicationType | string | `1` for Easy Apply only |
| jobType | string | `CF3CP` full-time, `75GKK` part-time, `NJXCK` contract, `4HKF7` temporary, `7SBAT` temp-to-hire, `internship`, `apprenticeship` or `entrylevel` |
| minSalary, maxSalary | string | Yearly amounts |
| minRating | string | `1.0`, `2.0`, `3.0` or `4.0` |
| employerSize | string | Glassdoor's bands from `1` (tiny) to `5` (huge) |
| radius | string | Miles from a city: `0`, `5`, `10`, `15`, `25`, `50` or `100` |
| industryNid | string | Industry ID, such as `10013` for Information Technology or `10012` for Healthcare |
| sgocId | string | Job function ID, such as `1011` for Information Technology or `1009` for Healthcare |
| deepSearch | boolean | Also search the most common job titles in the results, and merge without duplicates |
| expandKeywords | string\[] | Extra job titles to search when Deep search is on |
| resumeKeywords | array | Skills as `{"keyword": "ICU"}`. Adds a match score to each job without changing which jobs come back. |

These filters also apply to a company's jobs, when the data type is `jobs`.

Every review of a company, with statistics, newest first:

```json
{
    "startUrls": [{ "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm" }],
    "command": "reviews",
    "includeAllReviews": true,
    "includeCompanyReviewStats": true,
    "sortReviewsBy": "DATE",
    "maxItems": 1000
}
```

A wide job search, scored against your skills:

```json
{
    "searchJobsByKeyword": true,
    "searchKeyword": "registered nurse",
    "searchLocation": "Chicago, IL",
    "jobType": "CF3CP",
    "minSalary": "70000",
    "deepSearch": true,
    "expandKeywords": ["nurse practitioner"],
    "resumeKeywords": [{ "keyword": "ICU" }, { "keyword": "pediatrics" }],
    "saveOnlyUniqueItems": true,
    "maxItems": 500
}
```

### Output example

A review:

```json
{
    "__typename": "EmployerReviewRG",
    "reviewId": 106216861,
    "reviewDateTime": "2026-11-04T20:27:36.683",
    "summary": "Good benefits and nice campus with no complaints",
    "pros": "good benefits and compensation, nice campus",
    "cons": "i dont really have anything to complain",
    "advice": null,
    "ratingOverall": 5,
    "ratingWorkLifeBalance": 5,
    "ratingCompensationAndBenefits": 5,
    "ratingCareerOpportunities": 5,
    "ratingCultureAndValues": 5,
    "ratingDiversityAndInclusion": 5,
    "ratingSeniorLeadership": 5,
    "isCurrentJob": false,
    "employmentStatus": "REGULAR",
    "lengthOfEmployment": 0,
    "location": { "id": 1147442, "name": "Sunnyvale, CA", "type": "CITY" },
    "employer": {
        "id": 9079,
        "shortName": "Google",
        "largeLogoUrl": "https://media.glassdoor.com/sqll/9079/google-squarelogo-1441130773284.png",
        "regularLogoUrl": "https://media.glassdoor.com/sql/9079/google-squarelogo-1441130773284.png"
    },
    "languageId": "eng",
    "countHelpful": 0,
    "countNotHelpful": 0
}
```

A salary:

```json
{
    "__typename": "AggregatedSalaryEstimatesResult",
    "jobTitle": { "id": 4279, "gocId": 100063, "text": "Software Engineer" },
    "employer": { "id": 9079, "name": "Google Inc.", "primaryIndustryId": 200063 },
    "country": { "id": 1, "name": "United States" },
    "currency": { "code": "USD", "symbol": "$" },
    "payPeriod": "ANNUAL",
    "salaryCount": 51625,
    "confidence": "CONFIDENT",
    "basePayStatistics": {
        "mean": 176776.22,
        "percentiles": [
            { "ident": "P10", "value": 144297.03 },
            { "ident": "P50", "value": 176776.22 },
            { "ident": "P90", "value": 216566.01 }
        ]
    }
}
```

A job from a search with resume keywords:

```json
{
    "listingId": 1010011509199,
    "__typename": "JobViewHeader",
    "jobTitleText": "Registered Nurse - TEAM LEADER-WOMEN/CHILDREN L&D Experience Required",
    "employerNameFromSearch": "Methodist Hospitals",
    "employer": { "id": 20261 },
    "locationName": "Gary, IN",
    "ageInDays": 246,
    "rating": 3.4,
    "easyApply": false,
    "sponsored": false,
    "jobTypeKeys": ["search-jobs.job-type-options.fulltime"],
    "description": "<div>Overview: ...</div>",
    "matchScore": 0,
    "matchedSkills": [],
    "missingSkills": ["ICU", "pediatrics"]
}
```

These examples are shortened, and other data types have the fields listed above.

### How to use the Glassdoor API in Python and JavaScript

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/glassdoor-scraper").call(run_input={
    "startUrls": [{"url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"}],
    "command": "reviews",
    "sortReviewsBy": "DATE",
    "maxItems": 100,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["reviewDateTime"], item["ratingOverall"], item["summary"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/glassdoor-scraper').call({
    searchJobsByKeyword: true,
    searchKeyword: 'registered nurse',
    searchLocation: 'Chicago, IL',
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((job) => console.log(job.jobTitleText, job.employerNameFromSearch, job.locationName));
```

Get your token in [Apify Console](https://console.apify.com/settings/integrations). See every option on the [API tab](https://apify.com/parsebird/glassdoor-scraper/api).

### Use cases

- **Employer brand monitoring:** schedule a run to catch new reviews of your company, or a competitor's.
- **Salary benchmarking:** compare pay percentiles by job title, company and country.
- **Interview preparation:** collect a company's interview questions and processes by job title.
- **Recruiting and sales leads:** see which companies are hiring for a role, with pay ranges and locations.
- **Job hunting:** rank search results by how well they match your skills.
- **Workplace research:** analyse ratings by demographic group, or the themes in pros and cons.

### How does Glassdoor Scraper work?

1. It reads the employer ID from each URL, and your job search if you turned it on.
2. It opens a Glassdoor session through residential proxies and paces its requests.
3. It moves through the data page by page until it reaches Max items, your date cutoff or the end.
4. It skips rows that are duplicates or don't match your keywords, and saves the rest as it goes, so a stopped run keeps its results.

### How much does it cost to scrape Glassdoor?

Glassdoor Scraper uses pay-per-event pricing. Compute and proxy costs are included in the event price.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `apify-actor-start`, per run | **$0.005** | **$0.005** | **$0.005** | **$0.005** |
| `result-scraped`, per 1,000 | **$4.49** | **$3.99** | **$3.79** | **$3.49** |

A start event fires once per run for each GB of run memory, and the default memory stays within one. A result event fires for each row saved, whatever the data type. So 1,000 reviews cost about $4.50 on the Free tier and $3.50 on Gold.

Duplicates and rows dropped by your keyword filter cost nothing. Each overview is one row, each culture category such as gender is one row, and a salary address that names a job title is one row. To cap your spending, set a maximum cost per run in the run options. The run stops at that limit and keeps what it saved.

### Is it legal to scrape Glassdoor?

Glassdoor Scraper only collects data that Glassdoor shows publicly, without logging in. Web scraping of public data is generally legal, but what you may do with the data depends on your purpose and your country. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Reviews are anonymous, but their text, job titles and locations can still be **personal data**, so laws such as the GDPR and CCPA may apply if you store or use them. Review text may be protected by copyright. Check Glassdoor's terms too, and ask a lawyer if you are unsure. This section is not legal advice.

### Other scrapers you may like

- [ZipRecruiter Jobs Scraper](https://apify.com/parsebird/ziprecruiter-jobs-scraper): job listings from ZipRecruiter
- [Totaljobs Scraper](https://apify.com/parsebird/totaljobs-scraper): UK job listings from Totaljobs
- [FlexJobs Jobs Scraper](https://apify.com/parsebird/flexjobs-jobs-scraper): remote and flexible jobs from FlexJobs
- [TrustRadius Review Scraper](https://apify.com/parsebird/trustradius-review-scraper): software reviews from TrustRadius
- [Owler Company Scraper](https://apify.com/parsebird/owler-company-scraper): company profiles from Owler
- [hh.ru Jobs Scraper](https://apify.com/parsebird/hh-ru-jobs-scraper): job listings from hh.ru

### FAQ

**Do I need a Glassdoor account or cookies?**
No. Glassdoor Scraper needs no login, no cookies and no setup.

**Is there a limit on how many reviews I can get?**
The scraper doesn't stop at 200 reviews. In our tests it read 3,000 Google reviews in one run, and Glassdoor returned pages far beyond that. Set **Max items** to `0` for everything.

**What does "Include reviews in every language" change?**
With it off, you get Glassdoor's default view, which was 51,198 of Google's 74,074 reviews in our test. With it on, the scraper reads each language in turn, so `DATE` order applies within each language rather than across the whole run.

**Can I sort reviews by most helpful?**
No. Glassdoor's data offers relevance, date and rating orders, which is what the scraper provides. You can sort your dataset by `countHelpful` afterwards.

**How does monitoring work?**
With **Save only new reviews** on, the scraper remembers the newest review it saw for each company and set of settings, in a key-value store in your account. The next run saves only newer reviews. If a run is stopped by your cost limit, the marker doesn't move, so nothing is skipped.

**How many interviews can I get?**
Glassdoor stops each sort order at 10,000 interviews. For longer histories, the scraper also reads newest first and oldest first and removes repeats at no charge, so it can reach about 20,000 or more of a company's interviews, but maybe not all of them.

**Why did one job search return only about 500 jobs?**
Glassdoor stops a single search at about 500 listings, some of them repeated. Turn on **Deep search** or add **Extra keywords** to reach more. Repeats are removed at no charge.

**Why do I see jobs of another type?**
Glassdoor treats job type as a preference. In our tests, full-time returned 30 of 30 full-time jobs, while internship and temporary returned a mix.

**How is matchScore calculated?**
It's the percentage of your resume keywords found in the job description as whole words, ignoring case. Fetching descriptions makes these runs slower. A 500-job run took about three minutes in our test.

**Where do my rows go if I mix tabs without choosing a data type?**
The first type goes to the run's default dataset. Each other type gets its own dataset, and the log gives its ID. To keep everything in one place, choose a **Data type**.

**Why is a salary address returning one row?**
It names a job title, so you get one detailed row with the estimates for that title, the filters used, and the countries available. Use the company's main salary address for a row per job title.

**Which countries do salaries cover?**
The United States by default, or the country in your URL, such as `_IN2` for the United Kingdom. Turn on **Include salaries in every country** for all the countries Glassdoor lists.

**Why did a company return no office locations?**
Glassdoor doesn't list offices for every company. Google had none in our test. The run logs a warning and charges nothing. `latitude` and `longitude` are `null` when Glassdoor has no position.

**Which benefit reviews do I get?**
Those on Glassdoor's United States benefits page for the company, newest first. For Google that was 8,651 reviews, while the company's overall benefit count, in `counts.benefitCount` of its overview, is higher.

**Why does Google show `activeStatus` as `INACTIVE`?**
That's the value Glassdoor returns. It doesn't appear to mean a company has closed, so don't rely on it.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly or at any interval.

**Something doesn't work. Where do I report it?**
Open a ticket on the [Issues tab](https://apify.com/parsebird/glassdoor-scraper/issues). Include your run link so we can look into it.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/glassdoor-scraper/changelog.md

# Actor input Schema

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

Add Glassdoor company addresses from any tab: Reviews, Jobs, Salaries, Interviews, Overview or Benefits. You can mix companies freely. Regional sites such as glassdoor.co.uk work too.

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

Choose what to scrape for every URL. Leave empty to follow the tab in each URL, in which case each type gets its own dataset.

## `includes` (type: `array`):

Keep only rows that contain at least one of these words. Rows that don't match aren't charged.

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

Enter the most rows to save for each URL, and for the job search. Use 0 for everything available.

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

Choose the review order. A start date or monitoring mode always uses newest first.

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

Skip reviews older than this date.

## `monitoringModeForReviews` (type: `boolean`):

Save only reviews newer than the previous run with the same company and settings. The first run saves up to Max items and sets the starting point.

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

Read the complete review history in all languages. When this is off, you get Glassdoor's default view, which has fewer reviews. Max items still applies, so set it to 0 for everything.

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

Add rating averages, the rating distribution and ratings by demographic group to each review row.

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

Skip interviews older than this date.

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

Add the difficulty score and the experience and source breakdowns to each interview row.

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

Skip benefit reviews older than this date.

## `includeCompanyBenefitsStats` (type: `boolean`):

Add per-benefit ratings by category and the total benefit reviews to each benefit row.

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

Read salaries for every country Glassdoor lists for the company. When this is off, you get the United States, or the country in the URL.

## `searchJobsByKeyword` (type: `boolean`):

Turn on to run a Glassdoor job search with the fields in this section. You don't need a company URL for this.

## `searchKeyword` (type: `string`):

Enter a job title or skill, such as registered nurse.

## `searchLocation` (type: `string`):

Enter a city, state or country as you'd type it on Glassdoor, such as Chicago, IL.

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

Choose the job order. Leave empty for Glassdoor's most relevant order.

## `maxDaysOld` (type: `string`):

Keep only jobs posted within this time.

## `remoteWorkType` (type: `string`):

Choose whether to keep only remote jobs.

## `applicationType` (type: `string`):

Choose whether to keep only Easy Apply jobs.

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

Choose the job type. Glassdoor treats this as a preference, so some rows of another type can appear.

## `minSalary` (type: `string`):

Enter a yearly amount in the search country's currency, such as 70000.

## `maxSalary` (type: `string`):

Enter a yearly amount in the search country's currency, such as 120000.

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

Keep only jobs at companies with at least this rating.

## `employerSize` (type: `string`):

Choose Glassdoor's company size band.

## `radius` (type: `string`):

Choose how far from a city to search, in miles.

## `industryNid` (type: `string`):

Enter a Glassdoor industry ID, such as 10013 for Information Technology, 10012 for Healthcare or 10010 for Financial Services.

## `sgocId` (type: `string`):

Enter a Glassdoor job function ID, such as 1011 for Information Technology, 1009 for Healthcare or 1008 for Finance & Accounting.

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

Find the most common job titles in the results, search those too, and merge everything without duplicates. Useful because one Glassdoor search stops at about 500 listings. Max items still applies.

## `expandKeywords` (type: `array`):

Add more job titles to search when Deep search is on.

## `resumeKeywords` (type: `array`):

Add your skills, as in \[{"keyword": "ICU"}, {"keyword": "pediatrics"}]. Each job then gets the full description, a matchScore from 0 to 100, matchedSkills and missingSkills. This doesn't change which jobs come back.

## `saveOnlyUniqueItems` (type: `boolean`):

Skip a row whose job ID, review ID or content was already saved in this run. Duplicates aren't charged.

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

Set the most requests to send at once. Glassdoor rate-limits fast clients, so higher values may not be faster.

## `minConcurrency` (type: `integer`):

Set the fewest requests to send at once after Glassdoor slows the run down.

## `maxRequestRetries` (type: `integer`):

Set how many times to retry a failed request.

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

Leave empty. The scraper uses residential proxies by itself when Glassdoor needs them, at no extra cost. Set this only to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
    }
  ],
  "maxItems": 20,
  "sortReviewsBy": "RELEVANCE",
  "monitoringModeForReviews": false,
  "includeAllReviews": false,
  "includeCompanyReviewStats": false,
  "includeCompanyInterviewStats": false,
  "includeCompanyBenefitsStats": false,
  "includeAllSalaries": false,
  "searchJobsByKeyword": false,
  "deepSearch": false,
  "saveOnlyUniqueItems": true,
  "maxConcurrency": 3,
  "minConcurrency": 1,
  "maxRequestRetries": 4
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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/Google-Reviews-E9079.htm" }],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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/Google-Reviews-E9079.htm"
    }
  ],
  "maxItems": 20
}' |
apify call parsebird/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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