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

Scrape Glassdoor job listings by keyword and location. Extract job titles, companies, salary estimates, employer ratings, required skills, and job URLs. Supports 23 country sites with optional enriched attributes (work arrangement, job type, seniority level, education).

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

## Pricing

from $1.00 / 1,000 scraped jobs

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

Scrape **job listings from Glassdoor** by keyword and location. Extract job titles, companies, salary estimates, employer ratings, required skills, and direct job URLs — all in structured JSON, ready for analysis, dashboards, or integrations.

Run this Actor on the [Apify platform](https://apify.com) to get results via API, schedule recurring searches, or connect to Google Sheets, Slack, Zapier, and 100+ other tools.

### What does Glassdoor Jobs Scraper do?

Glassdoor Jobs Scraper searches [Glassdoor.com](https://www.glassdoor.com/) for job listings that match a keyword and location. It returns structured data for each job, including salary ranges, employer ratings, skills, and application links.

Type a city, state, or country name, and the Actor matches it to the correct Glassdoor location for you. The Actor supports **23 country sites** — select the country that matches your location to get the best results. Pagination is handled automatically — no manual setup required.

### Why use Glassdoor Jobs Scraper?

- **Market research** — Track which roles employers hire for, what salaries they offer, and what skills they require.
- **Competitive intelligence** — Monitor competitor hiring activity across regions.
- **Job aggregation** — Feed structured listings into your job board, newsletter, or talent platform.
- **Salary benchmarking** — Compare salary estimates (10th, 50th, 90th percentiles) across companies and locations.
- **Recruitment analytics** — Identify trending skills and measure how quickly roles fill (posting age in days).
- **Multi-country coverage** — Search across 23 Glassdoor country sites, from the US and UK to Germany, France, Brazil, and more.

### How to scrape Glassdoor job listings

1. Go to the [Glassdoor Jobs Scraper](https://apify.com/itsnotyouitsme/glassdoor-jobs-scraper) page on Apify Store.
2. Click **Try for free**.
3. Enter a **job keyword** (e.g., "data scientist") and a **location** (e.g., "san francisco").
4. Select the **country site** that matches your location (default: United States).
5. Set the number of pages to scrape (each page returns up to 30 jobs).
6. Optionally turn on **Include enriched data** for extra fields like work arrangement and seniority level.
7. Click **Start**.
8. When the run finishes, download or preview the results on the **Output** tab.

That's it. No coding, no login, no API key needed to get started.

### Input

Configure the scraper on the **Input** tab or pass JSON via the API. See the full schema on the [Input tab](https://apify.com/itsnotyouitsme/glassdoor-jobs-scraper/input-schema).

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `keyword` | String | Yes | `software engineer` | Job title or role to search for. |
| `location` | String | Yes | `new-york` | City, state, or country to search in. |
| `country` | String | No | `us` | Glassdoor country site. Choose from 23 supported countries. The scraper routes traffic through the matching country automatically. |
| `maxPages` | Integer | No | `3` | Number of result pages to scrape (1–50). Each page returns up to 30 jobs. |
| `includeEnrichedData` | Boolean | No | `false` | Add extra fields: work arrangement, job type, seniority level, education requirement, and more. |

#### Supported country sites

United States, United Kingdom, Canada (English), Canada (Français), India, Australia, Singapore, Hong Kong, New Zealand, Deutschland, France, España, Italia, Nederland, Ireland, Österreich, België (Nederlands), Belgique (Français), Schweiz (Deutsch), Suisse (Français), Brasil, México, Argentina.

#### Example input

```json
{
    "keyword": "product manager",
    "location": "london",
    "country": "gb",
    "maxPages": 5,
    "includeEnrichedData": true
}
```

### Output

The Actor stores results in a dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output (standard)

```json
{
    "id": 1234567890,
    "title": "Senior Product Manager",
    "employer": "Acme Corp",
    "employerId": 12345,
    "employerRating": 4.2,
    "employerLogo": "https://media.glassdoor.com/sql/12345/acme-squarelogo.png",
    "location": "London, England (UK)",
    "ageInDays": 3,
    "easyApply": true,
    "sponsored": false,
    "salary": {
        "p10": 65000,
        "p50": 85000,
        "p90": 110000,
        "period": "ANNUAL",
        "currency": "GBP",
        "source": "ESTIMATED"
    },
    "occupation": "Product Manager",
    "skills": ["Agile", "Roadmap Planning", "SQL"],
    "descriptionSnippet": "We are looking for a Senior Product Manager to lead our core platform...",
    "url": "https://www.glassdoor.com/job-listing/senior-product-manager-acme-corp-JV_IC12345_KO0,22.htm"
}
```

#### Example output (enriched)

When **Include enriched data** is enabled, each job includes these additional fields:

```json
{
    "workArrangement": "Hybrid",
    "jobType": "Full-time",
    "seniorityLevel": "Senior-level",
    "educationRequirement": "Bachelor's degree",
    "schedule": null,
    "normalizedJobTitle": "Product Manager",
    "expired": false,
    "otherAttributes": null
}
```

### Data fields

#### Standard fields

| Field | Type | Description |
|---|---|---|
| `id` | Number | Glassdoor listing ID. |
| `title` | String | Job title as posted. |
| `employer` | String | Company name. |
| `employerId` | Number | Glassdoor employer ID. |
| `employerRating` | Number | Overall employer rating (out of 5). |
| `employerLogo` | String | URL of the company logo. |
| `location` | String | Job location (city, state, country). |
| `ageInDays` | Number | Days since the job was posted. |
| `easyApply` | Boolean | Whether Glassdoor Easy Apply is available. |
| `sponsored` | Boolean | Whether the listing is a sponsored result. |
| `salary` | Object | Salary estimate with p10, p50, p90 percentiles, period, currency, and source. |
| `occupation` | String | Glassdoor occupation category. |
| `skills` | Array | List of required skills extracted from the listing. |
| `descriptionSnippet` | String | Short description snippet from the search results. |
| `url` | String | Direct link to the full job listing on Glassdoor. |

#### Enriched fields (optional)

| Field | Type | Description |
|---|---|---|
| `workArrangement` | String | Remote, Hybrid, or On-site. |
| `jobType` | String | Full-time, Part-time, Contract, etc. |
| `seniorityLevel` | String | Entry-level, Mid-level, Senior-level, etc. |
| `educationRequirement` | String | Degree or certification requirement. |
| `schedule` | String | Flexible schedule, Shift work, etc. |
| `normalizedJobTitle` | String | Glassdoor's normalized job title. |
| `expired` | Boolean | Whether the listing has expired. |
| `otherAttributes` | Array | Additional job attributes that do not fit the categories above. |

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

Glassdoor Jobs Scraper uses **pay-per-event (PPE)** pricing on the Apify platform:

- **`job-search`** — One event per run. Covers the cost of loading the search results.
- **`job-saved`** — One event per job saved to the dataset.
- **`job-enriched`** — One event per job when enriched data is enabled (optional add-on).

A typical run that scrapes 3 pages (~90 jobs) without enrichment costs a small fraction of a dollar. Enable enrichment only when you need the extra fields.

You can set a **charge limit** on each run to control spending. The Actor stops automatically when the limit is reached.

Check the current per-event prices on the [Actor's pricing tab](https://apify.com/itsnotyouitsme/glassdoor-jobs-scraper/pricing).

### Tips for best results

- **Start small.** Set `maxPages` to 1 or 2 for your first run to verify the keyword and location work as expected.
- **Match the country to the location.** Use the `gb` country site for UK cities, `de` for German cities, and so on. The default is `us`.
- **Use specific locations.** "San Francisco" returns more targeted results than "California" because Glassdoor scopes city-level searches more precisely.
- **Enable enrichment selectively.** Each enriched job is charged an additional event, so turn this on only when you need the extra fields.
- **Schedule recurring runs.** Use [Apify Schedules](https://docs.apify.com/platform/schedules) to track new postings daily or weekly.
- **Integrate with other tools.** Connect the output to Google Sheets, Slack, or a webhook via [Apify Integrations](https://apify.com/integrations).

### Limitations

- The Actor scrapes search results only. It does not open individual job pages for full descriptions. Use the `url` field to access the full listing.
- Salary data is a Glassdoor estimate (source: `ESTIMATED`) unless the employer publishes an actual figure.
- Glassdoor may change its website at any time. Report issues on the [Issues tab](https://apify.com/itsnotyouitsme/glassdoor-jobs-scraper/issues).

### FAQ

#### Is it legal to scrape Glassdoor?

Web scraping of publicly available data is generally legal, but you must follow Glassdoor's Terms of Service and applicable laws. Do not scrape personal data or use the results for prohibited purposes. Use this Actor responsibly.

#### Can I scrape jobs in languages other than English?

Yes. Select the country site that matches your target language. Job titles and descriptions appear in whatever language the employer used to post them.

#### What happens when the scraper cannot reach Glassdoor?

The Actor retries automatically. If all attempts fail, it exits with an error message that explains the problem.

#### Can I get the full job description?

The search results include only a short snippet. To get the full description, use the `url` field and scrape individual job pages with a separate Actor or crawler.

***

Need a custom Glassdoor integration or a feature not listed here? Open an issue on the [Issues tab](https://apify.com/itsnotyouitsme/glassdoor-jobs-scraper/issues) or contact us for a custom solution.

# Actor input Schema

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

Search keyword for the job title or role (e.g. "software engineer", "data scientist", "product manager").

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

City, state, or region to search in (e.g. "new york", "san francisco", "london"). The scraper resolves the Glassdoor location ID automatically. Make sure the location matches the selected country.

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

Glassdoor country site to search. The scraper uses the correct domain and proxy for each country. Default is United States.

## `maxJobs` (type: `integer`):

Maximum number of job listings to fetch. The scraper stops when it reaches this limit or when there are no more results.

## `includeEnrichedData` (type: `boolean`):

Add enriched fields to each job: work arrangement (remote/hybrid/onsite), job type (full-time/part-time/contract), seniority level, education requirement, and all extracted job attributes. Charged as an extra event per job when PPE pricing is active.

## Actor input object example

```json
{
  "keyword": "software engineer",
  "location": "new-york",
  "country": "us",
  "maxJobs": 90,
  "includeEnrichedData": true
}
```

# Actor output Schema

## `results` (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 = {
    "keyword": "software engineer",
    "location": "new-york",
    "country": "us",
    "maxJobs": 90,
    "includeEnrichedData": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/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 = {
    "keyword": "software engineer",
    "location": "new-york",
    "country": "us",
    "maxJobs": 90,
    "includeEnrichedData": True,
}

# Run the Actor and wait for it to finish
run = client.actor("hgservices/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 '{
  "keyword": "software engineer",
  "location": "new-york",
  "country": "us",
  "maxJobs": 90,
  "includeEnrichedData": true
}' |
apify call hgservices/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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