# Indeed Jobs Scraper: Salaries, Contacts & Apply URLs (`shadowextractor/indeed-jobs-intelligence-scraper`) Actor

Scrape Indeed jobs by keyword, location, URL, or job ID. Extract full descriptions, salaries, skills, public emails and phones, company profiles, logos, ATS providers, apply links, and listing changes.

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

## Pricing

from $2.29 / 1,000 indeed 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/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## 💼 Indeed Jobs Scraper: Salaries, Contacts & Apply URLs

Turn public Indeed listings into clean job-market data. Search by keyword and location, enrich known job URLs or IDs, normalize salaries, extract skills and public contacts, identify apply destinations, build company summaries, and monitor listing changes between runs.

> **Data availability:** fields are returned only when they are publicly available for the selected listing, country, and enrichment options. Use **Compact clean results** to omit unavailable fields automatically.

### ✨ What you can collect

- Job title, company, location, job type, remote status, and posting date
- Full job descriptions, requirements, benefits, shifts, and schedules
- Salary text plus normalized min, max, currency, unit, and annual values
- Skills grouped from the public job content
- Public email addresses and phone numbers found in job or company content
- Company website, social links, rating, size, industry, revenue, addresses, logos, and photos when published
- Indeed Apply or external application links with ATS detection
- Candidate-to-job skill match and salary-fit signals
- New, updated, reposted, unchanged, and expired listing monitoring
- Separate jobs, contacts, companies, errors, changes, and run-summary outputs

### 🚀 Quick start

1. Open the Actor **Input** tab.
2. Choose **Search jobs**.
3. Add a job title or keyword such as `python developer`.
4. Add one or more locations such as `New York, NY`.
5. Choose the Indeed country.
6. Set the number of jobs.
7. Select **Fast listing cards** for discovery or **Full details, contacts & media** for richer records.
8. Start the run and open the **Jobs**, **Contacts**, or **Job details** output.

#### Recommended first run

```json
{
  "mode": "SEARCH",
  "country": "us",
  "queries": ["python developer"],
  "locations": ["New York, NY"],
  "maxResults": 10,
  "maxPagesPerSearch": 1,
  "postedWithinDays": "7",
  "sort": "date",
  "enrichmentMode": "fast",
  "outputMode": "compact"
}
````

### 🧭 Three workflows

#### 1. Search jobs

Use `SEARCH` to discover listings from keyword and location combinations or from complete Indeed search URLs.

```text
queries × locations
        ↓
Indeed result pages
        ↓
clean job rows
        ↓ optional full enrichment
details + contacts + salary + skills + apply data
```

Every query is combined with every location. For example, 2 queries and 3 locations create 6 search combinations. `maxResults` remains the global result limit for the run.

#### 2. Enrich job URLs or IDs

Use `DETAIL` when you already know the listings you need. Provide direct Indeed job URLs in `startUrls` or job keys in `jobIds`.

```json
{
  "mode": "DETAIL",
  "country": "us",
  "startUrls": [
    { "url": "https://www.indeed.com/viewjob?jk=de07417d37bb4b34" }
  ],
  "jobIds": [],
  "maxResults": 10,
  "enrichmentMode": "full",
  "outputMode": "compact"
}
```

`DETAIL` requires at least one direct job URL or job ID. Country is used to build a matching Indeed detail URL for raw job IDs.

#### 3. Auto detect

Use `AUTO` to let the Actor choose from your input:

- search queries or search URLs select search mode
- direct URLs or job IDs select detail mode when no search input is present
- mixed input can collect search results and direct listings in one run
- empty input uses a safe sample search for `python developer` in `New York, NY`

### 📬 Choose your data depth

| Capability | Fast listing cards | Full details |
|---|:---:|:---:|
| Title, company, location | ✅ | ✅ |
| Visible salary and posting data | ✅ | ✅ |
| Full description | Limited | ✅ |
| Requirements and benefits | Limited | ✅ |
| Public job contacts | Limited | Best coverage |
| Skill extraction | From available card text | From full description |
| Apply metadata | When visible | Best coverage |
| Requests per job | Lower | Higher |

Use `enrichmentMode: "fast"` for broad discovery. Use `enrichmentMode: "full"` when descriptions, contacts, skills, or apply data matter.

### 🌍 Supported Indeed countries

| Value | Country |
|---|---|
| `us` | United States |
| `gb` | United Kingdom |
| `ca` | Canada |
| `au` | Australia |
| `de` | Germany |
| `fr` | France |
| `nl` | Netherlands |
| `es` | Spain |
| `it` | Italy |
| `br` | Brazil |
| `in` | India |
| `sg` | Singapore |
| `za` | South Africa |

Use the country matching the listing or search domain for the most predictable URLs, filters, salary currency, and locale.

### 🎛️ Search controls

| Input | Purpose |
|---|---|
| `queries` | Job titles, skills, employers, or search terms |
| `locations` | Cities, states, countries, or `Remote` |
| `maxResults` | Global maximum number of job rows |
| `maxPagesPerSearch` | Pagination limit for each query/location or search URL |
| `postedWithinDays` | Any time or last 1, 3, 7, 14, or 30 days |
| `jobType` | Full-time, part-time, contract, temporary, internship, or commission |
| `remote` | Remote, hybrid, on-site, or any |
| `radius` | Search radius from 0 to 100 miles where supported |
| `sort` | Relevance or newest first |
| `dedupe` | Remove repeated listings across searches |

Indeed filters vary by country. The remote and radius controls are best-effort and may behave differently across local Indeed domains.

### 🧠 Enrichment options

#### Normalize salary

`normalizeSalary: true` converts a visible salary label into analysis-friendly fields:

- `salaryMin`
- `salaryMax`
- `salaryCurrency`
- `salaryUnit`
- `salaryAnnualMin`
- `salaryAnnualMax`
- `salaryConfidence`

When no public salary is present, salary fields are omitted in compact output.

#### Extract skills

`extractSkills: true` groups recognized skills from the available description and attributes. Full details provides the best input text.

#### Resolve apply URLs

`resolveApplyUrls: true` follows an available application link and adds the final destination when it can be resolved:

- `applyUrl`
- `externalApplyUrl`
- `finalApplyUrl`
- `atsProvider`
- `applyUrlStatus`

Keep this off for fast job discovery. Some listings use Indeed Apply and do not expose a separate employer or ATS URL.

#### Add company profile data

`enrichCompanyProfiles: true` can add public employer information such as:

- website and social links
- logo, header image, and company photos
- industry, company size, revenue, and founded data
- rating and company description
- addresses and public company contacts

Availability differs by company. This option adds work per unique employer, so enable it only when company intelligence is useful.

#### Candidate matching

Add at least one target skill to `candidateProfile`:

```json
{
  "candidateProfile": {
    "skills": ["python", "sql", "aws"],
    "targetSalaryAnnual": 120000
  }
}
```

Each matching job can receive:

```json
{
  "candidateFit": {
    "matchScore": 66.67,
    "matchedSkills": ["python", "sql"],
    "missingSkills": ["aws"],
    "salaryFit": true
  }
}
```

This is a transparent rule-based comparison, not an employment decision or ranking recommendation.

### 📥 Complete examples

#### Full jobs with public contacts

```json
{
  "mode": "SEARCH",
  "country": "us",
  "queries": ["account executive", "sales representative"],
  "locations": ["Austin, TX", "Remote"],
  "maxResults": 50,
  "maxPagesPerSearch": 3,
  "postedWithinDays": "7",
  "sort": "date",
  "enrichmentMode": "full",
  "normalizeSalary": true,
  "extractSkills": true,
  "resolveApplyUrls": false,
  "enrichCompanyProfiles": false,
  "outputMode": "compact"
}
```

#### Company intelligence and media

```json
{
  "mode": "SEARCH",
  "country": "gb",
  "queries": ["data analyst"],
  "locations": ["London"],
  "maxResults": 25,
  "enrichmentMode": "full",
  "enrichCompanyProfiles": true,
  "normalizeSalary": true,
  "extractSkills": true,
  "outputMode": "compact"
}
```

#### Search from an Indeed URL

```json
{
  "mode": "SEARCH",
  "country": "us",
  "queries": [],
  "locations": [],
  "startUrls": [
    { "url": "https://www.indeed.com/jobs?q=product+manager&l=Chicago%2C+IL" }
  ],
  "maxResults": 50,
  "maxPagesPerSearch": 3,
  "enrichmentMode": "full"
}
```

#### Monitor a repeatable search

```json
{
  "mode": "SEARCH",
  "country": "us",
  "queries": ["machine learning engineer"],
  "locations": ["San Francisco, CA"],
  "maxResults": 100,
  "maxPagesPerSearch": 5,
  "postedWithinDays": "30",
  "sort": "date",
  "enrichmentMode": "full",
  "enableDeltaMonitoring": true,
  "outputMode": "compact"
}
```

Use the same Actor task and equivalent input on later runs so the comparison represents the same market slice.

### 📤 Output views

#### 💼 Jobs

The clean default table with company image, title, company, location, salary, remote status, job type, date, contact preview, and canonical URL.

#### 📇 Contacts

Focuses on public contact and company-link fields:

- primary email and phone
- all email and phone values
- contact count
- company website and social links
- job and company context

#### 🏢 Companies & media

Shows public company profile and image fields attached to job rows. Enable `enrichCompanyProfiles` for the richest coverage.

#### 📊 Company summary

One aggregated row per employer in the separate `companies` dataset:

- open jobs count
- top roles and locations
- average annual salary when available
- remote share
- top skills
- public company contacts and profile fields

#### 📄 Job details

Full descriptions, requirements, benefits, work systems, extracted skills, normalized salary, and source URL.

#### 🔗 Apply links

Application status, ATS provider, source apply link, external destination, and final resolved URL.

#### ⚠️ Errors

Recoverable page-level diagnostics live in the separate `errors` dataset. They are not mixed into normal job rows. If no jobs can be collected, the default dataset receives one clearly labeled diagnostic row so the Output tab does not look silently empty.

#### 📈 Run summary

One row in the separate `summary` dataset with counts, quality rates, pages and details processed, source issue status, runtime, and timestamps.

#### 🧩 Complete job data

The curated complete job schema for inspection and integrations. Apify also adds its own system **All fields** tab, which displays every key physically present in the dataset. Use **Complete job data** for the Actor's stable field order and the system **All fields** tab only for raw inspection.

### 🧾 Example compact job

```json
{
  "type": "job",
  "jobKey": "de07417d37bb4b34",
  "title": "Senior Python Engineer",
  "companyName": "Example Labs",
  "companyImageUrl": "https://example.com/company-logo.png",
  "location": "New York, NY",
  "remoteType": "hybrid",
  "salaryText": "$130,000 - $165,000 a year",
  "salaryCurrency": "USD",
  "salaryUnit": "year",
  "salaryMin": 130000,
  "salaryMax": 165000,
  "salaryAnnualMin": 130000,
  "salaryAnnualMax": 165000,
  "employmentType": ["FULL_TIME"],
  "descriptionSnippet": "Build reliable data services...",
  "extractedSkills": {
    "all": ["AWS", "Python", "SQL"]
  },
  "applyUrlStatus": "external",
  "atsProvider": "Greenhouse",
  "canonicalUrl": "https://www.indeed.com/viewjob?jk=de07417d37bb4b34"
}
```

This is an illustrative record. Exact values and fields depend on the public listing and selected options.

### 📦 Compact vs full output

#### Compact clean results

Recommended for people, spreadsheets, and most automations. Empty strings, empty arrays, empty objects, and unavailable fields are omitted.

```json
{
  "outputMode": "compact"
}
```

#### Full stable schema

Recommended when downstream code requires the same keys in every row. Unavailable values remain as stable empty collections or `null` placeholders.

```json
{
  "outputMode": "full"
}
```

### 🔄 Delta monitoring

With `enableDeltaMonitoring: true`, the Actor compares the current result set with the previous state stored for the task.

Possible `changeStatus` values:

- `new`
- `updated`
- `reposted`
- `unchanged`
- `expired`

Changed or expired records are written to the separate `changes` dataset. The main job row also receives `changeStatus`, and updated jobs can include `changedFields`.

The first monitoring run establishes the baseline. Use stable queries, locations, filters, and limits between runs; changing the search can make unrelated jobs appear new or expired.

### ✅ Data-quality behavior

- Duplicate job keys and equivalent title/company/location rows can be removed with `dedupe`.
- Detail enrichment keeps the original search card if an individual detail page is temporarily unavailable.
- Compact mode removes unavailable values instead of showing filler text.
- Public contacts are never guessed.
- Salary normalization runs only on salary text published by the source.
- Error rows are separated from successful jobs.
- `maxResults` is an upper limit. The final count can be lower when fewer matching public jobs exist.

### 💡 Recommended settings

| Goal | Recommended settings |
|---|---|
| Fast market scan | `SEARCH`, `fast`, 1-3 pages, compact output |
| Full job export | `SEARCH`, `full`, salary and skills enabled |
| Contact discovery | `full`, compact output, company profiles only if needed |
| Apply-link research | `full`, `resolveApplyUrls: true` |
| Employer intelligence | `full`, `enrichCompanyProfiles: true` |
| Known listing enrichment | `DETAIL` with job URLs or IDs |
| Change monitoring | Repeatable search plus `enableDeltaMonitoring: true` |
| Stable database schema | `outputMode: "full"` |

### ❓ FAQ

#### Why are some fields missing?

Indeed does not publish every field for every listing or country. Full enrichment improves coverage, but it cannot create data that is not public.

#### Why are there no email addresses or phone numbers?

Many employers route applications through Indeed or an ATS and publish no direct contact information. The Actor returns contacts only when found in public job or company content.

#### Why does the apply URL still point to Indeed?

The listing may use Indeed Apply or may not expose an external destination. Enable `resolveApplyUrls` to follow an available apply path, but some jobs legitimately remain on Indeed.

#### Why did a DETAIL run return nothing?

Check that `startUrls` contains a public job URL or `jobIds` contains a valid Indeed job key. Expired or removed listings may no longer provide a job record.

#### Can I mix search URLs and direct job URLs?

Yes. Mixed input can collect both. Keep `maxResults` high enough for the combined run and leave deduplication enabled.

#### How do I avoid `null` and empty placeholders?

Use `outputMode: "compact"`, which is the default.

#### Can I export to CSV or Excel?

Yes. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

### ⚖️ Responsible use

Use public job and company data responsibly. Follow applicable privacy, employment, anti-spam, copyright, and data-protection requirements. Candidate matching fields are analytical helpers and should not be used as the sole basis for employment decisions.

### 🏷️ Good for

`Indeed jobs` · `job scraping` · `salary intelligence` · `public contacts` · `ATS links` · `company intelligence` · `skills extraction` · `job monitoring` · `recruiting automation`

# Actor input Schema

## `mode` (type: `string`):

Choose Search jobs to discover listings, Direct job details when you already have URLs or IDs, or Auto detect to let the actor choose from your input.

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

Indeed country/domain to use for generated search and detail URLs.

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

Job titles or keywords for SEARCH mode. Add one or many terms such as software engineer, nurse, data analyst, or customer support.

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

Cities, states, countries, or Remote. Each search query is combined with each location.

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

Maximum number of paid job results saved to the default dataset.

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

Paste direct job URLs or Indeed search URLs. Direct job URLs work best with the Full details option below.

## `jobIds` (type: `array`):

Indeed job keys such as de07417d37bb4b34.

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

Pagination safety limit per query/location or search URL. Increase for larger searches.

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

Indeed date filter. Leave empty to avoid a date filter.

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

Indeed job type filter.

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

Remote preference. Best-effort because Indeed varies filters by country.

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

Search radius in miles for Indeed domains that support it.

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

Sort order for generated search URLs.

## `enrichmentMode` (type: `string`):

Fast returns listing cards only. Full details adds the complete description, public emails and phones, available company images, salary data, requirements, benefits, skills, and apply links.

## `normalizeSalary` (type: `boolean`):

Parse salary text into min/max/unit/currency and annualized fields.

## `extractSkills` (type: `boolean`):

Extract skills from job descriptions and attributes using rule-based dictionaries.

## `resolveApplyUrls` (type: `boolean`):

Follow an available apply link to identify the final employer or ATS destination. Keep it off when you only need listing data.

## `enrichCompanyProfiles` (type: `boolean`):

Add public employer metadata such as website, social links, rating, size, industry, description, logo, header image, addresses, and company-level contacts when Indeed publishes them.

## `candidateProfile` (type: `object`):

Optional matching input. Add target skills and salary to get a basic candidateFit object on each job.

## `dedupe` (type: `boolean`):

Skip duplicate job keys/canonical URLs and title/company/location duplicates.

## `outputMode` (type: `string`):

Compact keeps only populated fields for a clean table. Full keeps a stable wide schema with empty placeholders for integrations.

## `enableDeltaMonitoring` (type: `boolean`):

Compare the current run with the previous run stored in the default key-value store. Keep off for random tests.

## `rawOutput` (type: `boolean`):

Include selected raw parser/debug fields. This can increase dataset size and is usually only useful for development.

## `maxConcurrency` (type: `integer`):

Maximum number of source requests processed at once. The default is recommended for normal runs.

## `maxRetries` (type: `integer`):

Retry budget for temporary source or connection errors.

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

Connection settings for cloud and local runs. Keep the default configuration for normal use.

## Actor input object example

```json
{
  "mode": "SEARCH",
  "country": "us",
  "queries": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxResults": 10,
  "startUrls": [],
  "jobIds": [],
  "maxPagesPerSearch": 1,
  "postedWithinDays": "7",
  "jobType": "",
  "remote": "",
  "radius": 25,
  "sort": "date",
  "enrichmentMode": "full",
  "normalizeSalary": true,
  "extractSkills": true,
  "resolveApplyUrls": false,
  "enrichCompanyProfiles": false,
  "candidateProfile": {
    "skills": [
      "python",
      "sql",
      "aws"
    ],
    "targetSalaryAnnual": 120000
  },
  "dedupe": true,
  "outputMode": "compact",
  "enableDeltaMonitoring": false,
  "rawOutput": false,
  "maxConcurrency": 6,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `contacts` (type: `string`):

No description

## `companiesAndMedia` (type: `string`):

No description

## `companySummary` (type: `string`):

No description

## `jobDetails` (type: `string`):

No description

## `applyLinks` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `runSummary` (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 = {
    "mode": "SEARCH",
    "country": "us",
    "queries": [
        "python developer"
    ],
    "locations": [
        "New York, NY"
    ],
    "maxResults": 10,
    "jobIds": [],
    "maxPagesPerSearch": 1,
    "postedWithinDays": "7",
    "jobType": "",
    "remote": "",
    "radius": 25,
    "sort": "date",
    "enrichmentMode": "full",
    "normalizeSalary": true,
    "extractSkills": true,
    "resolveApplyUrls": false,
    "enrichCompanyProfiles": false,
    "candidateProfile": {
        "skills": [],
        "targetSalaryAnnual": null
    },
    "dedupe": true,
    "outputMode": "compact",
    "enableDeltaMonitoring": false,
    "rawOutput": false,
    "maxConcurrency": 6,
    "maxRetries": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("shadowextractor/indeed-jobs-intelligence-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 = {
    "mode": "SEARCH",
    "country": "us",
    "queries": ["python developer"],
    "locations": ["New York, NY"],
    "maxResults": 10,
    "jobIds": [],
    "maxPagesPerSearch": 1,
    "postedWithinDays": "7",
    "jobType": "",
    "remote": "",
    "radius": 25,
    "sort": "date",
    "enrichmentMode": "full",
    "normalizeSalary": True,
    "extractSkills": True,
    "resolveApplyUrls": False,
    "enrichCompanyProfiles": False,
    "candidateProfile": {
        "skills": [],
        "targetSalaryAnnual": None,
    },
    "dedupe": True,
    "outputMode": "compact",
    "enableDeltaMonitoring": False,
    "rawOutput": False,
    "maxConcurrency": 6,
    "maxRetries": 3,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("shadowextractor/indeed-jobs-intelligence-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 '{
  "mode": "SEARCH",
  "country": "us",
  "queries": [
    "python developer"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxResults": 10,
  "jobIds": [],
  "maxPagesPerSearch": 1,
  "postedWithinDays": "7",
  "jobType": "",
  "remote": "",
  "radius": 25,
  "sort": "date",
  "enrichmentMode": "full",
  "normalizeSalary": true,
  "extractSkills": true,
  "resolveApplyUrls": false,
  "enrichCompanyProfiles": false,
  "candidateProfile": {
    "skills": [],
    "targetSalaryAnnual": null
  },
  "dedupe": true,
  "outputMode": "compact",
  "enableDeltaMonitoring": false,
  "rawOutput": false,
  "maxConcurrency": 6,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call shadowextractor/indeed-jobs-intelligence-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Indeed Jobs Scraper: Salaries, Contacts & Apply URLs",
        "description": "Scrape Indeed jobs by keyword, location, URL, or job ID. Extract full descriptions, salaries, skills, public emails and phones, company profiles, logos, ATS providers, apply links, and listing changes.",
        "version": "0.1",
        "x-build-id": "DkUrjcFu5ZSsYFg5F"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shadowextractor~indeed-jobs-intelligence-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shadowextractor-indeed-jobs-intelligence-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/shadowextractor~indeed-jobs-intelligence-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shadowextractor-indeed-jobs-intelligence-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/shadowextractor~indeed-jobs-intelligence-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shadowextractor-indeed-jobs-intelligence-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",
                "properties": {
                    "mode": {
                        "title": "🧭 What do you want to do?",
                        "enum": [
                            "AUTO",
                            "SEARCH",
                            "DETAIL"
                        ],
                        "type": "string",
                        "description": "Choose Search jobs to discover listings, Direct job details when you already have URLs or IDs, or Auto detect to let the actor choose from your input.",
                        "default": "AUTO"
                    },
                    "country": {
                        "title": "🌎 Indeed country",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "de",
                            "fr",
                            "nl",
                            "es",
                            "it",
                            "br",
                            "in",
                            "sg",
                            "za"
                        ],
                        "type": "string",
                        "description": "Indeed country/domain to use for generated search and detail URLs.",
                        "default": "us"
                    },
                    "queries": {
                        "title": "🔎 Search query / job title",
                        "type": "array",
                        "description": "Job titles or keywords for SEARCH mode. Add one or many terms such as software engineer, nurse, data analyst, or customer support.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "python developer"
                        ]
                    },
                    "locations": {
                        "title": "📍 Location(s)",
                        "type": "array",
                        "description": "Cities, states, countries, or Remote. Each search query is combined with each location.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "New York, NY"
                        ]
                    },
                    "maxResults": {
                        "title": "💯 Number of jobs to extract",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of paid job results saved to the default dataset.",
                        "default": 10
                    },
                    "startUrls": {
                        "title": "🔗 Indeed URLs",
                        "type": "array",
                        "description": "Paste direct job URLs or Indeed search URLs. Direct job URLs work best with the Full details option below.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "jobIds": {
                        "title": "🧾 Job IDs",
                        "type": "array",
                        "description": "Indeed job keys such as de07417d37bb4b34.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "maxPagesPerSearch": {
                        "title": "📄 Pages per search",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Pagination safety limit per query/location or search URL. Increase for larger searches.",
                        "default": 1
                    },
                    "postedWithinDays": {
                        "title": "🗓️ Posted within",
                        "enum": [
                            "",
                            "1",
                            "3",
                            "7",
                            "14",
                            "30"
                        ],
                        "type": "string",
                        "description": "Indeed date filter. Leave empty to avoid a date filter.",
                        "default": "7"
                    },
                    "jobType": {
                        "title": "💼 Job type",
                        "enum": [
                            "",
                            "fulltime",
                            "parttime",
                            "contract",
                            "temporary",
                            "internship",
                            "commission"
                        ],
                        "type": "string",
                        "description": "Indeed job type filter.",
                        "default": ""
                    },
                    "remote": {
                        "title": "🏠 Remote filter",
                        "enum": [
                            "",
                            "remote",
                            "hybrid",
                            "on_site"
                        ],
                        "type": "string",
                        "description": "Remote preference. Best-effort because Indeed varies filters by country.",
                        "default": ""
                    },
                    "radius": {
                        "title": "📏 Search radius",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Search radius in miles for Indeed domains that support it.",
                        "default": 25
                    },
                    "sort": {
                        "title": "↕️ Sort results",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Sort order for generated search URLs.",
                        "default": "relevance"
                    },
                    "enrichmentMode": {
                        "title": "📬 Data depth",
                        "enum": [
                            "fast",
                            "full"
                        ],
                        "type": "string",
                        "description": "Fast returns listing cards only. Full details adds the complete description, public emails and phones, available company images, salary data, requirements, benefits, skills, and apply links.",
                        "default": "fast"
                    },
                    "normalizeSalary": {
                        "title": "💰 Normalize salary",
                        "type": "boolean",
                        "description": "Parse salary text into min/max/unit/currency and annualized fields.",
                        "default": true
                    },
                    "extractSkills": {
                        "title": "🧠 Extract skills",
                        "type": "boolean",
                        "description": "Extract skills from job descriptions and attributes using rule-based dictionaries.",
                        "default": true
                    },
                    "resolveApplyUrls": {
                        "title": "🔗 Resolve apply URLs",
                        "type": "boolean",
                        "description": "Follow an available apply link to identify the final employer or ATS destination. Keep it off when you only need listing data.",
                        "default": false
                    },
                    "enrichCompanyProfiles": {
                        "title": "🏢 Add company profile data",
                        "type": "boolean",
                        "description": "Add public employer metadata such as website, social links, rating, size, industry, description, logo, header image, addresses, and company-level contacts when Indeed publishes them.",
                        "default": false
                    },
                    "candidateProfile": {
                        "title": "🎯 Candidate profile",
                        "type": "object",
                        "description": "Optional matching input. Add target skills and salary to get a basic candidateFit object on each job.",
                        "default": {
                            "skills": [],
                            "targetSalaryAnnual": null
                        }
                    },
                    "dedupe": {
                        "title": "🧹 Deduplicate jobs",
                        "type": "boolean",
                        "description": "Skip duplicate job keys/canonical URLs and title/company/location duplicates.",
                        "default": true
                    },
                    "outputMode": {
                        "title": "📦 Output mode",
                        "enum": [
                            "compact",
                            "full"
                        ],
                        "type": "string",
                        "description": "Compact keeps only populated fields for a clean table. Full keeps a stable wide schema with empty placeholders for integrations.",
                        "default": "compact"
                    },
                    "enableDeltaMonitoring": {
                        "title": "🔁 Delta monitoring",
                        "type": "boolean",
                        "description": "Compare the current run with the previous run stored in the default key-value store. Keep off for random tests.",
                        "default": false
                    },
                    "rawOutput": {
                        "title": "🧪 Include raw debug fields",
                        "type": "boolean",
                        "description": "Include selected raw parser/debug fields. This can increase dataset size and is usually only useful for development.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "⚡ Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of source requests processed at once. The default is recommended for normal runs.",
                        "default": 6
                    },
                    "maxRetries": {
                        "title": "🔄 Max retries",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Retry budget for temporary source or connection errors.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Connection settings",
                        "type": "object",
                        "description": "Connection settings for cloud and local runs. Keep the default configuration for normal use.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
