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

Scrape job postings from 13 Indeed country sites - titles, employers with rating and review count, locations, salary where published, remote flag. No recruiter or applicant data, ever.

- **URL**: https://apify.com/lowlanddata/indeed-scraper.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** Jobs, MCP servers, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.70 / 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 Jobs Scraper — job postings from 13 Indeed sites as clean JSON

Extract job postings from Indeed — titles, employers, locations, posting dates, salary when published, employment types and remote flags — as flat JSON rows for recruiting pipelines, market research and job boards. Search any role in any country Indeed runs, with a radius, a posted-since window and newest-first sorting.

**Live health record:** [lowlanddata.com/status/indeed-scraper](https://lowlanddata.com/status/indeed-scraper/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/indeed-scraper/).

**No personal data, ever.** Employers appear as what they are — companies, with their public Indeed rating and review count. Recruiter contact persons, hiring-manager names and applicant anything are never extracted: there is no field for them and there never will be. One honest edge: the posting's own summary text is reproduced as the employer wrote it, so an ad that names a contact person in its own prose carries that text as published.

### Quick start (30 seconds)

1. Type a role into **what** (`data engineer`, `nurse`, `warehouse`).
2. Pick a **country** and optionally a **where** (city, region or postal code).
3. Click **Start**, then open the dataset's **Overview** tab or **Export** as CSV/Excel/JSON.

Optional: a search **radius**, **posted within N days**, **remote only**, and **newest first**. Everything works on a daily Schedule.

### What you can build with it

- **A hiring radar.** Schedule daily with `postedWithinDays: 1` — every new posting for your role and city lands each morning, before it circulates.
- **Competitor hiring watch.** Filter rows by `companyName`; a competitor opening five data roles is telling you their roadmap out loud.
- **Salary research.** `salaryMin`/`salaryMax`/`salaryPeriod` wherever the employer publishes a band, plus the raw `salaryText` exactly as printed.
- **Job boards and newsletters.** Clean rows with employer, location, remote flag and a tracking-free link — ready to republish as your niche board.

### What you get

One JSON object per posting:

```json
{
  "jobId": "a9bd9c57774e3bc4",
  "title": "Full Stack Engineer Python React (m/w/d)",
  "url": "https://de.indeed.com/viewjob?jk=a9bd9c57774e3bc4",
  "companyName": "Tech Punk GmbH",
  "companyRating": 4.1,
  "companyReviewCount": 128,
  "location": "10969 Berlin",
  "city": "Berlin",
  "region": "BE",
  "postCode": "10969",
  "isRemote": false,
  "datePosted": "2026-01-15T06:00:00.000Z",
  "postedLabel": "vor 30+ Tagen",
  "jobTypes": ["Vollzeit", "Festanstellung"],
  "snippet": "Wir bieten Python und React",
  "salaryText": "100.000 € pro Jahr",
  "salaryMin": 100000,
  "salaryMax": 100000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "YEARLY",
  "isSponsored": true
}
```

Links come back without Indeed's tracking parameters, so they stay stable and shareable.

### How much does it cost?

Pay per job row plus a small start fee — no subscription. A daily 100-job radar costs cents per day. Free-plan users can try it capped at 5 jobs. Platform usage is billed by Apify; Indeed needs the unblocker to get through at all, so runs cost a little more than a plain HTML site.

### Not technical? Let your AI assistant set it up

```
I want to use the Indeed Jobs Scraper (lowlanddata/indeed-scraper) on Apify.

What I want: [E.G. "all new nursing jobs within 25km of Manchester, posted this week"]

Guide me to:
1. Propose input values: what, country, where, radiusKm,
   postedWithinDays, remoteOnly, sortByDate and maxItems.
2. Explain how to run it in the Apify Console and export CSV.
3. Suggest a daily Schedule setup for a morning hiring radar.
```

### Input reference

| Field                | Type    | Default             | Notes                                                                       |
| -------------------- | ------- | ------------------- | --------------------------------------------------------------------------- |
| `what`               | string  | `software engineer` | Role or keyword, as you would type it on Indeed.                            |
| `where`              | string  | —                   | City, region or postal code; empty searches the whole country.              |
| `country`            | string  | `us`                | One of 13 Indeed sites: us, uk, ie, ca, de, at, ch, fr, be, nl, es, it, pl. |
| `radiusKm`           | integer | —                   | Radius around the location (1-100). Ignored without `where`.                |
| `postedWithinDays`   | integer | —                   | Only postings from the last N days (1-30).                                  |
| `remoteOnly`         | boolean | `false`             | Only postings Indeed flags as remote.                                       |
| `sortByDate`         | boolean | `false`             | Newest first instead of Indeed's relevance ranking.                         |
| `maxItems`           | integer | `200`               | Stop after this many jobs.                                                  |
| `proxyConfiguration` | object  | residential         | Indeed refuses repeated requests from one address — keep this as it is.     |

### Scheduling and API use

```bash
curl -X POST "https://api.apify.com/v2/acts/lowlanddata~indeed-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"what": "data engineer", "where": "Berlin", "country": "de", "postedWithinDays": 7, "maxItems": 100}'
```

### Use it with AI agents (MCP)

Run it directly from Claude, Cursor and other MCP clients: [apify.com/lowlanddata/indeed-scraper/api/mcp](https://apify.com/lowlanddata/indeed-scraper/api/mcp).

### Is it legal to scrape job postings?

Job postings are published to be found — employers pay to distribute them. This actor reads only public search pages, takes no applicant or recruiter personal data, and identifies employers only by their public business identity. Factual posting data is exactly what the postings exist to communicate. How you use it downstream is yours to assess.

### FAQ

**Why does it need Apify's unblocker?** Indeed refuses a second request to the same URL from the same address, answers paging with a challenge page, and as of 11 September blocks plain residential addresses outright - eleven consecutive attempts, all refused, while the unblocker got through every time. Every page goes out on a fresh session through it. That is measured behaviour, not a guess.

**Why do some rows have no salary?** Most employers do not publish one. `salaryText` carries it verbatim when they do, and `salaryMin`/`salaryMax` only when Indeed managed to parse a band.

**Why is `postedLabel` in German/French/Spanish?** It is Indeed's own wording, kept as served. Use `datePosted` for anything you need to compute with — it is always ISO 8601 in UTC.

**What is `dateListed`?** When the posting entered Indeed's index, which can be much later than `datePosted` for a re-listed ad.

**Sponsored rows?** `isSponsored` flags paid placements so you can filter them out.

### Troubleshooting

- **"challenge or interstitial page"** — Indeed served a captcha instead of results. The actor treats that as a block and retries on a fresh route rather than reporting an empty success. Re-run in a few minutes if a whole run fails.
- **Fewer jobs than the result count suggests** — Indeed's own count includes postings it will not page through. The run stops when pages stop yielding new rows.

If this saves you an afternoon, a **rating on this page** takes ten seconds and helps other buyers find the compliance-clean option.

# Actor input Schema

## `what` (type: `string`):

What to search for, exactly as you would type it on Indeed.

## `where` (type: `string`):

City, region or postal code. Leave empty to search the whole country.

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

Which Indeed site to search.

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

How far around the location to look. Ignored without a location.

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

Only jobs posted in the last N days.

## `remoteOnly` (type: `boolean`):

Only postings Indeed flags as remote.

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

Sort by date instead of by Indeed's relevance ranking.

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

Stop after this many jobs.

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

Indeed refuses repeated requests from one address and answers paging with a challenge, and it currently blocks residential addresses outright. The run therefore goes through Apify's unblocker, which gets through reliably. Leave this as it is unless you know you need something else.

## Actor input object example

```json
{
  "what": "software engineer",
  "where": "Berlin",
  "country": "us",
  "remoteOnly": false,
  "sortByDate": false,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "what": "software engineer",
    "where": "Berlin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/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 = {
    "what": "software engineer",
    "where": "Berlin",
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/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 '{
  "what": "software engineer",
  "where": "Berlin"
}' |
apify call lowlanddata/indeed-scraper --silent --output-dataset

```

## MCP server setup

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