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

🔥$0.1 per 1K jobs. Extract Indeed job listings from 62 countries. Get salaries, company profiles, contact emails, job descriptions, and direct apply links. Filter by location, remote jobs, Easy Apply, and job type.

- **URL**: https://apify.com/cockroachapi/indeed-jobs-scraper.md
- **Developed by:** [Cockroach API](https://apify.com/cockroachapi) (community)
- **Categories:** Jobs, Social media, Lead generation
- **Stats:** 51 total users, 15 monthly users, 100.0% runs succeeded, 8 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$0.10 / 1,000 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — Extract Job Data from Indeed in 60+ Countries

![Output format](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-blue?style=for-the-badge)
![Countries](https://img.shields.io/badge/Countries-62-green?style=for-the-badge)
![Jobs per run](https://img.shields.io/badge/Jobs%20per%20run-Up%20to%201%2C000-orange?style=for-the-badge)
![Data fields](https://img.shields.io/badge/Data%20fields-20%2B-purple?style=for-the-badge)

> **Scrape job listings from [Indeed](https://www.indeed.com) — the world's largest job search engine.** Get structured JSON data with company profiles, salary info, job descriptions, and direct apply links from 62 countries, all delivered to your Apify dataset.

***

### What does this Indeed scraper do?

This Actor searches and extracts job postings from Indeed across **62 countries**. Provide a job title or keyword, optionally add location and filters, and receive structured data for every matching listing — automatically paginated, de-duplicated, and ready to export as **JSON, CSV, Excel, HTML, or XML**.

#### Key features

| Capability                     | Description                                                                         |
| ------------------------------ | ----------------------------------------------------------------------------------- |
| 🔍**Keyword search**     | Search by job title, skill, company name, or any keyword                            |
| 🌍**62 countries**       | Search Indeed sites worldwide — US, UK, Germany, India, Japan, Brazil, and 56 more |
| 📍**Location & radius**  | City, state, postal code, or remote — with configurable search radius (0–500 mi)  |
| 🏷️**Job type filter**  | Full-time, part-time, contract, or internship                                       |
| 🏠**Remote filter**      | Only work-from-home and remote positions                                            |
| ⚡**Easy Apply filter**  | Only jobs with Indeed Easy Apply enabled                                            |
| 📅**Posted within**      | Filter by recency — last 24 hours, 48 hours, or up to 30 days                      |
| 📄**Auto-pagination**    | Collects up to 1,000 results per run with automatic pagination                      |
| 🏢**Rich company data**  | Name, industry, revenue, employee count, CEO, logo, corporate website               |
| 💰**Salary data**        | Compensation range, pay interval, and currency when available                       |
| 📧**Contact extraction** | Email addresses scraped from job descriptions                                       |
| 🔀**Proxy rotation**     | Built-in residential proxy support for reliable, uninterrupted scraping             |

#### Who uses this scraper?

| Use case                            | What you get                                                                 |
| ----------------------------------- | ---------------------------------------------------------------------------- |
| 📊**Salary benchmarking**     | Track compensation trends across roles, locations, and industries            |
| 🔍**Recruiting intelligence** | Monitor competitor hiring patterns and open positions                        |
| 🗃️**Job board builders**    | Power career portals, aggregators, or recommendation engines with fresh data |
| 📈**Labor market analytics**  | Analyze hiring demand by role, geography, and company size                   |
| 🎯**Job seekers**             | Bulk-download and compare listings across multiple countries at once         |

***

### How to use this Indeed data scraper

#### Step 1 — Enter your search keyword

Provide a **search term**: a job title, skill, or company name.

> **Examples:** `software engineer`, `data scientist`, `Python developer`, `marketing manager`

#### Step 2 — Configure location & filters (optional)

| Option                    | Description                                                              |
| ------------------------- | ------------------------------------------------------------------------ |
| **Location**        | City, state, postal code, or `remote` — e.g., `San Francisco, CA`   |
| **Country**         | Select from 62 Indeed country sites (default: United States)             |
| **Search radius**   | Distance in miles from the location (0 = exact location only, up to 500) |
| **Job type**        | Full-time, part-time, contract, or internship                            |
| **Remote only**     | Exclusively remote / work-from-home positions                            |
| **Easy Apply only** | Only jobs with Indeed Easy Apply enabled                                 |
| **Posted within**   | Limit to jobs posted in the last N hours (1–720)                        |

#### Step 3 — Set result volume

Specify the number of job listings to collect — up to **1,000** per run (minimum 5).

#### Step 4 — Run and download

Click **Run**. When complete, your data is available in the **Dataset** tab. Download in **JSON, CSV, Excel, HTML, or XML**, or connect via webhooks, Zapier, or Make to pipe data directly into Google Sheets, Airtable, Slack, or your database.

***

### Input parameters

| Field             | Type        | Required | Default   | Description                                                        |
| ----------------- | ----------- | -------- | --------- | ------------------------------------------------------------------ |
| `searchTerm`    | `string`  | ✅ Yes   | —        | Job title, keyword, or company name                                |
| `location`      | `string`  | No       | —        | City, state, postal code, or `remote`                            |
| `country`       | `string`  | No       | `us`    | Indeed country code — see[supported countries](#supported-countries) |
| `searchRadius`  | `integer` | No       | —        | Search radius in miles (0–500)                                    |
| `resultsWanted` | `integer` | No       | `1000`  | Max jobs to collect (5–1,000)                                     |
| `jobType`       | `string`  | No       | —        | `FULL_TIME`, `PART_TIME`, `CONTRACT`, or `INTERNSHIP`      |
| `isRemote`      | `boolean` | No       | `false` | Only remote positions                                              |
| `easyApply`     | `boolean` | No       | `false` | Only Easy Apply jobs                                               |
| `postedWithin`  | `integer` | No       | —        | Only jobs posted within this many hours (1–720)                   |

***

### Output fields

Each job listing produces a flat JSON record with **45+ data fields**:

#### Job identifiers & links

| Field            | Type       | Description                                         |
| ---------------- | ---------- | --------------------------------------------------- |
| `id`           | `string` | Unique job identifier                               |
| `sourceName`   | `string` | Original source name (e.g., LinkedIn, company site) |
| `title`        | `string` | Job title                                           |
| `jobUrl`       | `string` | Indeed job detail page                              |
| `jobUrlDirect` | `string` | Direct application URL (when available)             |

#### Company information

| Field                     | Type       | Description                     |
| ------------------------- | ---------- | ------------------------------- |
| `companyName`           | `string` | Employer name                   |
| `companyUrl`            | `string` | Indeed company profile page     |
| `companyUrlDirect`      | `string` | Employer's corporate website    |
| `companyIndustry`       | `string` | Industry classification         |
| `companyNumEmployees`   | `string` | Employee count range            |
| `companyRevenue`        | `string` | Revenue range                   |
| `companyDescription`    | `string` | Brief company overview          |
| `companyLogo`           | `string` | Company logo image URL          |
| `companyHeaderImageUrl` | `string` | Company header/banner image URL |
| `companyAddressPrimary` | `string` | Primary office address          |
| `companyAddresses`      | `array`  | All office addresses            |
| `companyCeoName`        | `string` | CEO name                        |
| `companyCeoPhotoUrl`    | `string` | CEO photo URL                   |

#### Location

| Field                      | Type       | Description                     |
| -------------------------- | ---------- | ------------------------------- |
| `location_city`          | `string` | City                            |
| `location_state`         | `string` | State or province code          |
| `location_country`       | `string` | Country code                    |
| `location_countryName`   | `string` | Country name                    |
| `location_postalCode`    | `string` | Postal / ZIP code               |
| `location_streetAddress` | `string` | Street address                  |
| `locationFormattedShort` | `string` | Short formatted location string |
| `locationFormattedLong`  | `string` | Long formatted location string  |

#### Dates

| Field            | Type       | Description                       |
| ---------------- | ---------- | --------------------------------- |
| `datePosted`   | `string` | Posting date (`YYYY-MM-DD`)     |
| `dateOnIndeed` | `string` | Date indexed by Indeed (ISO 8601) |

#### Job metadata

| Field               | Type        | Description                                        |
| ------------------- | ----------- | -------------------------------------------------- |
| `isRemote`        | `boolean` | Remote position indicator                          |
| `jobType`         | `array`   | Employment type(s) — e.g.,`["FULL_TIME"]`       |
| `attributeLabels` | `array`   | Raw attribute labels (e.g., "Full-time", "Remote") |
| `attributeKeys`   | `array`   | Raw attribute keys                                 |

#### Compensation

| Field                      | Type       | Description                                                                |
| -------------------------- | ---------- | -------------------------------------------------------------------------- |
| `compensation_interval`  | `string` | Pay interval:`YEARLY`, `MONTHLY`, `WEEKLY`, `HOURLY`, or `DAILY` |
| `compensation_minAmount` | `number` | Minimum salary                                                             |
| `compensation_maxAmount` | `number` | Maximum salary                                                             |
| `compensation_currency`  | `string` | Currency code (e.g.,`USD`, `EUR`)                                      |
| `recruitDetailedSalary`  | `object` | Detailed salary breakdown (when available)                                 |
| `recruitWorkSchedule`    | `string` | Work schedule info (when available)                                        |

#### Description & contacts

| Field               | Type       | Description                                              |
| ------------------- | ---------- | -------------------------------------------------------- |
| `description`     | `string` | Full job description (HTML)                              |
| `descriptionText` | `string` | Plain-text job description                               |
| `emails`          | `array`  | Contact email addresses extracted from description       |
| `rawJob`          | `object` | Complete raw job payload from Indeed for deep inspection |

#### Example output

```json
{
  "id": "in-abc123def",
  "sourceName": "Acme Corp",
  "title": "Software Engineer",
  "companyName": "Acme Corp",
  "companyIndustry": "Technology Information Internet",
  "companyNumEmployees": "1001 to 5000 employees",
  "companyRevenue": "$1B to $10B revenue",
  "companyUrl": "https://us.indeed.com/cmp/Acme-Corp",
  "companyUrlDirect": "https://acme.example.com/",
  "companyLogo": "https://example.com/logo.png",
  "location_city": "San Francisco",
  "location_state": "CA",
  "location_country": "US",
  "location_countryName": "United States",
  "datePosted": "2026-06-05",
  "dateOnIndeed": "2026-06-06T14:30:00Z",
  "jobUrl": "https://us.indeed.com/viewjob?jk=abc123def",
  "jobUrlDirect": "https://acme.example.com/apply",
  "isRemote": false,
  "jobType": ["FULL_TIME"],
  "attributeLabels": ["Full-time", "Benefits available"],
  "compensation_interval": "YEARLY",
  "compensation_minAmount": 120000,
  "compensation_maxAmount": 180000,
  "compensation_currency": "USD",
  "companyDescription": "Acme Corp is a leading technology company...",
  "description": "<div>... job description HTML ...</div>",
  "descriptionText": "About Us: Acme Corp is a leading...",
  "emails": ["careers@acme.example.com"]
}
```

***

### Supported countries

This Actor supports **62 countries** — every country where Indeed operates:

| Code   | Country                   | Code   | Country          | Code   | Country            |
| ------ | ------------------------- | ------ | ---------------- | ------ | ------------------ |
| `ae` | 🇦🇪 United Arab Emirates | `il` | 🇮🇱 Israel      | `om` | 🇴🇲 Oman          |
| `ar` | 🇦🇷 Argentina            | `in` | 🇮🇳 India       | `pa` | 🇵🇦 Panama        |
| `at` | 🇦🇹 Austria              | `it` | 🇮🇹 Italy       | `pe` | 🇵🇪 Peru          |
| `au` | 🇦🇺 Australia            | `jp` | 🇯🇵 Japan       | `ph` | 🇵🇭 Philippines   |
| `be` | 🇧🇪 Belgium              | `kr` | 🇰🇷 South Korea | `pk` | 🇵🇰 Pakistan      |
| `bh` | 🇧🇭 Bahrain              | `kw` | 🇰🇼 Kuwait      | `pl` | 🇵🇱 Poland        |
| `br` | 🇧🇷 Brazil               | `lu` | 🇱🇺 Luxembourg  | `pt` | 🇵🇹 Portugal      |
| `ca` | 🇨🇦 Canada               | `ma` | 🇲🇦 Morocco     | `qa` | 🇶🇦 Qatar         |
| `ch` | 🇨🇭 Switzerland          | `mx` | 🇲🇽 Mexico      | `ro` | 🇷🇴 Romania       |
| `cl` | 🇨🇱 Chile                | `my` | 🇲🇾 Malaysia    | `sa` | 🇸🇦 Saudi Arabia  |
| `cn` | 🇨🇳 China                | `ng` | 🇳🇬 Nigeria     | `se` | 🇸🇪 Sweden        |
| `co` | 🇨🇴 Colombia             | `nl` | 🇳🇱 Netherlands | `sg` | 🇸🇬 Singapore     |
| `cr` | 🇨🇷 Costa Rica           | `no` | 🇳🇴 Norway      | `th` | 🇹🇭 Thailand      |
| `cz` | 🇨🇿 Czech Republic       | `nz` | 🇳🇿 New Zealand | `tr` | 🇹🇷 Turkey        |
| `de` | 🇩🇪 Germany              |        |                  | `tw` | 🇹🇼 Taiwan        |
| `dk` | 🇩🇰 Denmark              |        |                  | `ua` | 🇺🇦 Ukraine       |
| `ec` | 🇪🇨 Ecuador              |        |                  | `us` | 🇺🇸 United States |
| `eg` | 🇪🇬 Egypt                |        |                  | `uy` | 🇺🇾 Uruguay       |
| `es` | 🇪🇸 Spain                |        |                  | `ve` | 🇻🇪 Venezuela     |
| `fi` | 🇫🇮 Finland              |        |                  | `vn` | 🇻🇳 Vietnam       |
| `fr` | 🇫🇷 France               |        |                  | `za` | 🇿🇦 South Africa  |
| `gb` | 🇬🇧 United Kingdom       |        |                  |        |                    |
| `gr` | 🇬🇷 Greece               |        |                  |        |                    |
| `hk` | 🇭🇰 Hong Kong            |        |                  |        |                    |
| `hu` | 🇭🇺 Hungary              |        |                  |        |                    |
| `id` | 🇮🇩 Indonesia            |        |                  |        |                    |
| `ie` | 🇮🇪 Ireland              |        |                  |        |                    |

***

### Tips & best practices

- 🎯 **Be specific** — Precise job titles and skills return more relevant results than generic terms
- ⏱️ **Use `postedWithin`** for fresh listings — set to `24` for jobs from the last day
- 🔀 **Combine filters** — `jobType`, `isRemote`, and `easyApply` work together. Note: `postedWithin` cannot be combined with these filters (Indeed treats date filtering as a separate search dimension)
- 📅 **Schedule runs** — Use the Apify scheduler for daily or weekly market monitoring
- 🔗 **Integrate** — Connect via webhooks, Zapier, or Make to pipe data into Google Sheets, Airtable, Slack, or databases
- 📦 **Start small** — Test with `resultsWanted: 10` to validate your search criteria, then scale up
- 🌍 **Multi-country** — Run the same search across multiple countries by scheduling separate runs with different `country` values
- 💡 **Use `remote` location** — Set location to `remote` with `isRemote: true` for fully remote positions

***

### Frequently asked questions

#### How many jobs can I scrape per run?

Up to **1,000 jobs** per run. For larger volumes, schedule multiple runs with different search terms or locations.

#### Which countries are supported?

All **62 countries** where Indeed operates — including the US, UK, Germany, India, Japan, Brazil, Canada, Australia, and many more. See the [full country list](#supported-countries).

#### Can I search for remote jobs?

Yes. Set the location to `remote` and enable the **Remote Only** filter. You can also combine `isRemote` with job type filters.

#### Why are some output fields empty?

Data availability depends on what the employer provided. Not all listings include compensation data, company descriptions, or direct apply URLs. The scraper returns whatever is available.

#### Can I combine multiple filters?

Yes — `jobType`, `isRemote`, and `easyApply` can be used together. However, `postedWithin` cannot be combined with these filters because Indeed treats date filtering as a separate search dimension.

#### What format is the output?

Each job is a flat JSON object with 45+ fields. You can download the dataset in **JSON, CSV, Excel, HTML, or XML** from the Apify Console, or access it via the Apify API.

#### Is this scraper compliant with Indeed's Terms of Service?

This tool retrieves publicly available job listing data. Users are responsible for reviewing and complying with Indeed's Terms of Service, robots.txt, and applicable local laws before using the data commercially.

#### Can I run this on a schedule?

Yes. Use the Apify **Scheduler** to run this Actor daily, weekly, or at any interval — ideal for monitoring job market trends or tracking new postings.

***

### Legal disclaimer

This Actor is provided for **educational and research purposes**. Users must comply with Indeed's [Terms of Service](https://www.indeed.com/legal), applicable laws, and website policies. The authors assume no liability for misuse of this tool or the data it produces.

**Support**: For questions, bug reports, or feature requests, please open an issue. Need a custom solution or enterprise support? Contact the team directly.

# Actor input Schema

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

Job title, keywords, or company name to search for. E.g., 'software engineer', 'data scientist', 'Python developer'

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

Select the country's Indeed site to search on

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

City, state, postal code, or 'remote' to search. Examples: 'San Francisco, CA', 'New York', 'remote'

## `resultsWanted` (type: `integer`):

Maximum number of job listings to scrape

## `searchRadius` (type: `integer`):

Search radius in miles from the specified location (0 = exact location only, max 500)

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

Filter by employment type

## `isRemote` (type: `boolean`):

Only show remote / work-from-home positions

## `easyApply` (type: `boolean`):

Only show jobs with Indeed Easy Apply (desktop-applicable)

## `postedWithin` (type: `integer`):

Only show jobs posted within this many hours (e.g., 24 = last 24 hours)

## Actor input object example

```json
{
  "searchTerm": "software engineer",
  "country": "us",
  "location": "San Francisco, CA",
  "resultsWanted": 1000,
  "isRemote": false,
  "easyApply": false
}
```

# Actor output Schema

## `dataset` (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",
    "location": "San Francisco, CA",
    "resultsWanted": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("cockroachapi/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",
    "location": "San Francisco, CA",
    "resultsWanted": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("cockroachapi/indeed-jobs-scraper").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 '{
  "searchTerm": "software engineer",
  "location": "San Francisco, CA",
  "resultsWanted": 1000
}' |
apify call cockroachapi/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/2pyLe8QDfcU5Jum36/builds/cjO2EiSJofmjEk5Os/openapi.json
