# Indeed Job Scraper \[From $0.1💰] | Company, Contacts & more (`corvuslab/indeed-scraper`) Actor

Scrape Indeed jobs from 49 markets with company profiles (rating, industry, revenue, CEO), contact extraction, GPS coordinates, remote/hybrid flags, and incremental monitoring with Slack/Telegram/Discord alerts.

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

## Pricing

from $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

### What does Indeed Job Scraper do?

Indeed Job Scraper extracts structured job listings from Indeed across **49 country markets** and enriches every record with **company profile data** — employer rating, industry, revenue, size, CEO, headquarters, and website — that no other Indeed scraper provides. Each job also carries **GPS coordinates**, up to **30+ structured attributes** (skills, benefits, experience level), salary metadata, remote/hybrid flags, and **contact details** (emails, phones, social profiles) extracted from the listing text. Everything is delivered as clean, typed JSON ready for CSV, Excel, API, or AI-agent consumption, no code required.

Give it a search keyword, a location, and a country — and it returns every matching job as a structured record with nearly **50 data fields**. For each job you get the title, company, parsed location with coordinates, salary period and currency, posting date, and source. **Company profile enrichment** (on by default) adds the employer's rating, review count, industry, revenue, founding year, headcount range, CEO name, website, and logo. Turn on **Fetch full details** to also pull the complete job description, the full attributes/skills array, and contact information. You can also paste Indeed URLs directly instead of a keyword search.

> New to Apify? You can sign up for free and use the included monthly platform credit to try this Actor.

**Why this scraper**

- ⚡ **Fast & low-cost** — lightweight requests with no browser overhead, so large runs stay cheap.
- 🏢 **Company intelligence built in** — employer rating, industry, revenue, size, CEO, and HQ enriched automatically.
- 🧾 **Rich, typed records** — nearly 50 structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### Key features

- 🏢 **Company profile enrichment** — every job is automatically enriched with the employer's Indeed rating, review count, industry, revenue range, founding year, headcount, CEO name, official website, headquarters, logo, and profile URL. No other Indeed scraper on Apify provides this depth of company intelligence.
- 📇 **Contact extraction** — emails, phone numbers, URLs, and social profiles pulled from each job description; filter with `requireContact` for instant lead-gen lists.
- ♻️ **Incremental monitoring** — schedule it and get only NEW, UPDATED, or EXPIRED records; unchanged jobs are skipped before their detail is fetched, cutting costs dramatically.
- 🔔 **Multi-channel notifications** — Telegram, Slack, Discord, or any webhook (n8n / Make / Zapier) — get pinged the moment new jobs match your search.
- 🔎 **Search or URL scraping** — run a keyword + location + country search, or paste Indeed search and job-detail URLs directly.
- 🌍 **49 country markets** — US, UK, Canada, Australia, India, Germany, France, Japan, Brazil, UAE, and 39 more — switch with a single dropdown.
- 📍 **GPS coordinates on every listing** — latitude, longitude, city, state, postal code, and street address where available — ready for mapping, radius filtering, and geo-analytics.
- 🧠 **30+ job attributes per listing** — structured array of skills, benefits, experience level, job type, and work arrangement — ideal for skills-gap analysis and trend research.
- 🏠 **Remote & hybrid flags** — explicit `isRemote` and `isHybrid` booleans on every record for clean filtering.
- 📝 **Three description formats** — plain text, HTML, and Markdown in every record; choose which to include or get all three.
- 🤖 **AI-ready** — compact + drop-empty output modes keep payloads small for LLMs and MCP tool chains.

***

### 🚀 How to scrape Indeed

1. Open the actor and enter a **search keyword** (e.g. `software engineer`) and pick a **country** — or paste an Indeed URL.
2. Set a **location** and **radius** if you want geo-targeted results.
3. Set **Max results** and choose whether to **fetch full details** and **company enrichment** (both on by default).
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start** and download the data as **JSON, CSV or Excel**, or pull it from the **API**.

***

### Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search (comma-separate for multiple searches). |
| `location` | City, state, or region (e.g. "New York", "London", "Berlin"). |
| `country` | Indeed market — 49 countries from the US to Japan to Nigeria. |
| `startUrls` | Scrape specific Indeed search or job-detail URLs. |
| `sort` | Sort by newest first or most relevant. |
| `radius` / `radiusUnit` | Search radius around the location (miles or kilometers). |
| `includeDetails` | Fetch each job's full description, GPS, attributes, and contacts. |
| `includeCompanyInfo` | Enrich each record with company profile data (on by default). |
| `requireContact` | Keep only listings with an email, phone, or both — built-in lead-gen filter. |
| `descriptionFormat` | Which description format(s) to include: all, text, html, or markdown. |
| `compact` | Return only core fields — ideal for AI agents and MCP clients. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of records (0 = unlimited). |

...and **28 inputs** in total — the table shows the essentials; the rest cover notification channels, output/AI modes, and advanced tuning, all in the visual editor.

#### Example inputs

**Basic keyword search**

```json
{ "query": "software engineer", "country": "US", "maxResults": 100 }
```

**Location-specific search with company enrichment**

```json
{
  "query": "data scientist",
  "location": "London",
  "country": "GB",
  "radius": 50,
  "radiusUnit": "KILOMETERS",
  "includeCompanyInfo": true
}
```

**Incremental monitoring with notifications (schedule daily)**

```json
{
  "query": "product manager",
  "country": "US",
  "incrementalMode": true,
  "maxResults": 500,
  "slackWebhookUrl": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
}
```

***

### Output

Each item in the dataset is one **job listing**. Every record includes the core fields; enabling **Fetch full details** (on by default) adds the full description, GPS coordinates, job attributes, remote/hybrid flags, and extracted contacts. **Company profile enrichment** (also on by default) adds the employer's rating, industry, revenue, size, CEO, website, and more. Here is a real example record:

```json
{
  "id": "47d2c3febf0d0fe0",
  "title": ".NET Developer - Equities Back office",
  "url": "https://jobs.smartrecruiters.com/Talan/744000144781909--net-developer-equities-back-office-",
  "company": "Talan",
  "companyRating": 3.8,
  "companyReviewCount": 245,
  "companyIndustry": "Information Technology",
  "companyRevenue": "$500M–$1B",
  "companyFounded": 2002,
  "companySize": "5,001–10,000",
  "companyCeo": "Mehdi Houas",
  "companyWebsite": "https://www.talan.com",
  "companyHeadquarters": "Paris, France",
  "companyLogoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/abc123.png",
  "companyProfileUrl": "https://www.indeed.com/cmp/Talan",
  "location": "New York, NY, US",
  "city": "New York",
  "state": "NY",
  "country": "US",
  "latitude": 40.71427,
  "longitude": -74.00597,
  "salaryPeriod": "YEAR",
  "salaryCurrency": "USD",
  "isRemote": false,
  "isHybrid": true,
  "jobAttributes": [
    "Full-time",
    "Senior level",
    "Hybrid work",
    ".NET",
    "SQL",
    "SQL databases",
    "UNIX",
    "Shell Scripting",
    "Automation",
    "Incident management",
    "Communication skills",
    "5 years",
    "401(k) matching",
    "Dental insurance",
    "Paid holidays"
  ],
  "description": "Company Description\n\nTalan is an international group that supports its clients in their end-to-end Data & AI transformation ...",
  "descriptionMarkdown": "**Company Description**\n\nTalan is an international group ...",
  "postedAt": 1787323700509,
  "indexedAt": 1787323703770,
  "expired": false,
  "externalSource": "Talan",
  "source": "indeed.com",
  "searchKeyword": "software engineer",
  "scrapedAt": "2026-08-21T15:39:26.093427+00:00",
  "extractedEmails": ["careers@talan.com"],
  "extractedPhones": ["+1-212-555-0199"],
  "extractedUrls": ["https://careers.talan.com/apply"],
  "socialProfiles": { "linkedin": "https://linkedin.com/company/talan" },
  "contentHash": "90b1890e8c18a45fb1af3cbc06aaac812971d8ff"
}
```

This listing carried **20 job attributes** — the array is trimmed for readability. Descriptions are shown truncated; in practice each record contains the full text. Each record can also include `descriptionHtml` alongside `description` and `descriptionMarkdown` — choose the format with the Description format input. When incremental mode is on, records carry a `changeType` field (`NEW` / `UPDATED` / `EXPIRED`) and repost-detection fields.

#### Data fields

- **Core** — id, title, url, company, location, postedAt, source, scrapedAt.
- **Company profile** (with `includeCompanyInfo`) — companyRating, companyReviewCount, companyIndustry, companyRevenue, companyFounded, companySize, companyCeo, companyWebsite, companyHeadquarters, companyLogoUrl, companyProfileUrl.
- **Location & GPS** (with `includeDetails`) — city, state, country, latitude, longitude, postalCode, streetAddress.
- **Skills & attributes** (with `includeDetails`) — jobAttributes (structured array of skills, benefits, experience level, job type, work arrangement — typically 15-30+ per listing).
- **Salary & work type** — salaryPeriod, salaryCurrency, isRemote, isHybrid.
- **Description** (with `includeDetails`) — description, descriptionHtml, descriptionMarkdown (choose format with the Description format input).
- **Contacts & signals** — extractedEmails, extractedPhones, extractedUrls, socialProfiles.
- **Posting metadata** — indexedAt, expired, externalSource, searchKeyword, detailFetched, contentHash.
- **Incremental** — changeType, isRepost, repostOfId, repostDetectedAt (present only in incremental mode).

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads. With **`excludeEmptyFields`** enabled, null/empty fields are omitted entirely.

***

### 💡 What can you do with Indeed data?

- **Company intelligence** — aggregate employer ratings, industries, revenue ranges, and headcount across job postings to profile companies at scale, enrich your CRM, or research potential employers.
- **Lead generation** — filter for listings with embedded contact details (`requireContact`) and build targeted outreach lists from job postings, enriched with company website and social profiles.
- **Skills-gap & talent research** — aggregate the structured `jobAttributes` array across thousands of listings to map in-demand skills by role, region, or industry.
- **Remote & hybrid filtering** — use the dedicated `isRemote` and `isHybrid` flags to segment listings by work arrangement across any market.
- **Job monitoring & alerts** — schedule it with incremental mode + notifications for a live change feed of new, updated, or expired postings.
- **Geo-analytics & mapping** — plot listings on a map using the GPS coordinates; cluster by city, radius, or commute zone. Filter remote and hybrid jobs with dedicated boolean flags.
- **AI agents & pipelines** — compact output plugs straight into LLM/MCP workflows for automated job matching, resume screening, or market intelligence.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** records — unchanged items are skipped *before* their detail page is fetched, so a daily watch costs a fraction of a full re-scrape.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta.

***

### 💰 Pricing

This Actor uses the **pay-per-event** pricing model: a small fee at run start plus a per-record fee. It runs on lightweight requests with no browser overhead, so the underlying platform cost is minimal.

See the Actor's **Pricing** tab for exact current prices.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### 🔗 Using the API

You can run this Actor from your own code. Example with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "query": "software engineer",
    "country": "US",
    "includeCompanyInfo": True,
    "maxResults": 50,
}

run = client.actor("corvuslab/indeed-scraper").call(run_input=run_input)

print("Results: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

The Actor also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

***

### ❓ FAQ

**Do I need a proxy or login?** No — it runs out of the box with no configuration. Apify Proxy is available under Advanced for high-volume runs in restricted regions.

**What company data do I get?** When company profile enrichment is enabled (on by default), each record includes the employer's Indeed rating, review count, industry, revenue range, founding year, headcount range, CEO name, official website, headquarters, logo, and profile URL.

**Can I get only new jobs on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your Telegram, Slack, Discord, or webhook channel.

**Can I filter remote or hybrid jobs?** Every record includes `isRemote` and `isHybrid` boolean flags, so you can filter in your downstream pipeline or spreadsheet.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly and keeps token usage low.

**How many records can I get?** Set `maxResults` to any number (0 = unlimited). The actor paginates automatically.

**Can I search multiple keywords at once?** Yes — comma-separate them in the query field (e.g. "data scientist, machine learning"); each runs as its own search and results are merged and de-duplicated.

**Can it notify me when new jobs appear?** Yes — add a Telegram, Slack, Discord, or generic webhook target under Notifications, and combine with incremental mode so you only get pinged about new and updated listings.

**Is scraping Indeed legal?** This actor collects only **publicly available** data on Indeed. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by Indeed, Recruit Holdings, or any of their subsidiaries.

***

**Keywords:** indeed scraper · indeed api · indeed.com scraper · indeed job scraper · scrape indeed jobs · indeed data extraction · indeed job listings · indeed company profiles · indeed company rating · employer data · job scraper · job board scraper · indeed jobs export · indeed to csv · indeed to excel · job market research · job monitoring · lead generation jobs · no-code scraper · MCP tool for AI agents

# Actor input Schema

## `query` (type: `string`):

Keywords to search for. Separate multiple searches with commas — each runs as its own search and results are merged and de-duplicated.

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

City, state, or region to search in (e.g. 'New York', 'London', 'Berlin'). Leave empty for nationwide results.

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

Indeed market to search. Controls which country's listings appear.

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

Paste Indeed search or job URLs to scrape directly. Job-detail URLs (with ?jk=...) are fetched individually.

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

Maximum number of records to return. Set 0 for unlimited (bounded by how many the search has).

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

How to sort search results.

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

Search radius around the location. Only applies when a location is set.

## `radiusUnit` (type: `string`):

Unit for the search radius.

## `ignoreUrlFailures` (type: `boolean`):

Skip URLs that cannot be interpreted instead of failing the whole run.

## `requireContact` (type: `string`):

Keep only records that include a contact. off = keep everything; email / phone = require that channel; either = at least one; both = email and phone. Screened at emit time, so it also trims what you're billed for.

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

Fetch full job descriptions, GPS coordinates, and attributes. Turn off for the fastest, cheapest runs.

## `descriptionFormat` (type: `string`):

Which representation(s) of the job description to include.

## `compact` (type: `boolean`):

Emit only the core fields (id, title, url, company, location, postedAt). Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit records that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for items present last run but gone now.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

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

Apify datacenter proxy is enabled by default for reliable access from the platform. Residential proxy is available for restricted regions.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## `detailConcurrency` (type: `integer`):

How many detail requests to run in parallel. Higher = faster but uses more bandwidth.

## Actor input object example

```json
{
  "query": "data scientist, machine learning",
  "country": "US",
  "maxResults": 25,
  "sort": "DATE",
  "radius": 25,
  "radiusUnit": "MILES",
  "ignoreUrlFailures": true,
  "requireContact": "off",
  "includeDetails": true,
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxRequestRetries": 3,
  "detailConcurrency": 5
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": "software engineer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/indeed-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 = { "query": "software engineer" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/indeed-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 '{
  "query": "software engineer"
}' |
apify call corvuslab/indeed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/indeed-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/atB8bCmFRz0Qkjabv/builds/OpeWzxD7sKbC6Vvmn/openapi.json
