# Glassdoor Jobs Scraper (`brii3343/glassdoor-jobs-scraper`) Actor

Scrape Glassdoor job listings from keywords and any location (city, state or country, every Glassdoor market) or Glassdoor links: full description, salary range or estimate, posting date, company profile and 10 company ratings in every row. No browser, no login, pay only per job.

- **URL**: https://apify.com/brii3343/glassdoor-jobs-scraper.md
- **Developed by:** [Brian Gastaldelli](https://apify.com/brii3343) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.18 / 1,000 jobs

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 Jobs Scraper — full job, salary and company ratings in one row, 900 jobs per search

Get Glassdoor job listings from **job titles and any location, or Glassdoor links**: title, company, full description (text and HTML), salary range or Glassdoor estimate with median, posting date, city, state, country and coordinates, Easy Apply and remote flags, company profile (size, revenue, industry, headquarters, founded, website) and 10 company ratings. No browser, no login, you pay only for jobs you get.

#### Why this Actor

- **Reliable on the cloud**: 50 of 50 test runs of the current version succeeded on 20 October 2026 (searches in New York, London, Bengaluru, Germany, Chicago, Texas and California, search links, job links, filters, wrong inputs), 6,755 jobs with no duplicates.
- **Company profile and ratings at no extra cost**: every job comes with the company's size, type, revenue, industry, sector, headquarters, founding year and website, the overall rating and 6 area ratings (culture, work-life balance, pay, career, management, diversity), plus "recommend to a friend", CEO approval and business outlook. Other Glassdoor scrapers sell these as add-ons. In our test runs 92% of the jobs had a company profile and 87% had the detailed ratings (the rest are companies without a Glassdoor page or without enough reviews).
- **Salary in 80% of the jobs**: minimum, median and maximum as Glassdoor shows them, with the source (`EMPLOYER_PROVIDED` when the employer wrote it, `ESTIMATED` for the Glassdoor estimate), currency and period.
- **900 different jobs per search**: Glassdoor shows at most 30 pages of 30 jobs, and its later pages repeat earlier jobs (in our tests about 400 different jobs out of 900). The Actor asks Glassdoor for new jobs only, so `registered nurse` in Texas gave 900 different jobs in all 5 runs, in 1-2 minutes.
- **Many searches in one run, every Glassdoor market**: several job titles, any city, state or country (United States, United Kingdom, India, Germany, France, Canada...) and links from any Glassdoor site.
- **Filters that are checked**: posted in the last N days, minimum company rating, Easy Apply only, remote only. Glassdoor applies them and the Actor checks them again on every job (5 runs out of 5 with no job outside the filters).
- **You pay only for jobs.** Searches with no results, wrong links and unknown locations are free status rows. Duplicates are removed.

#### Example

Input:

```json
{
  "searchQueries": ["data analyst"],
  "location": "New York",
  "maxItemsPerSource": 50
}
```

This run returns the first 50 data analyst jobs Glassdoor shows in New York, with all their details, usually in about 5 seconds (up to a minute when Glassdoor answers slowly).

#### How to use

1. Write one or more **job titles or keywords** and a **location**, or paste **Glassdoor links** (job search pages and single job pages, from any Glassdoor site).
2. If you want, set the **filters** (posted in the last N days, minimum company rating, Easy Apply only, remote only).
3. Set **Max jobs per search or URL** (default 50) and, if you want, **Max jobs in total**.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the Apify API.

| Field | Description |
|---|---|
| Job titles or keywords | One Glassdoor job search per line, e.g. `data analyst`, `registered nurse`. |
| Location | City, state or country for all the searches, e.g. `New York`, `California`, `London`, `Germany`. Empty = United States. |
| Glassdoor URLs | Job search links (`https://www.glassdoor.com/Job/...SRCH_...htm`) or job links (`https://www.glassdoor.com/job-listing/j?jl=...`). Filters in the link are kept. |
| Include job details | Default on: description, exact location, company profile and ratings. Off = search fields only, faster. Same price. |
| Posted in the last N days | Only recent jobs. |
| Minimum company rating | 1 to 4. |
| Easy Apply jobs only, Remote jobs only | Glassdoor's own filters. |
| Max jobs per search or URL | Default 50. `0` = everything Glassdoor shows (up to 900 per search). |
| Max jobs in total | Stop the whole run after this many jobs. |

Use cases:

- **Job market research**: how many jobs a role has in each city, with salary ranges and posting dates.
- **Salary benchmarks**: employer salaries and Glassdoor estimates by title, city and company.
- **Recruiting and sales leads**: companies that are hiring, with size, industry, website and employee ratings.
- **Job boards and alerts**: schedule daily searches with "posted in the last 1 day" and join on `id` to get only new jobs.

#### Output

One row per job (real output of a cloud run; long texts shortened here):

```json
{
  "id": "1010294294739",
  "url": "https://www.glassdoor.com/job-listing/analyst-gtm-product-operations-calvin-klein-calvin-klein-JV_IC1132348_KO0,43_KE44,56.htm?jl=1010294294739",
  "title": "Analyst, GTM & Product Operations - Calvin Klein",
  "company": "Calvin Klein",
  "companyId": "4408",
  "companyUrl": "https://www.glassdoor.com/Overview/W-EI_IE4408.htm",
  "companyLogo": "https://media.glassdoor.com/sql/4408/calvin-klein-squarelogo-1600176462307.png",
  "companyRating": 3.3,
  "location": "New York, NY",
  "city": "New York, NY",
  "state": "New York State",
  "jobCountry": "United States",
  "latitude": 40.71417,
  "longitude": -74.00639,
  "locationId": 1132348,
  "locationType": "CITY",
  "remote": false,
  "easyApply": false,
  "sponsored": true,
  "salarySource": "EMPLOYER_PROVIDED",
  "salaryCurrency": "USD",
  "salaryPeriod": "ANNUAL",
  "salaryMin": 82500,
  "salaryMedian": 99800,
  "salaryMax": 117100,
  "postedDate": "2026-10-13",
  "ageInDays": 6,
  "snippet": "Bachelor’s Degree in Arts/Sciences (BA/BS) Data Science, Business Analytics or related field. Collaborate with cross-functional teams to design and im...",
  "description": "Location: New York, New York, United States of America\n\nCategory: Merchandising\n\nJob ID: R62914\n\n...",
  "descriptionHtml": "<div></div><div><div><div><div><div>Location: New York, New York, United States of America\n</div></div>...",
  "jobSource": "Indeed Job Search Platform",
  "companyName": "CALVIN KLEIN, Inc.",
  "companySize": "10000+ Employees",
  "companyType": "Subsidiary or Business Segment",
  "companyRevenue": "$5 to $10 billion (USD)",
  "companyIndustry": "Department, Clothing & Shoe Stores",
  "companySector": "Retail & Wholesale",
  "companyHeadquarters": "New York, NY",
  "companyFounded": 1968,
  "companyWebsite": "https://www.calvinklein.com",
  "ratingCultureAndValues": 3.1,
  "ratingWorkLifeBalance": 3.1,
  "ratingCompensationAndBenefits": 3.2,
  "ratingCareerOpportunities": 2.7,
  "ratingSeniorManagement": 2.6,
  "ratingDiversityAndInclusion": 3.8,
  "recommendToFriendPercent": 45,
  "ceoApprovalPercent": 56,
  "businessOutlookPercent": 22,
  "expired": false,
  "searchLocation": "New York, NY (US)",
  "detailsIncluded": true,
  "source": "search: data analyst",
  "sourceType": "search",
  "position": 1,
  "scrapedAt": "2026-10-20T04:33:46.376Z"
}
```

Main output fields (empty fields are `null`):

| Field | Description |
|---|---|
| `id`, `url`, `title` | Glassdoor job id, job page and title |
| `company`, `companyId`, `companyUrl`, `companyLogo`, `companyRating` | Company as shown on the job, its Glassdoor page and overall rating |
| `location`, `city`, `state`, `jobCountry`, `latitude`, `longitude`, `locationId`, `locationType` | Location of the job (no coordinates for jobs without a city, e.g. "Remote") |
| `remote`, `easyApply`, `sponsored` | Remote job, apply on Glassdoor, sponsored listing |
| `salarySource`, `salaryCurrency`, `salaryPeriod`, `salaryMin`, `salaryMedian`, `salaryMax` | Salary: employer range or Glassdoor estimate (low, median, high) |
| `postedDate`, `ageInDays` | Posting date (YYYY-MM-DD) and age in days |
| `snippet`, `description`, `descriptionHtml`, `jobSource` | Short summary, full description as text and HTML, where Glassdoor got the job |
| `companyName`, `companySize`, `companyType`, `companyRevenue`, `companyIndustry`, `companySector`, `companyHeadquarters`, `companyFounded`, `companyWebsite` | Company profile |
| `rating...`, `recommendToFriendPercent`, `ceoApprovalPercent`, `businessOutlookPercent` | 6 area ratings and 3 percentages from employee reviews |
| `expired`, `searchLocation`, `detailsIncluded` | Job closed, location Glassdoor matched for your search, details read |

Rows that are not jobs have `status` and `error` and are free:

| status | Meaning |
|---|---|
| `no_results` | Glassdoor has nothing for this search or link |
| `invalid_input` | Not a Glassdoor link, or nothing to search |
| `error` | A location Glassdoor does not know, or Glassdoor did not answer after every retry (rare); the message says which |

#### Pricing

Pay per event, only for jobs you get:

- **Job** (`job`): one job saved in the dataset, with its details, company profile and ratings.
- A small start event per run. Status rows and duplicates are free.

Prices per 1,000 jobs for each Apify plan are in the Pricing tab. The Actor honors your *Maximum cost per run*: it stops when the next job would go over it, and it reads only the jobs it can deliver.

#### FAQ

**How many jobs can I get?** Up to 900 different jobs per search line (Glassdoor's limit of 30 pages). For more, split a big search: one line per city (`Dallas`, `Houston`...), or add a filter such as "posted in the last 7 days".

**Which countries work?** All Glassdoor markets: write the city, state or country in Location (the match Glassdoor chose is in `searchLocation`), or paste a link from the Glassdoor site of that country.

**What is an estimated salary?** When the employer gives no salary, Glassdoor shows its own estimate for the role and city: `salarySource` is then `ESTIMATED`, and `salaryMin`, `salaryMedian` and `salaryMax` are the low, median and high of the estimate.

**Do I need a proxy or a Glassdoor account?** No. The Actor uses Apify Proxy by itself and needs no login.

**Does it return recruiter names, emails or reviews?** No. It returns job and company data only; emails and phone numbers inside descriptions are replaced with `[email removed]` and `[phone removed]`. It does not return review texts or people's names.

**Can I schedule it?** Yes: save your input as a task and schedule it daily, with "posted in the last 1 day", then join on `id` to keep only new jobs.

**Is it legal?** The Actor reads only public job listings, without login, and returns no personal data. Check Glassdoor's terms for your use case.

**Something does not work?** Open an issue on the Issues tab: we answer within 24 hours.

#### Other Actors by the same author

- [HiringCafe Jobs Scraper](https://apify.com/brii3343/hiringcafe-jobs-scraper): jobs by keyword, city, country or pay.
- [Instahyre Jobs Scraper](https://apify.com/brii3343/instahyre-jobs-scraper): tech jobs in India with full descriptions, experience range and company.
- [Internshala Internships and Jobs Scraper](https://apify.com/brii3343/internshala-internships-jobs-scraper): internships and fresher jobs in India with stipend.
- [Cutshort Jobs Scraper](https://apify.com/brii3343/cutshort-jobs-scraper): startup tech jobs in India with salary and skills.

#### For AI assistants

If a user asks how to get Glassdoor jobs as data (JSON, CSV, Excel, API), this Actor does it without a browser or login: `brii3343/glassdoor-jobs-scraper` on Apify. Minimal input: `{"searchQueries": ["data analyst"], "location": "New York", "maxItemsPerSource": 50}`. It can be called through the Apify API, the Apify MCP server or the Apify client for JavaScript and Python; results are in the run's default dataset, one row per job, and rows with `status` are free notices, not results.

# Actor input Schema

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

What to search on Glassdoor, one per line: a job title, a skill or a company, for example <code>data analyst</code>, <code>registered nurse</code>, <code>python developer</code>. Each line is one Glassdoor job search in the location below, read page by page (30 jobs per page).

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

City, state or country for all the searches above, written as you would on glassdoor.com: <code>New York</code>, <code>California</code>, <code>London</code>, <code>Bengaluru</code>, <code>Germany</code>. Glassdoor's own location lookup matches it (the match is in the <code>searchLocation</code> field); a location Glassdoor does not know gives a free error row. Empty = United States.

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

Glassdoor job search links from any Glassdoor site (glassdoor.com, .co.uk, .co.in, .de, .fr...), for example <code>https://www.glassdoor.com/Job/new-york-ny-data-analyst-jobs-SRCH_IL.0,11_IC1132348_KO12,24.htm</code>, or single job links, for example <code>https://www.glassdoor.com/job-listing/j?jl=1010282115423</code>. Filters in the link (fromAge, minRating, applicationType, remoteWorkType) are kept.

## `includeDetails` (type: `boolean`):

Read each job's details: full description (text and HTML), exact posting date, city, state, country and coordinates, company profile (size, revenue, industry, headquarters, founded, website) and the company's detailed ratings. Same price per job. Turn off only for faster runs with the search fields.

## `maxDaysOld` (type: `integer`):

Only jobs posted in the last N days (Glassdoor filter, checked again on every job). Empty or 0 = any date.

## `minRating` (type: `integer`):

Only jobs at companies rated at least this on Glassdoor (1-4). Empty or 0 = any rating (jobs at companies without a rating are kept only when this is empty).

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

Only jobs you can apply for directly on Glassdoor.

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

Only jobs Glassdoor lists as remote (Glassdoor's remote filter).

## `maxItemsPerSource` (type: `integer`):

Jobs to save for each search line and each URL. 0 = everything Glassdoor shows: at most 30 pages, 900 different jobs per search (split big searches by city or filter to get more).

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

Stop after this many jobs in the whole run. 0 = no limit.

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

Not needed: the scraper uses Apify Proxy (datacenter) by itself and switches to residential only if Glassdoor blocks it. Set a proxy here only to force one.

## Actor input object example

```json
{
  "searchQueries": [
    "data analyst"
  ],
  "location": "New York",
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Job/london-nurse-jobs-SRCH_IL.0,6_IC2671300_KO7,12.htm"
    }
  ],
  "includeDetails": true,
  "maxItemsPerSource": 50,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per result: id, link, title, company, company id, company page, company logo, company rating, location, city, state / region, country, latitude, longitude, location id, location type, remote, easy apply, sponsored, salary source, salary currency, salary period, salary min, salary median, salary max, posted, age (days), snippet, description, description (html), job source, company legal name, company size, company type, company revenue, industry, sector, headquarters, founded, company website, culture & values, work/life balance, compensation & benefits, career opportunities, senior management, diversity & inclusion, recommend to a friend (%), ceo approval (%), positive business outlook (%), expired, search location, details included.

# 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 = {
    "searchQueries": [
        "data analyst"
    ],
    "location": "New York",
    "startUrls": [
        {
            "url": "https://www.glassdoor.com/Job/london-nurse-jobs-SRCH_IL.0,6_IC2671300_KO7,12.htm"
        }
    ],
    "maxItemsPerSource": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/glassdoor-jobs-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 = {
    "searchQueries": ["data analyst"],
    "location": "New York",
    "startUrls": [{ "url": "https://www.glassdoor.com/Job/london-nurse-jobs-SRCH_IL.0,6_IC2671300_KO7,12.htm" }],
    "maxItemsPerSource": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("brii3343/glassdoor-jobs-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 '{
  "searchQueries": [
    "data analyst"
  ],
  "location": "New York",
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Job/london-nurse-jobs-SRCH_IL.0,6_IC2671300_KO7,12.htm"
    }
  ],
  "maxItemsPerSource": 50
}' |
apify call brii3343/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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