# Glassdoor Job Search Scraper (`apt_marble/glassdoor-job-search-scraper`) Actor

Search Glassdoor jobs by keyword and location and export title, employer, location, salary estimate, rating and direct link for every listing. Filters for date and radius, location scoping by city name or Glassdoor location ID.

- **URL**: https://apify.com/apt\_marble/glassdoor-job-search-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.60 / 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?

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

## Glassdoor Job Search Scraper

Search Glassdoor jobs by keyword and location and export title, employer, location, salary estimate, rating and direct link for every listing. Filters for date and radius, location scoping by city name or Glassdoor location ID.

Built for recruiters, sourcing teams, job seekers and market analysts who need Glassdoor inventory as structured rows. Runs without a Glassdoor or Indeed account and returns clean, structured rows you can send straight to a spreadsheet, database or downstream model.

### What you can do with it

- **Build a hiring pipeline fast.** Search by the same words a job seeker would and get every listing Indeed or Glassdoor shows.
- **Keep records fresh.** Re-run on a schedule and diff titles, salaries and descriptions to spot new openings or closed postings.
- **Enrich what you have.** Turn a list of job URLs or company pages into the full structured record without re-searching.
- **Research a market.** Pull reviews and salaries by role or employer and compare markets by location.
- **Feed LLMs and analytics.** Job text, ratings and pay figures arrive as clean JSON — no HTML cleaning needed.
- **Stay in budget.** Launch with one term to preview, then scale to dozens; concurrency controls keep costs predictable.

### What you get

One row per job search. Abridged sample:

```json
{
  "title": "Software Engineer",
  "company": "Acme Corp",
  "location": "New York, NY",
  "salaryText": "$120,000 - $150,000 a year",
  "postedAtText": "Posted 2 days ago",
  "snippet": "Build scalable services in TypeScript and Go...",
  "url": "https://www.indeed.com/viewjob?jk=abc123...",
  "searchQuery": "software engineer",
  "position": 1,
  "rating": 4.2,
  "jobKey": "abc123def4567890",
  "country": "us",
  "scrapedAt": "2026-08-31T00:00:00.000Z"
}
```

### Input reference

| Setting | Type | Default | Description |
| --- | --- | --- | --- |
| Search terms | list of text | — (required) | Keywords to search for. |
| Location | text | — | City or region. Known cities resolve automatically. |
| Location ID | integer | — | Glassdoor numeric location ID (e.g. 1132348 for New York, NY). Takes precedence over Location text. |
| Location scope | select | `C` | City, country or state interpretation of the location ID. |
| Country | select | `us` | Which Glassdoor market. |
| Date posted | select | any time | Window to include. |
| Radius | integer | `25` | Distance from the location. |
| Maximum per term | integer | `100` | Stop after this many jobs per term. |
| Parallel searches | integer | `3` | How many terms at once. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `title` | string | Job title. |
| `company` / `employer` | string | Hiring company. |
| `location` | string | Posting location. |
| `salaryText` / `salaryEstimate` | string | Salary snippet or estimated range. |
| `url` | string | Direct link to the posting. |
| `searchQuery` | string | Which search term found it. |
| `position` | integer | Ranking for that term. |
| `postedAtText` | string | Human posting time. |
| `rating` | number | Employer rating. |
| `scrapedAt` | string | When the row was collected. |

### Tips & limits

- Runs without a login. The actor reads the same data a signed-out visitor sees.
- Results reflect what the site makes public — private or expired postings do not appear.
- Counts (total jobs, total reviews) are estimated and can shift as the site updates.
- Very high `maxItemsPerQuery` simply returns everything the site exposes for that term; most searches top out in the low hundreds.
- Use `Country` to keep salary and location semantics consistent with the market you care about.
- If a company name is ambiguous, prefer the full `…/cmp/…` or `…/Overview/…-E…` URL so the right entity is read.

### Pricing

Pay only for what you keep. The single event is one dataset row. See the Store pricing table for current rates and an example run cost.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search Glassdoor for. Each term is searched separately.

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

City or region. Leave empty to search everywhere. Examples: 'New York, NY', 'London'. Known cities resolve automatically; anything else is resolved with one extra request when possible.

## `locationId` (type: `integer`):

Glassdoor numeric location ID. Takes precedence over Location text. Example: 1132348 for New York, NY, 2671300 for London.

## `locationType` (type: `string`):

How to interpret the location ID.

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

Which Glassdoor market to search.

## `fromAge` (type: `string`):

Keep only jobs posted within this window. Applied to each job's posting age while paging; deeper pages are fetched automatically until the requested count is reached.

## `radius` (type: `integer`):

Distance from the location in the site default unit.

## `maxItemsPerQuery` (type: `integer`):

Stop after this many jobs for each term.

## `maxConcurrency` (type: `integer`):

How many terms to run at the same time.

## Actor input object example

```json
{
  "queries": [
    "software engineer",
    "product manager"
  ],
  "location": "New York, NY",
  "locationType": "C",
  "country": "us",
  "fromAge": "",
  "radius": 25,
  "maxItemsPerQuery": 100,
  "maxConcurrency": 3
}
```

# 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 = {
    "queries": [
        "software engineer",
        "product manager"
    ],
    "location": "New York, NY",
    "locationType": "C",
    "country": "us",
    "fromAge": "",
    "radius": 25,
    "maxItemsPerQuery": 100,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/glassdoor-job-search-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 = {
    "queries": [
        "software engineer",
        "product manager",
    ],
    "location": "New York, NY",
    "locationType": "C",
    "country": "us",
    "fromAge": "",
    "radius": 25,
    "maxItemsPerQuery": 100,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/glassdoor-job-search-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 '{
  "queries": [
    "software engineer",
    "product manager"
  ],
  "location": "New York, NY",
  "locationType": "C",
  "country": "us",
  "fromAge": "",
  "radius": 25,
  "maxItemsPerQuery": 100,
  "maxConcurrency": 3
}' |
apify call apt_marble/glassdoor-job-search-scraper --silent --output-dataset

```

## MCP server setup

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