# Indeed Jobs Scraper (`webdata_labs/indeed-jobs-scraper`) Actor

\[💵 $2.50 / 1K - no start fee] Search Indeed jobs across 18 countries. Get titles, companies, salaries, full descriptions, remote status, structured salary fields and monitoring-ready job IDs.

- **URL**: https://apify.com/webdata\_labs/indeed-jobs-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (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 $1.40 / 1,000 indeed job delivereds

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/platform/actors/running/actors-in-store#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 Jobs Scraper | Jobs, Salaries and Full Descriptions

**Search Indeed across 18 country sites and receive normalized job rows with salary fields, full descriptions, remote status, stable job IDs, and company links.** This Indeed scraper is built for repeatable exports and monitoring, not one-off browser copy and paste. Run it in Apify Console, through the API, on a schedule, or from an automation.

### ✅ What you get / ❌ What this isn't

✅ One structured dataset row per public Indeed job listing\
✅ Search by keyword, location, job type, posting age, or Indeed search URL\
✅ Full plain-text and HTML descriptions when requested\
✅ Numeric salary minimum, maximum, currency, and period when Indeed publishes structured pay\
✅ `onlyNew` monitoring mode that remembers job IDs for each search\
✅ 18 Indeed country domains and a low-cost HTTP architecture

❌ This is not an official Indeed API or an Indeed partnership\
❌ It does not apply to jobs, access accounts, solve CAPTCHAs, or collect private candidate data\
❌ Missing salary or employer metadata is not invented when Indeed does not publish it

### 🔎 Why use this Indeed scraper

- **Recruiting intelligence:** monitor roles, locations, skills, and hiring companies.
- **Salary research:** compare published ranges using analysis-ready numeric fields.
- **Job alerts:** schedule `onlyNew: true` and send fresh rows to Sheets, Slack, Make, Zapier, or a webhook.
- **Labor-market research:** export reproducible JSON, CSV, Excel, XML, or HTML datasets.
- **Lead signals:** identify companies actively hiring without mixing them with stale job IDs.

### 📊 What Indeed job data you get

| Field                            | Type    | Description                                  |
| -------------------------------- | ------- | -------------------------------------------- |
| `jobId`                          | string  | Stable Indeed job key used for deduplication |
| `title`                          | string  | Published job title                          |
| `company`                        | string  | Hiring company name                          |
| `location`                       | string  | Published location or remote label           |
| `salary`                         | string  | Human-readable published salary              |
| `salaryMin`, `salaryMax`         | number  | Structured pay range when available          |
| `salaryCurrency`, `salaryPeriod` | string  | Currency and hour, month, or year period     |
| `jobType`                        | array   | Employment types published by Indeed         |
| `datePosted`                     | date    | Posting date when available                  |
| `description`                    | string  | Clean full job description                   |
| `descriptionHtml`                | string  | Original description HTML                    |
| `jobUrl`                         | URL     | Canonical Indeed detail URL                  |
| `isRemote`                       | boolean | Remote-work indicator                        |
| `companyUrl`, `companyLogo`      | URL     | Public company metadata when available       |
| `scrapedAt`                      | date    | Extraction timestamp                         |

### 👥 Who it's for

Recruiters, staffing agencies, job seekers, compensation analysts, sales teams, academic researchers, workforce planners, and developers building job-search or hiring-intelligence workflows.

### ⚙️ How to scrape Indeed jobs

1. Open the Actor in Apify Console.
2. Enter a job title, skill, or company in `query`.
3. Add a location and choose the matching Indeed country.
4. Optionally filter by job type or posting age.
5. Keep `includeDescription` on for full descriptions, or turn it off for smaller summary rows.
6. Set a cost-safe `maxItems` value and click **Start**.
7. Download the dataset or connect it to an API, schedule, integration, or webhook.

For an existing Indeed search, supply its search-results URL in `urls` instead of query fields.

### 📥 Input

```json
{
    "query": "software engineer",
    "location": "Austin, TX",
    "country": "US",
    "jobType": "fulltime",
    "datePosted": "7",
    "maxItems": 100,
    "includeDescription": true,
    "onlyNew": false
}
```

| Field                | Type    |   Default | Description                                              |
| -------------------- | ------- | --------: | -------------------------------------------------------- |
| `query`              | string  | prefilled | Job title, keywords, or company                          |
| `location`           | string  | prefilled | City, region, postal code, or Remote                     |
| `country`            | enum    |      `US` | One of 18 Indeed country sites                           |
| `jobType`            | enum    |     empty | Full-time, part-time, contract, temporary, or internship |
| `datePosted`         | enum    |     empty | Last 1, 3, 7, or 14 days                                 |
| `urls`               | array   |     empty | Indeed search-result URLs                                |
| `includeDescription` | boolean |    `true` | Include full plain-text and HTML descriptions            |
| `onlyNew`            | boolean |   `false` | Skip job IDs emitted by previous matching runs           |
| `maxItems`           | integer |      `50` | Result cap; `0` means unlimited                          |

### 📤 Output

```json
{
    "jobId": "abc123",
    "title": "Senior Software Engineer",
    "company": "Example Company",
    "location": "Austin, TX",
    "salary": "USD 140000 - 180000 / year",
    "salaryMin": 140000,
    "salaryMax": 180000,
    "salaryCurrency": "USD",
    "salaryPeriod": "YEAR",
    "jobType": ["FULL_TIME"],
    "datePosted": "2026-08-01T00:00:00.000Z",
    "description": "Build reliable software products...",
    "jobUrl": "https://www.indeed.com/viewjob?jk=abc123",
    "isRemote": false,
    "sourceDomain": "www.indeed.com",
    "scrapedAt": "2026-08-08T10:00:00.000Z"
}
```

The Output tab includes separate **Jobs**, **Salary data**, and **Full descriptions** views. You can download the dataset in JSON, CSV, Excel, XML, or HTML formats.

### 💵 How much does it cost to scrape Indeed?

The Store price is **$2.50 per 1,000 delivered jobs on the Free tier, with no Actor-start fee**. A 100-row run costs about $0.25. Higher Apify plans receive volume discounts. You pay only for delivered rows, while Apify platform usage and residential proxy traffic are included in the event price.

Keep `maxItems` near the number you need. Turn off `includeDescription` when search-card summaries are sufficient, which reduces requests and run time without changing the per-row event.

### 🔁 Run it on the Apify platform

Start from one of the ready-made tasks, add a daily or weekly Schedule, consume results with the JavaScript or Python client, connect Make or Zapier, or receive a webhook when a run finishes. `onlyNew` is designed for recurring monitors and stores history separately for each search and filter combination.

- [Software engineer jobs in Austin](https://apify.com/webdata_labs/indeed-jobs-scraper/examples/indeed-software-jobs-austin)
- [Remote Python jobs from the last 7 days](https://apify.com/webdata_labs/indeed-jobs-scraper/examples/indeed-remote-python-jobs)
- [Monitor new London data jobs](https://apify.com/webdata_labs/indeed-jobs-scraper/examples/indeed-monitor-london-data-jobs)

### ⚠️ Limits and caveats

- Indeed can rate-limit automated requests. The Actor uses a lightweight job-data API request through Apify residential proxy traffic and fails clearly when the source is unavailable.
- Salary, industry, company size, revenue, and logos are optional source fields. Missing values remain `null`.
- Search ranking and result availability vary by country, location, time, and Indeed experiments.
- Data collection must remain proportionate. Avoid unlimited runs unless you have verified the target volume and cost.

### 🧩 Related Actors

- [ATS Jobs Scraper](https://apify.com/webdata_labs/greenhouse-lever-ashby-jobs-scraper) for company career boards across Workday, Greenhouse, Lever, Ashby, and more.
- [We Work Remotely Jobs Scraper](https://apify.com/webdata_labs/weworkremotely-jobs-scraper) for remote-first vacancies with published eligibility regions.
- [Website Contact Extractor](https://apify.com/webdata_labs/website-contact-extractor) for approved public-company contact enrichment after job discovery.

### ❓ FAQ

#### Is this an official Indeed API?

No. It is an independent scraper for public listing pages and provides an API-shaped dataset through Apify.

#### Can it monitor only newly posted jobs?

Yes. Save an Apify Task with `onlyNew: true` and run it on a schedule. The first run returns matching jobs; later runs skip IDs already emitted for that same configuration.

#### Why is a salary field null?

Many employers do not publish compensation. The Actor returns structured pay only when the source provides it and does not manufacture estimates.

#### Is scraping Indeed legal?

Use this Actor only for lawful purposes and public data you are permitted to process. Follow Indeed's terms, Apify's terms, applicable privacy and data-protection law, and the rules governing your organization and location. Job descriptions can contain personal data, so establish a lawful purpose and retention policy before processing at scale. Consult qualified counsel when unsure.

### 🛠️ Support

When reporting a problem, include the Apify run URL, redacted input, affected Indeed country, expected behavior, and one example public URL. Use the Actor's Issues tab so failures can be reproduced without exposing credentials.

# Actor input Schema

## `query` (type: `string`):

Search phrase such as software engineer, data analyst, registered nurse, or a company name. Required unless URLs are supplied.

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

City, region, postal code, or Remote. Leave empty for country-wide results.

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

Country-specific Indeed site used for the search.

## `jobType` (type: `string`):

Optional Indeed employment-type filter.

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

Optional maximum age of listings in days.

## `urls` (type: `array`):

Optional Indeed search-result URLs. Their q and l parameters replace the query-based search.

## `includeDescription` (type: `boolean`):

Include full plain-text and HTML descriptions plus structured employer and salary fields.

## `onlyNew` (type: `boolean`):

For scheduled monitoring, return only job IDs not emitted by earlier runs with the same search and filter combination.

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

Maximum jobs returned. The low default protects first-run cost. Set 0 for unlimited.

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

Reserved for compatibility. The Actor uses Indeed's job API and does not normally consume proxy traffic.

## Actor input object example

```json
{
  "query": "data analyst",
  "location": "London",
  "country": "US",
  "urls": [
    {
      "url": "https://www.indeed.com/jobs?q=python+developer&l=Austin%2C+TX"
    }
  ],
  "includeDescription": true,
  "onlyNew": false,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

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

No description

## `descriptions` (type: `string`):

No description

## `runSummary` (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 = {
    "query": "software engineer",
    "location": "Austin, TX",
    "country": "US",
    "includeDescription": true,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/indeed-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 = {
    "query": "software engineer",
    "location": "Austin, TX",
    "country": "US",
    "includeDescription": True,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/indeed-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 '{
  "query": "software engineer",
  "location": "Austin, TX",
  "country": "US",
  "includeDescription": true,
  "maxItems": 10
}' |
apify call webdata_labs/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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