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

Scrape Glassdoor job listings by keyword and location or from search URLs: title, company and rating, location, salary estimate (min, median, max), posted date, easy apply, job type and skills. Optional full descriptions and company profiles. Thousands of jobs per search.

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

## Pricing

from $0.50 / 1,000 jobs

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 Jobs Scraper

Scrape **Glassdoor job listings** by job title and location, or from any Glassdoor search URL. The **Glassdoor Jobs Scraper** returns each job's title, company with its Glassdoor rating, location, **salary estimate** (low, median and high, with currency, period and whether the employer or Glassdoor provided it), posting date, easy-apply flag, job type and the skills Glassdoor tags the job with. Switch on full details to also get the complete job description, the apply link and the company profile: size, revenue, industry, headquarters, website, CEO and the rating breakdown. Use it for **Glassdoor salary data** and job market research, recruiting, lead generation (companies that are hiring) and job boards.

### ✨ Features

- 🔍 **Search by keyword and location**: job titles, skills or company names, one per line, in any city, state or country Glassdoor knows ("New York, NY", "California", "London").
- 🔗 **Or paste Glassdoor search URLs**: the URL keeps its own location and filters (date posted, job type, remote, salary range, company rating, ...). A URL of a later results page starts there.
- 💵 **Glassdoor salary data as numbers**: min, median and max pay, currency, period (annual or hourly) and the source (employer-provided or Glassdoor estimate).
- ⭐ **Glassdoor company ratings**: the overall rating on every job; with details on, also culture, work-life balance, compensation, career opportunities, senior management and recommend-to-a-friend.
- 📄 **Full job descriptions (optional)**: plain text and HTML, plus job type, apply link, map coordinates and the company profile.
- 📈 **Deep results**: Glassdoor lists about 900 jobs per search. When you ask for more, the scraper splits the search by company size automatically (for example about 2,000 "software engineer" jobs in New York in 90 seconds).
- ♻️ **No duplicates**: a job found by two of your searches, or twice in one search, is saved and billed once.

### 🛠️ How It Works

1. **Enter job titles or keywords** and a **location**, or paste Glassdoor search URLs.
2. Pick a **date posted** filter if you want, turn on **full description and company details** if you need them, and set **Max jobs** (default 50).
3. **Run the Scraper**: download the jobs as JSON, CSV or Excel, or get them through the API.

### ⚙️ Input

| Field | What it does |
| --- | --- |
| **Job titles, keywords or search URLs** | One per line. Keywords are searched in the location below; a Glassdoor search URL keeps its own location and filters. |
| **Location** | City, state or country as you would type it on Glassdoor. Empty = everywhere. Not used for search URLs. |
| **Date posted** | `any`, `1`, `3`, `7`, `14` or `30` days. |
| **Include full description and company details** | Also opens each job page for the full description, job type, apply link, coordinates and the company profile. Billed as an extra event per job. Default off. |
| **Max jobs** | Total jobs to save across all searches. Default 50. |
| **Proxy configuration** | Residential proxies in the United States work best (default). |

```json
{
    "searches": ["data analyst", "business analyst"],
    "location": "Chicago, IL",
    "datePosted": "7",
    "includeDetails": false,
    "maxItems": 500
}
```

With a search URL (remote jobs in the United States, posted in the last 3 days):

```json
{
    "searches": ["https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm?fromAge=3&remoteWorkType=1"],
    "maxItems": 200
}
```

### 💰 Pricing

Pay only for the jobs you get. No monthly rental.

| Event | Price | What you get |
| --- | --- | --- |
| **Job** | $0.0005 per job ($0.50 per 1,000) | One job listing with all the search fields below |
| **Job details** | $0.004 per job ($4.00 per 1,000) | Only with "Include full description and company details" on: full description, job type, apply link, coordinates, company profile |
| **Actor start** | $0.00005 per GB of run memory | Charged once when the run starts ($0.0002 at the default 4 GB). |

Examples: 50 jobs = $0.025 · 1,000 jobs = $0.50 · 1,000 jobs with full details = $4.50.

### 📊 Sample Output Data

A job saved with full details on (without them, the row stops at `search`):

```json
{
    "jobId": "1010301612137",
    "url": "https://www.glassdoor.com/job-listing/senior-accountant-mandarin-english-speaking-conexus-food-solutions-JV_IC1128808_KO0,43_KE44,66.htm?jl=1010301612137",
    "title": "Senior Accountant (Mandarin- English Speaking)",
    "company": {
        "name": "Conexus Food Solutions",
        "id": 9704532,
        "rating": 3.9,
        "logo": null,
        "website": "www.conexusfood.com",
        "headquarters": "Chicago, IL",
        "size": null,
        "revenue": null,
        "type": "Company - Public",
        "founded": null,
        "industry": null,
        "sector": null,
        "ceo": null,
        "ratings": {
            "overall": 3.9,
            "careerOpportunities": 4,
            "compensationAndBenefits": 4,
            "cultureAndValues": 4,
            "seniorManagement": 4,
            "workLifeBalance": 3,
            "recommendToFriend": 1,
            "ceoApproval": null
        },
        "reviewsCount": 0
    },
    "location": "Chicago, IL",
    "locationId": 1128808,
    "salary": {
        "min": 65600,
        "median": 72800,
        "max": 80000,
        "currency": "USD",
        "period": "ANNUAL",
        "source": "EMPLOYER_PROVIDED"
    },
    "postedDate": "2026-10-21",
    "ageInDays": 3,
    "easyApply": true,
    "sponsored": true,
    "jobTypes": ["Full-time"],
    "attributes": ["Mandarin", "Accounting systems", "Financial close processing", "Teamwork", "CPA", "Bachelor's degree in finance", "Spreadsheets"],
    "normalizedTitle": "accountant",
    "descriptionSnippet": "Bachelor’s degree in accounting, Finance or a related field. CPA certification is a plus but not required. Handle full book ledgers of small entities like Real…",
    "search": {
        "keyword": "accountant",
        "location": "Chicago, IL (US)",
        "url": null
    },
    "description": "Salary:$65,000 - $80,000\nSchedule: 5-Day Work Week (Onsite)\nSite Address: 6500 W 51st Chicago, IL 60638\nCompany Overview\nConexus Food Solutions is a leader in the Asian food service industry…",
    "descriptionHtml": "<p><b>Salary:</b>$65,000 - $80,000<br/><b>Schedule: </b>5-Day Work Week (Onsite)…",
    "applyUrl": "https://www.glassdoor.com/partner/jobListing.htm?pos=102&ao=1110586&tgt=APPLY_START…",
    "discoveredDate": "2026-10-20",
    "coordinates": { "lat": 41.85, "lng": -87.65 },
    "scrapedAt": "2026-10-24T12:17:58.365Z"
}
```

`salary` is Glassdoor's pay range for the job: `min`/`median`/`max` are its 10th, 50th and 90th percentile, and `source` says whether the employer published it (`EMPLOYER_PROVIDED`) or Glassdoor estimated it (`ESTIMATED`). `postedDate` is worked out from the job's age in days. `attributes` are the skills, education and seniority tags Glassdoor shows; `jobTypes` holds Full-time, Part-time, Contract, Permanent or Temp-to-hire when known.

### 🎯 Use Cases

- **Glassdoor salary data**: collect pay ranges by job title and city for compensation benchmarks.
- **Job market data**: track how many jobs a role or a company posts, where and how fast.
- **Companies hiring**: find employers hiring for a role in your area, with their rating, size and website (details on).
- **Job boards and alerts**: feed new jobs from the last 24 hours into your own board, newsletter or Slack channel.
- **Recruiting research**: compare employers by rating, salary and easy-apply jobs.

### ❓ FAQ

**Is there a Glassdoor API for job listings?** Glassdoor has no public job search API. This scraper works as one: send keywords or search URLs and get structured JSON back, from the Apify API, a schedule or an integration.

**Do I need a Glassdoor account?** No.

**How many jobs can one search return?** Glassdoor lists about 900 jobs per search. For more, the scraper splits the search by company size by itself, which reaches a few thousand jobs for broad searches such as "nurse" in California. For even more, run narrower searches (more cities, the date-posted filter or search URLs with filters).

**Why do some jobs have no salary or rating?** Glassdoor shows a pay range for most jobs, but not all, and only companies with reviews have a rating. Those fields are `null` then.

**Why is "Include full description and company details" billed separately?** The full description and the company profile come from each job's own page, which takes an extra request per job. Leave it off when the search fields are enough.

**Can I get remote jobs?** Yes: paste a country-wide Glassdoor search URL with the remote filter on (`remoteWorkType=1` in the address), like the example above. Glassdoor lists remote jobs per country, not per city.

# Actor input Schema

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

What to search, one per line: a job title, skill or company name (searched in the location below), or the address of a Glassdoor job search results page, which keeps its own location and filters.

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

City, state or country, as you would type it on Glassdoor (e.g. "New York, NY", "California", "London"). Used for the job titles and keywords above, not for search URLs. Leave empty to search everywhere.

## `datePosted` (type: `string`):

Only jobs posted within this period.

## `includeDetails` (type: `boolean`):

Also open each job page for the full job description, job type, apply link, coordinates and the company profile (size, revenue, industry, headquarters, website, rating breakdown). Billed as an extra event per job.

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

Stop after this many jobs in total across all searches. Deep searches are split automatically to go past the ~900 jobs Glassdoor lists per search.

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

Residential proxies in the United States work best.

## Actor input object example

```json
{
  "searches": [
    "software engineer",
    "https://www.glassdoor.com/Job/chicago-il-data-analyst-jobs-SRCH_IL.0,10_IC1128808_KO11,23.htm"
  ],
  "location": "New York, NY",
  "datePosted": "any",
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "searches": [
        "software engineer"
    ],
    "location": "New York, NY",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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 = {
    "searches": ["software engineer"],
    "location": "New York, NY",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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 '{
  "searches": [
    "software engineer"
  ],
  "location": "New York, NY",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call piotrv1001/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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