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

Scrape job listings from Glassdoor across all Glassdoor country sites (US, UK, Canada, Australia, New Zealand, Ireland, India, Hong Kong, Singapore), including title, company, rating, location, salary, and posted date.

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

## Pricing

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

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 hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glassdoor-jobs-scraper--hero.png)

### What does Glassdoor Jobs Scraper do?

**Glassdoor Jobs Scraper** extracts job listings from [Glassdoor](https://www.glassdoor.com) across all nine Glassdoor country sites - title, company name, company rating, location, salary, posted date, easy-apply status, and a description snippet. Point it at a keyword/location/country or a Glassdoor search URL and it scrapes every listing on the results, following pagination automatically until it has enough.

### Global coverage

Glassdoor only operates nine country sites (there's no separate `.de`/`.fr`/`.nl`/etc - every market shares the same English-language platform):

| Country        | Domain           |
| -------------- | ---------------- |
| United States  | glassdoor.com    |
| United Kingdom | glassdoor.co.uk  |
| Canada         | glassdoor.ca     |
| Australia      | glassdoor.com.au |
| New Zealand    | glassdoor.co.nz  |
| Ireland        | glassdoor.ie     |
| India          | glassdoor.co.in  |
| Hong Kong      | glassdoor.com.hk |
| Singapore      | glassdoor.sg     |

Pick one via the **Country** input, or paste a **Start URL** from any of them directly.

### How to use Glassdoor Jobs Scraper

![How Glassdoor Jobs Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glassdoor-jobs-scraper--how-it-works.png)

1. Click **Try for free** (or **Start**) to open the Actor.
2. Either:
   - Set **Keyword**, **Location**, and **Country** to have the Actor build a search for you, or
   - Go to a Glassdoor site, search for the role/location you want, and paste the resulting URL into **Start URLs** (this takes priority when set).
3. Optionally set **Max jobs per start URL** and **Max search result pages**.
4. Click **Start** and wait for the run to finish, then open the **Dataset** tab to view, filter, and export the results.

### Input

![Glassdoor Jobs Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glassdoor-jobs-scraper--input.png)

| Field                | Type               | Description                                                                                                                 |
| -------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array (optional)   | Glassdoor job search result page URLs on any of the nine domains above. Takes priority over `keyword`/`location`/`country`. |
| `keyword`            | string (optional)  | Job title/skill/keyword. Used to build a search URL when `startUrls` is empty.                                              |
| `location`           | string (optional)  | Free-text location. Used to build a search URL when `startUrls` is empty.                                                   |
| `country`            | string (optional)  | Which Glassdoor country site to search when building a URL. Defaults to `us`.                                               |
| `maxItems`           | integer (optional) | Maximum job listings per start URL/search. Defaults to 50.                                                                  |
| `maxPages`           | integer (optional) | Safety cap on search result pages to paginate through. Defaults to 10.                                                      |
| `scrapeJobDetails`   | boolean (optional) | Best-effort full-description enrichment - see **Full descriptions vs. snippets** below. Defaults to `false`.                |
| `proxyConfiguration` | object (required)  | Proxy settings. Defaults to Apify Proxy's Residential group - Glassdoor blocks a majority of unproxied/datacenter-IP requests.|

See the **Input** tab for the full schema.

### Output

![Glassdoor Jobs Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glassdoor-jobs-scraper--output.png)

![Glassdoor Jobs Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/glassdoor-jobs-scraper--fields.png)

Each dataset item looks like this:

```json
{
    "jobId": "1010223788583",
    "title": "Sr. Data Scientist",
    "companyName": "Canoe Software",
    "companyRating": 2.9,
    "location": "London, England",
    "salaryText": "£160k - £180k",
    "salaryIsEstimate": false,
    "descriptionSnippet": "Collaborate with cross-functional teams to design and build data-driven products and solutions…",
    "postedAge": "10d",
    "postedDate": "2026-08-07",
    "easyApply": false,
    "country": "uk",
    "url": "https://www.glassdoor.co.uk/job-listing/sr-data-scientist-canoe-software-JV_IC2671300_KO0,17_KE18,32.htm?jl=1010223788583",
    "fullDescription": null,
    "fullDescriptionScraped": false
}
```

`fullDescription` stays `null` and `fullDescriptionScraped` stays `false` for every item unless **Scrape full job descriptions** is turned on - see below.

#### Data table

| Field                    | Description                                                                                                |
| ------------------------ | ---------------------------------------------------------------------------------------------------------- |
| `jobId`                  | Glassdoor's internal job listing ID                                                                        |
| `title`                  | Job title                                                                                                  |
| `companyName`            | Hiring company name                                                                                        |
| `companyRating`          | Company's Glassdoor rating out of 5, if shown                                                              |
| `location`               | Job location                                                                                               |
| `salaryText`             | Salary range as shown on the card                                                                          |
| `salaryIsEstimate`       | `true` = Glassdoor-estimated salary, `false` = employer-provided, `null` = no salary shown                 |
| `descriptionSnippet`     | Truncated description shown on the search results card                                                     |
| `postedAge`              | Raw "how long ago posted" badge (e.g. `"10d"`, `"30d+"`)                                                   |
| `postedDate`             | `postedAge` converted to an approximate ISO date                                                           |
| `easyApply`              | Whether the listing supports Glassdoor Easy Apply                                                          |
| `country`                | Which Glassdoor country site the job came from                                                             |
| `url`                    | Link to the live listing                                                                                   |
| `fullDescription`        | Full job description text, only populated when `scrapeJobDetails` is on and the detail page wasn't blocked |
| `fullDescriptionScraped` | Whether `fullDescription` was actually obtained                                                            |

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Full descriptions vs. snippets

Glassdoor's search result pages are what this Actor scrapes by default, and they already carry title, company, rating, location, salary, easy-apply status, and a real (if truncated) description snippet for every job - all reliably, without needing a proxy.

Glassdoor's individual job-listing pages sit behind a **much stricter** Cloudflare interactive challenge than the search pages do, and even the search pages themselves block a majority of unproxied/datacenter-IP requests - that's why proxy is required and defaults to Apify Proxy's Residential group. Turning on **Scrape full job descriptions** makes the Actor visit each job's detail page for the untruncated text; when a detail page is blocked, the job is **not dropped** - it's still pushed to the dataset with its snippet data and `fullDescriptionScraped: false`. Expect a mix of hits and blocks on detail pages rather than a guaranteed 100% success rate, even with Residential proxy.

### Cost estimation

With `scrapeJobDetails` off (the default), cost scales with the number of search result pages, not the number of jobs - each page returns up to 30 jobs in one browser page load. Turning it on adds one extra page load per job, most of which may be blocked.

### Tips

- Add multiple start URLs (different roles, locations, countries) to cover more ground in a single run.
- Salary is only shown by Glassdoor when either the employer discloses it or Glassdoor has enough data to estimate it - many listings will have `salaryText: null`.
- Proxy is required and defaults to Residential; don't turn it off even for small runs.

### FAQ, disclaimers, and support

This Actor only collects publicly listed Glassdoor data. It is not affiliated with or endorsed by Glassdoor. Respect Glassdoor's Terms of Service when using the scraped data. Found a bug or have a feature request? Use the Issues tab on this Actor's page. Custom scraper solutions are also available on request.

# Actor input Schema

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

Glassdoor job search result page URLs to start scraping from, on any Glassdoor country site (glassdoor.com, glassdoor.co.uk, glassdoor.ca, glassdoor.com.au, glassdoor.co.nz, glassdoor.ie, glassdoor.co.in, glassdoor.com.hk, glassdoor.sg). Takes priority over Keyword/Location/Country below when set.

## `keyword` (type: `string`):

Job title, skill, or keyword to search for. Used to build a search URL when Start URLs is empty.

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

Free-text location to search in (city, state, or region). Used to build a search URL when Start URLs is empty.

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

Which Glassdoor country site to search when building a URL from Keyword/Location. Ignored if Start URLs is set.

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

Maximum number of job listings to scrape for each start URL / search.

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

Safety cap on how many search result pages to paginate through for each start URL / search. Since results are billed per item, this must be set explicitly so a single search can't run away into an unbounded number of pages.

## `scrapeJobDetails` (type: `boolean`):

Visit each job's detail page for the untruncated description. Off by default: search-result pages already carry title, company, rating, location, salary, and a real (if truncated) description snippet for every job, reliably and without a proxy. Detail pages sit behind a much stricter Cloudflare challenge - turning this on adds one extra page load per job, and any job whose detail page is blocked still lands in the dataset using its snippet as a fallback.

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

Proxy settings. Required - Glassdoor blocks a majority of unproxied/datacenter-IP requests (confirmed live), on both search pages and (if Scrape full job descriptions is on) job-detail pages. Defaults to Apify Proxy's Residential group.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,17.htm"
    }
  ],
  "keyword": "Software Engineer",
  "country": "us",
  "maxItems": 10,
  "maxPages": 5,
  "scrapeJobDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,17.htm"
        }
    ],
    "keyword": "Software Engineer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/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 = {
    "startUrls": [{ "url": "https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,17.htm" }],
    "keyword": "Software Engineer",
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/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 '{
  "startUrls": [
    {
      "url": "https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,17.htm"
    }
  ],
  "keyword": "Software Engineer"
}' |
apify call mrdoe/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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