# Glassdoor Scraper: Jobs, Salaries, Ratings & Companies (`santamaria-automations/glassdoor-scraper`) Actor

Extract Glassdoor jobs across 20+ countries. Returns title, company, rating (1-5), review count, salary (min/max/currency + estimated flag), location, employment type, workplace type, description, apply URL, easy_apply. Optional employer profile: about, HQ, size, industry, CEO.

- **URL**: https://apify.com/santamaria-automations/glassdoor-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (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 $3.00 / 1,000 serp 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?

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: Jobs, Salaries, Ratings & Companies

Extract job listings from [Glassdoor](https://www.glassdoor.com) across 20+ country domains. Every row carries the company's Glassdoor rating (1-5) and review count alongside title, salary, location and apply URL. Optional employer profile enrichment adds "About" text, headquarters, size range, founded year, industry, CEO, rating breakdown and open-role count for each unique company in the run.

### What it does

Runs a search on Glassdoor for one or more keyword and location pairs (or a set of pre-filtered start URLs) and returns structured rows. Three fetch modes:

1. **SERP only** (default). 25+ fields per job, sourced from Glassdoor's embedded React state plus JSON-LD.
2. **SERP + job detail** (`includeJobDetails: true`). Adds full description (plain text + HTML), direct apply URL and richer employment-type data from each job's detail page.
3. **SERP + job detail + employer profile** (`includeCompanyDetails: true`). Also resolves each unique employer to its Glassdoor company page and returns company enrichment fields merged directly onto each job row: about text, HQ, size, founded year, industry, CEO, rating breakdown (culture, comp, opportunities, senior leadership, work-life balance) and a list of currently-open roles.

### Sample output

```json
{
  "_type": "job",
  "id": "1009123456",
  "title": "Senior Software Engineer",
  "company_name": "Acme Corp",
  "company_rating": 4.2,
  "review_count": 1284,
  "location": "New York, NY",
  "salary_min": 145000,
  "salary_max": 205000,
  "salary_currency": "USD",
  "salary_period": "year",
  "salary_text": "$145K - $205K/yr (Employer est.)",
  "salary_estimated": true,
  "salary_source": "employer",
  "employment_type": "full-time",
  "workplace_type": "hybrid",
  "description_snippet": "We are looking for a senior software engineer...",
  "posted_at": "2026-09-19",
  "posted_at_datetime": "2026-09-19T00:00:00Z",
  "age_days": 1,
  "job_url": "https://www.glassdoor.com/job-listing/senior-software-engineer-acme-JV_IC1132348_KO0,24_KE25,34.htm?jl=1009123456",
  "apply_url": "https://jobs.acme.com/apply/123",
  "apply_type": "external",
  "easy_apply": false,
  "sponsored": false,
  "employer_id": "9079",
  "employer_profile_url": "https://www.glassdoor.com/Overview/Working-at-Acme-Corp-EI_IE9079.htm",
  "source_platform": "glassdoor.com",
  "search_query": "software engineer",
  "search_location": "New York, NY",
  "serp_page": 1,
  "scraped_at": "2026-09-20T08:00:00Z",
  "extraction_mode": "serp-apollo"
}
```

### Output fields

| Field | Type | Description |
|---|---|---|
| `_type` | string | Always `"job"` |
| `id` | string | Glassdoor jobListingId |
| `title` | string | Job title |
| `company_name` | string | Employer name |
| `company_logo_url` | string | Company square logo URL (null if only placeholder available) |
| `location` | string | Location text from card |
| `city` | string | Parsed city |
| `state` | string | Parsed state/region |
| `country` | string | Country from structured data |
| `salary_min` | number | Minimum salary (numeric) |
| `salary_max` | number | Maximum salary (numeric) |
| `salary_currency` | string | Currency code (USD, EUR, GBP, ...) |
| `salary_period` | string | Pay period: year, month, week, day, hour |
| `salary_text` | string | Human-readable salary string synthesized from structured fields (e.g. "$145K - $205K/yr (Glassdoor est.)") |
| `salary_estimated` | boolean | True when Glassdoor or employer estimated |
| `salary_source` | string | "glassdoor" or "employer" when estimated |
| `employment_type` | string | full-time, part-time, contract, temporary, internship, freelance |
| `workplace_type` | string | remote, hybrid, onsite |
| `description_snippet` | string | Short description excerpt (SERP) |
| `description_full` | string | Full plain-text description (requires `includeJobDetails`) |
| `description_html` | string | Full HTML description (requires `includeJobDetails`) |
| `description_md` | string | Full Markdown description converted from HTML (requires `includeJobDetails`) |
| `posted_at` | string | Posting date YYYY-MM-DD (approximate, derived from "Nd ago") |
| `posted_at_datetime` | string | ISO-8601 UTC datetime (YYYY-MM-DDT00:00:00Z) |
| `age_days` | number | Days since posted |
| `job_url` | string | Glassdoor job listing URL |
| `apply_url` | string | Direct apply URL (requires `includeJobDetails`) |
| `apply_type` | string | quick (Easy Apply), native, external |
| `source_platform` | string | Always `"glassdoor.com"` |
| `company_rating` | number | Overall Glassdoor rating 1.0-5.0 |
| `review_count` | number | Number of Glassdoor reviews |
| `easy_apply` | boolean | True if Glassdoor Easy Apply available |
| `sponsored` | boolean | True if sponsored/promoted listing |
| `employer_id` | string | Glassdoor employer ID (eid) |
| `employer_profile_url` | string | Glassdoor company Overview URL |
| `search_query` | string | Keyword used for this result |
| `search_location` | string | Location used for this result |
| `serp_page` | number | SERP page number |
| `scraped_at` | string | ISO-8601 UTC scrape timestamp |
| `extraction_mode` | string | Extraction path used (serp-apollo, serp-jsonld, serp-html-anchor, +detail) |
| `company_about` | string | Employer "About" text (requires `includeCompanyDetails`) |
| `company_website` | string | Employer website URL |
| `company_headquarters` | string | Headquarters location |
| `company_size_range` | string | Employee count range (e.g. "10001+ Employees") |
| `company_founded_year` | number | Year founded |
| `company_industry` | string | Industry name |
| `company_sector` | string | Sector name |
| `company_type` | string | Company type (Public, Private, Nonprofit, ...) |
| `company_revenue_range` | string | Annual revenue range |
| `company_ceo` | string | CEO name |
| `company_ceo_approval_pct` | number | CEO approval % |
| `company_recommend_pct` | number | Recommend-to-friend % |
| `company_glassdoor_rating` | number | Overall rating from company page |
| `company_review_count` | number | Review count from company page |
| `company_rating_culture` | number | Culture and values sub-rating |
| `company_rating_compensation` | number | Compensation and benefits sub-rating |
| `company_rating_opportunities` | number | Career opportunities sub-rating |
| `company_rating_senior_leadership` | number | Senior leadership sub-rating |
| `company_rating_work_life_balance` | number | Work-life balance sub-rating |
| `company_rating_diversity` | number | Diversity and inclusion sub-rating |
| `company_active_jobs_count` | number | Number of open roles on company page |
| `company_active_jobs` | array | List of open job titles and URLs (up to 20) |

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | string\[] | `["software engineer"]` | Job search keywords |
| `startUrls` | string\[] | | Pre-filtered Glassdoor search URLs |
| `location` | string | | City or region (e.g. "New York, NY") |
| `country` | select | `us` | Glassdoor domain: us, uk, gb, ca, au, ie, in, de, fr, nl, es, it, br, mx, ar, sg, hk, ch, at, be |
| `maxResults` | integer | `5` | Total job cap across all queries |
| `maxResultsPerQuery` | integer | `5` | Per-query job cap |
| `includeJobDetails` | boolean | `false` | Fetch full description and apply URL from PDP |
| `includeCompanyDetails` | boolean | `false` | Fetch employer profile fields |
| `sortBy` | select | `newest` | newest or relevance |
| `maxConcurrency` | integer | `3` | Max parallel HTTP requests |

### Pricing

Pay-per-event (PPE) via Apify's platform billing:

| Event | Rate | When charged |
|---|---|---|
| `job-start` | $0.001 | Once per actor run |
| `job-serp-result` | $0.003 | Per job pushed to dataset |
| `job-detail-result` | $0.002 | Per job enriched with full description from the detail page |
| `company-detail-result` | $0.005 | Per unique employer profile resolved (deduplicated per run) |

**How it works:** You pay a flat rate per event; we absorb compute and proxy costs on our end. No monthly minimum. New Apify accounts include $5 free credit that applies immediately.

#### Worked examples

**SERP-only scan — 100 jobs**

| Event | Count | Rate | Subtotal |
|---|---|---|---|
| `job-start` | 1 | $0.001 | $0.001 |
| `job-serp-result` | 100 | $0.003 | $0.300 |
| **Total** | | | **$0.301** |

**SERP + detail enrichment — 500 jobs**

| Event | Count | Rate | Subtotal |
|---|---|---|---|
| `job-start` | 1 | $0.001 | $0.001 |
| `job-serp-result` | 500 | $0.003 | $1.500 |
| `job-detail-result` | 500 | $0.002 | $1.000 |
| **Total** | | | **$2.501** |

**Full pipeline — 1,000 jobs + 200 employer profiles**

| Event | Count | Rate | Subtotal |
|---|---|---|---|
| `job-start` | 1 | $0.001 | $0.001 |
| `job-serp-result` | 1,000 | $0.003 | $3.000 |
| `job-detail-result` | 1,000 | $0.002 | $2.000 |
| `company-detail-result` | 200 | $0.005 | $1.000 |
| **Total** | | | **$6.001** |

### Supported countries

us (glassdoor.com), uk/gb (glassdoor.co.uk), ca (glassdoor.ca), au (glassdoor.com.au), ie (glassdoor.ie), in (glassdoor.co.in), de (glassdoor.de), fr (glassdoor.fr), nl (glassdoor.nl), es (glassdoor.es), it (glassdoor.it), br (glassdoor.com.br), mx (glassdoor.com.mx), ar (glassdoor.com.ar), sg (glassdoor.sg), hk (glassdoor.com.hk), ch (glassdoor.ch), at (glassdoor.at), be (glassdoor.be)

### Use with AI agents (MCP)

This actor is compatible with Apify's MCP server for use in Claude, Cursor, LangChain and other agent frameworks. For per-tool schemas and MCP-client copy-paste snippets, see the [MCP tab](https://apify.com/santamaria-automations/glassdoor-scraper/api/mcp) on the actor page.

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.apify.com/sse?token=YOUR_APIFY_TOKEN&tools=santamaria-automations~glassdoor-scraper"
      ]
    }
  }
}
```

### Related actors

Feed the `company_website` field from this actor's output into one of the two below to enrich rows with contact data:

- **[Website Email & Phone Scraper](https://apify.com/santamaria-automations/website-email-scraper)** — regex-based, fast & cheap; scrapes emails + phones from a company website.
- **[Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor)** — LLM-based, higher precision on structured contacts (names, roles, dept-scoped emails).

More job scrapers from our fleet you may also want:

- **[LinkedIn Jobs Scraper](https://apify.com/santamaria-automations/linkedin-scraper)** — LinkedIn's public job search across every geo.
- **[Stepstone.de Scraper](https://apify.com/santamaria-automations/stepstone-de-scraper)** — flagship DACH board (Germany).
- **[Arbeitsagentur DE Scraper](https://apify.com/santamaria-automations/arbeitsagentur-de-scraper)** — the German federal employment agency (jobsuche.arbeitsagentur.de).
- **[France Travail Scraper](https://apify.com/santamaria-automations/france-travail-scraper)** — the French national public employment service.

### Why this scraper

- Returns Glassdoor's employer rating (1-5) and review count on every SERP row — not just on aggregated employer pages — so compensation and culture signals travel with each job record.
- Preserves the `salary_estimated` boolean and `salary_source` string alongside parsed numeric salary ranges, letting ML pipelines weight or filter employer-declared vs Glassdoor-estimated bands independently.
- Optional employer profile pass (`includeCompanyDetails: true`) resolves 20+ company fields — about text, HQ, size, founded year, industry, sector, CEO, CEO approval %, recommend %, six sub-ratings, open-role count and list — deduplicated per unique employer, with no second API call required.
- Covers 20+ country domains under a single normalized schema: one input change (`country: "de"`) routes the entire run to glassdoor.de without any per-country actor to maintain.
- Pure Go HTTP stack running at 128 MB RAM baseline with residential proxy and Apify Unblocker — no browser overhead, roughly 30x faster per query than the previous browser-tier implementation.

### Use cases

- Compensation benchmarking across cities and titles using `salary_min`, `salary_max`, `salary_currency`, `salary_period` and the `salary_estimated` filter flag.
- Recruiter lead-gen: identify companies actively hiring for a target role and open a conversation using co-located employer fields (HQ, size, industry, CEO).
- Market intelligence: track competitor rating trends, open-role counts and review-count velocity across recurring scheduled runs.
- Pay-transparency research or media reporting, particularly for US postings where Glassdoor publishes salary estimates employers do not disclose elsewhere.
- Candidate pipeline building with deduplication on `employer_id` and `id` (Glassdoor jobListingId) across daily runs.

### Notes and limits

- Glassdoor's "newest" sort applies a `fromAge` filter (typically last-24 h posts) rather than a strict recency ordering. Results within the window are relevance-ranked. To capture older postings, use `sortBy: relevance` and paginate deeper.
- Salary ranges are often Glassdoor's estimates rather than official employer bands. The `salary_estimated` boolean and `salary_source` string identify which is which on every row.
- Employer profile pages sometimes omit fields for smaller companies or non-US regions. Missing values are returned as null rather than backfilled with guesses.
- `description_full`, `description_html` and `description_md` are only populated when `includeJobDetails: true`. SERP rows carry only `description_snippet` (roughly 150 chars).
- `apply_url` and the `apply_type` distinction (external ATS redirect vs Glassdoor Easy Apply) require `includeJobDetails: true`.
- Throughput: expect roughly 2-3 jobs per second at `maxConcurrency: 3`. Total runtime scales approximately linearly with SERP page count (30 rows per page).

### Support

- **Questions or issues?** Email contact@nanoscrape.com — we typically reply within 6 hours. You can also open a ticket in the [Issues tab](https://console.apify.com/actors/hrJPbHgcDqPpF7NaW/info/issues) on the actor page.
- **Feature request?** Open a ticket in the [Issues tab](https://console.apify.com/actors/hrJPbHgcDqPpF7NaW/info/issues) or email contact@nanoscrape.com with the field / country / employer type you need and (if possible) a URL that shows the data live on glassdoor.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site + your rough usage volume — we ship one-off boards regularly.

# Actor input Schema

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

One or more job search terms (e.g. \['software engineer', 'product manager']). Each keyword runs as a separate search combined with 'location' and 'country'. Results are deduplicated by Glassdoor's jobListingId. Leave empty if you use searchUrls, directUrls, companyUrls or startUrls instead.

## `searchUrls` (type: `array`):

Glassdoor SERP URLs to crawl. Preserves any filters you set in Glassdoor's own UI (salary range, distance, remote, easy-apply, etc.). Supports query-string shape (https://www.glassdoor.com/Job/jobs.htm?sc.keyword=...) and slug shape (https://www.glassdoor.com/Job/new-york-software-engineer-jobs-SRCH_IL.0,8_IC1132348_KO9,26.htm). Pagination is applied automatically.

## `directUrls` (type: `array`):

Glassdoor job-listing detail page URLs to fetch individually, skipping SERP. Shape: https://www.glassdoor.com/job-listing/...-JV\_...htm?jl=<id>. Each URL produces one fully-enriched row. Charges one job-detail-result event per URL.

## `companyUrls` (type: `array`):

Glassdoor company profile URLs. Scrapes all jobs listed under each company AND populates company\_\* enrichment fields automatically. Shapes: https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.htm or https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm. includeCompanyDetails is implicitly true for these.

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

Mixed-shape convenience input — a polymorphic router. Each URL is classified by its shape and dispatched to the correct handler: job-listing URLs go to directUrls handler, company Overview/Jobs URLs go to companyUrls handler, SERP URLs go to searchUrls handler. Use searchUrls, directUrls and companyUrls for precise routing. Existing customers passing SERP URLs here continue to work unchanged.

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

City, region or country text (e.g. 'New York, NY', 'London', 'Berlin'). Applied to every keyword in searchQueries. Ignored when using searchUrls or startUrls.

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

Which Glassdoor domain to search (us -> glassdoor.com, uk -> glassdoor.co.uk, de -> glassdoor.de, etc.).

## `maxResults` (type: `integer`):

Total cap on jobs pushed to the dataset across all queries and URLs.

## `maxResultsPerQuery` (type: `integer`):

Cap on jobs pushed per individual keyword or search URL.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description (plain text + HTML + Markdown), a direct apply URL, and richer structured fields. Adds a separate 'job-detail-result' charge per enriched job.

## `includeCompanyDetails` (type: `boolean`):

Resolve each unique employer to its Glassdoor company page for enriched about text, headquarters, size, founded year, industry, CEO, rating breakdowns (culture, comp, opportunities, senior leadership, work-life balance), recommend-to-friend %, and active job list. Deduped per employer. Charges a 'company-detail-result' event ($0.005 each). Auto-enables includeJobDetails.

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

'newest' = newest first (adds date_desc sort). 'relevance' = Glassdoor's default ranking.

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

Maximum number of parallel HTTP requests for detail and company page fetches. Each worker uses an independent UNBLOCKER session with its own cookie jar for block safety. Higher values speed up large runs with includeJobDetails=true.

## `descriptionFetchTimeoutSec` (type: `integer`):

Per-request timeout in seconds for job-detail and company-detail page fetches. Default 20s. Increase if you see timeout errors on slow networks; decrease to fail-fast and rotate to a fresh proxy session sooner.

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "location": "New York, NY",
  "country": "us",
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "sortBy": "newest",
  "maxConcurrency": 3,
  "descriptionFetchTimeoutSec": 20
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of scraped Glassdoor jobs plus per-employer enrichment records (when includeCompanyDetails=true). Each job record has 25+ fields and is deduplicated by Glassdoor's jobListingId. Employer-enrichment records are keyed by the same job id and carry company\_\* fields for downstream joins. See the Dataset tab for tabular preview, or export as JSON for full fidelity.

# 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": [
        "software engineer"
    ],
    "sortBy": "newest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "searchQueries": ["software engineer"],
    "sortBy": "newest",
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/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 '{
  "searchQueries": [
    "software engineer"
  ],
  "sortBy": "newest"
}' |
apify call santamaria-automations/glassdoor-scraper --silent --output-dataset

```

## MCP server setup

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