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

Indeed Scraper SD - Indeed Scraper is a job data tool that extracts Indeed job listings by keyword and location: title, company, salary, job type, remote or hybrid, posting date, full description and company details. 14 countries, no login.

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

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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 — Indeed jobs with salary and full descriptions, no login

The Indeed Scraper searches Indeed by keyword and location and returns one row per job: title, company, location, salary range, job types, remote or hybrid flag, publish dates, Indeed's job attributes, company details and the full description.

It works logged out on 14 English-language Indeed sites. Each job already carries its full description, so no job page is opened.

#### Input

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | list | `python developer` (prefill) | One Indeed search per line |
| `location` | text | `New York, NY` (prefill) | City, state, postcode or "Remote" |
| `country` | select | `US` | US, GB, CA, AU, IN, IE, NZ, SG, ZA, PH, MY, AE, PK, NG |
| `datePosted` | integer | `0` | Only jobs Indeed received in the last N days |
| `jobTypes` | multi-select | – | Full-time, Part-time, Contract, Temporary, Internship, Permanent |
| `workplace` | select | `any` | Remote only / Hybrid only |
| `radius` | integer | `25` | Around the location, in the site's unit (read from the page) |
| `sort` | select | `relevance` | Relevance or date |
| `maxItems` | integer | `50` | Stop after this many jobs |
| `proxyConfiguration` | proxy | Apify RESIDENTIAL | Proxy for Indeed |

#### Output

| Field | Meaning |
|---|---|
| `jobKey`, `jobUrl` | Indeed job key and `https://<site>/viewjob?jk=<key>` |
| `title`, `companyName`, `companyUrl` | Job and Indeed company page |
| `companyWebsite`, `companyIndustry`, `companySize`, `companyRevenue`, `companyDescription` | When Indeed has a company profile |
| `location`, `city`, `state`, `postalCode`, `country` | Job location |
| `datePublished`, `dateOnIndeed` | When the employer published it / when Indeed received it |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `salaryIsEstimate` | Employer pay, or Indeed's estimate when flagged |
| `jobTypes`, `workplace`, `attributes` | Job types, `remote` / `hybrid`, all Indeed attributes (skills, benefits ...) |
| `descriptionText`, `descriptionHtml` | Full description |
| `searchKeywords`, `searchLocation`, `searchCountry`, `scrapedAt` | The search that produced the row, UTC time |

#### How it works

The Actor opens Indeed's public search page and reads from it, on every run, the API key Indeed's own scripts use, the job-type and remote filter IDs and the radius unit. It then asks Indeed's job-search API for 100 jobs at a time and follows the cursor.

#### Measured (2026-10-03, one residential IP, no proxy)

| Test | Result |
|---|---|
| `python developer` / New York, 50 jobs | 50 rows in 4 s (2 requests) |
| `registered nurse` / Texas by date, 250 jobs | 250 rows in 8 s, 3 cursor pages |
| `python developer` / New York, 1,100 asked | 996 rows in 21 s, 10 pages, then Indeed ended the cursor |
| UK, `accountant` / London, 3 days, full-time, hybrid | 25 rows: 25/25 full-time, 25/25 hybrid, all from the last 3 days |
| Country `XX`, empty input | Clean stop with an error line |

#### Limits (measured)

- About 1,000 jobs per search (996 measured): split by location, date or job type for more.
- Fill rates in the 50-job test: salary 31/50, job types 42/50, company size 43/50, industry 4/50.
- Only English-language Indeed sites are offered, because job types are matched on the English labels of Indeed's filter menu.
- Indeed's job pages (`/viewjob`) answer a Cloudflare challenge; they are never requested.

#### Example input

```json
{"keywords": ["accountant"], "location": "London", "country": "GB", "datePosted": 3, "jobTypes": ["fullTime"], "workplace": "hybrid", "maxItems": 100}
```

# Actor input Schema

## `keywords` (type: `array`):

One Indeed search per line, e.g. "python developer", "registered nurse".

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

City, state, postcode or "Remote", as you would type it on Indeed, e.g. "New York, NY", "London".

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

Which Indeed site to search.

## `datePosted` (type: `integer`):

Only jobs Indeed received in the last N days (1, 3, 7, 14 ...). 0 = any time.

## `jobTypes` (type: `array`):

Only these job types (Indeed's own filter; the ids are read from Indeed's filter menu on every run).

## `workplace` (type: `string`):

Only remote jobs, or only hybrid jobs (Indeed's own labels).

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

Search radius around the location, in the unit of the country site (miles in the US/UK, km elsewhere).

## `sort` (type: `string`):

Indeed's sort order.

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

Stop after this many jobs. Indeed returns at most about 1,000 jobs per search.

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

Residential proxy is recommended and is the default.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "location": "New York, NY",
  "country": "US",
  "datePosted": 0,
  "workplace": "any",
  "radius": 25,
  "sort": "relevance",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "keywords": [
        "python developer"
    ],
    "location": "New York, NY",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/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 = {
    "keywords": ["python developer"],
    "location": "New York, NY",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/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 '{
  "keywords": [
    "python developer"
  ],
  "location": "New York, NY",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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