# Indeed Jobs Scraper 💼 \[No Cookies] — $0.50/1K 💰 (`viralanalyzer/indeed-jobs-scraper-pro`) Actor

Extract Indeed job postings in bulk globally without cookies or login: title, company, location, salary, rating, snippet, and direct apply link. Only $0.50/1K jobs.

- **URL**: https://apify.com/viralanalyzer/indeed-jobs-scraper-pro.md
- **Developed by:** [viralanalyzer](https://apify.com/viralanalyzer) (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 $0.35 / 1,000 job scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Pro 💼

> 🔗 [View on Apify Store](https://apify.com/viralanalyzer/indeed-jobs-scraper-pro) | 🇺🇸 English | [🇧🇷 Português](#português)

***

### 🇺🇸 English

#### Overview

Extract job postings, salary ranges, company names, job descriptions, and direct application URLs from **`www.indeed.com` (the US domain)**.

**Scope:** this actor queries `www.indeed.com` only. It is not multi-country: there is no country
parameter, and a non-US `location` is passed to the US domain, which returns what that domain has
for it. One keyword and one location per run — not lists.

#### Features

- **Salary as Indeed states it**: `salaryText` carries the employer-provided or Indeed-estimated string, verbatim. Nothing is computed or filled in
- **Company signal**: Employer name, star rating and review count, straight from the result card
- **Real listings**: the search page's own job-card data blob. Measured 2026-08-26: 45 real jobs on a single US query

#### Input Example

```json
{
  "keywords": "Senior React Developer",
  "location": "New York, NY",
  "maxJobs": 30
}
```

#### Output Example

```json
{
  "jobId": "ind_0d1f8c2b3a4e5f60",
  "sourceJobId": "0d1f8c2b3a4e5f60",
  "title": "Senior AI Engineer",
  "companyName": "TechScale Inc",
  "location": "New York, NY",
  "companyRating": 4.2,
  "companyReviewCount": 318,
  "salaryText": "$140,000 - $180,000 a year",
  "jobType": "Full-time",
  "isRemote": false,
  "descriptionSnippet": "Looking for an experienced LLM and Python engineer...",
  "postedAt": "3 days ago",
  "jobUrl": "https://www.indeed.com/viewjob?jk=0d1f8c2b3a4e5f60",
  "keywords": "Senior AI Engineer",
  "searchLocation": "New York, NY",
  "dataSource": "indeed-search",
  "scrapedAt": "2026-08-20T21:00:00.000Z"
}
```

Every key above is emitted on every job. A value Indeed does not publish comes back as `null` — `companyRating` in particular is `null`, never `0`, when the employer has no rating yet.

#### Output Fields

| Field | Description |
|---|---|
| `jobId` | `ind_` + Indeed's own job key |
| `sourceJobId` | Indeed's raw job key |
| `title`, `companyName`, `location` | As Indeed formats them |
| `companyRating`, `companyReviewCount` | Employer rating and review count, `null` when absent |
| `salaryText` | The salary string Indeed shows — employer-stated or Indeed-estimated. `null` when neither exists |
| `jobType` | First job type on the card (e.g. `Full-time`) |
| `isRemote` | Boolean, or `null` when the card does not say |
| `descriptionSnippet` | The card snippet with HTML stripped — not the full description |
| `postedAt` | Relative string as shown (`"3 days ago"`) |
| `jobUrl` | `https://www.indeed.com/viewjob?jk=<key>` |
| `keywords`, `searchLocation` | Echo of the input that produced the row |
| `dataSource`, `scrapedAt` | `"indeed-search"` and the ISO 8601 timestamp |

#### Input Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `keywords` | string | **One** job title or search phrase |
| `location` | string | **One** city, state, or "Remote" |
| `maxJobs` | number | Max jobs to extract (default: 20) |
| `unlockerProxyUrl` | string (secret) | Web Unlocker proxy URL. Replaces Apify Proxy when set |
| `brightDataApiToken` + `brightDataZone` | string | Routes the request through Bright Data's Web Unlocker API |

#### Tips

- Use `"Remote"` as the location to search work-from-home postings on the US domain

#### Use Cases

- **Recruitment & Headhunting** — Identify hiring surges and companies expanding their engineering teams

### ✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out. Derived from this Actor's own input schema.

| Input / feature | Supported | Notes |
|---|---|---|
| `keywords` — **required** | ✅ | a single search phrase, not a list |
| `location` | ✅ | a single location, not a list |
| Multiple keywords or locations per run | ❌ | one of each; run the actor again for another pair |
| **Country selection** | ❌ | `www.indeed.com` is hardcoded — there is no country domain switch |
| UK / Canada / Australia / Germany / Brazil domains | ❌ | not supported |
| Result volume (`maxJobs`) | ⚠️ | Maximum number of job postings to collect |
| Salary | ⚠️ | `salaryText` — present only when the employer or Indeed states one; there is no `salary` field and no parsed min/max/currency |
| Full job description | ❌ | only `descriptionSnippet`, the short card text. Detail pages are not visited |
| Apply / employer URL | ❌ | `jobUrl` points to Indeed's viewjob page; the employer's own application link is not resolved |
| Hybrid work type | ❌ | `isRemote` is a boolean — remote or not. No hybrid/on-site classification |
| Absolute posting date | ❌ | `postedAt` is Indeed's relative string (`"3 days ago"`), not a timestamp |
| Proxy | ⚠️ | this source refuses Apify IP ranges; supply `unlockerProxyUrl` for reliable runs |

#### FAQ

**Q: Are salary details always present?**
A: No. `salaryText` is filled whenever the employer states a range or Indeed estimates one, and is `null` otherwise. Roughly speaking, the field mirrors what you would see on the result card — nothing is inferred.

***

### 🇧🇷 Português

#### Visão Geral

Extraia vagas, salários, empresas contratantes e trechos de descrição do **`www.indeed.com` (domínio dos EUA)**.

**Escopo:** este actor consulta apenas o `www.indeed.com`. Não é multi-país: não existe parâmetro de país, e uma `location` fora dos EUA é enviada ao domínio americano, que devolve o que ele tiver para ela. Um cargo e uma localização por execução — não listas.

#### Funcionalidades

- **Salário como o Indeed publica**: `salaryText` traz a string do empregador ou a estimativa do Indeed, literal. Nada é calculado nem preenchido
- **Sinal da empresa**: Nome do empregador, nota e número de avaliações, direto do card de resultado
- **Vagas reais**: lidas do bloco de dados dos cards da própria página de busca. Medido em 2026-08-26: 45 vagas reais em uma única consulta nos EUA

#### Exemplo de Entrada

```json
{
  "keywords": "Senior React Developer",
  "location": "New York, NY",
  "maxJobs": 30
}
```

#### Exemplo de Saída

```json
{
  "jobId": "ind_0d1f8c2b3a4e5f60",
  "sourceJobId": "0d1f8c2b3a4e5f60",
  "title": "Senior AI Engineer",
  "companyName": "TechScale Inc",
  "location": "New York, NY",
  "companyRating": 4.2,
  "companyReviewCount": 318,
  "salaryText": "$140,000 - $180,000 a year",
  "jobType": "Full-time",
  "isRemote": false,
  "descriptionSnippet": "Looking for an experienced LLM and Python engineer...",
  "postedAt": "3 days ago",
  "jobUrl": "https://www.indeed.com/viewjob?jk=0d1f8c2b3a4e5f60",
  "keywords": "Senior AI Engineer",
  "searchLocation": "New York, NY",
  "dataSource": "indeed-search",
  "scrapedAt": "2026-08-20T21:00:00.000Z"
}
```

Toda chave acima sai em toda vaga. O que o Indeed não publica vem como `null` — `companyRating` em especial vem `null`, nunca `0`, quando o empregador ainda não tem nota.

**Não sai na saída:** descrição completa da vaga (só `descriptionSnippet`, o trecho do card), link de candidatura no site do empregador (`jobUrl` aponta para a página do Indeed), classificação híbrido/presencial (`isRemote` é booleano) e data absoluta de publicação (`postedAt` é a string relativa, ex. `"3 days ago"`). Não existe campo `salary`: o nome é `salaryText`.

#### Parâmetros de Entrada

| Parâmetro | Tipo | Descrição |
|-----------|------|-----------|
| `keywords` | string | **Um** cargo ou frase de busca |
| `location` | string | **Uma** cidade, estado ou "Remoto" |
| `maxJobs` | number | Máximo de vagas a extrair (padrão: 20) |
| `unlockerProxyUrl` | string (secreto) | URL de proxy de desbloqueio. Substitui o Apify Proxy quando preenchido |
| `brightDataApiToken` + `brightDataZone` | string | Roteia a requisição pela API Web Unlocker da Bright Data |

#### Dicas

- Use `"Remote"` na localização para buscar vagas remotas no domínio americano

#### Casos de Uso

- **Recrutamento & Seleção** — Identifique empresas contratando ativamente em sua área

#### Perguntas Frequentes

**P: Todas as vagas trazem salário?**
R: Não. `salaryText` é preenchido quando o empregador informa uma faixa ou quando o Indeed estima uma; caso contrário vem `null`. O campo espelha o que você veria no card — nada é inferido.

***

### 💰 Pricing

This actor uses **Pay Per Event (PPE)** pricing — you pay only per **item scraped** (`job-scraped`). Platform usage is included. See the current price on the **Pricing** panel of this actor's Apify Store page.

***

### 🔗 Related Actors

- [Reclame Aqui Scraper](https://apify.com/viralanalyzer/reclameaqui-scraper)
- [iFood Restaurant Intelligence](https://apify.com/viralanalyzer/ifood-restaurant-intelligence)
- [Instagram Reels Scraper](https://apify.com/viralanalyzer/instagram-reels-scraper)
- [TikTok Viral Scanner](https://apify.com/viralanalyzer/tiktok-viral-scanner)
- [Google Maps BR Scraper](https://apify.com/viralanalyzer/google-maps-br-scraper)
- [Mercado Livre Scraper](https://apify.com/viralanalyzer/mercadolivre-scraper)

***

### 📝 Changelog

- **v1.0.0** (2026-08-20) — Initial release: full extraction, Pay-Per-Event pricing, and automated proxy support

***

### License

ISC © 2026 Viral Analyzer Platform

***

💡 **Need AI analysis on top of this data — sentiment, trend detection and a dashboard, with no API keys to manage?**\
[ViralAnalyzer](https://viralanalyzer.com.br) runs this actor + 42 more data sources with built-in AI. JSON + insights in one call.

# Actor input Schema

## `keywords` (type: `string`):

Job title or search keywords (e.g. 'Software Engineer', 'React Developer', 'Data Analyst').

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

Location to search in (e.g. 'United States', 'New York, NY', 'Remote', 'London').

## `maxJobs` (type: `integer`):

Maximum number of job postings to collect.

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

Apify Proxy options (Residential recommended for high volume scraping).

## `unlockerProxyUrl` (type: `string`):

URL de proxy de um serviço de desbloqueio (ex.: Bright Data Web Unlocker), no formato http://usuario:senha@host:porta. Quando preenchido, substitui o Apify Proxy. Necessário porque esta origem bloqueia os IPs do Apify Proxy — medido em 2026-08-26 com cliente HTTP e com navegador real, ambos HTTP 403.

## `brightDataApiToken` (type: `string`):

Token da API da Bright Data. Junto com a zona abaixo, roteia a requisição pelo Web Unlocker, que contorna o bloqueio de IP desta origem.

## `brightDataZone` (type: `string`):

Nome da zona Web Unlocker criada no painel da Bright Data (ex.: viralanalyzer\_unlocker).

## Actor input object example

```json
{
  "keywords": "Software Engineer",
  "location": "United States",
  "maxJobs": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset output for Indeed Jobs Scraper Pro Output

# 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 = {
    "keywords": "Software Engineer",
    "location": "United States"
};

// Run the Actor and wait for it to finish
const run = await client.actor("viralanalyzer/indeed-jobs-scraper-pro").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 = {
    "keywords": "Software Engineer",
    "location": "United States",
}

# Run the Actor and wait for it to finish
run = client.actor("viralanalyzer/indeed-jobs-scraper-pro").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 '{
  "keywords": "Software Engineer",
  "location": "United States"
}' |
apify call viralanalyzer/indeed-jobs-scraper-pro --silent --output-dataset

```

## MCP server setup

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

```

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/IjEpHRJZwBM6Uhufy/builds/qdDZSTmGCOBmcdaEe/openapi.json
