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

Scrape Indeed job listings by keyword and location in 9 countries: title, company, location, salary, job type, benefits, skills, rating and apply link, in a clean standardized format. Filters, wide search and new-job monitoring. From $3 per 1,000 jobs.

- **URL**: https://apify.com/tacps126/indeed-jobs.md
- **Developed by:** [Tapaswai Ashok Choudhary](https://apify.com/tacps126) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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.
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 Jobs Scraper

Get job listings from **Indeed** by keyword and location in 9 countries as a clean, spreadsheet-ready dataset. Each job includes the title, company, location (city, state, postcode, country), **salary range with the yearly equivalent**, job type, work mode (remote / hybrid), benefits, schedule, the skills Indeed tagged, the company's rating and the link to the job. Export to JSON, CSV or Excel, send to Google Sheets or Slack, or call it as an API.

**Built for** recruiters and staffing agencies sourcing openings, job boards and aggregators, sales teams looking for companies that are hiring, analysts tracking salaries and demand, and job seekers who want new postings delivered to them.

### Why this scraper

- **Rich, standardized records.** Salaries are parsed into min/max/currency/period with a yearly equivalent. Work mode, employment type, seniority and job function are filled in the same way as in our other job scrapers (Greenhouse, Lever, Workday, LinkedIn…), so you can combine sources in one table.
- **Wide search for more jobs.** Turn on *Wide search* and each query + location is searched from several angles (newest, most relevant, last 24 hours, last 3 days, full-time, contract, part-time). In our tests that gave about **3× more distinct jobs** for the same search.
- **9 country sites.** United States, United Kingdom, Canada, Australia, Ireland, Germany, France, Netherlands and Singapore. Searches go out from residential IPs in the same country.
- **New-job monitoring.** Schedule it with *Only new jobs* and each run returns only postings you haven't received yet, so you pay only for new ones.
- **Filters applied for you.** Title keywords, location, work mode, employment type, seniority, job function, minimum salary, "with salary only", excluded companies. Filtered-out jobs are never charged.
- **No account needed.** Nothing to log in to, nothing to configure beyond your search.
- **Resilient.** If Indeed shows a security check, the search is retried automatically on a fresh connection. Results are saved as each search finishes, and a moved run resumes without charging twice.

### How to use it

1. Add **Search queries** (e.g. `registered nurse`, `data analyst`) and **Locations** (e.g. `Chicago, IL`, `Remote`).
2. Pick the **Indeed country site** and, optionally, **Posted within**, **Job type** and **Sort by**.
3. For more results per search, turn on **Wide search**.
4. Press **Start**. Download results from the **Output** tab, or connect an integration.

#### Example input

```json
{
  "queries": ["registered nurse", "software engineer"],
  "locations": ["Chicago, IL", "Austin, TX"],
  "country": "us",
  "datePosted": "7",
  "wideSearch": true,
  "maxItems": 500
}
```

### What you get

| Field | Description |
|-------|-------------|
| `title` / `company` | Job title and employer |
| `location`, `city`, `region`, `postalCode`, `country`, `countryCode` | Where the job is |
| `workMode` | `remote` or `hybrid` when the posting says so |
| `employmentType`, `jobTypes` | Full-time, part-time, contract, internship… |
| `salary` | `{min, max, currency, period, annualMin, annualMax}` when listed |
| `salaryText` | The pay exactly as Indeed shows it |
| `benefits`, `schedules` | E.g. health insurance, 401(k), paid time off; Monday to Friday, on call |
| `skills` | Skills and requirements Indeed tagged on the posting |
| `summary` | The short description shown in search results |
| `seniority`, `jobFunction` | Derived from the title |
| `companyRating`, `companyReviewCount`, `companyLogo`, `companyUrl` | Employer details on Indeed |
| `easyApply`, `urgentlyHiring`, `sponsored` | Indeed flags (`sponsored` = promoted by the employer) |
| `url`, `jobId` | Link to the job on Indeed and its job key |
| `postedAtIso`, `postedDaysAgo` | When it was posted |
| `searchQuery`, `searchLocation` | Which search found it |

Example (shortened):

```json
{
  "title": "Software Engineer",
  "company": "Visa Technology and Operations LLC",
  "city": "Austin",
  "region": "TX",
  "postalCode": "78759",
  "countryCode": "US",
  "employmentType": "full_time",
  "salary": { "min": 86500, "max": 134400, "currency": "USD", "period": "year", "annualMin": 86500, "annualMax": 134400 },
  "salaryText": "$86,500 - $134,400 a year",
  "benefits": ["401(k)", "Dental insurance", "Health insurance", "Paid time off"],
  "skills": ["Agile software development", "C#", "JavaScript", "RESTful API", "Selenium"],
  "companyRating": 3.9,
  "easyApply": true,
  "sponsored": false,
  "url": "https://www.indeed.com/viewjob?jk=d2131e5a5ae9a900",
  "postedAtIso": "2026-10-01T05:00:00+00:00"
}
```

### How many jobs per search?

Each search returns the jobs on Indeed's first results page: about **40 in the US** and about **15 on the other country sites**. For more jobs:

- add more **locations** (nearby cities, suburbs or postcodes),
- add related **queries** (`RN`, `registered nurse`, `ICU nurse`),
- turn on **Wide search** (about 3× more distinct jobs per query + location),
- schedule the Actor with **Only new jobs** to build up a complete feed over time.

Full job descriptions aren't included; you get the summary Indeed shows in search results plus the tagged skills and benefits.

### Pricing

Pay per result: about **$3 per 1,000 jobs** (lower on higher Apify plans) plus a tiny start fee. Duplicates, filtered-out jobs and (with *Only new jobs*) already-delivered jobs are free. See the **Pricing** tab for exact rates, and set a maximum charge per run to cap spend.

On Apify's **free plan** each run returns up to 100 jobs, enough to try it out. Any paid Apify plan removes the limit.

### FAQ

**Why do some searches take longer?** Every search opens Indeed in a real browser. When Indeed shows a security check, the search is retried on a fresh connection, which adds a few seconds.

**Which countries are supported?** US, UK, Canada, Australia, Ireland, Germany, France, Netherlands and Singapore.

**Is it legal?** The Actor collects publicly listed job ads. You're responsible for how you use the data, including any personal data, under the laws that apply to you.

### Support

Found a problem or need a field that isn't there yet? Open an issue on the **Issues** tab with your input and what you expected. Requests decide what gets built next.

# Actor input Schema

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

What to search for — job title, skill or company, one per line. Every query runs in every location.

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

City, state, postcode or `Remote`, one per line. Leave empty to search the whole country.

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

Which Indeed site to search.

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

Only jobs posted in this window.

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

Only this type of job.

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

Distance around each location, in the site's unit (miles in the US/UK, km elsewhere).

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

Order Indeed returns results in.

## `wideSearch` (type: `boolean`):

Run each search from several angles (newest and most relevant, last 1 and 3 days, full-time, contract and part-time) to collect many more different jobs per query and location. Takes a little longer.

## `includeSponsored` (type: `boolean`):

Keep jobs that employers promote on Indeed. They're marked with `sponsored: true`.

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

Maximum number of jobs to return in total.

## `titleIncludes` (type: `array`):

Keep a job only if its title contains any of these words (case-insensitive), e.g. `engineer`, `developer`.

## `titleExcludes` (type: `array`):

Drop a job whose title contains any of these words (case-insensitive), e.g. `intern`, `manager`.

## `locationIncludes` (type: `array`):

Keep a job only if its location contains any of these (case-insensitive), e.g. `Berlin`, `Remote`.

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

Only remote jobs (uses Indeed's remote filter).

## `workModes` (type: `array`):

Keep only these work arrangements. Jobs whose posting doesn't state it are dropped when this is set.

## `employmentTypes` (type: `array`):

Keep only these employment types.

## `seniorities` (type: `array`):

Keep only these seniority levels.

## `jobFunctions` (type: `array`):

Keep only these job functions (engineering, data, sales, …).

## `descriptionIncludes` (type: `array`):

Keep a job only if its summary or skills mention any of these.

## `companyExcludes` (type: `array`):

Drop jobs from companies whose name contains any of these, e.g. staffing agencies.

## `minAnnualSalary` (type: `integer`):

Keep jobs paying at least this per year (hourly and monthly pay are converted), in the posting's currency. Jobs that don't publish pay are kept unless “Only jobs with salary” is on.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs that publish their pay.

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

Return only jobs that no earlier run with the same input has delivered. Schedule the Actor and you pay only for new jobs.

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

Optional name for the 'only new' history. Runs sharing a name share one history; leave empty to derive it from the sources.

## `indeedCookies` (type: `string`):

Optional. Cookies from your own signed-in Indeed session (`name=value; …`). Unlocks more result pages and full job descriptions.

## `maxPages` (type: `integer`):

Result pages per search when you provide your login cookies.

## `includeDetails` (type: `boolean`):

Open each job for its full description. Needs your login cookies.

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

Residential proxy in the site's country is used by default — Indeed blocks cloud IPs.

## `tenantId` (type: `string`):

Optional label used to keep separate histories for different clients or teams.

## `debug` (type: `boolean`):

Save extra diagnostics with the run.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "us",
  "sort": "relevance",
  "wideSearch": false,
  "includeSponsored": true,
  "maxItems": 200,
  "remoteOnly": false,
  "onlyWithSalary": false,
  "onlyNew": false,
  "maxPages": 1,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "debug": false
}
```

# Actor output Schema

## `results` (type: `string`):

The produced items (default dataset items).

# 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": [
        "software engineer"
    ],
    "locations": [
        "Austin, TX"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tacps126/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 = {
    "queries": ["software engineer"],
    "locations": ["Austin, TX"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tacps126/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 '{
  "queries": [
    "software engineer"
  ],
  "locations": [
    "Austin, TX"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call tacps126/indeed-jobs --silent --output-dataset

```

## MCP server setup

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