# Glassdoor Jobs Scraper - Salaries & Employer Ratings (`vaulted-apis/glassdoor-jobs-scraper`) Actor

Scrape Glassdoor job listings with salary ranges parsed into numbers (min/median/max), employer names and Glassdoor company ratings. Filter by job title and location. Returns posting age, extracted skills and direct apply links as JSON or CSV.

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

## Pricing

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

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

## Glassdoor Jobs Scraper — Salaries & Employer Ratings

Scrape Glassdoor job listings with **salary ranges**, employer names and company
ratings. Search any job title in any location and get structured JSON or CSV.

Most Glassdoor scrapers hand back a salary string like `$213K - $288K` and leave
you to parse it. This one returns `salaryMin: 213000`, `salaryMax: 288000` and
`salaryPeriod: "year"` alongside the original text, so you can filter and sort
without post-processing.

### What you get

| Field | Example |
|---|---|
| `title` / `normalizedTitle` | Registered Dental Hygienist / dental hygienist |
| `employer` | North Austin Dental |
| `employerId`, `employerRating` | 1061951, 3.5 |
| `location`, `locationType` | Austin, TX / CITY |
| `payMin`, `payMedian`, `payMax` | 55, 56.5, 58 |
| `payPeriod`, `payCurrency` | HOURLY, USD |
| `payIsEstimate` | false when the employer published the figure |
| `ageInDays`, `postedAt` | 1, 2026-08-29 |
| `attributes` | Oral hygiene, Continuing education credits, Part-time... |
| `snippet` | first lines of the description |
| `easyApply`, `isSponsored`, `expired` | true / true / false |
| `url`, `jobId` | direct link, 1010244761866 |

Pay arrives as **numbers, not a "$213K - $288K" string** - so you can filter and
sort without post-processing. `payIsEstimate` tells you whether the figure came
from the employer or from Glassdoor's model. `attributes` are the extracted
skills and benefits, which most Glassdoor scrapers drop entirely.

Listings are deduplicated by `jobId` across pages and across search terms, so
you are never charged twice for the same row.

### Input

```json
{
  "searchTerms": ["software engineer", "data analyst"],
  "location": "New York, NY",
  "maxItemsPerTerm": 300,
  "maxPages": 20
}
```

- **searchTerms** — one or more job titles or keywords; each is searched separately
- **location** — city, state or country; leave empty for the whole United States
- **maxItemsPerTerm** — stop each term after this many unique listings
- **maxPages** — safety cap; Glassdoor returns 30 listings per page

### Use cases

- Glassdoor salary data for compensation benchmarking
- Job market research and hiring-trend analysis
- Recruiting pipelines and job board aggregation
- Tracking which companies are hiring for a role
- Competitor headcount and hiring signals
- Feeding job data into an LLM or RAG pipeline

### Proxies

**Residential proxies are required.** Glassdoor returns `403` to datacenter IPs —
measured at 0 successes out of 8 requests from a datacenter host, versus 18 out
of 18 from a residential connection. The default input uses Apify's residential
proxy group; leaving it off will produce nothing but blocks.

At roughly 4.3 KB of traffic per listing, a residential GB is worth about
240,000 listings, so proxy cost per record is negligible.

### Notes

- Reads Glassdoor's own search backend rather than parsing HTML, which is why
  pagination works: the public HTML pages return the same ~30 listings
  reshuffled no matter which page you request
- Deep pagination stops at roughly 500-600 listings per search term - that is
  Glassdoor's own limit, not the actor's. To go wider, split the search by
  location; a `location` search returns the whole metro (an Austin search
  includes Round Rock, Pflugerville and Cedar Park)
- `employerRating` is `null` where the company has no Glassdoor rating, and pay
  is `null` where the listing publishes none (roughly 1 in 6)
- Where Glassdoor holds a single pay estimate, `payMin`, `payMedian` and
  `payMax` are equal - that means one data point, not a flat band
- Public search data only; no login is used

### Related

Part of **Vaulted** — reputation and hiring data APIs.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles or keywords to search, e.g. "software engineer", "registered nurse". Each term is searched separately.

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

Optional. City, state or country, e.g. "New York, NY". Leave empty to search the United States.

## `maxItemsPerTerm` (type: `integer`):

Stops each term once this many unique listings are collected.

## `maxPages` (type: `integer`):

Safety cap. Glassdoor returns 30 listings per page.

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

REQUIRED. Glassdoor returns 403 to datacenter IPs - measured 0 successes out of 8 from a datacenter host versus 18/18 from residential. Use Apify Proxy with the RESIDENTIAL group (needs a paid Apify plan), or paste your own residential proxy URL into proxyUrls.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "location": "",
  "maxItemsPerTerm": 300,
  "maxPages": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `runStats` (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 = {
    "searchTerms": [
        "software engineer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("vaulted-apis/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 = {
    "searchTerms": ["software engineer"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("vaulted-apis/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 '{
  "searchTerms": [
    "software engineer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call vaulted-apis/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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