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

Scrape Indeed job listings from 60+ country sites: title, company, salary as numbers, remote flag, full description, apply link, company website, industry and size, recruiter emails. No login, no API key, no browser.

- **URL**: https://apify.com/lergassy/indeed-jobs-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 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/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 Jobs Scraper** turns any Indeed search into a clean table of job listings — from **60+ Indeed country sites** — with the **salary parsed into numbers**, the full description, the apply link, and the company's website, industry, size and revenue band straight from the posting. Recruiter emails and phones found in the posting come in their own columns. No login, no API key, no browser: 100 jobs with full descriptions are one request.

Type job titles and a location, pick the country, and click **Start**. Export as JSON, CSV or Excel, run it on a schedule for fresh postings, or call it from the API and AI agents.

### What is Indeed Jobs Scraper?

It is an **Indeed scraper and Indeed jobs API** for people who need Indeed listings as data: job boards and aggregators, recruiters, lead generation (companies hiring for X are buying Y), salary research and AI agents. Indeed has no public job-search API; this Actor reads the same endpoint the Indeed mobile app uses, so rows come back fast and complete.

- **Salary as numbers:** `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, plus `salaryEstimated` when the figure is Indeed's estimate.
- **Company data on every row:** website, domain, industry, employee count, revenue band, description, logo, address.
- **Contacts:** emails and phones from the posting text; optional look-up of general contacts on the company website.
- **Any country:** set `country` (`us`, `uk`, `ca`, `au`, `de`, `fr`, `in`, `nl`, `es`, `sg`, `ae`, `br`…). A location in another country is detected and searched on the right site.

### What data does it return?

| Field | Example |
|---|---|
| `id`, `url`, `applyUrl` | 2e6243f5ef576267 · https://www.indeed.com/viewjob?jk=… · https://careers.spglobal.com/jobs/331257 |
| `title`, `company`, `companyWebsite`, `companyDomain` | Software Engineering Lead · S\&P Global · https://www.spglobal.com/en/ · spglobal.com |
| `companyIndustry`, `companySize`, `companyRevenue` | Information Technology · 10,000+ · more than $10B (USD) |
| `location`, `city`, `region`, `country`, `countryCode` | New York, NY · New York · NY · United States · US |
| `isRemote`, `workplaceType`, `employmentType`, `jobTypes` | false · hybrid · fulltime · \["fulltime"] |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | 93000 · 150000 · USD · year · "$93,000 - $150,000 a year" |
| `postedAt`, `listedAt` | 2026-09-06T05:00:00.000Z · 2026-09-06T02:39:44.587Z |
| `description`, `descriptionHtml`, `skills`, `attributes` | full text · HTML · \["Kotlin", "Spring Boot"] · Indeed tags |
| `emails`, `phones` | \["careers@acme.com"] · \["+14155552671"] |

### How much does it cost?

Pay per job row; there is no browser, so platform usage is close to zero and **error rows are free**.

| Row | Price |
|---|---|
| Job | $0.003 — 1,000 Indeed jobs for $3 |
| Job that came with an email address | +$0.002 |

No fee per run, per page or for proxies. Larger monthly plans get 10–30 % off.

### How to scrape Indeed jobs

1. Enter **Job titles or keywords** (one per line) and a **Location**.
2. Set the **Indeed country** if the location is outside the US.
3. Pick filters: posted within, remote / hybrid / on-site, job types, radius, sort, Indeed Apply only.
4. Click **Start**; export the dataset or read it through the API.

### ⬇️ Input

```json
{
  "keywords": ["registered nurse", "python developer"],
  "location": "Chicago, IL",
  "country": "us",
  "maxJobsPerQuery": 200,
  "datePosted": "week",
  "includeContacts": true
}
```

UK remote jobs, newest first:

```json
{ "keywords": ["customer success manager"], "location": "United Kingdom", "country": "uk", "remote": "remote", "sortBy": "date" }
```

### ⬆️ Output

```json
{
  "type": "job",
  "source": "indeed",
  "id": "6b55e2575a497854",
  "title": "CLINICAL NURSE II - MEDICAL/SURGICAL 7E",
  "company": "Cook County Health & Hospitals System",
  "companyWebsite": "https://www.cookcountyhealth.net",
  "location": "Chicago, IL",
  "city": "Chicago",
  "region": "IL",
  "countryCode": "US",
  "employmentType": "fulltime",
  "salaryMin": 40.25,
  "salaryMax": 54.55,
  "salaryCurrency": "USD",
  "salaryPeriod": "hour",
  "postedAt": "2026-09-22T05:00:00.000Z",
  "url": "https://www.indeed.com/viewjob?jk=6b55e2575a497854",
  "applyUrl": "https://cookcountyil.taleo.net/careersection/200/jobdetail.ftl?job=481371"
}
```

A search that cannot be read arrives as a `type: "error"` row with the reason, never as a silently empty run.

### Use cases

- **Job boards:** feed a niche board (nursing jobs in Texas, remote React jobs) on a schedule; dedupe on `id`.
- **Recruiting:** who is hiring for a role, where, at which salary band.
- **Lead generation:** companies hiring "Salesforce administrator" need Salesforce consultants — export `company`, `companyDomain`, `emails`.
- **Salary research:** thousands of postings with numeric salary, period and currency.
- **AI agents:** typed rows an agent can filter ("remote data-engineer jobs over $150k posted this week").

### Integrations

Run it from the [Apify API](https://docs.apify.com/api/v2), a schedule or a webhook, and push results to Google Sheets, Airtable, Slack or a CRM through **n8n**, **Make** or **Zapier**. The [Apify MCP server](https://mcp.apify.com) exposes it to Claude, ChatGPT and other agents.

### ❓ FAQ

#### Does it need an Indeed account?

No. It reads the public endpoint Indeed's own mobile app uses.

#### How many jobs can I get?

Up to what Indeed has for the query — thousands, 100 per request.

#### I also need LinkedIn and company career sites.

Use [Jobs API](https://apify.com/lergassy/jobs-api) — Indeed, LinkedIn and Greenhouse / Lever / Ashby / Workable boards in one schema — or [LinkedIn Jobs Scraper](https://apify.com/lergassy/linkedin-jobs-scraper).

#### Is this legal?

It reads public job postings without logging in and returns factual listing data and public business contacts. Respect Indeed's terms and local law for outreach; this is not legal advice.

### You might also like

- [Jobs API](https://apify.com/lergassy/jobs-api) — Indeed, LinkedIn and career sites in one table.
- [LinkedIn Jobs Scraper](https://apify.com/lergassy/linkedin-jobs-scraper) — LinkedIn job listings without login.
- [Website Contacts API](https://apify.com/lergassy/website-contacts-api) — emails and phones from any company website.

# Actor input Schema

## `keywords` (type: `array`):

One search per line: <code>python developer</code>, <code>registered nurse</code>, <code>marketing manager</code>. Boolean syntax the boards support works too (<code>"data engineer" -senior</code> on Indeed). Required.

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

City, state or country as you would type it on the board: <code>New York, NY</code>, <code>London</code>, <code>Remote</code>, <code>Germany</code>. Empty = the whole country. Should match <b>Indeed country</b> below. If it does not (a German city with country <code>us</code>), the actor notices, searches the right Indeed site instead and says so in the run status — setting the country yourself is still one request faster.

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

Defaults to <code>us</code>, so set it whenever the location is outside the United States — otherwise the actor has to detect the mismatch and search again. Which Indeed site to search: <code>us</code>, <code>uk</code>, <code>ca</code>, <code>au</code>, <code>de</code>, <code>fr</code>, <code>in</code>, <code>nl</code>, <code>es</code>, <code>it</code>, <code>sg</code>, <code>ae</code>, <code>mx</code>, <code>br</code>… (60+ countries). LinkedIn searches worldwide by location.

## `maxJobsPerQuery` (type: `integer`):

Cap per keyword per source (and per career-site board). Indeed pages 100 jobs per request; LinkedIn 25.

## `datePosted` (type: `string`):

Indeed and LinkedIn date filter (LinkedIn has no 3-day option; it uses a week).

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

Remote is a board filter on Indeed and LinkedIn; hybrid and on-site are LinkedIn filters and a check on the rows elsewhere.

## `jobTypes` (type: `array`):

Empty = all.

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

Distance around the location.

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

Order in which the boards return jobs; the first N are taken.

## `easyApplyOnly` (type: `boolean`):

Indeed: only jobs that can be applied to on Indeed itself.

## `postedAfter` (type: `string`):

<code>YYYY-MM-DD</code>; rows with an older posting date are dropped.

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

Optional: paste Indeed search URLs from your browser instead of keywords.

## `includeContacts` (type: `boolean`):

Recruiter and HR emails and phone numbers found in the job description, plus the company domain from its website or apply link.

## `enrichCompanyContacts` (type: `boolean`):

For jobs with a known company domain, open the home page and a contact page to collect general emails, phones and social links (2–4 requests per company, cached within the run).

## `maxCompaniesToEnrich` (type: `integer`):

Cap for the website look-up above.

## `maxItems` (type: `integer`):

Stop after this many rows.

## `concurrency` (type: `integer`):

How many searches run at once.

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

Apify datacenter proxies work for all sources. Switch to Residential only if rate-limit error rows appear.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "location": "New York, NY",
  "country": "us",
  "maxJobsPerQuery": 25,
  "datePosted": "any",
  "remote": "any",
  "radius": 25,
  "sortBy": "relevance",
  "easyApplyOnly": false,
  "includeContacts": true,
  "enrichCompanyContacts": false,
  "maxCompaniesToEnrich": 50,
  "maxItems": 20000,
  "concurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per job: source, title, company, company website and size, location, remote/hybrid, job type, salary as numbers, posting date, description, apply link, skills, emails and phones found in the posting.

# 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": [
        "python developer"
    ],
    "location": "New York, NY",
    "maxJobsPerQuery": 25,
    "includeContacts": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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 = {
    "keywords": ["python developer"],
    "location": "New York, NY",
    "maxJobsPerQuery": 25,
    "includeContacts": False,
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/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 '{
  "keywords": [
    "python developer"
  ],
  "location": "New York, NY",
  "maxJobsPerQuery": 25,
  "includeContacts": false
}' |
apify call lergassy/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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