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

Scrape Glassdoor job searches — title, employer, company rating, salary range, location, skills & benefits and posting age — from any country site.

- **URL**: https://apify.com/mina_safwat/glassdoor-jobs-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (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

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

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

Paste a Glassdoor search link and get every job back as a clean row, with the **company's rating**, the **salary band** (low, mid and high), the **job attributes** Glassdoor extracts and **how long the ad has been up**. You don't need an account or an API key.

### What does Glassdoor Jobs Scraper do?

It repeats a job search from [Glassdoor](https://www.glassdoor.com) and returns the results as structured data. The **job title, the location and the country site** are read from the link, so `glassdoor.com`, `glassdoor.co.uk`, `glassdoor.co.in` and the other country sites all work from the same input box.

Glassdoor is worth scraping for what sits next to each listing: the employer's overall rating, a salary band with low, mid and high figures, and a list of extracted job attributes. You get all three.

Because it runs on the Apify platform, you can call it through the **API**, **schedule** it, connect it to **integrations** (Google Sheets, Zapier, Make, webhooks), and **monitor** its runs. Proxy rotation is handled for you.

### Why use Glassdoor Jobs Scraper?

- **Salary benchmarking.** Low, mid and high bands across hundreds of listings tell you more than any single quoted figure.
- **Recruiting intelligence.** See who is hiring for what, where, and how long the roles have been open.
- **Skills and benefits demand.** Count the extracted attributes (skills, benefits, seniority) across a market.
- **Job aggregation.** Feed a job board, a newsletter or an internal dashboard.
- **Competitor watch.** See which companies are hiring and how their employees rate them.
- **Market research.** Compare the same role across cities or countries in one run.

### How to scrape Glassdoor jobs

1. Click **Try for free**.
2. On Glassdoor, search for the job title and location you want.
3. Copy the address bar and paste it into **Glassdoor search links**, one link per line.
4. Click **Start**, then download the results.

A valid link looks like `https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm`. If a link isn't a Glassdoor search link, the Actor skips it, logs a warning and carries on with the others.

### Input

Set these fields on the **Input** tab:

| Field | What it does |
|---|---|
| `search_urls` | Your Glassdoor search links, one per line. You can mix country sites. |
| `max_results_per_search` | Stops after this many jobs per search. Results arrive 30 at a time. |
| `exclude_sponsored` | Drops jobs from employers who paid for placement. |
| `proxy_configuration` | Residential proxies are recommended. |

```json
{
    "search_urls": [
        "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
        "https://www.glassdoor.com/Job/new-york-city-data-scientist-jobs-SRCH_IL.0,13_IC1132348_KO14,28.htm"
    ],
    "max_results_per_search": 100,
    "exclude_sponsored": false,
    "proxy_configuration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Filters you add on Glassdoor after the `?` in the address (date posted, salary range, Easy Apply and so on) are **not applied**. The Actor logs a warning when a link contains them.

### Output

You get one row per job. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "listing_id": 1010242102534,
    "title": "Software Developer",
    "url": "https://www.glassdoor.com/job-listing/software-developer-bryce-JV_IC1127653_KO0,18_KE19,24.htm?jl=1010242102534",
    "employer": "BryceTech",
    "employer_id": 2009430,
    "employer_rating": 4.4,
    "employer_logo": "https://media.glassdoor.com/sql/2009430/bryce-squarelogo-1584439350651.png",
    "location": "Huntsville, AL",
    "salary_low": 105000,
    "salary_median": 110000,
    "salary_high": 115000,
    "salary_currency": "USD",
    "pay_period": "ANNUAL",
    "salary_is_estimated": false,
    "posted_days_ago": 35,
    "easy_apply": true,
    "is_sponsored": false,
    "job_category": "software developer",
    "attributes": ["C#", ".NET Core", "Linux", "Full-time", "Health insurance", "401(k) matching", "Senior level"],
    "description_snippet": "Capture, develop, and present technical information to support software development and program objectives…",
    "search_url": "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
    "search_keyword": "software engineer",
    "scraped_at": "2026-10-01T09:28:58.872766+00:00"
}
```

The dataset has three views: **Jobs** (the main table), **Salary bands** (low, mid and high with currency and period) and **Attributes & description**.

### Data fields

| Field | Type | Meaning |
|---|---|---|
| `listing_id` | number | Glassdoor's ID for the job ad. Stable between runs. |
| `title` | text | Job title. |
| `url` | link | The job's page on Glassdoor. |
| `employer` | text | Company name. |
| `employer_id` | number | Glassdoor's company ID. |
| `employer_rating` | number | The company's overall employee rating, 1–5. Empty when Glassdoor shows none. |
| `employer_logo` | link | Company logo. Empty when Glassdoor has none. |
| `location` | text | Where the job is based, as Glassdoor shows it. |
| `salary_low` / `salary_median` / `salary_high` | number | The 10th, 50th and 90th percentile of the salary band, in `salary_currency` per `pay_period`. |
| `salary_currency` | text | Currency code, e.g. `USD`. Empty when there is no salary. |
| `pay_period` | text | Pay period, e.g. `ANNUAL` or `HOURLY`. Empty when there is no salary. |
| `salary_is_estimated` | boolean | `false` when the employer published the figure, `true` when Glassdoor estimated it, and **empty when the listing carries no salary at all**. Empty doesn't mean estimated. |
| `posted_days_ago` | number | How many days the ad has been up. |
| `easy_apply` | boolean | Whether you can apply directly on Glassdoor. |
| `is_sponsored` | boolean | The employer paid for placement in the results. |
| `job_category` | text | Glassdoor's occupation label, e.g. `software engineer`. |
| `attributes` | list | Attributes Glassdoor extracted from the ad: skills, degrees, benefits, job type and seniority, all in one list. Glassdoor doesn't say which is which. |
| `description_snippet` | text | The short excerpt Glassdoor shows in search results, not the full description. |
| `search_url` | link | The search link that produced this job. |
| `search_keyword` | text | The job title read from that link. |
| `scraped_at` | date | When the job was collected (UTC). |

On US searches most jobs come with a salary band. Where Glassdoor shows none, every salary field is empty.

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

The Actor uses pay-per-event pricing, and you pay only for jobs it delivers:

- **$0.002 per job** in the dataset, so **about $2.00 per 1,000 results**.
- **$0.00005 per run** for starting the Actor. That is one charge per GB of memory, and the default is 1 GB.

Proxy and compute costs are included. A search link that gives no jobs costs nothing beyond the run start.

| Run | Jobs | Approximate cost |
|---|---|---|
| 1 search × 100 jobs | 100 | $0.20 |
| 10 searches × 200 jobs | 2,000 | $4.00 |
| 5 searches × 100 jobs, daily | 500/day | $1.00/day |

Apify's free plan includes $5 of monthly credit, which covers roughly 2,500 jobs.

### Tips

- Broad searches match tens of thousands of jobs. The log shows the total for each search, so you can decide how deep to go with `max_results_per_search`.
- Results arrive 30 at a time, so a limit of 100 fetches four batches and stops at 100.
- To spot new postings, run the same searches on a schedule and compare the `listing_id` sets.
- To narrow a search, change the job title or location on Glassdoor, since those are the parts of the link the Actor uses.

### FAQ, disclaimers and support

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

**Does it work outside the US?** Yes. The country site comes from the link, so any Glassdoor domain works, and you can mix them in one run.

**Does it get the full job description?** No. You get the short excerpt Glassdoor shows in search results. Follow `url` for the full ad.

**Can I get company reviews or interview questions?** Not with this Actor, which covers job searches. Each job does include the employer's overall rating.

**What happens to a link that gives no jobs?** Nothing is added to your dataset, so you aren't charged for it. It's listed with a reason in the `FAILED_INPUTS` record of the run's key-value store, and the run's status message gives the counts. A run fails only if Glassdoor refused every search in it.

**Is scraping Glassdoor legal?** This Actor collects only publicly visible job ads and no personal data. Glassdoor's terms of use restrict automated collection, though, and you are responsible for how you use the data and for following those terms and the laws that apply to you. If you're unsure, take legal advice, especially before republishing the data.

Found a problem or want a field added? Open an issue on the Actor's **Issues** tab. If you need a custom scraper or a different data shape, ask there too.

# Actor input Schema

## `search_urls` (type: `array`):

Search on Glassdoor with whatever job title and location you want, then copy the address bar and paste it here — one per line. The country site is taken from the link too, so you can mix glassdoor.com, glassdoor.co.uk, glassdoor.co.in and the rest in one run. Only the job title, location and country site are read from the link; extra filters such as date posted or salary are not applied.

## `max_results_per_search` (type: `integer`):

Stops after exactly this many jobs for each search.

## `exclude_sponsored` (type: `boolean`):

Drop paid placements and keep only organic results. Useful when you want a true picture of what is being advertised.

## `proxy_configuration` (type: `object`):

Residential addresses are recommended. Glassdoor serves results far more reliably to them.

## Actor input object example

```json
{
  "search_urls": [
    "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
    "https://www.glassdoor.com/Job/new-york-city-data-scientist-jobs-SRCH_IL.0,13_IC1132348_KO14,28.htm"
  ],
  "max_results_per_search": 100,
  "exclude_sponsored": false,
  "proxy_configuration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "search_urls": [
        "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
        "https://www.glassdoor.com/Job/new-york-city-data-scientist-jobs-SRCH_IL.0,13_IC1132348_KO14,28.htm"
    ],
    "max_results_per_search": 100,
    "proxy_configuration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/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 = {
    "search_urls": [
        "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
        "https://www.glassdoor.com/Job/new-york-city-data-scientist-jobs-SRCH_IL.0,13_IC1132348_KO14,28.htm",
    ],
    "max_results_per_search": 100,
    "proxy_configuration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "search_urls": [
    "https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm",
    "https://www.glassdoor.com/Job/new-york-city-data-scientist-jobs-SRCH_IL.0,13_IC1132348_KO14,28.htm"
  ],
  "max_results_per_search": 100,
  "proxy_configuration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mina_safwat/glassdoor-jobs-scraper --silent --output-dataset

```

## MCP server setup

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