# Glassdoor Job Scraper (`shahidirfan/glassdoor-job-scraper`) Actor

Extract Glassdoor job listings at scale with structured data including job titles, companies, locations, salaries, descriptions, ratings, and job URLs. Ideal for job market research, recruitment, salary analysis, lead generation, and employment data collection.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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

### What does Glassdoor Jobs Scraper do?

Glassdoor Jobs Scraper collects current Glassdoor job listings from a search URL or from keyword and location filters. Each dataset item includes the job title, employer, location, salary range, posting age, description, listing URL, employer details, application signals, and extracted skills.

Use it for recruitment research, salary benchmarking, hiring-market monitoring, job aggregation, and structured datasets for analytics or AI workflows.

### Why use Glassdoor Jobs Scraper?

- **Rich job records** - Capture core listing details plus employer IDs, logos, ratings, salary periods, source labels, and application flags.
- **Flexible search** - Search by job keywords and location, or provide a Glassdoor search URL with its filters already set.
- **Fast multi-page collection** - Follow Glassdoor's result pages and save unique jobs without opening every job detail page.
- **Duplicate-safe results** - Each saved listing is checked by its Glassdoor listing ID before it is added to the dataset.
- **Automation-ready output** - Export the dataset to JSON, CSV, Excel, XML, or connect it to webhooks and downstream tools.
- **Proxy support** - Use the existing proxy configuration field when larger or repeated runs need a different network location.

### What data can you extract from Glassdoor?

| Field                  | Type             | Description                                                         |
| ---------------------- | ---------------- | ------------------------------------------------------------------- |
| `Title`                | String           | Job position title.                                                 |
| `company`              | String           | Employer name shown in the listing.                                 |
| `location`             | String           | City, state, country, or remote location.                           |
| `salary`               | String           | Salary range with currency when published.                          |
| `salaryMin`            | Number or String | Lower salary estimate, or `Not specified`.                          |
| `salaryMedian`         | Number or String | Median salary estimate, or `Not specified`.                         |
| `salaryMax`            | Number or String | Upper salary estimate, or `Not specified`.                          |
| `payCurrency`          | String           | Salary currency code such as `USD`.                                 |
| `jobType`              | String           | Employment type when published or inferred from listing attributes. |
| `postedDate`           | String           | Relative posting age such as `2 days ago`.                          |
| `ageInDays`            | Number or String | Numeric posting age when published.                                 |
| `descriptionHtml`      | String           | Listing-page description preview for HTML-aware consumers.          |
| `descriptionText`      | String           | Plain-text listing-page description preview.                        |
| `url`                  | String           | Direct Glassdoor listing URL.                                       |
| `jobId`                | String           | Unique Glassdoor listing identifier.                                |
| `scrapedAt`            | String           | ISO timestamp for collection time.                                  |
| `companyId`            | String           | Glassdoor employer identifier.                                      |
| `companyLogo`          | String           | Employer logo URL when available.                                   |
| `companyRating`        | Number or String | Overall employer rating, or `Not specified`.                        |
| `employerShortName`    | String           | Employer short name from the listing.                               |
| `locationType`         | String           | Glassdoor location type code.                                       |
| `locationId`           | String           | Glassdoor location identifier.                                      |
| `jobCountryId`         | String           | Glassdoor country identifier.                                       |
| `payPeriod`            | String           | Salary interval such as `ANNUAL`.                                   |
| `salarySource`         | String           | Salary source, such as employer-provided or estimated.              |
| `easyApply`            | Boolean          | Whether the listing supports easy apply.                            |
| `sponsored`            | Boolean          | Whether the listing is marked as sponsored.                         |
| `listingType`          | String           | Sponsorship or organic listing label.                               |
| `jobTitleId`           | String           | Glassdoor job-title identifier.                                     |
| `jobSourceId`          | String           | Source identifier when supplied by Glassdoor.                       |
| `goc`                  | String           | Glassdoor occupation/category value.                                |
| `gocId`                | String           | Glassdoor occupation/category identifier.                           |
| `adOrderId`            | String           | Listing advertisement order identifier when supplied.               |
| `jobResultTrackingKey` | String           | Per-listing result tracking key.                                    |
| `searchTrackingKey`    | String           | Search result tracking key.                                         |
| `seoUrl`               | String           | Search-friendly job listing URL.                                    |
| `skills`               | String           | Comma-separated skills and job attributes found in the listing.     |
| `jobAttributes`        | Array            | Structured skills and attributes published with the listing.        |

### How to use Glassdoor Jobs Scraper

1. Open the Actor in Apify Console.
2. Enter a job search keyword and optional location, or provide a complete Glassdoor search URL.
3. Choose filters such as posting age, employment type, salary, and sorting.
4. Set the maximum number of jobs to collect across result pages.
5. Run the Actor and preview or export the resulting dataset.

### Input Parameters

| Parameter            | Type    | Required | Default                             | Description                                                                                      |
| -------------------- | ------- | -------: | ----------------------------------- | ------------------------------------------------------------------------------------------------ |
| `searchUrl`          | String  |       No | -                                   | A complete Glassdoor search URL. When supplied, it takes priority over the other search filters. |
| `searchQuery`        | String  |       No | `software engineer`                 | Job title, skill, or keyword phrase.                                                             |
| `location`           | String  |       No | -                                   | City, state, country, or other Glassdoor location.                                               |
| `maxJobs`            | Integer |       No | `50`                                | Maximum listings to save. Use `0` for unlimited within the available result set.                 |
| `fromAge`            | Integer |       No | `1`                                 | Only include listings posted within this many days.                                              |
| `jobType`            | String  |       No | `all`                               | `all`, `fulltime`, `parttime`, `contract`, `temporary`, or `internship`.                         |
| `minSalary`          | Integer |       No | `0`                                 | Minimum annual salary filter in USD when supported by the search.                                |
| `sortBy`             | String  |       No | `relevance`                         | Use `date` for newest-first results.                                                             |
| `proxyConfiguration` | Object  |       No | Residential proxy setting in schema | Apify Proxy settings for repeated or protected runs.                                             |

### Usage Examples

#### Basic keyword search

Collect recent software engineering listings in San Francisco:

```json
{
    "searchQuery": "software engineer",
    "location": "San Francisco, CA",
    "maxJobs": 20
}
```

#### Search with filters

Limit results to full-time jobs with a salary filter and newest-first sorting:

```json
{
    "searchQuery": "data analyst",
    "location": "New York, NY",
    "maxJobs": 50,
    "fromAge": 7,
    "jobType": "fulltime",
    "minSalary": 90000,
    "sortBy": "date"
}
```

#### Use a complete Glassdoor search URL

Let Glassdoor define the search terms and filters through an existing URL:

```json
{
    "searchUrl": "https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,17.htm?fromAge=1",
    "searchQuery": "software engineer",
    "maxJobs": 20
}
```

### Sample Output

```json
{
    "Title": "Software Development Engineer",
    "company": "Clearwater Analytics, LLC",
    "location": "Bellevue, WA",
    "salary": "USD 115,120 - USD 148,350",
    "salaryMin": 115120,
    "salaryMedian": 131735,
    "salaryMax": 148350,
    "payCurrency": "USD",
    "jobType": "Full-time",
    "postedDate": "2 days ago",
    "ageInDays": 2,
    "descriptionHtml": "<p>Build and maintain production software systems, collaborate with engineering teams, and improve platform reliability...</p>",
    "descriptionText": "Build and maintain production software systems, collaborate with engineering teams, and improve platform reliability...",
    "url": "https://www.glassdoor.com/job-listing/software-development-engineer-clearwater-analytics-JV.htm?jl=1010228597784",
    "jobId": "1010228597784",
    "scrapedAt": "2026-08-15T06:49:31.700Z",
    "companyId": "297676",
    "companyLogo": "https://media.glassdoor.com/sql/297676/clearwater-analytics-squareLogo.png",
    "companyRating": 3.4,
    "employerShortName": "Clearwater Analytics",
    "locationType": "C",
    "locationId": "1150442",
    "jobCountryId": "1",
    "payPeriod": "ANNUAL",
    "salarySource": "EMPLOYER_PROVIDED",
    "easyApply": true,
    "sponsored": false,
    "listingType": "Organic",
    "jobTitleId": "0",
    "jobSourceId": "Not specified",
    "goc": "software engineer",
    "gocId": "10132",
    "seoUrl": "https://www.glassdoor.com/job-listing/software-development-engineer-clearwater-analytics-JV.htm?jl=1010228597784",
    "skills": "Computer science, Software engineering, TypeScript, APIs",
    "jobAttributes": [
        { "name": "TypeScript", "value": "TypeScript" },
        { "name": "Employment type", "value": "Full-time" }
    ]
}
```

### Tips for best results

- Start with `maxJobs: 20` while testing a new keyword or location.
- Use a complete search URL when you need Glassdoor's exact location and filter encoding.
- Provide either a search URL, a keyword, or both a keyword and location. If all search fields are empty, the Actor falls back to `software engineer`.
- Description fields contain the preview published with each search result. The Actor does not open every detail page, which keeps multi-page runs fast.
- Use a residential proxy configuration for frequent or larger runs.
- On Apify Cloud, a residential proxy is selected automatically when no proxy configuration is provided.
- Review several records before treating a missing salary, rating, logo, or employment type as a source-wide limitation.
- Schedule repeat runs in Apify to monitor new postings over time.

### Integrations and exports

Apify datasets can be downloaded as JSON, CSV, Excel, XML, and other supported formats. Connect completed runs to Google Sheets, webhooks, Make, Zapier, or your own service through the Apify API.

### Frequently Asked Questions

#### Can I export the results to CSV or Excel?

Yes. Download the completed Apify dataset in CSV, Excel, JSON, XML, or another supported format.

#### Can I run this Actor on a schedule?

Yes. Create an Apify schedule to refresh a search hourly, daily, weekly, or on a custom interval.

#### Why is a salary or rating sometimes not specified?

Glassdoor does not publish every field for every listing. The Actor keeps the field present and uses `Not specified` when the source does not provide a usable value.

#### Does the Actor return duplicate jobs?

The Actor deduplicates records by Glassdoor listing ID during a run. Results can still change between runs as listings are updated or reposted.

#### Is it legal to collect Glassdoor data?

You are responsible for complying with applicable laws, Glassdoor's terms, and privacy requirements. Use the Actor for legitimate collection of publicly available information.

### Related Actors

- [BuiltIn Jobs Scraper](https://apify.com/shahidirfan/builtin-jobs-scraper)
- [Wellfound Jobs Scraper](https://apify.com/shahidirfan/wellfound-jobs-scraper)
- [APEC Jobs Scraper](https://apify.com/shahidirfan/apec-jobs-scraper)
- [Foundit Jobs Scraper](https://apify.com/shahidirfan/foundit-jobs-scraper)

### Support

For issues or feature requests, use the Issues tab on the Actor page and include the input, approximate run time, and the affected output field.

### Legal Notice

This Actor is intended for responsible data collection from publicly available sources. Users are responsible for complying with website terms, applicable law, privacy rules, and any restrictions on storing or redistributing collected data.

# Actor input Schema

## `searchUrl` (type: `string`):

Direct Glassdoor search URL to scrape from. If provided, other search parameters will be ignored. Example: https://www.glassdoor.com/Job/admin-jobs-SRCH\_KO0,6.htm?fromAge=1

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

Job title or keywords to search for (e.g., 'software engineer', 'data analyst', 'marketing manager'). Required if searchUrl is not provided.

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

Location to search for jobs (e.g., 'New York, NY', 'San Francisco, CA', 'London, UK'). Optional.

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

Maximum number of job listings to scrape (0 = unlimited). Default is 50 for optimal performance.

## `fromAge` (type: `integer`):

Filter jobs posted within the last N days (e.g., 1 for last 24 hours, 7 for last week, 30 for last month)

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

Filter by employment type

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

Minimum annual salary in USD (optional filter). Only jobs with salary information will match.

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

Sort order for job listings

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

Proxy settings for bypassing anti-bot protection. RESIDENTIAL proxies are STRONGLY recommended for Glassdoor to avoid blocking.

## Actor input object example

```json
{
  "searchQuery": "software engineer",
  "location": "",
  "maxJobs": 50,
  "fromAge": 1,
  "jobType": "all",
  "minSalary": 0,
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Complete job listings with all details from Glassdoor

## `jobsCSV` (type: `string`):

Export jobs in CSV format

## `jobsJSON` (type: `string`):

Export jobs in JSON format

## `statistics` (type: `string`):

Scraping statistics and summary

# 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"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/glassdoor-job-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" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/glassdoor-job-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"
}' |
apify call shahidirfan/glassdoor-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/glassdoor-job-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/8q1gB2aqjPgiLGPOe/builds/YechtT77Mec3fEgns/openapi.json
