# Indeed Jobs Scraper: salaries, full descriptions, company data (`pikoulas/indeed`) Actor

Scrape Indeed jobs by keyword, location or search URL, past the 1,000-job limit: full descriptions, salaries, job types, remote, benefits, and company website, size and industry. Filter by date, job type, remote, level, salary and radius. 60+ countries. Fast, no browser.

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

## Pricing

from $0.20 / 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

Scrape jobs from Indeed in 62 countries:

- **Search:** jobs for keywords and locations, or a whole country, as many as you need per search.
  The 1,000-result limit of Indeed's own search doesn't apply.
- **Search URLs:** paste an Indeed search from your browser, and its filters come with it.
- **Job URLs:** any job by its link (`viewjob?jk=...`, `/job/...`, `/rc/clk?jk=...`).
- **Filters:** date posted, job type, remote or hybrid, experience level, minimum salary, radius,
  and Easy Apply only.

Every job comes with its title, company, full location with coordinates, salary (min, max,
currency, period and the text the site shows), job types, experience level, remote or hybrid,
benefits, posting date, Indeed link and the employer's own apply link, and Easy Apply and
urgently hiring flags. With details on, the default, it also comes with the full description as
text and HTML, the occupations and skills Indeed tagged, and the company's website, logo,
industry, size, revenue, CEO, description and addresses.

It needs no browser and no login, and it is fast: 900 jobs from 9 searches in the US, UK,
Germany and India took 9 seconds, and 2,500 jobs of one search 35 seconds. It costs
**$0.20 per 1,000 jobs**.

### What people use it for

- **Job market research:** salaries, remote share and demand for a role, city by city or country by country.
- **Lead generation:** companies hiring for a role, with their website, size, revenue and CEO.
- **Job boards and alerts:** new jobs of the last day for any search, with the full description.
- **AI and LLM data:** full job descriptions with Indeed's skill and occupation tags.

### How to scrape Indeed

1. Click **Try for free**; Apify's free plan covers a first run.
2. Enter **Search terms** and **Locations**, pick the country, or paste Indeed searches in **Start URLs**.
3. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or read them through
   the API.

An input with more options:

```json
{
  "searchTerms": ["data engineer", "python developer"],
  "locations": ["New York, NY", "Austin, TX"],
  "country": "us",
  "maxJobsPerSearch": 500,
  "postedWithinDays": 7,
  "jobType": "fulltime",
  "remote": "any",
  "minSalary": 100000,
  "startUrls": [
    "https://uk.indeed.com/jobs?q=nurse&l=London&fromage=7",
    "https://www.indeed.com/viewjob?jk=89c74615b1cf4e69"
  ]
}
```

Every search term is searched in every location. With terms and no location, the whole country
is searched; with locations and no terms, every job there. Search URLs keep their own country
and filters, and the filters above don't change them. Turn off `includeDetails` for jobs without
the description and company profile.

### Output

A job, with the description shortened here:

```json
{
  "type": "job",
  "jobKey": "89c74615b1cf4e69",
  "title": "Senior Front End Product Engineer",
  "company": "Hyatt",
  "location": "Chicago, IL",
  "city": "Chicago",
  "state": "Illinois",
  "country": "US",
  "latitude": 41.85003,
  "longitude": -87.65005,
  "workplaceType": null,
  "remote": false,
  "jobTypes": ["Full-time"],
  "experienceLevel": "Senior level",
  "salary": {"min": 117000, "max": 145000, "currency": "USD", "period": "year", "text": "$117,000 - $145,000 a year"},
  "benefits": ["Health insurance", "Dental insurance", "Paid time off", "Vision insurance", "401(k) matching", "Flexible schedule"],
  "postedAt": "2026-09-26T05:00:00Z",
  "listedAt": "2026-09-26T08:42:53Z",
  "url": "https://www.indeed.com/viewjob?jk=89c74615b1cf4e69",
  "applyUrl": "https://careers.hyatt.com/en-US/careers/details/10780/CHI015660",
  "easyApply": false,
  "urgentlyHiring": false,
  "companyUrl": "https://www.indeed.com/cmp/Hyatt",
  "searchTerm": "software engineer",
  "searchLocation": "Chicago, IL",
  "normalizedTitle": "front end developer",
  "occupations": ["Software Development Occupations", "Technology Occupations", "Front End Developers"],
  "attributes": ["Responsive design", "TypeScript", "Next.js", "Docker", "Microservices", "5 years", "..."],
  "companyWebsite": "http://www.hyatt.com",
  "companyLogo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/51c6802f65e31678c80fe52f7a89d8b0",
  "companyIndustry": "Restaurants travel and leisure",
  "companyEmployees": "10,000+",
  "companyRevenue": "$1B to $5B (USD)",
  "companyDescription": "Hyatt is a leading global hospitality company guided by its purpose – to care for people so they can be their best – with more than 160,000 colleagues across more than 70 countries.",
  "companyCeo": "Mark S. Hoplamazian",
  "companyAddresses": ["150 N. Riverside Plaza\nChicago, IL 60606, United States"],
  "descriptionText": "Summary\n\nThe Opportunity\n\nHyatt Hotels Corporation seeks an enthusiastic Senior Front End Product Engineer to join our Digital team...",
  "descriptionHtml": "<div><div><h2 class=\"jobSectionHeader\"><b>Summary</b></h2>..."
}
```

### Use it as an API

One call runs it and returns the results as JSON (for runs under 5 minutes; longer ones start a
run and read its dataset). Apify's Python and JavaScript clients, and its Make, Zapier and n8n
integrations, work the same way.

```bash
curl -X POST "https://api.apify.com/v2/acts/pikoulas~indeed/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["python developer"], "locations": ["New York, NY"], "maxJobsPerSearch": 10, "startUrls": ["https://uk.indeed.com/jobs?q=nurse&l=London&fromage=7"]}'
```

AI agents can call it as a tool through Apify's MCP server: `https://mcp.apify.com?tools=pikoulas/indeed`.

### How much does it cost to scrape Indeed?

You pay **$0.0002 per job**, which is $0.20 per 1,000 jobs, details included. Apify doesn't let
its servers reach Indeed directly, so runs go through Apify's residential proxy and also pay its
traffic, $0.0012 per 100 KB: a job with details is about 4.5 KB, so about $0.06 per 1,000 jobs.
There are no monthly fees.

### Good to know

- Jobs come newest first, as Indeed's app lists them; there is no relevance order.
- Job types and experience levels are in English in every country. Benefits and `attributes`
  are in the site's language, as Indeed shows them there.
- Indeed doesn't give company ratings or reviews without a login, so there are none.
- `radius` is in miles in the US and UK, and in kilometers elsewhere, as on each Indeed site.
- A job that has expired or been removed is reported in the log and skipped.

### FAQ

#### Is it legal to scrape Indeed?

It collects only what Indeed shows publicly, without logging in. Scraping public data is
generally legal, but personal data is protected by laws such as the GDPR and the CCPA, and
Indeed's terms may limit how you use what you collect. If you're unsure, ask a lawyer;
Apify's [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) is a good start.

#### Something missing or not working?

Open an issue on the **Issues** tab with the input you used, or ask there for a field you need.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, skills or companies, as you would type them into Indeed's What box. Each is searched in each location.

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

Cities, states, regions or postcodes (Austin, TX; London; 10001). Leave empty to search the whole country.

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

The Indeed site to search, such as indeed.com (United States) or uk.indeed.com. Start URLs carry their own.

## `maxJobsPerSearch` (type: `integer`):

How many jobs to take from each search (each search term in each location, and each search URL), newest first. Indeed shows 1,000 at most per search; this goes past that.

## `postedWithinDays` (type: `integer`):

Only jobs listed on Indeed in the last this many days: 1 for the last 24 hours. Leave empty for any date.

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

Only jobs of this type.

## `remote` (type: `string`):

Only remote or only hybrid jobs.

## `experienceLevel` (type: `string`):

Only jobs at this level.

## `minSalary` (type: `integer`):

Only jobs whose pay reaches this much a year, in the country's currency, with hourly and monthly pay converted by Indeed. Indeed also keeps some jobs that show no pay.

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

How far from each location to search: miles in the US and UK, kilometres elsewhere, as Indeed shows it. 0 for the place itself.

## `easyApplyOnly` (type: `boolean`):

Only jobs you can apply to on Indeed (Indeed Apply).

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

Indeed search URLs (https://www.indeed.com/jobs?q=nurse\&l=Austin%2C+TX\&fromage=3), which keep their own filters, and job URLs (https://uk.indeed.com/viewjob?jk=...), from any Indeed country.

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

The full description (text and HTML), skills and other attributes, occupations, and the company's website, logo, industry, size, revenue, CEO and addresses. Turn off for lighter items.

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

Not needed for most runs: if Indeed refuses the run's IP, it switches to Apify's residential proxy by itself.

## Actor input object example

```json
{
  "searchTerms": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "country": "us",
  "maxJobsPerSearch": 20,
  "jobType": "any",
  "remote": "any",
  "experienceLevel": "any",
  "radius": 25,
  "easyApplyOnly": false,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `companies` (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 = {
    "searchTerms": [
        "python developer"
    ],
    "locations": [
        "New York, NY"
    ],
    "maxJobsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("pikoulas/indeed").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 = {
    "searchTerms": ["python developer"],
    "locations": ["New York, NY"],
    "maxJobsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("pikoulas/indeed").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 '{
  "searchTerms": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxJobsPerSearch": 20
}' |
apify call pikoulas/indeed --silent --output-dataset

```

## MCP server setup

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

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/KvOInR60UK4hBCaxu/builds/qWkZPqikUP4j1R2kr/openapi.json
