# Indeed Salaries Universal Scraper (`scrapifier/indeed-salaries-universal-scraper`) Actor

💰 Scrape Indeed salaries of any company by name or URL: one clean row per job title with the median salary, currency & period, number of salary reports, job category and the detail-page link. Works on 20 Indeed country sites. No login, pay per result.

- **URL**: https://apify.com/scrapifier/indeed-salaries-universal-scraper.md
- **Developed by:** [Scrapifier](https://apify.com/scrapifier) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.04 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Indeed Salaries Scraper

Scrape salary data of any company from Indeed by company name or by pasting its Indeed company-page URL, and export it as JSON, CSV or Excel, or pull it straight from the API.

⚡ One clean row per job title: the **median salary with its currency and period** (yearly, monthly, hourly), the **number of salary reports** behind it, the **job category** (Sales, Software Development, Management...) and the link to the title's detailed salary page. Works on **20 Indeed country sites**, with **no login and no cookies**: Apify's built-in proxy is used automatically. You **pay per row**.

[![Apify Actor](https://apify.com/actor-badge?actor=scrapifier/indeed-salaries-universal-scraper)](https://apify.com/scrapifier/indeed-salaries-universal-scraper)

### 🎯 Why scrape Indeed salaries?

- **Salary benchmarking**: what does a company actually pay per role, according to its own employees? One run gives you the whole pay table.
- **Compensation planning**: compare your salary bands against competitors, role by role, with the number of reports as a confidence signal.
- **Recruiting and offers**: know the median for the role before making or negotiating an offer.
- **Market research**: Indeed's salary base skews to frontline and hourly roles, a population Glassdoor covers less. Combine both for full coverage.
- **Due diligence**: labor cost structure of a target company, by category and role.

### 📊 What data does Indeed Salaries Scraper extract?

| Field | Description |
|---|---|
| `company`, `companySlug` | Company name and its Indeed page slug |
| `category` | Job category (Sales, Software Development, Management...) |
| `jobTitle`, `normalizedJobTitle` | The job title, as displayed and normalized by Indeed |
| `medianSalary` | Median salary as a number |
| `medianSalaryText` | Median salary as displayed, with currency (`$164,448`) |
| `salaryPeriod` | `YEARLY`, `MONTHLY`, `HOURLY`... |
| `reportedSalaryCount` | Number of salary reports behind the median |
| `url` | The title's detailed salary page on Indeed |
| `matchedInput` | The company name or URL that produced this row |

Every field is a flat column, so CSV and Excel exports need no post-processing.

### 🚀 How to scrape Indeed salaries

1. Type one or more **Company names** as they appear on Indeed (`Google`, `Walmart`), or paste **Indeed company URLs** (any `/cmp/...` page, from any country domain).
2. Optionally cap **Max job titles per company**.
3. Click **Start**. The Actor collects the overview table, then each job-category page (`?job_category=`).
4. Open the **Storage** tab to preview the rows and export them as JSON, CSV, Excel or XML, or read them from the dataset API.

The same run can be started from the Apify API, the Python or JavaScript client, or put on a schedule for quarterly benchmarks.

### 📥 Input parameters

| Field | Key | Type | Default | Description |
|---|---|---|---|---|
| Company names | `companyNames` | array of strings | `["Google", "Walmart"]` (prefill) | Company names as on Indeed; spaces are fine, Indeed's own redirect finds the right page. |
| Indeed company URLs | `startUrls` | array of URLs | none | Any Indeed company page (`/cmp/Google`, `/cmp/Google/salaries`), from any country domain. |
| Max job titles per company | `maxTitlesPerCompany` | integer | `0` | `0` = every title Indeed shows on the company's salaries page. |
| Indeed country site | `country` | select | `www` | Domain used for company names, one of 20 (pasted URLs keep their own domain). Sets market and currency. |
| Flatten output | `flatten` | boolean | `false` | Output is already flat; reserved for future nested fields. |
| Report input status | `emitInputStatus` | boolean | `true` | Write an `input_status` report to the run's OUTPUT record. |
| Max retries | `maxChallengeRetries` | integer | `3` | How many times to retry a page before giving up. |
| Proxy configuration | `proxyConfiguration` | object | Apify Proxy on | Keep Apify Proxy on. A residential proxy gives the most reliable runs. |

Example input:

```json
{
  "companyNames": ["Google", "Walmart"]
}
```

### 📤 Output example

Each job title is one dataset item, exportable as JSON, CSV, Excel or via the API.

```json
{
  "company": "Google",
  "companySlug": "Google",
  "category": "Sales",
  "jobTitle": "Account Manager",
  "normalizedJobTitle": "account manager",
  "medianSalary": 122797.0,
  "medianSalaryText": "$122,797",
  "salaryPeriod": "YEARLY",
  "reportedSalaryCount": 8,
  "url": "https://www.indeed.com/cmp/Google/salaries/Account-Manager",
  "matchedInput": "Google"
}
```

The run's OUTPUT record also holds the statistics and, per company, an `input_status` entry with the rows collected and the status (`ok`, `empty_or_not_found`, `error`).

### 💡 Ready-to-run examples

**Two companies' full pay tables (tested)**

```json
{ "companyNames": ["Google", "Bustle Digital Group"] }
```

**Retail giants compared**

```json
{ "companyNames": ["Walmart", "Target", "Costco Wholesale"] }
```

**From a company URL**

```json
{ "startUrls": [{ "url": "https://www.indeed.com/cmp/Amazon.com/salaries" }] }
```

**Quarterly benchmark**: schedule the Actor with your company and its competitors in `companyNames` and chart `medianSalary` per `normalizedJobTitle` over time.

### 💰 Pricing: how much does it cost to scrape Indeed salaries?

From **$3.00 per 1,000 rows** on the free plan, with automatic volume discounts down to **$2.04 per 1,000** on higher Apify plans. You pay only for the results you receive, there is no subscription and no start fee. New Apify accounts get free monthly platform credits to try it.

One company usually yields between 20 and a few hundred rows, so a full benchmark of a dozen competitors costs a few cents.

### ⚙️ Performance, proxies and limits

- **Proxy**: keep the default Apify Proxy setting. A residential proxy gives the most reliable runs.
- **First page**: the first page of a run can take up to a minute; the rest are fast.
- **Coverage**: the overview page is only a preview (~20–30 titles). The Actor then fetches every `job_category` page Indeed links, so large employers return far more rows. Titles with very few reports may still be missing.
- **Company names**: resolved through Indeed's own company search, then the `/cmp/{slug}/salaries` page. If a name misses, paste the company URL instead.
- **Blocked runs**: if a run ends without results after all retries, try again later or raise `maxChallengeRetries`.

### 🔌 Integrations and API

Run Indeed Salaries Scraper from the [Apify API](https://docs.apify.com/api/v2), the [Python](https://docs.apify.com/api/client/python) or [JavaScript](https://docs.apify.com/api/client/js) client, or on a [schedule](https://docs.apify.com/platform/schedules). Connect it to Make, Zapier, n8n, Google Sheets, Slack or any webhook through [Apify integrations](https://apify.com/integrations). Every run's dataset is available as JSON, CSV, Excel or XML from the dataset API.

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapifier~indeed-salaries-universal-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{ "companyNames": ["Google"] }'
```

### ❓ FAQ

**Is it legal to scrape Indeed salary data?**

The Actor only reads salary aggregates that Indeed publishes to anyone without logging in. They are statistics, not individual salaries, but still respect Indeed's terms of use and stay responsible for how you use the data. This is not legal advice.

**Do I need an Indeed account, login or cookies?**

No. Nothing to log in to, no cookies to paste, and the default proxy setting just works.

**Can I export Indeed salaries to Excel or Google Sheets?**

Yes. Every run's dataset downloads as CSV, XLSX, JSON or XML from the Storage tab, and the Google Sheets integration can push rows to a sheet automatically. Every field is already a flat column.

**Where do the figures come from?**

They are Indeed's own medians, computed from salaries reported by employees and job postings. The `reportedSalaryCount` column tells you how many reports back each median.

**How many rows does one company return?**

The job titles Indeed lists on the company's salaries pages (overview + each category), typically dozens to a few hundred depending on company size.

**Does it work outside the US?**

Yes. Pick one of the 20 Indeed domains in `country` or paste a company URL from any of them; currency and figures follow that market.

**How is this different from Glassdoor salaries?**

Different reporting population (Indeed skews to frontline and hourly roles) and different structure: Indeed gives one median per title, while Glassdoor gives ranges and percentiles. The sibling Glassdoor Salaries Scraper below covers the latter.

### 🔗 Related scrapers

- [Indeed Jobs Scraper](https://apify.com/scrapifier/indeed-jobs-universal-scraper): job listings from any Indeed country site, with salaries and full descriptions.
- [Indeed Company Reviews Scraper](https://apify.com/scrapifier/indeed-reviews-universal-scraper): employee reviews with ratings, pros and cons.
- [Glassdoor Salaries Scraper](https://apify.com/scrapifier/glassdoor-salaries-universal-scraper): salary ranges and percentiles per job title and company.
- [Glassdoor Company Overview Scraper](https://apify.com/scrapifier/glassdoor-company-overview-universal-scraper): the full company profile by name or URL.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/scrapifier/welcome-to-the-jungle-scraper): jobs and company profiles, France and Europe.

### 💬 Support

Questions, bugs or a feature request? Open an issue in the **Issues** tab of this Actor, I answer quickly. If Indeed Salaries Scraper saves you time, a rating on the Store helps others find it.

# Actor input Schema

## `companyNames` (type: `array`):

Company names as they appear on Indeed ("Google", "General Motors"). Spaces are fine, Indeed's own redirect finds the right company page.

## `startUrls` (type: `array`):

Any Indeed company page (e.g. https://www.indeed.com/cmp/Google or .../cmp/Google/salaries), from any Indeed country domain.

## `maxTitlesPerCompany` (type: `integer`):

Cap on the number of job-title rows per company (0 = every title Indeed shows on the company's salaries page).

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

Which Indeed domain to use for company names (pasted URLs keep their own domain). It sets the market and currency.

## `flatten` (type: `boolean`):

Already flat: every field is a simple column. Reserved for future nested fields.

## `emitInputStatus` (type: `boolean`):

Write an input\_status report to the run's OUTPUT record (rows collected per company, and why one returned nothing).

## `maxChallengeRetries` (type: `integer`):

How many times to retry a page before giving up.

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

Keep Apify Proxy on. A residential proxy gives the most reliable runs.

## Actor input object example

```json
{
  "companyNames": [
    "Google",
    "Walmart"
  ],
  "maxTitlesPerCompany": 0,
  "country": "www",
  "flatten": false,
  "emitInputStatus": true,
  "maxChallengeRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `salaries` (type: `string`):

All job-title salary rows extracted by this run.

# 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 = {
    "companyNames": [
        "Google",
        "Walmart"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapifier/indeed-salaries-universal-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 = {
    "companyNames": [
        "Google",
        "Walmart",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapifier/indeed-salaries-universal-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 '{
  "companyNames": [
    "Google",
    "Walmart"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapifier/indeed-salaries-universal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapifier/indeed-salaries-universal-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/scTCGNv2fOXoHJ3YZ/builds/xtg1BBQ50JWdPeePm/openapi.json
