# Indeed Jobs Scraper - Latest Job Listings with Salary (`datasignalslab/indeed-jobs-scraper`) Actor

Get the newest Indeed job listings for any search in 16 countries: title, company, location, salary range, job type, rating and date as clean JSON. Search terms times cities, or paste Indeed search URLs. $3 per 1,000 jobs, no login, no proxy setup.

- **URL**: https://apify.com/datasignalslab/indeed-jobs-scraper.md
- **Developed by:** [DataSignals Lab](https://apify.com/datasignalslab) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 1 total users, 0 monthly users, 73.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 job returneds

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 Jobs Scraper: newest listings with salary, $0.50 per 1,000

Get the newest Indeed job listings for any search as clean JSON: title, company, location, salary range, job type, employer rating and posting date. Give it search terms and cities, or paste Indeed search URLs with your filters. 16 Indeed country sites, residential proxy built in and included in the price, no login and no API key.

**Read this first.** Indeed only serves the first result page of a search to visitors who are not logged in. So each search returns about 15 jobs (25 to 50 on indeed.com), not the full result count. This Actor is built for monitoring: narrow searches, newest first, on a schedule.

**Run it with the default input to see it work.** It returns the newest registered nurse jobs in Austin, TX, one page.

### What you get

One row per job:

| field | meaning |
|---|---|
| `job_id` | Indeed's job key, stable across runs, use it to detect new jobs |
| `title`, `company` | job title and employer |
| `company_rating`, `company_review_count` | employer rating on Indeed, 1 to 5, and the number of reviews |
| `location`, `city`, `postal_code` | where the job is |
| `remote` | true when Indeed marks the job as remote |
| `job_types` | full-time, part-time and similar, as Indeed labels them |
| `date_posted`, `posted_relative` | publication date in UTC and the age text Indeed shows |
| `salary`, `salary_min`, `salary_max`, `salary_period`, `salary_currency` | salary text and the parsed range, when the listing shows one |
| `snippet` | the teaser text from the result list |
| `is_sponsored`, `urgently_hiring`, `easy_apply` | listing flags |
| `url` | link to the listing |
| `country`, `search_url` | the site and the search the job came from |

Example row:

```json
{
  "job_id": "671e2cfec1349ac1",
  "title": "RN Operating Room II - Bloomfield Surgery Center",
  "company": "SCA Health",
  "company_rating": 2.8,
  "company_review_count": 443,
  "location": "Bloomfield, CT 06002",
  "city": "Bloomfield",
  "postal_code": "06002",
  "remote": false,
  "job_types": null,
  "date_posted": "2026-10-02T05:00:00Z",
  "posted_relative": "Just posted",
  "salary": "$35 - $54 an hour",
  "salary_min": 35,
  "salary_max": 54,
  "salary_period": "hour",
  "salary_currency": "USD",
  "snippet": "Successful completion of Basic Life Support (BLS) within 90 of employment or documentation of current BLS certification.",
  "is_sponsored": false,
  "urgently_hiring": false,
  "easy_apply": true,
  "url": "https://www.indeed.com/viewjob?jk=671e2cfec1349ac1",
  "country": "us",
  "search_url": "https://www.indeed.com/jobs?q=registered+nurse&sort=date"
}
```

### How to scrape Indeed jobs with this Actor

1. Open the Actor in the Apify Console and click Try for free. The form is prefilled with one search term, one city and the US site.
2. Type your search terms and cities, one per line. Each term is searched in each city, so 3 terms and 10 cities are 30 searches. Pick the `country` site.
3. For filters this form does not have, such as radius or remote only, set them on Indeed in the browser and paste the result URL into `startUrls`.
4. Set `postedWithinDays` and `maxJobs` and click Start. Export the dataset from the Storage tab.
5. From code, call `POST /v2/acts/datasignalslab~indeed-jobs-scraper/run-sync-get-dataset-items` on the Apify API with the same input.

### Input

| field | what it does |
|---|---|
| `queries` | search terms, one per line |
| `locations` | cities or regions, one per line. Each term is searched in each location. Empty means the whole country |
| `country` | the Indeed site: us, uk, ca, au, ie, in, sg, de, nl, fr, be, at, ch, es, it, se. Default us |
| `startUrls` | Indeed search URLs pasted from the browser, in addition to the search terms. Filters in the URL are kept, only the first page is returned |
| `sort` | `date` (default, newest first) or `relevance`. Pasted URLs keep their own sorting |
| `postedWithinDays` | `"1"`, `"3"`, `"7"` or `"14"` to keep only recent jobs, default `"any"` |
| `skipSponsored` | drop sponsored listings. Read the note under Limits before you use it |
| `maxJobs` | hard stop across the run, also your budget cap. 0 means no limit |

Three roles in four German cities is twelve searches and up to 180 jobs:

```json
{ "queries": ["data engineer", "python developer", "devops engineer"], "locations": ["Berlin", "Hamburg", "Munich", "Cologne"], "country": "de", "postedWithinDays": "3" }
```

### Pricing

Pay per job returned: **$0.50 per 1,000 jobs**, charged only for rows that land in the dataset. That is $0.0005 per job, residential proxy included. No start fee, no charge for compute. Searches that fail cost nothing. Apify's free monthly credit covers thousands of jobs.

Example: 20 search terms in 25 US cities is 500 searches of one page each. At 25 to 50 jobs per page on indeed.com that is 12,500 to 25,000 rows, so $6.25 to $12.50 for a full sweep. That is how you cover a country with one page per search. A daily schedule with `postedWithinDays` set to `"1"` costs a fraction, because only new postings come back.

#### More from DataSignals Lab

This Actor is one of the pay-per-result data Actors of [DataSignals Lab](https://datasignalslab.com): job listings per ATS platform and job board, app and company reviews, YouTube comments and transcripts, website contacts and tech stacks. Every Actor returns the same clean JSON style and charges only for rows that land in the dataset, so you can combine feeds without remapping fields. All Actors and prices are listed on [datasignalslab.com](https://datasignalslab.com).

### Use cases

- Recruiters: new openings for a role in a set of cities every morning, with the employer rating.
- Sales teams: fresh job posts as a buying signal, `urgently_hiring` marks employers who struggle to fill a role.
- Salary researchers: parsed `salary_min` and `salary_max` per role, city and period.
- Job alert products and niche job boards: a daily feed per city, de-duplicated on `job_id`.
- AI agents: answer "who started hiring nurses in Austin this week" from live data.

Other boards: [LinkedIn Jobs Scraper](https://apify.com/datasignalslab/linkedin-jobs-scraper), [Stepstone Jobs Scraper](https://apify.com/datasignalslab/stepstone-jobs-scraper). Career sites: [Job Search API](https://apify.com/datasignalslab/job-search-api).

### Indeed jobs API alternative: how it compares

- Indeed has no public jobs API. Scrapers that page through hundreds of results run into Indeed's blocks, which shows up as timeouts and crawls that take hours. This Actor asks for one page per search, which Indeed serves, and gets breadth from many small searches.
- Residential proxy is included. No proxy groups to configure, no proxy bill next to the Actor fee.
- A blocked search is retried with fresh proxy sessions, then skipped and logged. The run continues.
- No full job description, see Limits. LinkedIn Jobs Scraper and Stepstone Jobs Scraper offer it as an option.

### Limits

- First result page per search only. Indeed blocks further pages for visitors who are not logged in.
- Result list data only. The full description, benefits block and external apply link are not included.
- Salary is filled only when the listing shows one. Indeed's own estimates are not included.
- No radius or remote filter in the form. Set them on Indeed in the browser and paste the URL into `startUrls`.
- Indeed decides per request how many listings are sponsored, in our tests from none to all 15 for the same search. Sponsored listings are real jobs, flagged with `is_sponsored`. `skipSponsored` removes them, which can leave a search with few rows or none.
- The same search can return different jobs on two runs. Repeated runs collect more of the result set.
- To build a history, run on a schedule and de-duplicate on `job_id`.

### FAQ

#### Is it legal to scrape Indeed jobs?

The Actor reads the public result page Indeed shows to any visitor, without logging in and without personal data. Whether you may use the data depends on your jurisdiction and your use.

#### Do I need an Indeed account, API key or proxy?

No. There is no login and no cookie to paste. The residential proxy is built in.

#### How often does the Indeed Jobs Scraper update?

Every run reads Indeed live. Keep `sort` on `date` and set `postedWithinDays` to `"1"` for the postings of the last day.

#### Can I schedule it?

Yes. Create a schedule in the Apify Console, for example every two hours, with `postedWithinDays` set to `"1"`. De-duplicate on `job_id`.

#### Can an AI agent or MCP client call the Indeed Jobs Scraper?

Yes. Through the Apify MCP server any MCP client, for example Claude Desktop or Cursor, can call this Actor as a tool and read the dataset.

#### How much do 10,000 Indeed jobs cost?

$5.00. No start fee, no proxy fee. On indeed.com that is roughly 200 to 400 searches.

#### What happens when Indeed blocks a request?

The search is retried three times with a fresh browser fingerprint and proxy session, in up to three rounds with a pause in between. If it still fails it is skipped and logged, and nothing is charged.

### Integrations

Works with the Apify API and SDKs, schedules, webhooks and the Apify MCP server, so Claude, ChatGPT and other agents can call it as a tool. Push the dataset into Google Sheets, or connect it through Make, Zapier or n8n. Export to JSON, CSV or Excel.

### Support

Issues tab on this page, or support@datasignalslab.com. Response within one working day. Built and maintained by [DataSignals Lab](https://datasignalslab.com).

### Changelog

- 2026-10: Price cut from $3 to $0.50 per 1,000 jobs. Blocked searches are retried in up to three rounds. README restructured with guide, cost example, comparison, limits and FAQ.
- 2026-10-03: First release. One page per search, 16 country sites, parsed salary.

# Actor input Schema

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

One per line, for example a job title or a skill. Each term is searched in each location below. Every search returns the first result page: about 15 jobs, more on indeed.com.

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

Optional, one per line. Each search term is run once per location, so 3 terms and 10 cities are 30 searches. Leave empty to search the whole country.

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

Which Indeed site to search.

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

Optional. Set your filters on Indeed in the browser and paste the URL of the result page. Used in addition to the search terms. Only the first page of each URL is returned.

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

Newest first is the right choice for scheduled monitoring. Applies to the search terms, pasted URLs keep their own sorting.

## `postedWithinDays` (type: `string`):

Keep only recent jobs. Applies to the search terms.

## `skipSponsored` (type: `boolean`):

Drop sponsored listings. Indeed decides per request how many listings are sponsored, from none to the whole page, so this can leave a search with few rows or none. Sponsored listings are real jobs.

## `maxJobs` (type: `integer`):

Hard stop across all searches. 0 means no limit. You pay per job returned, so this is also your budget cap.

## Actor input object example

```json
{
  "queries": [
    "registered nurse"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "us",
  "sort": "date",
  "postedWithinDays": "any",
  "skipSponsored": false,
  "maxJobs": 0
}
```

# Actor output Schema

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

All jobs from this run as JSON, one object per job.

## `jobsCsv` (type: `string`):

The same jobs as a CSV download.

# 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": [
        "registered nurse"
    ],
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datasignalslab/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 = {
    "queries": ["registered nurse"],
    "locations": ["Austin, TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("datasignalslab/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 '{
  "queries": [
    "registered nurse"
  ],
  "locations": [
    "Austin, TX"
  ]
}' |
apify call datasignalslab/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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