# Glassdoor Jobs Scraper – Salary Ranges, Ratings & Easy Apply (`inovaflow/glassdoor-jobs-scraper`) Actor

Scrape Glassdoor job listings by keyword and location without an account. Typed JSON per job: salary range (min / median / max, employer-stated or estimated), company rating and profile, posting age, Easy Apply flag, full description and apply link — plus a companies-hiring summary.

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

## Pricing

from $1.00 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

If you need Glassdoor job listings as data — with the **salary ranges and company ratings** that make Glassdoor different from every other job board — **Glassdoor Jobs Scraper** turns any Glassdoor job search into clean, typed JSON. No Glassdoor account, nothing to log in with. Each job comes back with its **salary range (min / median / max, employer-stated or Glassdoor's estimate)**, the **employer's rating and profile**, posting age, Easy Apply flag, full description and apply link — plus a companies-hiring summary for the whole run.

- **Job seekers & career coaches** — compare pay bands and employer ratings across hundreds of openings at once.
- **Recruiters & compensation analysts** — market salary data by role and city, straight from live postings.
- **Job boards & aggregators** — a scheduled feed of new roles with pay ranges and company reputation attached.
- **Sales & B2B teams** — hiring is a buying signal: see which well-rated companies are growing, with size, industry, HQ and website.

### What does Glassdoor Jobs Scraper do?

Give it job titles or keywords and locations (or paste a Glassdoor job search URL from your browser) and it returns the matching **Glassdoor job listings** — each with title, company, **company rating (overall plus culture, compensation, work-life balance, management, career opportunities, CEO approval)**, location, posting age, **salary range**, Easy Apply flag, job type, Glassdoor's skill tags, the **full description as text and HTML**, the employer profile (industry, sector, size, revenue, type, founded, headquarters, website) and links to the job, the apply page and the company's reviews and salaries pages. Duplicates across searches are removed, and a **companies-hiring summary** is written next to the dataset. It works as a **Glassdoor jobs API**: call it from the Apify API, schedule it, or use it from an AI agent through MCP.

### Why use this Glassdoor jobs scraper?

- **No login.** It reads what Glassdoor shows to visitors; there is no account to get flagged.
- **Salary ranges as numbers.** `salaryMin` / `salaryMedian` / `salaryMax` / `salaryCurrency` / `salaryPeriod`, with `salarySource` telling you whether the employer disclosed it or Glassdoor estimated it.
- **Employer reputation in every row.** Overall rating plus the full breakdown and the company profile — no second scraper needed.
- **Glassdoor's own filters.** Posted within 24h / 3 / 7 / 14 / 30 days, remote, job type, seniority, Easy Apply, minimum salary, minimum company rating, radius, sort by date — plus your own title / company include-exclude lists.
- **Companies hiring.** `COMPANIES` ranks employers by open roles with rating, titles, locations, newest posting and Easy Apply share — a ready-made hiring-intent signal.
- **Pay per job, no minimums.** 5 jobs cost 5 jobs. Duplicates and filtered-out jobs are free.
- **Built for pipelines.** Deduplicated across searches, CSV exports, webhooks and 20+ export formats via Apify.

### What data does it extract?

| Field | Description |
| --- | --- |
| `id`, `url`, `applyUrl` | Glassdoor listing ID, the public job page and the apply link |
| `title`, `occupation` | Title as posted and Glassdoor's normalised occupation |
| `company`, `companyId`, `companyRating`, `companyRatings` | Employer, overall rating and the rating breakdown (culture & values, compensation & benefits, work-life balance, senior management, career opportunities, CEO approval, recommend-to-friend) |
| `companyUrl`, `companyReviewsUrl`, `companySalariesUrl`, `companyWebsite`, `companyLogoUrl` | Employer links |
| `companyIndustry`, `companySector`, `companySize`, `companyRevenue`, `companyType`, `companyFounded`, `companyHeadquarters`, `companyCeo` | Employer profile |
| `location`, `locationType`, `isRemote` | Location as posted (city / state / country) and remote flag |
| `postedAt`, `ageInDays` | ISO date and Glassdoor's posting age |
| `salaryText`, `salaryMin`, `salaryMedian`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salarySource` | Salary range; `salarySource` is `employer` or `estimate` |
| `easyApply`, `sponsored` | Apply on Glassdoor; sponsored listing |
| `jobTypes`, `attributes` | e.g. `["full-time"]`; Glassdoor's skill / requirement / schedule tags |
| `descriptionSnippet`, `description`, `descriptionHtml` | Search snippet, full description as readable text, and as HTML |
| `searchKeywords`, `searchLocation`, `scrapedAt` | Provenance |

### How to scrape Glassdoor jobs

1. Open the Actor and click **Try for free**.
2. Enter **Job titles / keywords** (one per line) and **Locations** (one per line — cities, states, countries or `Remote`). Every keyword is searched in every location.
3. Optionally narrow with **Posted within**, **Remote only**, **Job type**, **Seniority**, **Easy Apply only**, **Minimum salary** or **Minimum company rating**, or paste a Glassdoor search URL from your browser.
4. Set **Max jobs per search** and click **Start**. 100 jobs with full details take about a minute.
5. Read the **Output** tab, download **JSON / CSV / Excel**, or open `COMPANIES` to see who is hiring most.

#### How to build a salary dataset

Search a role across several cities — e.g. keyword `data analyst`, locations `New York, NY`, `Chicago`, `Austin`, `Remote` — with **Fetch full job details** off for speed. Every row carries `salaryMin` / `salaryMedian` / `salaryMax` and `salarySource`; export to CSV and pivot by `searchLocation`.

#### How to track new Glassdoor jobs every day

Set **Posted within** to *Last 24 hours*, **Sort by** to *Most recent*, and schedule the Actor daily in Apify. Add a webhook or an integration (Slack, Google Sheets, Make, Zapier, n8n) to push new rows where your team works.

#### How to find well-rated companies that are hiring

Set **Minimum company rating** to 4, run a broad search (e.g. `software engineer` in `United States`, 300 jobs) and open `COMPANIES`: employers ranked by open roles, each with its rating and newest posting date.

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

Pay-per-event: **$0.001 per job delivered** plus a small run-start fee — **1,000 jobs for about $1**. Duplicates, filtered-out jobs and failed searches are never charged. Residential proxies (the default, needed for Glassdoor) are billed by Apify at your plan's rate; a run of 100 jobs with full details transfers roughly 8 MB, a list without details a fraction of that.

### Input

Example — two roles in two cities, posted this week, remote, well-rated employers only:

```json
{
    "keywords": ["python developer", "data engineer"],
    "locations": ["New York, NY", "Austin"],
    "postedWithin": "week",
    "remoteOnly": true,
    "minCompanyRating": 4,
    "maxJobsPerSearch": 100
}
```

Or paste a search URL from your browser:

```json
{ "startUrls": [{ "url": "https://www.glassdoor.com/Job/new-york-ny-python-developer-jobs-SRCH_IL.0,11_IC1132348_KO12,28.htm?fromAge=7" }] }
```

All fields are optional except one of `keywords` / `locations` / `startUrls`. Aliases such as `query`, `location`, `remote: true`, `limit`, `daysOld` and `experienceLevels` are accepted, so inputs written for other job scrapers usually work unchanged.

### Output

One dataset row per job:

```json
{
    "id": "1010253473691",
    "title": "Senior Software Engineer - Frontend Major",
    "company": "Back Market",
    "companyRating": 4.2,
    "companyRatings": { "overallRating": 4.2, "cultureAndValuesRating": 4.4, "compensationAndBenefitsRating": 3.4, "workLifeBalanceRating": 4.1, "seniorManagementRating": 3.9, "careerOpportunitiesRating": 3.9, "ceoRating": 0.88, "recommendToFriendRating": 0.87 },
    "companyUrl": "https://www.glassdoor.com/Overview/Working-at-Back-Market-EI_IE1780208.11,22.htm",
    "companyIndustry": "Internet & Web Services",
    "companySector": "Information Technology",
    "companySize": "501 to 1000 Employees",
    "companyType": "Company - Private",
    "companyFounded": 2014,
    "companyHeadquarters": "Paris, France",
    "companyWebsite": "https://www.backmarket.com",
    "location": "New York, NY",
    "locationType": "city",
    "isRemote": false,
    "jobTypes": ["full-time"],
    "postedAt": "2026-09-04",
    "ageInDays": 5,
    "url": "https://www.glassdoor.com/job-listing/senior-software-engineer-frontend-major-back-market-JV_IC1132348_KO0,39_KE40,51.htm?jl=1010253473691",
    "applyUrl": "https://www.glassdoor.com/partner/jobListing.htm?…&jobListingId=1010253473691",
    "easyApply": false,
    "salaryText": "$160,000 - $200,000 a year",
    "salaryMin": 160000,
    "salaryMedian": 180000,
    "salaryMax": 200000,
    "salaryCurrency": "USD",
    "salaryPeriod": "year",
    "salarySource": "employer",
    "description": "Location\n\nNew York\n\nEmployment Type\n\nFull time\n\n…",
    "searchKeywords": "python developer",
    "searchLocation": "New York, NY"
}
```

Also in the key-value store: `COMPANIES` (+ `COMPANIES.csv`) — employers ranked by open roles — `JOBS.csv`, and `OUTPUT` with run counts (jobs delivered, with salary, Easy Apply, companies, total matches on Glassdoor per search, filtered, duplicates).

### Using it from AI agents and code

Through the Apify MCP server an agent can call this Actor with plain-language inputs (`keywords`, `locations`, `postedWithin`, `minCompanyRating`). Rows are flat and typed, and the `OUTPUT` summary says how many jobs were delivered, how many Glassdoor had in total for each search, and how many were skipped as duplicates or filtered out — so an agent never has to guess. From code, use the Apify API or clients:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('inovaflow/glassdoor-jobs-scraper').call({
    keywords: ['registered nurse'],
    locations: ['Texas'],
    postedWithin: 'day',
    includeDetails: false,
    maxJobsPerSearch: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### Tips

- **Details are the expensive part.** Turn **Fetch full job details** off when you only need titles, companies, ratings and salary ranges — that data is already in the search results and comes back in seconds.
- **Locations** can be a city (`Austin`), a state or region (`Texas`, `England`), a country (`Germany`) or `Remote`. Ambiguous names resolve to the best Glassdoor match; the log shows what was chosen.
- **`salarySource: "estimate"`** rows are Glassdoor's own pay estimates; filter them out if you only want employer-disclosed numbers.
- **Large runs**: each search fetches 50 jobs per page, so 1,000 jobs are ~20 search requests plus the details you ask for.

### FAQ

**Do I need a Glassdoor account?** No. The Actor never logs in.

**Is it legal to scrape Glassdoor?** Job listings are public information published to be found. You are responsible for how you use the data — respect Glassdoor's and the employers' terms, and personal-data laws where you operate.

**Why do some jobs have no employer profile?** Smaller or unverified employers have no Glassdoor company page; the job still carries whatever the listing itself states.

**Can I filter by company?** Use `companyExclude` to drop employers, or add the company name to `keywords`.

**Why residential proxies?** Glassdoor's entry check blocks most datacenter IPs. The default configuration uses Apify residential proxies and keeps traffic small (about half a megabyte per IP for the warm-up, then only compact JSON).

### Support

Found a field you need or a search that misbehaves? Open an issue on the Actor's **Issues** tab — feedback shapes the roadmap.

# Actor input Schema

## `keywords` (type: `array`):

One search per line, as you would type it into Glassdoor's job search — e.g. `python developer`, `registered nurse`, `account executive`.

## `locations` (type: `array`):

Cities, states/regions or countries — every keyword is searched in every location. E.g. `New York, NY`, `London`, `Texas`, `Germany`, `Remote`. Leave empty to search everywhere.

## `maxJobsPerSearch` (type: `integer`):

Cap per keyword × location combination. Duplicates across searches are removed automatically.

## `postedWithin` (type: `string`):

Only jobs posted in this window. Filtered-out jobs are never charged.

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

Only jobs Glassdoor marks as remote.

## `jobTypes` (type: `array`):

Leave empty for all types.

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

Leave empty for all levels.

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

Only jobs that can be applied to directly on Glassdoor.

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

Only jobs whose salary range reaches this amount (in the local currency, per year).

## `minCompanyRating` (type: `integer`):

Only employers rated at least this many stars on Glassdoor (1–5).

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

Distance around a city location. Glassdoor's default is 25 miles.

## `titleInclude` (type: `array`):

Keep only jobs whose title contains at least one of these words (case-insensitive). Applied after Glassdoor's own matching, which can be loose.

## `titleExclude` (type: `array`):

Drop jobs whose title contains any of these words — e.g. `senior`, `intern`, `manager`.

## `companyExclude` (type: `array`):

Drop jobs from companies whose name contains any of these words — handy for skipping staffing agencies.

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

Opens every job for the full description and the employer profile (industry, size, revenue, HQ, founded, website, rating breakdown) — one extra request per job. Turn off for a fast list with title, company, rating, salary range and snippet.

## `includeDescriptionHtml` (type: `boolean`):

Adds `descriptionHtml` next to the plain-text `description`. Turn off for smaller rows.

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

Order in which Glassdoor returns the results (affects which jobs make it under the cap).

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

Paste `glassdoor.com/Job/…-jobs-SRCH_….htm` URLs from your browser — their keyword, location and filters are used as additional searches.

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

How many browser sessions work in parallel. Each session gets its own IP; 3 is a good balance of speed and memory.

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

Glassdoor's entry check blocks most datacenter IPs, so US residential proxies are the default (Glassdoor's global site answers in English from US exits). Keep it unless you have your own proxies.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxJobsPerSearch": 30,
  "postedWithin": "any",
  "remoteOnly": false,
  "jobTypes": [],
  "seniority": [],
  "easyApplyOnly": false,
  "includeDetails": true,
  "includeDescriptionHtml": true,
  "sortBy": "relevance",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job listing with typed fields.

## `companies` (type: `string`):

Employers ranked by open roles found in this run — rating, titles, locations, newest posting, Easy Apply share (hiring-intent signal).

## `jobsCsv` (type: `string`):

Spreadsheet-ready jobs export (first 5,000 rows).

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

Counts: jobs delivered, with salary, Easy Apply, companies hiring, total matches on Glassdoor, filtered, duplicates, blocked sessions.

# 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 = {
    "keywords": [
        "python developer"
    ],
    "locations": [
        "New York, NY"
    ],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/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 = {
    "keywords": ["python developer"],
    "locations": ["New York, NY"],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/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 '{
  "keywords": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxJobsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call inovaflow/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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