# Indeed Scraper: Jobs, Salaries, Company Ratings (`dltik/indeed-scraper`) Actor

Scrape Indeed jobs by keyword and location: title, company, salary range, company rating & review count, remote flag, job type, posting date and apply URL. US, UK, FR, DE, CA and more. No login, no API key.

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

## Pricing

from $5.00 / 1,000 job scrapeds

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

## Indeed Scraper — Jobs, Salaries & Company Ratings

![Indeed Scraper banner](https://api.apify.com/v2/key-value-stores/ZL1caVEv6xNCSOdJ8/records/banner.png)

> Scrape **Indeed** jobs by keyword, location or URL — with **salary ranges, company ratings and review counts** on every listing. No Indeed account, no API key. Works on Indeed US, UK, FR, DE, CA and 20+ country sites.

⭐ **Bookmark this actor** to keep it on top of your Apify dashboard.

### What is the Indeed Scraper?

The **Indeed Scraper** extracts structured job data from [Indeed](https://www.indeed.com) — the world's largest job site — without the official API or an Indeed login. Search by keyword and location (or paste Indeed search URLs) and get back every listing with title, company, location, **salary min/max**, **company rating + review count**, remote flag, job type, posting date and the apply URL.

Indeed sits behind Cloudflare and blocks plain HTTP scrapers; this actor clears the challenge with a stealth browser over residential proxies, so you get clean results out of the box. Built for recruiters, job-market researchers, lead-gen teams and salary-benchmarking.

### Use cases

- **Recruiting & sourcing** — pull fresh listings for a role across cities, with the hiring company and its rating.
- **Salary benchmarking** — collect the salary ranges Indeed extracts per title and location.
- **Job-market research** — track hiring volume, remote share and in-demand roles by keyword over time.
- **Lead generation** — build lists of companies actively hiring (hiring intent), filtered by location and role.
- **Competitive intel** — monitor which companies are hiring for which roles, and how long postings stay up.

### Input

Provide `queries` + `locations`, or paste full Indeed search URLs in `startUrls`. Indeed needs a **residential** proxy (Cloudflare blocks datacenter IPs) — the default proxy config handles it.

```json
{
  "queries": ["software engineer", "data analyst"],
  "locations": ["New York, NY", "Remote"],
  "country": "US",
  "maxResults": 100,
  "postedWithinDays": 7,
  "fetchDescription": false,
  "proxyConfig": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output

![Sample output — Indeed Scraper](https://api.apify.com/v2/key-value-stores/ZL1caVEv6xNCSOdJ8/records/output.png)

One clean record per job. The most useful fields:

```json
{
  "title": "Software Engineer (Remote)",
  "company": "Home Depot / THD",
  "location": "Atlanta, GA",
  "remote": true,
  "salary_min": 50000,
  "salary_max": 130000,
  "salary_period": "yearly",
  "company_rating": 3.7,
  "company_review_count": 70684,
  "job_types": ["Full-time"],
  "posted_relative": "3 days ago",
  "easy_apply": true,
  "url": "https://www.indeed.com/viewjob?jk=bb5f1972c0fb8768"
}
```

Turn on `fetchDescription` to also get the **full job description**, employment type, exact post date and full address from each job's detail page (best-effort — Indeed heavily rate-limits detail pages, so use it on small, targeted runs).

### Pricing

This actor uses **PAY\_PER\_EVENT**: **$0.005 per job** ($5 / 1,000) for the base result, and an opt-in **$0.01 per job** when `fetchDescription` enriches the full description. No charge for failed runs.

### Automate & schedule

Schedule this actor to run **daily** on your roles and cities to keep a live feed of new postings, and wire the dataset to Google Sheets, Slack, a webhook or your ATS/CRM via Apify integrations. Recurring runs keep your market data current — set it once and forget it.

### FAQ

**Is there an Indeed API, and is it free?** Indeed retired its public Publisher API for most use cases. This actor gives you the same job data — plus salary, rating and reviews — with zero account setup.

**Do I need an Indeed account?** No. The actor reads public search results; no login or API token.

**Why does it need a residential proxy?** Indeed is behind Cloudflare, which blocks datacenter IPs. A residential proxy (the default) clears it reliably.

**How many jobs can I get per keyword?** Indeed server-renders ~45 jobs per search page; the actor also sweeps recency windows and de-duplicates to pull more. Add several locations to widen coverage.

**Can I scrape a specific Indeed search URL?** Yes — paste it into `startUrls` and the actor scrapes it as-is.

***

⭐ **Found this useful? Bookmark it** — Apify ranks actors by bookmarks, so one click directly helps keep this scraper visible.

#### Related actors by dltik

- [France Travail Scraper](https://apify.com/dltik/francetravail-scraper) — 700K+ French jobs (Pôle Emploi)
- [HelloWork Scraper](https://apify.com/dltik/hellowork-scraper) — French job board
- [Welcome to the Jungle Scraper](https://apify.com/dltik/welcome-to-the-jungle-scraper) — WTJ tech jobs + salaries

# Actor input Schema

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

Job titles or keywords to search on Indeed, e.g. \["software engineer", "registered nurse"]. Each keyword is searched in every location.

## `locations` (type: `array`):

Cities/states to search, e.g. \["New York, NY", "Remote"]. Leave empty for the whole country. Add several to pull more jobs (each keyword x location returns its own page of results).

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

Paste full Indeed search URLs (e.g. https://www.indeed.com/jobs?q=nurse\&l=Texas) to scrape them directly. Overrides keywords/locations when set.

## `fetchDescription` (type: `boolean`):

Visit each job's detail page to add the full description + structured fields (employment type, exact post date, full address). Best-effort: Indeed heavily rate-limits its detail pages, so this reliably enriches a small targeted set per run (use low maxResults). Billed per enriched job.

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

Indeed country site to use: US, UK, CA, FR, DE, ES, IT, NL, IE, AU, IN, BR, MX, JP and more.

## `maxResults` (type: `integer`):

How many jobs to return for each keyword/location pair. One Indeed page holds ~45; above that the actor sweeps recency windows and de-duplicates to pull more.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days (Indeed 'fromage'): 1, 3, 7, 14. Leave empty for all.

## `radiusKm` (type: `integer`):

Distance around the location to include (Indeed radius). Default 25.

## `sortByDate` (type: `boolean`):

Sort newest-first instead of Indeed's relevance ranking.

## `proxyConfig` (type: `object`):

Indeed is behind Cloudflare and blocks datacenter IPs, so a RESIDENTIAL proxy is required. Keep the default unless you bring your own.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "Remote"
  ],
  "startUrls": [],
  "fetchDescription": false,
  "country": "US",
  "maxResults": 50,
  "radiusKm": 25,
  "sortByDate": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of Indeed jobs (title, company, location, salary, rating, reviews, remote, job type, URL).

# 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"
    ],
    "locations": [
        "Remote"
    ],
    "startUrls": [],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/indeed-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"],
    "locations": ["Remote"],
    "startUrls": [],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("dltik/indeed-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"
  ],
  "locations": [
    "Remote"
  ],
  "startUrls": [],
  "country": "US"
}' |
apify call dltik/indeed-scraper --silent --output-dataset

```

## MCP server setup

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