# Glassdoor Jobs - Job Listings & Company Data (`swerve/glassdoor-scraper`) Actor

Scrape Glassdoor job listings with salaries, company info, location, and descriptions. Search by keyword, location, or company across thousands of job postings.

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

## Pricing

from $10.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Job Scraper

Scrape job listings from [Glassdoor](https://www.glassdoor.com) with salary estimates, company ratings, full job descriptions, and more. Supports 21 countries with automatic domain health checks and fallback.

### Why This Scraper?

- **Salary data that Glassdoor hides** -- estimated salary range (min, median, max) for each listing, extracted from Glassdoor's internal data
- **Full job descriptions** -- optionally fetch the complete description for every listing (enable `fetchDescriptions`)
- **21 countries** -- dedicated Glassdoor domains for US, UK, Canada, Germany, Australia, and more
- **Smart fallback** -- if a country domain is temporarily down, the scraper automatically falls back to glassdoor.com so your run still produces results
- **In-browser location resolution** -- your location filter is resolved to Glassdoor's internal location ID for accurate results
- **Rich filtering** -- filter by job type, date posted, remote-only, and minimum salary

### Use Cases

- **Recruiters and staffing agencies** pulling fresh job postings across 21 countries to source leads, identify hiring companies, and benchmark against competitors
- **HR and compensation analysts** using Glassdoor's hidden salary estimates to build pay bands and benchmark offers for specific roles and cities
- **Job seekers and career coaches** monitoring new postings at target companies with custom filters (remote, fulltime, posted this week)
- **Sales teams at HR tech vendors** generating leads by tracking which companies are hiring in high volume (signals growth/budget)
- **Market researchers** studying labour demand trends, remote work share, and industry hiring shifts across US, UK, Germany, and more
- **Competitive intelligence teams** tracking how competitors describe roles, benefits, and culture in live listings

### Proxy Required

You **must** use Apify Proxy with the **RESIDENTIAL** group. Glassdoor will block requests from datacenter IPs.

```json
{
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

Runs that omit `proxyConfig` entirely now default to Apify RESIDENTIAL proxy automatically (residential bandwidth is billed as usage). To run without any proxy, pass `"proxyConfig": { "useApifyProxy": false }` explicitly.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQuery` | string | *(required)* | Job search keywords (e.g. `"Product Manager"`) |
| `location` | string | | City or region to filter by (e.g. `"New York"`) |
| `country` | string | `"us"` | Country code -- see supported list below |
| `maxItems` | integer | `100` | Maximum number of listings to return (max 1000) |
| `jobType` | string | `"all"` | One of: `all`, `fulltime`, `parttime`, `contract`, `internship`, `temporary` |
| `datePosted` | integer | | Only jobs posted within this many days: `1`, `3`, `7`, `14`, or `30` |
| `remoteOnly` | boolean | `false` | Only return remote positions |
| `minSalary` | number | | Minimum salary filter |
| `fetchDescriptions` | boolean | `false` | Fetch full job descriptions (slower but much richer data) |
| `proxyConfig` | object | | Proxy settings -- residential proxy required |

### Supported Countries

| Code | Country | Domain |
|------|---------|--------|
| `us` | United States | glassdoor.com |
| `uk` | United Kingdom | glassdoor.co.uk |
| `canada` | Canada | glassdoor.ca |
| `india` | India | glassdoor.co.in |
| `australia` | Australia | glassdoor.com.au |
| `germany` | Germany | glassdoor.de |
| `france` | France | glassdoor.fr |
| `netherlands` | Netherlands | glassdoor.nl |
| `austria` | Austria | glassdoor.at |
| `mexico` | Mexico | glassdoor.com.mx |
| `brazil` | Brazil | glassdoor.com.br |
| `belgium` | Belgium | glassdoor.be |
| `switzerland` | Switzerland | glassdoor.ch |
| `ireland` | Ireland | glassdoor.ie |
| `singapore` | Singapore | glassdoor.sg |
| `hong-kong` | Hong Kong | glassdoor.com.hk |
| `new-zealand` | New Zealand | glassdoor.co.nz |
| `israel` | Israel | glassdoor.co.il |
| `italy` | Italy | glassdoor.it |
| `spain` | Spain | glassdoor.es |
| `sweden` | Sweden | glassdoor.se |

> **Note:** Israel (`glassdoor.co.il`) is temporarily unavailable due to Glassdoor infrastructure issues. The scraper will automatically fall back to `glassdoor.com` when this domain is down.

### Example Input

```json
{
  "searchQuery": "Product Manager",
  "location": "New York",
  "country": "us",
  "maxItems": 50,
  "fetchDescriptions": true,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Sample Output

```json
{
  "jobId": "1009428351674",
  "url": "https://www.glassdoor.com/job-listing/product-manager-acme-corp-JV_IC1132348_KO0,15_KE16,25.htm?jl=1009428351674",
  "jobTitle": "Product Manager",
  "employerName": "Acme Corp",
  "employerId": "28471",
  "location": "New York, NY",
  "jobType": "fulltime",
  "isRemote": false,
  "salaryMin": 120000,
  "salaryMedian": 145000,
  "salaryMax": 175000,
  "salaryCurrency": "USD",
  "salaryPeriod": "ANNUAL",
  "datePosted": "2026-03-24",
  "easyApply": true,
  "sponsored": false,
  "companyRating": 4.2,
  "companySize": "1001 to 5000 Employees",
  "companyIndustry": "Internet & Web Services",
  "listingDescription": "We are looking for a Product Manager to lead our platform team...",
  "scrapedAt": "2026-03-26T12:00:00.000Z"
}
```

### How It Works

The scraper uses Playwright (headless Chrome) to render Glassdoor pages, then extracts structured data from the Apollo GraphQL cache embedded in each page. This gives richer and more reliable data than HTML scraping alone.

### Keywords

Glassdoor scraper, Glassdoor jobs API, salary data scraper, job listings API, Glassdoor salary estimates, recruitment data, HR benchmarking tool, global job market data, Glassdoor companies, remote jobs scraper, glassdoor.com scraper, job posting data

# Actor input Schema

## `searchQuery` (type: `string`):

Job search keywords (e.g. 'Software Engineer', 'Product Manager', 'Data Scientist')

## `country` (type: `string`):

Country to search in. Picks the correct Glassdoor domain and country-specific filters.

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

City or region filter (e.g. 'New York', 'San Francisco', 'London', 'Tel Aviv'). Leave empty to search the whole country.

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

Optional cap on how many job listings to return. Leave this blank to scrape ALL matching results (recommended). A large query on a big site can return thousands of jobs, so set a number here only if you want to limit cost. Glassdoor paginates 30 jobs per page. Examples: 30, 100, 500.

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

Employment type filter.

## `datePosted` (type: `integer`):

Only jobs posted within the last N days. Common values: 1 (24h), 3, 7, 14, 30. Empty = all dates.

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

Show only remote job listings.

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

Only jobs with posted salary ≥ this value (e.g. 80000). Only applicable in countries where Glassdoor shows salaries.

## `fetchDescriptions` (type: `boolean`):

Visit each job's detail page to pull the full description, company size, industry, and job type. Slower (about 1 second per job) but richer data.

## `proxyConfig` (type: `object`):

Use Apify Proxy with the RESIDENTIAL group. Glassdoor's Cloudflare aggressively blocks datacenter IPs - residential is strongly recommended. SHADER always triggers hard challenges and is not recommended.

## Actor input object example

```json
{
  "searchQuery": "Software Engineer",
  "country": "us",
  "jobType": "all",
  "remoteOnly": false,
  "fetchDescriptions": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "Software Engineer",
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("swerve/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 = {
    "searchQuery": "Software Engineer",
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("swerve/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 '{
  "searchQuery": "Software Engineer",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call swerve/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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