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

Scrape Indeed job listings by keyword, country, and location. Extract titles, companies, salaries, full descriptions, benefits, skills, posted dates, apply links, and job URLs. Export data, run via API, schedule and monitor runs, or integrate with other tools.

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

## Pricing

from $1.50 / 1,000 job listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### What does Indeed Jobs Scraper do?

Indeed Jobs Scraper allows you to extract clean, deduplicated job data from
[Indeed](https://www.indeed.com/) job listings: job title, full description,
company name, location, salary, employment type, benefits, skills, apply links,
posting metadata, and more.

To get that data, choose the Indeed country site, enter keywords, optionally add
a location, set how many jobs to save, and click **Start**. You can also run the
scraper through the Apify API, schedule it, or connect it to other tools.
It saves one row per job by default, so overlapping keywords, locations, and
pages do not fill your dataset with duplicate listings.

With Indeed Jobs Scraper, you can:

- Scrape Indeed job listings by job title, keyword, company, country, and
  location.
- Extract detailed job posting data, including description text and HTML when
  available.
- Collect salary ranges, company details, location fields, benefits, skills,
  apply URLs, and job URLs.
- Filter Indeed jobs by posting date, radius, job type, remote status, employer,
  salary period, and minimum salary.
- Run one country-wide search from the form or larger keyword/location matrices
  from JSON or API input.
- Save clean unique job listings with duplicate skips counted in the run
  summary.
- Download Indeed job data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- Check the run summary to see how many jobs were found, saved, skipped,
  duplicated, filtered, or stopped.

### What job listing data can I extract?

With this Actor, you can extract the following data from public Indeed job
postings:

|                            |                           |                       |
| -------------------------- | ------------------------- | --------------------- |
| 💼 Job title               | 🏢 Company name           | 📍 Job location       |
| 📝 Full description text   | 🧾 Description HTML       | 🔎 Description status |
| 💰 Salary range            | 💵 Salary currency        | ⏱ Salary period       |
| 🧑‍💻 Employment type         | 🪜 Seniority              | 🏠 Remote status      |
| 🎁 Benefits                | 🧰 Skills                 | 🚀 Apply link         |
| 🔗 Indeed job URL          | 🏷 Sponsored / Easy Apply | 📅 Posted date        |
| 🌎 Country and source site | 🔍 Search keyword         | 🧭 Search location    |
| 📊 Jobs saved              | ♻️ Duplicates skipped     | 🚦 Stop reason        |

Here are the main output groups:

| Data group              | Example fields                                                                                            |
| ----------------------- | --------------------------------------------------------------------------------------------------------- |
| 💼 Job details          | `jobId`, `title`, `employmentType`, `seniority`, `isRemote`, `isSponsored`, `isEasyApply`                 |
| 🏢 Company details      | `companyName`, `companyUrl`, `companyWebsite`, `companyIndustry`, `companyEmployees`, `companyRevenue`    |
| 📍 Location             | `locationRaw`, `locationCity`, `locationRegion`, `locationCountry`, `resolvedCountry`, `sourceSite`       |
| 💰 Salary               | `salaryRaw`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salarySource`                   |
| 📝 Description          | `descriptionSnippet`, `descriptionText`, `descriptionHtml`, `descriptionStatus`                           |
| 🚀 Links and enrichment | `benefits`, `skills`, `applyUrl`, `finalApplyUrl`, `jobUrl`                                               |
| 📊 Run summary          | `candidateItemsSeen`, `jobsSaved`, `duplicateCandidatesSeen`, `duplicatesSkipped`, warnings, `stopReason` |

Salary, benefits, skills, company profile fields, and final apply URLs depend on
what is available on each Indeed listing. If full job descriptions matter for
your workflow, check the `descriptionStatus` field in the output.

### Can I use this Actor through an API?

Yes. You can run Indeed Jobs Scraper manually in Apify Console or use it as an
API for Indeed job data.

Developers can call this Actor through:

- Apify API
- Python SDK
- Node.js SDK
- Webhooks
- Scheduled runs
- Apify integrations

This makes it useful for recruiting pipelines, dashboards, job boards,
warehouse loads, agents, and automated market research workflows.

### Why scrape Indeed?

Indeed is a large source of job market data. Scraping Indeed can help you track
hiring demand, salary signals, employer activity, and job-description language
across roles and locations.

Here are just some of the ways you could use Indeed job data:

|                               |                                                                          |
| ----------------------------- | ------------------------------------------------------------------------ |
| 📈 Monitor hiring trends      | Track demand by role, skill, location, company, or remote status.        |
| 💰 Benchmark salaries         | Compare salary ranges across markets and job families.                   |
| 🧲 Build recruiting workflows | Collect active job listings for sourcing, staffing, and lead generation. |
| 🏢 Track competitors          | Watch hiring activity, expansion signals, and technology adoption.       |
| 🧪 Research labor markets     | Analyze job descriptions, benefits, skills, and compensation signals.    |
| 🧱 Enrich job boards          | Feed clean Indeed job data into apps, databases, and career tools.       |

### Scrape Indeed salaries and full descriptions

Use Indeed Jobs Scraper when salary ranges, full descriptions, and job URLs are
the fields that matter most. Each saved row can include `salaryRaw`,
`salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`,
`descriptionText`, `descriptionHtml`, `descriptionStatus`, `applyUrl`, and
`jobUrl` when those values are available on the public listing.

### Indeed benefits and skills scraper

Indeed listings often include useful labor-market signals beyond the job title.
This Actor saves benefits, skills, employment type, seniority, remote status,
company fields, and posting metadata where available, so you can compare hiring
requirements across roles, markets, and employers.

### Indeed Jobs API for job listings

Indeed Jobs Scraper can be run manually in Apify Console or called as an API.
Use it from scheduled runs, webhooks, the Apify API, Python SDK, Node.js SDK, or
downstream warehouse jobs when you need repeatable Indeed job-listing data.

No Indeed account login or user-provided browser cookies are required.

### Clean, duplicate-free Indeed job datasets

Indeed search results can overlap across related keywords, locations, and pages.
For normal datasets, keep `saveOnlyUniqueItems` enabled so the Actor saves one
row per job and skips duplicate candidates before they become saved rows.

The `OUTPUT` summary shows `candidateItemsSeen`, `duplicateCandidatesSeen`,
`duplicatesSkipped`, and `jobsSaved`, so you can see how many matching rows were
found, how many were duplicates, and how many unique job listings were saved.
Turn unique-job mode off only when you intentionally want to measure keyword
overlap or search ranking behavior.

### How much does scraping Indeed cost?

Indeed Jobs Scraper uses a Pay-Per-Event pricing model. You are charged for
saved job listings.

The current price is **$1.50 per 1,000 saved job listings**, or **$0.0015 per
job listing**. For example:

| Saved job listings | Estimated Actor charge |
| ------------------ | ---------------------- |
| 100 jobs           | $0.15                  |
| 1,000 jobs         | $1.50                  |
| 10,000 jobs        | $15.00                 |

Check the **Pricing** tab for the current rate before production runs. Start
with `maxItems` between 10 and 100 if you want to test the output before running
larger searches. For normal runs, keep **Unique jobs only** enabled so duplicate
candidates are skipped before they become saved rows.

### How do I use Indeed Jobs Scraper?

Indeed Jobs Scraper was designed for an easy start even if you've never extracted
data from the web before. Here's how you can scrape Indeed job data with this
tool:

1. Create or log in to your Apify account.
2. Open **Indeed Jobs Scraper**.
3. Choose the Indeed country site to search.
4. Add a job title, keyword, skill, or company to search for.
5. Optionally add a location. Location narrows the keyword search; leave it
   empty for a country-wide search.
6. Set the maximum number of job listings to collect.
7. Add filters such as posted date, radius, job type, remote-only, employer
   exclusions, or salary filters if needed.
8. Click **Start** and wait for the data to be extracted.
9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ⬇️ Input

The input uses one main search flow:

1. Country
   Choose the Indeed country site to search.

2. Keywords
   Search Indeed by job titles/keywords inside the selected country.

3. Location
   Optionally enter a city, state, province, or region. Location narrows the
   keyword search; it is not a separate search mode. Leave it blank for
   country-wide results.

`Job listings to collect` is the shared cap for the whole run. All keywords and
the selected country/location share this same save limit.

You can also add optional filters for date, radius, job type, remote jobs,
employers, salary, and enrichment.

Here's a simple input example for a country-wide software engineer search in the
United States:

```json
{
    "searchTerm": "software engineer",
    "country": "us",
    "location": "",
    "postedWithinDays": "7",
    "radiusMiles": 25,
    "sortBy": "relevance",
    "maxItems": 25,
    "maxPagesPerSearch": 2,
    "balanceKeywordCoverage": true,
    "saveOnlyUniqueItems": true,
    "excludeCompanies": "",
    "salaryType": "any",
    "minSalary": 0,
    "followApplyRedirects": false,
    "scrapeCompanyDetails": false,
    "jobType": "any",
    "remoteOnly": false
}
````

Click on the **Input** tab for a full explanation of input in JSON.

#### Search terms

Use one job title, skill, company, or role family per line. Multiple distinct
search terms can help you collect broader job market data.

Good search terms:

```text
data engineer
analytics engineer
data scientist
```

Overlapping search terms can return the same job more than once. Keep
`saveOnlyUniqueItems` enabled unless you are measuring keyword overlap or search
ranking.

#### Locations and countries

Choose one Indeed country site first. Location is optional and narrows the
keyword search inside that country. For a country-wide search, leave the
location field empty.

Supported countries:

```text
Argentina, Australia, Austria, Bahrain, Belgium, Brazil, Canada, Chile, China,
Colombia, Costa Rica, Czech Republic, Denmark, Ecuador, Egypt, Finland, France,
Germany, Greece, Hong Kong, Hungary, India, Indonesia, Ireland, Israel, Italy,
Japan, Kuwait, Luxembourg, Malaysia, Mexico, Morocco, Netherlands, New Zealand,
Nigeria, Norway, Oman, Pakistan, Panama, Peru, Philippines, Poland, Portugal,
Qatar, Romania, Saudi Arabia, Singapore, South Africa, South Korea, Spain,
Sweden, Switzerland, Taiwan, Thailand, Turkey, Ukraine, United Arab Emirates,
United Kingdom, United States, Uruguay, Venezuela, Vietnam
```

#### Filters, quality controls, and enrichment

| Option                       | What it does                                                                    |
| ---------------------------- | ------------------------------------------------------------------------------- |
| `postedWithinDays`           | Keeps jobs from the selected freshness window.                                  |
| `radiusMiles`                | Searches around the selected location.                                          |
| `jobType`                    | Filters full-time, part-time, contract, or internship jobs.                     |
| `remoteOnly`                 | Returns remote jobs only.                                                       |
| `excludeCompanies`           | Skips matching employers and counts skipped rows in the run summary.            |
| `salaryType` and `minSalary` | Filters jobs by salary period and minimum salary when salary data is available. |
| `saveOnlyUniqueItems`        | Removes duplicate jobs from overlapping keywords, locations, and pages.         |
| `balanceKeywordCoverage`     | Gives each keyword a turn before going deeper into one keyword's pages.         |
| `followApplyRedirects`       | Adds the final employer or ATS apply URL when available. This is slower.        |
| `scrapeCompanyDetails`       | Adds company website, industry, size, revenue, and description when available.  |

### ⬆️ Output sample

The results will be wrapped into a dataset which you can find in the **Output**
tab. Each result is one saved Indeed job listing.

For easier postprocessing, export the results to one of the supported formats:
JSON, JSONL, CSV, Excel spreadsheet, XML, RSS, or HTML table.

Here's an example of the exported JSON output:

```json
{
    "jobId": "example-job-key",
    "title": "Junior Data Analyst",
    "companyName": "Example Company",
    "companyUrl": "https://www.indeed.com/cmp/example-company",
    "locationRaw": "London",
    "locationCity": "London",
    "locationRegion": "ENG",
    "locationCountry": "gb",
    "resolvedCountry": "gb",
    "sourceSite": "uk.indeed.com",
    "isRemote": false,
    "salaryRaw": "GBP 24,000-42,000 per year",
    "salaryMin": 24000,
    "salaryMax": 42000,
    "salaryCurrency": "GBP",
    "salaryPeriod": "year",
    "salarySource": "listing",
    "employmentType": "fulltime",
    "seniority": "junior",
    "descriptionSnippet": "Support data-driven decision-making processes...",
    "descriptionText": "Full job description text...",
    "descriptionHtml": "<p>Full job description HTML...</p>",
    "descriptionStatus": "full",
    "benefits": ["Example benefit"],
    "skills": ["SQL", "Python", "Power BI"],
    "applyUrl": "https://example.com/apply",
    "jobUrl": "https://uk.indeed.com/viewjob?jk=example-job-key",
    "query": "data analyst",
    "searchLocation": "London",
    "verifiedAt": "2026-06-21T02:15:24.063Z",
    "isExpired": false,
    "verificationSource": "search",
    "scrapedAt": "2026-06-21T02:15:24.063Z"
}
```

#### Run summary

Indeed Jobs Scraper also saves an `OUTPUT` summary in the default key-value store.
Use it to see why the final number of saved jobs changed.

```json
{
    "stopReason": "max_items_reached",
    "resolvedCountry": "gb",
    "sourceSite": "uk.indeed.com",
    "searchesQueued": 1,
    "pagesParsed": 1,
    "requestedMaxItems": 10,
    "candidateItemsSeen": 100,
    "jobsSaved": 10,
    "duplicateCandidatesSeen": 0,
    "duplicatesSkipped": 0,
    "rowsExcludedByCompany": 0,
    "rowsExcludedByDate": 0,
    "rowsExcludedBySalary": 0,
    "blockedPages": 0,
    "failedRequests": 0,
    "warnings": [],
    "statusMessage": "Saved 10 Indeed jobs."
}
```

### Why did I get fewer jobs than requested?

`maxItems` is a cap on saved rows, not a guarantee that every search has that
many matching jobs.

If your run saves fewer jobs than requested, check the `OUTPUT` summary. It
shows whether rows were skipped because of duplicates, employer exclusions, date
filters, salary filters, source exhaustion, page limits, failed requests, or
blocked pages.

Common reasons include:

- The selected role and location have fewer available jobs than `maxItems`.
- Strict filters removed many candidate rows.
- Multiple keywords returned the same jobs and unique-job mode skipped
  duplicates.
- The search depth limit was reached before enough unique matching jobs were
  found.

If you need more rows, increase `maxPagesPerSearch`, relax strict filters, add
more distinct keywords, expand the search radius, or search a broader location.

### Tips for scraping Indeed

- Start with a small test run and inspect the dataset before increasing
  `maxItems`.
- Use distinct keywords instead of near-duplicates.
- Keep `saveOnlyUniqueItems` enabled for normal datasets.
- Use `postedWithinDays` for fresh job monitoring.
- Enable `followApplyRedirects` only when you need the final apply destination.
- Enable `scrapeCompanyDetails` only when company profile enrichment matters.
- Check `descriptionStatus` when full job descriptions are important.

### FAQ

#### Does Indeed Jobs Scraper need login or cookies?

No. You do not need to provide an Indeed account, login session, or browser
cookies.

#### Can I use Indeed Jobs Scraper through an API?

Yes. Run it with the Apify API, Python SDK, Node.js SDK, webhooks, schedules, or
integrations. The dataset contains saved job rows and the `OUTPUT` key-value
store record contains the run summary.

#### Why are salaries, benefits, skills, or full descriptions sometimes missing?

Those fields depend on what Indeed exposes for each listing. Use
`descriptionStatus`, salary fields, and the run summary to separate complete
rows from partial rows.

#### How do I avoid duplicate jobs?

Keep `saveOnlyUniqueItems` enabled. The Actor saves one row per job across
overlapping keywords, locations, and pages. The `OUTPUT` summary reports
`candidateItemsSeen`, `duplicateCandidatesSeen`, `duplicatesSkipped`, and
`jobsSaved`, so you can audit how many candidates were found, skipped as
duplicates, and saved as unique job listings.

#### How much does it cost?

The current Actor charge is **$1.50 per 1,000 saved job listings**. Check the
Pricing tab before production runs because live Store pricing is the source of
truth.

### Is it legal to scrape Indeed?

This Actor extracts public job listing data. You are responsible for making sure
your use case complies with applicable laws, platform terms, and privacy rules.

Job listings can sometimes include personal data or contact details. You should
not scrape, store, or process personal data unless you have a legitimate reason
and the right legal basis. If you're unsure whether your reason is legitimate,
consult your lawyers.

Indeed is a trademark of its owner. This Actor is independent and is not
affiliated with, endorsed by, or sponsored by Indeed.

### Related job scrapers

- [LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)
  for LinkedIn job listings, search URLs, job IDs, Easy Apply signals, and job
  criteria.
- [Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper)
  for Indeed salaries, full descriptions, benefits, skills, and apply links.

### Support

If a run does not return what you expected, open an issue with the run ID and
the input you used. The run summary shows saved rows, skipped rows, filters,
warnings, and stop reason so support can be specific.

Related searches: Indeed scraper, Indeed jobs scraper, scrape Indeed jobs,
Indeed job listings, remove duplicate jobs, duplicate-free job scraper, unique
job listings, deduped job listings, job board deduplication, Indeed job
descriptions, Indeed full description scraper, Indeed salary scraper, Indeed
benefits and skills scraper, Indeed Jobs API, job market data, recruiting data,
HR analytics, salary benchmarking, job board data, company hiring signals.

# Actor input Schema

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

Choose the Indeed country site first. Keywords, Location, filters, and saved jobs all use this country.

## `searchTerm` (type: `string`):

Required. Search Indeed by job titles/keywords inside the selected country. Enter one job title, skill, company, or role group per line.

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

Optional. If filled, Indeed searches for Keywords AND this Location inside the selected country. Leave blank for country-wide results.

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

Total jobs to save for this run. All keywords and the selected country/location share this same limit.

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

Only keep jobs posted in this time window.

## `radiusMiles` (type: `integer`):

Search distance in miles when you enter a location.

## `sortBy` (type: `string`):

Choose the order for Indeed results.

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

Choose one job type, or keep Any.

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

Turn on to save only jobs that Indeed marks or describes as remote.

## `maxPagesPerSearch` (type: `integer`):

How many result pages to check for each keyword/location. Increase slowly for larger runs.

## `excludeCompanies` (type: `string`):

Optional. Enter one employer per line. Matching jobs are skipped and counted in the run summary.

## `salaryType` (type: `string`):

Optional salary-period filter. Rows without matching salary data are skipped when Salary period or Minimum salary is used.

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

Optional salary floor for the selected salary period. Use 0 to keep all salaries.

## `saveOnlyUniqueItems` (type: `boolean`):

Save each Indeed job only once, even if it appears from more than one keyword or page. Keep this on for normal runs.

## `balanceKeywordCoverage` (type: `boolean`):

Give each keyword a turn before going deeper. Useful when you enter more than one keyword.

## `followApplyRedirects` (type: `boolean`):

Adds the final employer or ATS destination when available. Slower because each apply link is checked.

## `scrapeCompanyDetails` (type: `boolean`):

Adds company website, industry, size, revenue, and description when available from the listing source.

## `requestDelayMillis` (type: `integer`):

Wait time between Indeed requests.

## Actor input object example

```json
{
  "country": "us",
  "searchTerm": "software engineer\ndata analyst\nsales representative",
  "location": "",
  "maxItems": 25,
  "postedWithinDays": "7",
  "radiusMiles": 25,
  "sortBy": "relevance",
  "jobType": "any",
  "remoteOnly": false,
  "maxPagesPerSearch": 2,
  "excludeCompanies": "",
  "salaryType": "any",
  "minSalary": 0,
  "saveOnlyUniqueItems": true,
  "balanceKeywordCoverage": true,
  "followApplyRedirects": false,
  "scrapeCompanyDetails": false,
  "requestDelayMillis": 2500
}
```

# Actor output Schema

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

No description

## `output` (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 = {
    "searchTerm": `software engineer
data analyst
sales representative`,
    "saveOnlyUniqueItems": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/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 = {
    "searchTerm": """software engineer
data analyst
sales representative""",
    "saveOnlyUniqueItems": True,
}

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/indeed-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerm": "software engineer\\ndata analyst\\nsales representative",
  "saveOnlyUniqueItems": true
}' |
apify call chronometrica/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=chronometrica/indeed-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Indeed Jobs Scraper",
        "description": "Scrape Indeed job listings by keyword, country, and location. Extract titles, companies, salaries, full descriptions, benefits, skills, posted dates, apply links, and job URLs. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
        "version": "1.2",
        "x-build-id": "2sC27l6rs3AcoEFux"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/chronometrica~indeed-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-chronometrica-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/chronometrica~indeed-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-chronometrica-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/chronometrica~indeed-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-chronometrica-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchTerm"
                ],
                "properties": {
                    "country": {
                        "title": "1. Country - Indeed site",
                        "enum": [
                            "ar",
                            "au",
                            "at",
                            "bh",
                            "be",
                            "br",
                            "ca",
                            "cl",
                            "cn",
                            "co",
                            "cr",
                            "cz",
                            "dk",
                            "ec",
                            "eg",
                            "fi",
                            "fr",
                            "de",
                            "gr",
                            "hk",
                            "hu",
                            "in",
                            "id",
                            "ie",
                            "il",
                            "it",
                            "jp",
                            "kw",
                            "lu",
                            "my",
                            "mx",
                            "ma",
                            "nl",
                            "nz",
                            "ng",
                            "no",
                            "om",
                            "pk",
                            "pa",
                            "pe",
                            "ph",
                            "pl",
                            "pt",
                            "qa",
                            "ro",
                            "sa",
                            "sg",
                            "za",
                            "kr",
                            "es",
                            "se",
                            "ch",
                            "tw",
                            "th",
                            "tr",
                            "ua",
                            "ae",
                            "gb",
                            "us",
                            "uy",
                            "ve",
                            "vn"
                        ],
                        "type": "string",
                        "description": "Choose the Indeed country site first. Keywords, Location, filters, and saved jobs all use this country.",
                        "default": "us"
                    },
                    "searchTerm": {
                        "title": "2. Keywords - search jobs",
                        "type": "string",
                        "description": "Required. Search Indeed by job titles/keywords inside the selected country. Enter one job title, skill, company, or role group per line."
                    },
                    "location": {
                        "title": "3. Location - optional filter",
                        "type": "string",
                        "description": "Optional. If filled, Indeed searches for Keywords AND this Location inside the selected country. Leave blank for country-wide results.",
                        "default": ""
                    },
                    "maxItems": {
                        "title": "Job listings to collect (shared cap)",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Total jobs to save for this run. All keywords and the selected country/location share this same limit.",
                        "default": 25
                    },
                    "postedWithinDays": {
                        "title": "Posted within",
                        "enum": [
                            "0",
                            "1",
                            "3",
                            "7",
                            "14",
                            "30"
                        ],
                        "type": "string",
                        "description": "Only keep jobs posted in this time window.",
                        "default": "7"
                    },
                    "radiusMiles": {
                        "title": "Search radius",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Search distance in miles when you enter a location.",
                        "default": 25
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "date",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "Choose the order for Indeed results.",
                        "default": "relevance"
                    },
                    "jobType": {
                        "title": "Job type",
                        "enum": [
                            "any",
                            "fulltime",
                            "parttime",
                            "contract",
                            "internship"
                        ],
                        "type": "string",
                        "description": "Choose one job type, or keep Any.",
                        "default": "any"
                    },
                    "remoteOnly": {
                        "title": "Remote jobs only",
                        "type": "boolean",
                        "description": "Turn on to save only jobs that Indeed marks or describes as remote.",
                        "default": false
                    },
                    "maxPagesPerSearch": {
                        "title": "Page depth",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "How many result pages to check for each keyword/location. Increase slowly for larger runs.",
                        "default": 2
                    },
                    "excludeCompanies": {
                        "title": "Skip employers",
                        "type": "string",
                        "description": "Optional. Enter one employer per line. Matching jobs are skipped and counted in the run summary.",
                        "default": ""
                    },
                    "salaryType": {
                        "title": "Salary period",
                        "enum": [
                            "any",
                            "year",
                            "hour",
                            "month",
                            "week",
                            "day"
                        ],
                        "type": "string",
                        "description": "Optional salary-period filter. Rows without matching salary data are skipped when Salary period or Minimum salary is used.",
                        "default": "any"
                    },
                    "minSalary": {
                        "title": "Minimum salary",
                        "minimum": 0,
                        "maximum": 10000000,
                        "type": "integer",
                        "description": "Optional salary floor for the selected salary period. Use 0 to keep all salaries.",
                        "default": 0
                    },
                    "saveOnlyUniqueItems": {
                        "title": "Unique jobs only (remove duplicates)",
                        "type": "boolean",
                        "description": "Save each Indeed job only once, even if it appears from more than one keyword or page. Keep this on for normal runs.",
                        "default": true
                    },
                    "balanceKeywordCoverage": {
                        "title": "Balance keyword coverage",
                        "type": "boolean",
                        "description": "Give each keyword a turn before going deeper. Useful when you enter more than one keyword.",
                        "default": true
                    },
                    "followApplyRedirects": {
                        "title": "Resolve final apply URLs",
                        "type": "boolean",
                        "description": "Adds the final employer or ATS destination when available. Slower because each apply link is checked.",
                        "default": false
                    },
                    "scrapeCompanyDetails": {
                        "title": "Add company profile fields",
                        "type": "boolean",
                        "description": "Adds company website, industry, size, revenue, and description when available from the listing source.",
                        "default": false
                    },
                    "requestDelayMillis": {
                        "title": "Delay between requests",
                        "minimum": 0,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Wait time between Indeed requests.",
                        "default": 2500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
