# Indeed Jobs Scraper: Many Searches, New Jobs Only (`nextgensda/indeed-jobs`) Actor

Scrape Indeed jobs for many keywords and locations in one run: full description, salary range, benefits, job type, posting date, company size, revenue, industry and rating. Duplicates removed across searches; a new-jobs-only mode for scheduled runs. Fast HTTP scraper, no browser.

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

## Pricing

from $0.10 / 1,000 jobs

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: 62 Countries, Many Searches, New Jobs Only

![Indeed Jobs Scraper: many job titles and US locations per run, duplicates removed, with pay-per-event pricing shown as a receipt](https://api.apify.com/v2/key-value-stores/mKtbVXUC6O9iFO827/records/banner.png?signature=YAlDGCeI4KgK6yFqOvYM)

Search [Indeed](https://www.indeed.com/) in any of its 62 countries for many
job titles and locations in one run. Every job is one item in the dataset, complete from
the search itself: full description, salary range and pay period, job type,
shifts, benefits, skills, posting date, location with coordinates, and the
company's size, revenue, industry, CEO, website and rating.

### What it does

- Searches by **query** (a job title, skill or company) in a **location**
  (a city, region or postcode), or across a whole country.
- **62 countries**: the US, UK, Canada, Australia, India, Germany, France,
  Japan, Brazil, Mexico and every other Indeed site. Pick one for the run, or
  give each search its own; Indeed URLs from any country site work as they
  are. Salaries come in the local currency.
- Runs **many searches at once**: a list of searches, or queries ×
  locations, plus Indeed search URLs and job URLs.
- **Removes duplicates across searches**: a job found by "nurse" and by
  "registered nurse" is delivered, and charged, once.
- **Only new jobs** for scheduled runs: turn it on and each run returns only
  postings this monitor hasn't delivered before. Jobs it skips aren't saved
  or charged, so a daily job alert costs only what's new.
- Filters: date posted (24 hours to 14 days), job type (full-time,
  part-time, contract, temporary, internship, permanent), remote or hybrid,
  radius, sort by relevance or date.
- Up to 850 jobs per search (Indeed's own limit) and no limit per run. For
  more, split a broad search into smaller locations or add filters.
- Pure HTTP, no browser: fast and light (256 MB). 100 complete jobs per
  request, with no extra request per job.

### Input examples

**Several searches:**

```json
{
    "searches": [
        { "query": "registered nurse", "location": "Houston, TX" },
        { "query": "software engineer", "location": "New York, NY" }
    ]
}
```

**Many queries × many locations, posted this week, full-time:**

```json
{
    "queries": ["electrician", "plumber", "hvac technician"],
    "locations": ["Phoenix, AZ", "Denver, CO", "Dallas, TX"],
    "datePosted": "7",
    "jobType": "full-time"
}
```

**A daily job alert (schedule it; each run returns only new postings):**

```json
{
    "queries": ["data engineer"],
    "workArrangement": "remote",
    "datePosted": "3",
    "onlyNewJobs": true,
    "monitorName": "remote-data-engineers"
}
```

**Several countries in one run:**

```json
{
    "searches": [
        { "query": "nurse", "location": "Manchester", "country": "GB" },
        { "query": "Pflegefachkraft", "location": "Berlin", "country": "DE" },
        { "query": "software engineer", "location": "Bengaluru", "country": "IN" }
    ]
}
```

**Indeed URLs:**

```json
{
    "urls": [
        "https://www.indeed.com/jobs?q=welder&l=Tulsa%2C+OK&fromage=7",
        "https://uk.indeed.com/jobs?q=electrician&l=Leeds",
        "https://www.indeed.com/viewjob?jk=a9125815986bb704"
    ]
}
```

### Output

Each item contains:

| Field | Example |
|---|---|
| `title` | Registered Nurse |
| `url` | https://www.indeed.com/viewjob?jk=a9125815986bb704 (the job's own country site) |
| `company`, `company_url`, `company_logo` | Encompass Health, its Indeed page and logo |
| `company_rating`, `company_review_count` | 3.4, 5330 |
| `company_size`, `company_revenue`, `company_industry` | 10,000+, $1B to $5B (USD), Health care (when listed) |
| `company_ceo`, `company_website`, `company_addresses`, `company_description` | when the company lists them |
| `location`, `city`, `state`, `postal_code`, `country` | Houston, TX 77054, US |
| `latitude`, `longitude`, `street_address` | 29.698248, -95.38001 |
| `salary`, `salary_min`, `salary_max`, `salary_period`, `salary_currency` | "$40.49 - $57.42 an hour", 40.49, 57.42, hour, USD |
| `job_types`, `shifts`, `benefits` | \["PRN"], \["Monday to Friday"], \["Health insurance", "Paid time off", "401(k) matching"] |
| `remote`, `hybrid` | false, false |
| `attributes`, `occupations` | \["RN License", "CPR Certification", "Mid-level", …]; \["Nursing Occupations", …] |
| `posted_at`, `published_at` | 2026-02-26T00:47:23.184000Z |
| `description` | the full job description (plain text) |
| `description_html` | the same as HTML, when **Description HTML** is on |
| `apply_url`, `easy_apply` | the employer's page; Indeed Apply available |
| `urgent_hire`, `high_volume_hiring` | Indeed's hiring signals |
| `employer_response_rate`, `employer_response_days` | when Indeed has them |

Plus `searchQuery`, `searchLocation`, `searchCountry`, `searchUrl` and
`searchIndex`: the search that found the job. Fields a job doesn't list are
empty: about 4 in 10 US jobs carry a salary. Job types, benefits and other
labels come in English where Indeed's country site has it (UK, India,
Belgium, Singapore, the Gulf, ...) and in the local language elsewhere
(Germany: `Vollzeit`).

### Pricing

Pay per event: platform usage is included in every price; you never pay
Apify compute, proxy or storage on top. Jobs skipped as duplicates or (with
**Only new jobs**) as already delivered are free.

| Event | Price | When charged |
|---|---|---|
| Run start | $0.001 | every run |
| `job` | $0.10 / 1,000 | each job pushed to the dataset |

**Example:** 9 searches × 100 jobs = $0.001 + 900 × $0.0001 = **$0.091**.

Your **spending limit** (set in the run configuration) is always respected:
the actor stops before exceeding it.

### Proxy

Apify's US residential proxy is the default, for every country: Indeed
answers it in under a second per 100 jobs. If Indeed refuses an IP or times out, the actor moves to
a new one and carries on where it stopped, without repeating jobs.

### Limits

- Remote jobs are searched across the whole country: Indeed returns none for
  a city with the remote filter.
- The radius is in miles in the US and the UK and in km elsewhere, as on
  Indeed's sites.
- Indeed's own limit is 850 jobs per search; "date" sorting is Indeed's
  (recent first, not strictly by date).

# Actor input Schema

## `searches` (type: `array`):

One search per entry: <code>{"query": "registered nurse", "location": "Houston, TX"}</code>, optionally with its own <code>"country": "GB"</code>. The query is a job title, skill or company; the location a city, region or postcode in that country. Leave the location out to use the locations below (or the whole country); leave the query out for every job in the location.

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

Shortcut for many queries on the same locations below.

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

Run-wide locations: every search without its own location, and every query, runs in each of them. City, region or postcode (e.g. <code>Austin, TX</code>, <code>Manchester</code>, <code>10001</code>).

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

Indeed search URLs (<code>https://www.indeed.com/jobs?q=...\&l=...</code>, with their own filters) and job URLs or job keys (<code>https://uk.indeed.com/viewjob?jk=...</code>), from any Indeed country site. A bare job key uses the country below.

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

Indeed's site to search (62 countries). Each search can name its own <code>country</code> instead; Indeed URLs use their site's country.

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

Only jobs posted (or reposted) on Indeed within this window.

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

Only jobs of this type. Indeed has no 'either' filter: one type per run.

## `workArrangement` (type: `string`):

Remote jobs are searched across the whole country: Indeed returns none for a city, so locations are ignored.

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

Around each location, in miles in the US and the UK and in km elsewhere (as on Indeed's sites); 0 = the place itself.

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

Indeed's order. 'Date' puts recent jobs first but isn't strictly by date.

## `includeDescriptionHtml` (type: `boolean`):

Also save each description as HTML (headings, lists), next to the plain text.

## `onlyNewJobs` (type: `boolean`):

Skip jobs this monitor delivered in earlier runs (last 90 days). Skipped jobs aren't saved or charged.

## `monitorName` (type: `string`):

Which history to compare against: use a different name for each independent schedule. Letters, digits and dashes.

## `maxItemsPerSearch` (type: `integer`):

Indeed serves up to 850 jobs per search. For more, split a search into smaller locations or add filters.

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

The run stops after this many jobs.

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

Apify's US residential proxy is the default, for every country: Indeed answers it fastest. With datacenter IPs, runs can be several times slower; if Indeed refuses them, the run moves to US residential by itself.

## Actor input object example

```json
{
  "searches": [
    {
      "query": "registered nurse",
      "location": "Houston, TX"
    },
    {
      "query": "software engineer",
      "location": "New York, NY"
    }
  ],
  "country": "US",
  "datePosted": "",
  "jobType": "",
  "workArrangement": "",
  "radius": 25,
  "sort": "relevance",
  "includeDescriptionHtml": false,
  "onlyNewJobs": false,
  "monitorName": "default",
  "maxItemsPerSearch": 850,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

One row per job: title, company, location, salary, job type, date posted and Indeed link.

## `allFields` (type: `string`):

Every field of every job, including the full description, salary range, benefits, skills, coordinates and company size, revenue, industry and rating.

# 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 = {
    "searches": [
        {
            "query": "registered nurse",
            "location": "Houston, TX"
        },
        {
            "query": "software engineer",
            "location": "New York, NY"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nextgensda/indeed-jobs").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 = {
    "searches": [
        {
            "query": "registered nurse",
            "location": "Houston, TX",
        },
        {
            "query": "software engineer",
            "location": "New York, NY",
        },
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nextgensda/indeed-jobs").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 '{
  "searches": [
    {
      "query": "registered nurse",
      "location": "Houston, TX"
    },
    {
      "query": "software engineer",
      "location": "New York, NY"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call nextgensda/indeed-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nextgensda/indeed-jobs"
        }
    }
}
```

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/jAIbUyZKL3enkdK8c/builds/Y3OlqLkqwaOBfpLH4/openapi.json
