# Indeed All-in-One Scraper: Jobs, Salary & Company Data (`trakk/indeed-all-in-one`) Actor

Scrape Indeed jobs in 60+ countries with full detail: salary (normalized to yearly), skills, benefits, company profile, employee reviews with star rating and pros/cons, plus recruiter emails & phones. Rich filters, 6 export views. No account.

- **URL**: https://apify.com/trakk/indeed-all-in-one.md
- **Developed by:** [Kelopr_bk](https://apify.com/trakk) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 💼 Indeed All-in-One Scraper — Jobs, Salaries, Companies, Reviews & Contacts

> 🧭 **One Actor for the whole Indeed job market.** Search jobs by keyword in **60+ countries**, pull the full job detail, enrich every posting with the company profile and employee reviews, and extract recruiter contacts — in one clean, export-ready dataset.

Find jobs by **title or keyword**, filter hard (salary, remote, job type, seniority, company, date), and get back everything Indeed exposes: the full description, salary (normalised to a yearly range), skills, benefits, location, apply links, company profile and **employee reviews with the star rating and pros/cons** — plus **emails and phone numbers** pulled out of the posting for lead generation. No account, no cookies.

> **Know what you want?** Use **Search + full detail** and type a title. **Just scanning the market?** Use **Search** for fast, cheap job cards. **Have job links?** Use **Job detail**.

***

### 🚀 Start your first run

1. Open the Actor's **Input** tab.
2. Choose a **Mode**:
   - **🔎 Search** — fast job cards: title, company, salary, rating, location, remote, posted date.
   - **⭐ Search + full detail** — everything above **plus** full description, skills, benefits, company profile, reviews and extracted contacts.
   - **📄 Job detail** — the full record for specific job keys / URLs.
3. Type one or more **Search queries** (e.g. `software engineer`), a **Location**, and pick a **Country** (60+ supported).
4. Set **Max results**, tune the **filters**, and click **Start**.
5. Open **Output** and switch between **Jobs overview, Company overview, Salary & benefits, Location & remote, Contacts & hiring signals, Company reviews** — or **All fields**. Export any view to CSV, Excel or JSON.

```json
{ "mode": "SEARCH_DETAIL", "searchQueries": ["software engineer"], "location": "New York, NY", "country": "US", "maxResults": 100 }
```

The default memory is **1 GB**. Invalid or empty input finishes safely with a message instead of crashing.

***

### 🎯 Choose a mode

| Mode | What it collects | Recommended use |
|---|---|---|
| 🔎 `SEARCH` | Job cards: title, company, salary, rating, location, remote, job type, skills, posted date, hiring signals | Fast market scans and price-of-talent research |
| ⭐ `SEARCH_DETAIL` | Everything from Search **plus** full description, benefits, company profile, employee reviews and extracted contacts | All-in-one job + company + lead intelligence |
| 📄 `JOB_DETAIL` | Full record for specific `jobKeys` or Indeed URLs | Enriching a known list of postings |

**Search + full detail** filters first, then enriches only the jobs that pass your filters — so you never pay to enrich rows you filtered out.

***

### 🌍 60+ countries

The **Country** field covers 60+ Indeed markets — US, UK, Canada, Australia, India, Germany, France, Spain, Italy, Netherlands, Brazil, Mexico, Poland, Ireland, New Zealand, Singapore, Japan, UAE, Saudi Arabia, South Africa, and many more. Pick one country per run; results, salary currency and locations come back for that market.

***

### 📋 Copy-paste examples

#### Fresh remote senior roles, well paid

```json
{
  "mode": "SEARCH_DETAIL",
  "searchQueries": ["backend engineer"],
  "country": "US",
  "remote": true,
  "experienceLevel": "senior_level",
  "postedWithinDays": "3",
  "minSalary": 150000,
  "maxResults": 100
}
```

#### Recruiter lead list (contacts) excluding agencies

```json
{
  "mode": "SEARCH_DETAIL",
  "searchQueries": ["warehouse associate"],
  "location": "Dallas, TX",
  "country": "US",
  "extractContacts": true,
  "excludeCompanies": ["staffing", "recruiting", "agency"],
  "maxResults": 200
}
```

#### Company + reviews research for one employer

```json
{
  "mode": "SEARCH_DETAIL",
  "searchQueries": ["data analyst"],
  "companies": ["Intuit"],
  "country": "US",
  "includeReviews": true,
  "maxReviews": 25
}
```

#### Specific jobs by URL / key

```json
{ "mode": "JOB_DETAIL", "jobKeys": ["1387461f66e12d27", "https://www.indeed.com/viewjob?jk=..."] }
```

***

### 🎛️ Input reference

#### Search & locale

| Field | Default | Meaning |
|---|---:|---|
| `mode` | `SEARCH_DETAIL` | `SEARCH`, `SEARCH_DETAIL`, `JOB_DETAIL` |
| `searchQueries` | `[]` | Titles/keywords, one per row |
| `location` | — | City, state, ZIP or region |
| `country` | `US` | One of 60+ Indeed markets |
| `maxResults` | `100` | Jobs saved for the whole run |
| `sortBy` | `relevance` | `relevance` or `date` |
| `radius` | default | Miles/km from the location |

#### Filters (applied before billing)

| Field | What it does |
|---|---|
| `postedWithinDays` | 24h / 3 / 7 / 14 days |
| `jobType` | full-time, part-time, contract, internship, temporary |
| `remote` | remote jobs only |
| `experienceLevel` | entry / mid / senior |
| `minSalary` | minimum **annualised** pay |
| `minCompanyRating` | minimum employer star rating |
| `titleKeywords` / `excludeKeywords` | require / drop words in the title |
| `companies` / `excludeCompanies` | keep / drop employers (e.g. staffing agencies) |

Filtered-out jobs are **not saved and never charged**.

#### Enrichment

| Field | Default | Meaning |
|---|---:|---|
| `includeDetails` | `true` | Full description + structured detail |
| `parseCompanyDetails` | `true` | Company profile (industry, size, revenue, HQ, rating) |
| `includeReviews` | `true` | Employee reviews (text + title + date), company star rating, pros & cons |
| `maxReviews` | `10` | Reviews per company |
| `extractContacts` | `true` | Master switch for pulling contacts from the description |

#### Contact filters (lead-gen)

| Field | Meaning |
|---|---|
| `extractEmails` / `extractPhones` | Turn email or phone extraction on/off independently |
| `onlyWithEmail` | Keep only jobs that expose an email |
| `onlyWithPhone` | Keep only jobs that expose a phone number |
| `onlyWithContact` | Keep only jobs with an email **or** a phone |
| `excludeEmails` | Blacklist — drop jobs whose email matches an address or domain (e.g. `@indeed.com`) |
| `excludePhones` | Blacklist — drop jobs whose phone matches a number (digits compared) |

Contacts live in the job description, so any contact filter automatically fetches full detail. Jobs filtered out by a contact filter are **not saved and not charged**.

***

### 📦 Output views

| View | What you see |
|---|---|
| **Jobs overview** | Title, company, location, salary, type, remote, rating, posted, age |
| **Company overview** | Industry, size, revenue, founded, HQ, rating, total reviews, website |
| **Salary & benefits** | Salary min/max, currency, period, **annualised min/max**, benefits |
| **Location & remote** | City, state, ZIP, neighborhood, remote flag, country |
| **Contacts & hiring signals** | Emails, phones, urgent-hire, high-volume, apply count, **hiring-urgency score**, easy-apply |
| **Company reviews** | Company rating, total reviews, pros, cons, individual review text |
| **All fields** | The complete record |

Export any view to JSON, CSV, Excel or via the Apify API.

***

### 🔎 Main fields

- **Job**: `jobKey`, `title`, `normalizedTitle`, `url`, `descriptionText`, `descriptionHtml`, `snippet`, `jobTypes`, `skills`, `benefits`, `isRemote`, `isExpired`, `isEasyApply`, `applyUrl`, `postedAt`, `jobAgeDays`.
- **Salary**: `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryAnnualMin`, `salaryAnnualMax`, `salaryEstimated`.
- **Location**: `location`, `city`, `state`, `postalCode`, `neighborhood`, `country`, `locationCount`.
- **Company**: `company`, `companyUrl`, `companyLogoUrl`, `rating`, `reviewsCount`, `companyIndustry`, `companySize`, `companyRevenue`, `companyHeadquarters`, `companyWebsite`, `companyCeoName`.
- **Reviews**: `companyOverallRating`, `companyTotalReviews`, `companyPros`, `companyCons`, `companyReviews[]` (text, title, date).
- **Contacts**: `emails`, `phones`, `hasContact`.

Every record also carries **competitor-compatible aliases** (`positionName`, `companyName`, `id`, `jobkey`, `postingDateParsed`, `displayTitle`) so it drops into tools built for other Indeed scrapers.

### ✨ Exclusive signals (only here)

| Field | What it is |
|---|---|
| `hiringUrgencyScore` | a 0–100 score blending urgent-hire, high-volume, freshness, responsiveness and apply volume — sort by who is hiring **now** |
| `salaryAnnualMin` / `salaryAnnualMax` | every pay figure normalised to a **yearly** range, so hourly and monthly jobs are comparable and `minSalary` filters work across all of them |
| `emails` / `phones` / `hasContact` | recruiter contacts pulled out of the posting — a lead list, not just a job list |
| `skills` | the skills/requirements Indeed tags on the job, as readable labels |
| `companyReviews` + `companyPros` / `companyCons` | employee sentiment attached to every job, not just the job text |

***

### 💳 How charging works

- A **job result** is charged for each saved job card.
- A **full-detail job** is charged only when its detail is fetched successfully; a job that falls back to card-only data is billed at the lower job rate.
- **Filtered-out and duplicate jobs are never charged.**
- **No Actor-start fee** — you pay only for the data you keep.

***

### ⚠️ Troubleshooting

- **Fewer jobs than requested** — a filter removed rows, or Indeed exposed a short result set. Loosen filters or add queries.
- **Some company / review fields blank** — Indeed does not publish every company detail or review for every employer; missing values stay empty, never invented.
- **Detail slower than search** — detail passes Indeed's Cloudflare protection per job; search is faster. This is normal.

### ✅ Data quality

- Salaries are returned as given **and** normalised to a yearly range; nothing is fabricated.
- Filters run **before** billing, so filtered rows cost nothing.
- Missing values stay missing; the Actor never invents company data, salaries or contacts.

**Tags:** `indeed` · `indeed scraper` · `jobs` · `job scraper` · `recruitment` · `lead generation` · `salary data` · `company reviews`

# Actor input Schema

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

SEARCH returns job cards for each keyword. SEARCH + DETAIL also opens every job for the full description, salary, company profile and extracted contacts. JOB DETAIL takes specific job keys/URLs.

## `searchQueries` (type: `array`):

Job titles, keywords or boolean queries, one per row (e.g. "software engineer", "nurse").

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

City, state, ZIP or region to search in (e.g. "New York, NY"). Leave empty for nationwide.

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

Indeed country domain to search.

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

Maximum jobs written for the whole run.

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

Relevance (Indeed default) or most recent.

## `radius` (type: `string`):

Distance from the location.

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

Only jobs posted within this many days.

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

Employment type filter.

## `remote` (type: `boolean`):

Keep only remote jobs.

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

Filter by seniority.

## `jobKeys` (type: `array`):

Specific Indeed job keys or viewjob URLs for JOB DETAIL mode.

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

Indeed job or search URLs to start from.

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

Keep only jobs whose salary (normalized to yearly) is at or above this.

## `minCompanyRating` (type: `integer`):

Keep only jobs at companies rated at or above this (1–5).

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains at least one of these words.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words.

## `companies` (type: `array`):

Keep only jobs whose company name contains one of these.

## `excludeCompanies` (type: `array`):

Drop jobs from companies whose name contains one of these (e.g. staffing agencies).

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

Open each job for the full description, salary, attributes and company profile.

## `parseCompanyDetails` (type: `boolean`):

Enrich each job with the company profile (industry, size, revenue, CEO, socials, rating).

## `extractContacts` (type: `boolean`):

Pull emails and phone numbers out of each job description.

## `extractEmails` (type: `boolean`):

Extract email addresses from the job description. Turn off to never look for emails.

## `extractPhones` (type: `boolean`):

Extract phone numbers from the job description. Turn off to never look for phones.

## `onlyWithEmail` (type: `boolean`):

Keep only jobs that have at least one email in the description (auto-fetches detail).

## `onlyWithPhone` (type: `boolean`):

Keep only jobs that have at least one phone number in the description (auto-fetches detail).

## `onlyWithContact` (type: `boolean`):

Keep only jobs that have an email OR a phone.

## `excludeEmails` (type: `array`):

Drop jobs whose email matches any of these addresses or domains (e.g. "noreply@", "@indeed.com").

## `excludePhones` (type: `array`):

Drop jobs whose phone matches any of these numbers (digits are compared, formatting ignored).

## `includeReviews` (type: `boolean`):

Attach employee reviews of the company — text and star rating — plus the rating breakdown, when available.

## `maxReviews` (type: `integer`):

Cap on company reviews collected per job.

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

Parallel job-detail lookups.

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

Retry budget per request; also rotates the connection on a Cloudflare challenge.

## `capMonsterApiKey` (type: `string`):

Optional CapMonster Cloud key to solve a Cloudflare Turnstile challenge if one appears. Usually not needed on residential proxy.

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

Proxy settings. Residential is strongly recommended for Indeed.

## Actor input object example

```json
{
  "mode": "SEARCH",
  "searchQueries": [
    "software engineer"
  ],
  "location": "New York, NY",
  "country": "US",
  "maxResults": 100,
  "sortBy": "relevance",
  "radius": "",
  "postedWithinDays": "",
  "jobType": "",
  "remote": false,
  "experienceLevel": "",
  "jobKeys": [],
  "startUrls": [],
  "titleKeywords": [],
  "excludeKeywords": [],
  "companies": [],
  "excludeCompanies": [],
  "includeDetails": true,
  "parseCompanyDetails": true,
  "extractContacts": true,
  "extractEmails": true,
  "extractPhones": true,
  "onlyWithEmail": false,
  "onlyWithPhone": false,
  "onlyWithContact": false,
  "excludeEmails": [],
  "excludePhones": [],
  "includeReviews": true,
  "maxReviews": 10,
  "maxConcurrency": 5,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `company` (type: `string`):

No description

## `salary` (type: `string`):

No description

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

No description

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

No description

## `reviews` (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",
    "searchQueries": [
        "software engineer"
    ],
    "location": "New York, NY",
    "country": "US",
    "maxResults": 100,
    "maxReviews": 10,
    "maxConcurrency": 5,
    "maxRetries": 6,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/indeed-all-in-one").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",
    "searchQueries": ["software engineer"],
    "location": "New York, NY",
    "country": "US",
    "maxResults": 100,
    "maxReviews": 10,
    "maxConcurrency": 5,
    "maxRetries": 6,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("trakk/indeed-all-in-one").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "SEARCH",
  "searchQueries": [
    "software engineer"
  ],
  "location": "New York, NY",
  "country": "US",
  "maxResults": 100,
  "maxReviews": 10,
  "maxConcurrency": 5,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call trakk/indeed-all-in-one --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cBHpTKlSc8vSU8Vbl/builds/azzKEY0q7QmV5Sc2j/openapi.json
