# Glassdoor Jobs Scraper (`schnellscrapers/glassdoor-job-leads`) Actor

Extract Glassdoor job leads with salary ranges, employer ratings, locations, skills, posting age, remote flags, and Easy Apply signals. Filter salary, rating, remote, and freshness before records are billed; search-card extraction keeps runs lean.

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

## Pricing

from $1.50 / 1,000 glassdoor job leads

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?

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 turns public Glassdoor search pages into clean job leads for recruiting operations, job boards, talent-market monitoring, and sales workflows. Each record keeps the job title, company, location, salary range, employer rating, remote signal, Easy Apply signal, posting age, skills, and direct job URL together so you can route fresh leads without opening every job page.

### What data can you extract from Glassdoor?

- Job identity — `jobId`, `title`, `jobUrl`, and the `searchUrl` that produced the card
- Employer signals — `company`, `companyId`, `companyUrl`, and `companyRating`
- Compensation — `salaryText`, `salaryCurrency`, `salaryPeriod`, `salaryMin`, and `salaryMax`
- Lead filters — `remote`, `easyApply`, `postedText`, and `skills`
- Context — `location`, `descriptionSnippet`, and `scrapedAt`

The salary bounds are normalized from the source result. Missing salary or rating values remain `null`, rather than being guessed. The actor does not make a separate detail-page request for each job, keeping the common lead workflow compact.

### How to use Glassdoor Jobs Scraper

1. Open the actor and enter a keyword such as `software engineer`.
2. Enter a city, region, country, or `remote` in `location`.
3. Choose freshness, salary, company-rating, remote, Easy Apply, and result filters.
4. Click **Run** and wait for the dataset to finish.
5. Download the results as JSON, CSV, Excel, or use the Apify dataset API.

### How much does Glassdoor Jobs Scraper cost?

Pay-per-event pricing charges **$0.0015 per emitted job lead** ($1.50 per 1,000) and a separate **$0.06 actor-start charge** for the upstream search run. Filtered-out jobs are not billed as result events, while a zero-result or dry run still pays the start charge. The default run is capped at 100 records; raise `maxItems` when you need more coverage.

### Input

`keywords` and `location` are required for the default search. Add `daysOld`, `remoteOnly`, `easyApply`, `minRating`, `minSalary`, or `maxSalary` for tighter lead lists. Use `searches` to batch multiple keyword/location pairs, `excludeJobIds` for incremental workflows, and `urlParam` when Glassdoor exposes a source filter that is not yet a top-level field.

```json
{
  "keywords": "software engineer",
  "location": "New York",
  "daysOld": 7,
  "remoteOnly": false,
  "minRating": 3.5,
  "minSalary": 100000,
  "maxItems": 50
}
```

### Output

The default dataset contains one job lead object per emitted Glassdoor card. Salary values use the source currency and period; company rating, salary, and description fields can be `null` when the card does not show them.

```json
{
  "jobId": "1010117622005",
  "title": "Software Engineer, Cloud",
  "company": "Abbott",
  "companyId": 12,
  "companyRating": 3.7,
  "companyUrl": "https://www.glassdoor.com/Overview/W-EI_IE12.htm",
  "location": "United States",
  "salaryText": "$78K - $156K (Employer provided)",
  "salaryCurrency": "USD",
  "salaryPeriod": "ANNUAL",
  "salaryMin": 78000,
  "salaryMax": 156000,
  "easyApply": false,
  "remote": false,
  "postedText": "30d+",
  "descriptionSnippet": "Bachelor's degree in computer science, Engineering Mathematics, or related field. Build and manage internal tooling, APIs, and production systems, driving…",
  "skills": ["Computer science", "Go", "Tooling", "System design", "Configuration management"],
  "jobUrl": "https://www.glassdoor.com/job-listing/software-engineer-cloud-abbott-JV_KO0,23_KE24,30.htm?jl=1010117622005",
  "searchUrl": "https://www.glassdoor.com/Job/jobs.htm?sc.keyword=software%20engineer&locS=United%20States",
  "scrapedAt": "2026-08-27T18:00:00.000Z"
}
```

### Integrations

Connect the dataset to [Apify integrations](https://apify.com/integrations), scheduled runs, webhooks, Make, n8n, or Zapier. Trigger runs and read JSON or CSV records through the [Apify API](https://docs.apify.com/api/v2) from Python or Node.js.

### Related actors

- [Indeed Jobs Scraper](https://apify.com/SchnellScrapers/indeed-jobs-scraper) — collect comparable job leads from Indeed.
- [Greenhouse Jobs Scraper](https://apify.com/SchnellScrapers/greenhouse-jobs-scraper) — pull active company career-board jobs from Greenhouse.
- [Ashby Jobs Scraper](https://apify.com/SchnellScrapers/ashby-jobs-scraper) — collect jobs from Ashby-hosted career pages.

### FAQ

#### How does Glassdoor Jobs Scraper work?

It delegates each keyword/location search to the proven `valig/glassdoor-jobs-scraper` actor, maps the returned employer, salary, rating, age, and URL fields into a flat lead record, and applies salary, rating, remote, Easy Apply, exclusion, and freshness filters before writing dataset records.

#### Can I use Glassdoor Jobs Scraper as an API?

Yes. Start a run through the [Apify REST API](https://docs.apify.com/api/v2/actor-runs/post-actor-run), then read the run's default dataset with the dataset endpoint. The Output tab links directly to the dataset items.

#### Can I use Glassdoor Jobs Scraper in Python or Node.js?

Yes. Use `apify-client` to start a run and fetch its dataset:

```js
const run = await apifyClient.actor('SchnellScrapers/glassdoor-job-leads').call({ keywords: 'data engineer', location: 'Austin' });
const { items } = await apifyClient.dataset(run.defaultDatasetId).listItems();
```

#### What does this actor access?

The actor delegates the public Glassdoor search to the proven `valig/glassdoor-jobs-scraper` Store actor, then applies this actor's narrower lead filters and flat output mapping before writing records. No Glassdoor login, cookie, or API key is required for the input shown above.

#### Does a filtered or dry run cost anything?

A filtered or dry run can still incur the separate actor-start charge because it starts the upstream search. Dataset result charges apply only to records actually written; dry runs write zero records.

#### Is it legal to scrape Glassdoor?

This actor accesses public job-search pages. You are responsible for your use of the data and should review the laws, regulations, and site rules that apply to your location and use case.

### Your feedback

If a Glassdoor card layout changes or a salary format is not parsed correctly, report it in the actor's Issues tab with a sample search URL. Feature requests for additional country markets, filters, or lead fields are welcome there too.

# Actor input Schema

## `keywords` (type: `string`):

Required search terms such as `software engineer`, `marketing manager`, or a company name.

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

Required city, state, country, or `remote` location to search on Glassdoor.

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

Glassdoor country site used for the search. The default is the United States.

## `daysOld` (type: `integer`):

Ask Glassdoor for jobs posted within this many days. Leave blank for the default search window.

## `easyApply` (type: `boolean`):

Keep only cards marked Easy Apply. The final check is applied before dataset writes.

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

Keep only cards whose title, location, or description snippet identifies remote work.

## `minRating` (type: `number`):

Keep jobs from employers rated at least this many Glassdoor stars. Jobs without a rating are excluded when this filter is set.

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

Keep jobs whose lower salary bound is at least this amount in the source currency. Jobs without a numeric salary are excluded when set.

## `maxSalary` (type: `integer`):

Keep jobs whose upper salary bound is at most this amount in the source currency. Jobs without a numeric salary are excluded when set.

## `radius` (type: `string`):

Glassdoor distance radius around the location, in miles where the market supports it.

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

Sort Glassdoor results by relevance or posting date before local filtering.

## `searches` (type: `array`):

Optional batch of additional keyword/location searches. Each item may override the top-level filters; invalid items are warned and skipped.

## `urlParam` (type: `array`):

Optional Glassdoor query parameters passed through to every search page. Use this for source filters not exposed above.

## `excludeJobIds` (type: `array`):

Skip known Glassdoor job IDs before billing. Useful for incremental lead workflows.

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

Hard cap on total emitted records across all searches and pages.

## `dryRun` (type: `boolean`):

Fetch and filter cards but do not write dataset records. Logs report matched candidates and zero records written.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "New York",
  "country": "US",
  "daysOld": 7,
  "easyApply": false,
  "remoteOnly": false,
  "minRating": 0,
  "minSalary": 0,
  "maxSalary": 0,
  "radius": "0",
  "sortBy": "relevant_desc",
  "searches": [],
  "urlParam": [],
  "excludeJobIds": [],
  "maxItems": 100,
  "dryRun": false
}
```

# Actor output Schema

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

Default dataset of salary-backed Glassdoor job leads.

# 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 = {
    "keywords": "software engineer",
    "location": "New York",
    "searches": [],
    "urlParam": [],
    "excludeJobIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/glassdoor-job-leads").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 = {
    "keywords": "software engineer",
    "location": "New York",
    "searches": [],
    "urlParam": [],
    "excludeJobIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/glassdoor-job-leads").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 '{
  "keywords": "software engineer",
  "location": "New York",
  "searches": [],
  "urlParam": [],
  "excludeJobIds": []
}' |
apify call schnellscrapers/glassdoor-job-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,schnellscrapers/glassdoor-job-leads"
        }
    }
}

```

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/8zqj7MdPrfq4xzANT/builds/P5KCg5qCW40ALQ1Il/openapi.json
