# Indeed Jobs API (`deepmine/indeed-jobs`) Actor

Search Indeed jobs by keyword, location and posting time in the US, UK, Canada, Australia, India, Germany and 21 more countries. Every job comes with its full description, salary range, job type, remote/hybrid, company details and apply link. Newest first, past Indeed's search limit. No login.

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

## Pricing

from $0.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 API

Indeed scraper and jobs API: search Indeed jobs by **keyword**, **location** and **posting time** in **27 countries**. Every job comes with its **full description**, **salary** (text plus min/max numbers), **job type**, **remote/hybrid**, **experience level**, **company details** (logo, size, revenue, website) and the **employer's apply link**. Newest jobs first, past Indeed's per-search limit.

| 💼 Title | 🏢 Company | 📍 Location | 💰 Salary | 🕒 Job Type | 🏠 Workplace | 📅 Posted |
|---|---|---|---|---|---|---|
| Business Analyst | Teachers Retirement System | Manhattan, NY 10004 | $105,000 - $115,000 a year | Full-time | Hybrid | 2026-09-26T13:36:07Z |
| Workday HR Reporting Analyst | Houlihan Lokey | New York, NY | $85,000 - $115,000 a year | Full-time | – | 2026-09-26T05:34:13Z |
| Data Analytics Specialist | Federal Reserve Bank of New York | New York, NY | $165,000 - $195,000 a year | Full-time | – | 2026-09-25T20:59:20Z |

<sub>Collected 2026-09-27 ("data analyst", New York, NY, past week).</sub>

**$0.80 per 1,000 jobs** on the Starter plan ($1.00 Free, $0.65 Scale, $0.50 Business), descriptions and company details included. The prefilled run (100 jobs) costs about $0.08 and takes a few seconds.

No Indeed account, no cookies, no login.

### Why this one

- **Everything in one row.** Full description, salary, job type, workplace, level, company logo, size, revenue, website, Indeed company page and the employer's own apply link, with no second pass per job.
- **Salary you can filter.** `salary` reads like Indeed shows it (`$20 - $25 an hour`); `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` are numbers and codes you can sort and filter. In our test runs 63-92% of US jobs had a pay range, depending on the search.
- **Past Indeed's search limit.** Indeed stops a search after several hundred jobs (640 in our test). With a time period, this Actor reads the newest jobs first, hour window by hour window, so one search can return thousands. In our test, "registered nurse" in the US over 3 days gave 2,000 unique jobs in 39 seconds; re-reading five slices of that period found 308 of 309 of their jobs in the result.
- **Newest first.** Each keyword's jobs come sorted by the time they appeared on Indeed: what you want for alerts, lead lists and job feeds.
- **Several keywords, no duplicates.** Each keyword is its own search, and results come keyword by keyword in your order. A job that several keywords find comes back once, under the first of them (`keyword`).
- **Rows arrive as they're read.** Jobs go into your dataset during the run, so a long run shows results within seconds and keeps them even if you abort it.
- **27 countries.** US, UK, Canada, Australia, Ireland, New Zealand, India, Singapore, Philippines, Malaysia, South Africa, UAE, Germany, Austria, Switzerland, France, Belgium, Netherlands, Spain, Italy, Portugal, Poland, Sweden, Mexico, Brazil, Argentina and Japan, each with its local jobs, links and currency.
- **Fails loudly.** A run never ends "succeeded" with an empty dataset because Indeed refused it. Searches that fail after retries on other IPs fail the run with a clear message (the jobs already found are still delivered). An empty answer is double-checked with a control search. Every run saves a summary (`OUTPUT`).
- **Fast and light.** Plain HTTPS calls, no browser, datacenter proxies. 100 jobs arrive in about 4 seconds, 2,000 in about 40.

### Input

| Field | What it does | Default |
|---|---|---|
| `keywords` | Job titles, skills or companies, as you'd type them in Indeed's search box. Each is its own search. An empty list = every job in the place. | `["data analyst"]` |
| `location` | City, state, region or ZIP code, e.g. `New York, NY`, `Texas`, `90210`, `London`. Empty = the whole country. | – |
| `country` | Which Indeed site to search (two-letter code, e.g. `US`, `GB`, `DE`). | `US` |
| `postedWithin` | `past24Hours`, `past3Days`, `pastWeek`, `past2Weeks` or `pastMonth`. | `pastWeek` |
| `workplace` | `any`, `remote` or `hybrid`. | `any` |
| `maxResults` | Stop each keyword's search after this many jobs. You pay per job, so this also caps the cost. | 100 |
| `jobType` | More filters: `any`, `fullTime`, `partTime`, `contract`, `temporary` or `internship`. | `any` |
| `radius` | More filters: miles around the location. | 25 |
| `includeHtml` | Advanced: also return the description with Indeed's formatting (`descriptionHtml`). | off |
| `proxyConfiguration` | Advanced: Apify Proxy. Datacenter by default; residential works too but costs more. | Apify datacenter |

Example:

```json
{
  "keywords": ["registered nurse", "LPN"],
  "location": "Texas",
  "postedWithin": "past3Days",
  "jobType": "fullTime",
  "maxResults": 500
}
```

### Output

One dataset, **💼 All Jobs**, one row per job. Views:

- **📊 Overview**: 🖼️ Logo, 💼 Title, 🏢 Company, 📍 Location, 💰 Salary, 🕒 Job Type, 🏠 Workplace, 📅 Posted, 🔗 Indeed, 📨 Apply, 🔍 Keyword
- **💰 Salaries**: 💼 Title, 🏢 Company, 📍 Location, 💰 Salary, 💰 Salary Min, 💰 Salary Max, 💱 Currency, ⏱️ Pay Period, 🕒 Job Type, 📅 Posted, 🔗 Indeed
- **📝 Details**: 💼 Title, 🏢 Company, 🎓 Level, 🕒 Job Type, 🏠 Workplace, 💰 Salary, 📝 Description, 📨 Apply, 🔗 Indeed
- **🏢 Companies**: 🖼️ Logo, 🏢 Company, 👥 Company Size, 💵 Revenue, 🌍 Website, 🌐 Company Page, 💼 Title, 📍 Location, 🔗 Indeed

Fields, in row order (empty = `null`):

| Field | Example |
|---|---|
| `companyLogo` | `https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/fd1cb8806a2e54dae9c6079efd0876a7` (doesn't expire; 77-91% of jobs in our tests) |
| `title` | `Data Analytics Specialist` |
| `company` | `Federal Reserve Bank of New York` |
| `location` | `New York, NY` (as Indeed shows it; `Remote` for remote jobs without a place) |
| `salary` | `$165,000 - $195,000 a year`, `$33 an hour`, `From $50,000 a year`: the pay the employer gave Indeed |
| `salaryMin`, `salaryMax` | `165000`, `195000` (numbers, per `salaryPeriod`; equal when the employer gave one figure) |
| `salaryCurrency` | `USD`, `GBP`, `EUR`, `INR`… |
| `salaryPeriod` | `year`, `month`, `week`, `day` or `hour` |
| `jobType` | `Full-time`, `Part-time`, `Contract`, `Temporary`, `Internship`, `Per diem`…; several are comma-separated |
| `workplace` | `Remote`, `Hybrid` or `In-person`, when Indeed tags it |
| `seniority` | `Entry level`, `Mid-level`, `Senior level`, `No experience needed` |
| `postedAt` | `2026-09-25T20:59:20Z`: when the job appeared on Indeed (UTC). `postedWithin` filters on this time. |
| `jobUrl` | `https://www.indeed.com/viewjob?jk=8501d92db19ba6de` |
| `applyUrl` | `https://rb.wd5.myworkdayjobs.com/en-US/FRS/job/New-York-NY/Data-Analytics-Specialist_R-0000033525`: the employer's own apply page; empty when you apply on Indeed itself (then use `jobUrl`) |
| `companyUrl` | `https://www.indeed.com/cmp/Federal-Reserve-Bank-of-New-York`: the company's Indeed page (reviews, salaries, all its jobs) |
| `companyWebsiteUrl` | `https://www.newyorkfed.org` |
| `companySize` | `1,001 to 5,000`, `10,000+` (Indeed's employee bands) |
| `companyRevenue` | `more than $10B (USD)` |
| `descriptionSnippet` | `Company Federal Reserve Bank of New York When you…` (first 50 characters, without a repeated title) |
| `description` | Full description as plain text: a line per paragraph, `•` list items |
| `descriptionHtml` | Only in runs with `includeHtml` on: the description with Indeed's formatting |
| `jobId` | `8501d92db19ba6de` (Indeed's job key, the `jk` in job links) |
| `keyword` | `data analyst`: the keyword whose search delivered this job (the first in your list, when several found it; empty when you searched all jobs) |
| `scrapedAt` | `2026-09-27T19:40:58Z` |

#### Run summary (`OUTPUT`)

```json
{
  "results": 100,
  "stopReason": "complete",
  "jobsFound": 100,
  "searches": [
    {"keyword": "data analyst", "status": "ok", "stopReason": "maxResults", "jobsFound": 100,
     "delivered": 100, "alreadyDeliveredByEarlierKeyword": 0, "pages": 1, "hourWindows": 1,
     "denseHours": 0, "filteredOut": 0}
  ],
  "requests": 1,
  "statusMessage": "100 jobs from 1 search in New York, NY, US, past week. Download them from the Output tab (CSV, Excel, JSON) or schedule this run to get new jobs daily. …"
}
```

- Per search, `jobsFound` counts every job its search found and `delivered` the rows it added; `alreadyDeliveredByEarlierKeyword` counts jobs an earlier keyword in your list had already delivered.

- `stopReason` for the run is `complete`, or `spendingLimit` when your spending limit for the run was reached.

- Per search, `stopReason` is `maxResults` (there were more jobs), `complete` (you got every job Indeed lists for it), `pageBudget` (the run's request limit, which scales with `maxResults`) or `spendingLimit`.

- `denseHours` counts hours that held more jobs than one Indeed search returns (several hundred). This happens only for very broad searches, such as every job in the US. Some jobs from those hours are missing; add keywords or a location to split the search.

- A search that fails after retries on other IPs has `status: "error"` and a `reason`, and the run fails after delivering the other searches' jobs.

### Pricing

Pay per job, no start fee and no minimum. Each job is charged once, even when several keywords find it.

| Your Apify plan | Per 1,000 jobs |
|---|---|
| Free | $1.00 |
| Starter | $0.80 |
| Scale | $0.65 |
| Business | $0.50 |

You're billed only for rows that reach your dataset. When your spending limit is reached, the run stops, and you never pay more than the limit.

### FAQ

**Do I need an Indeed account?** No. The Actor reads Indeed's public job search, logged out.

**Why do some jobs have no salary?** Indeed shows pay only when the employer gives it. Many descriptions state pay in their text.

**Why is `applyUrl` empty on some jobs?** Those jobs take applications on Indeed itself ("Apply now" on Indeed). `jobUrl` opens them.

**How fresh are the jobs?** Indeed lists a new job about an hour after it comes in, so the newest rows are usually about an hour old. For a job feed, schedule a `past24Hours` run as often as you like and dedupe on `jobId`.

**Which locations work?** Anything Indeed's own "Where" box understands: a city, a state or region, or a ZIP/postal code. For remote jobs, set `workplace` to `remote` (typing "Remote" as the location does the same).

**Can I search several countries?** One country per run (Indeed keeps a separate job list per country). Save a task per country or run the Actor once per country.

### Feedback

Missing a field, or a search that doesn't come back the way you expect? Open an issue on the **Issues** tab and we'll look into it. If the data helped you, a short review on this page helps other people find it.

# Actor input Schema

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

Job title, skill or company, as you'd type it in Indeed's search box. Each keyword is its own search; a job several keywords find comes back once. Remove every keyword to get all jobs in the place.

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

City, state, region or ZIP code as Indeed understands it, e.g. "New York, NY", "Texas", "90210", "London". Leave empty for the whole country. For remote jobs use Workplace = Remote.

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

Which Indeed site to search (Indeed keeps a separate job list per country).

## `postedWithin` (type: `string`):

Only jobs that appeared on Indeed in this period. Indeed lists new jobs about an hour after they come in. Searches bigger than Indeed's per-search limit (several hundred jobs) are read hour window by hour window, newest first.

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

Only remote or only hybrid jobs, as Indeed tags them.

## `maxResults` (type: `integer`):

Stop each keyword's search after this many jobs. You pay per job, so this also caps the cost.

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

Only jobs Indeed lists with this job type.

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

How far around the location to search.

## `includeHtml` (type: `boolean`):

Also return the description with Indeed's formatting (descriptionHtml). The plain-text description is always there.

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

Apify datacenter proxies work for Indeed and are the default. Residential proxies work too but cost more.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "location": "New York, NY",
  "country": "US",
  "postedWithin": "pastWeek",
  "workplace": "any",
  "maxResults": 100,
  "jobType": "any",
  "radius": 25,
  "includeHtml": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "data analyst"
    ],
    "location": "New York, NY",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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 = {
    "keywords": ["data analyst"],
    "location": "New York, NY",
    "maxResults": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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