# Indeed & LinkedIn Jobs Scraper - Salaries, Descriptions, Emails (`zaver.api/indeed-linkedin-jobs-scraper`) Actor

$1.49 per 1,000 jobs, no start fee. Scrape job listings from Indeed and LinkedIn in one run: title, company, location, salary, full description, apply link, recruiter emails and company details. 70+ countries, date and remote filters. CSV, Excel or JSON.

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

## Pricing

from $1.49 / 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.

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 & LinkedIn Jobs Scraper — Salaries, Descriptions, Apply Links and Emails

**Scrape job listings from Indeed and LinkedIn in a single run.** Enter job titles and locations and export every matching job with title, company, location, salary, full description, apply link, recruiter emails and company details. No login, no cookies, no API key. **Pay per job, no start fee, descriptions included.**

> ⭐ Two job boards, one table · 70+ countries · salary and full description · date, job type and remote filters · duplicates removed · proxies included · API and MCP ready

### What does the Indeed & LinkedIn Jobs Scraper do?

It runs each of your search terms in each of your locations on **Indeed** and **LinkedIn**, merges the results into one consistent format and removes duplicates. You get one row per job, with the same column names whichever board it came from.

| You enter | You get |
|---|---|
| Job titles or keywords, such as `software engineer` | Matching jobs from both boards |
| Locations, such as `New York, NY` or `London` | Jobs within your chosen radius |
| A country | The right Indeed country site, from 70+ supported |
| Filters | Only recent, remote, full-time, contract or internship jobs |

### What data does it extract?

#### Job fields

| Field | Description |
|---|---|
| `site` | `indeed` or `linkedin` |
| `title` | Job title |
| `company` | Employer name |
| `location` | City, state or region, country |
| `datePosted` | Posting date (`YYYY-MM-DD`) |
| `jobType` | Full-time, part-time, contract, internship |
| `isRemote` | `true` for remote jobs |
| `jobLevel`, `jobFunction` | Seniority and function (LinkedIn) |
| `description` | Full job description, as Markdown or HTML |
| `jobUrl` | Link to the listing on the job board |
| `applyUrl` | Direct link to the employer's application page, when published |
| `emails` | Email addresses found in the description |

#### Salary fields

| Field | Description |
|---|---|
| `salaryMin`, `salaryMax` | Pay range |
| `salaryInterval` | `yearly`, `monthly`, `weekly`, `daily` or `hourly` |
| `salaryCurrency` | Currency code |
| `salarySource` | `direct_data` when the board published it, `description` when parsed from the text |

#### Company fields

| Field | Description |
|---|---|
| `companyIndustry` | Industry |
| `companyUrl`, `companyWebsite` | Company page on the board and the company's own site |
| `companyLogo` | Logo URL |
| `companyEmployees`, `companyRevenue` | Size and revenue bands (Indeed) |
| `companyAddresses`, `companyDescription` | Head office and profile text (Indeed) |

Every row also carries `searchTerm` and `searchLocation`, so a run with many searches stays easy to filter. Fields a board does not publish are left out rather than filled with blanks.

### Why use this job scraper

#### Two boards for one price

Most job scrapers cover one site, so you pay twice and then reconcile two formats. Here Indeed and LinkedIn arrive in one table with identical column names.

#### Full descriptions are included

Descriptions are what make job data useful for matching, skills analysis and AI. They are part of the base price, including on LinkedIn, where many tools charge extra or skip them.

#### Salary data you can compare

Indeed publishes pay on a large share of listings. Turn on **Convert salaries to annual** to bring hourly, weekly and monthly pay to one yearly figure.

#### No start fee, and you only pay for jobs you receive

Starting a run is free. You are charged right after each batch of jobs is saved, so a run you stop early costs only what it delivered. Duplicates and failed searches are free.

#### No login or cookies

The Actor reads public job listings. You do not provide a LinkedIn or Indeed account, so there is no account to get restricted.

### How to scrape Indeed and LinkedIn jobs

1. Open the Actor and enter **Job titles or keywords**, one per line.
2. Add **Locations**, or leave them empty to search the whole country.
3. Pick the **Country** for Indeed. LinkedIn uses the location text only.
4. Set **Max jobs per search** and any filters: posted within, job type, remote only.
5. Press **Start**. Export as CSV, Excel, JSON or XML, or read the dataset through the API.

> 💡 For daily monitoring, set **Posted within (hours)** to `24` and schedule the Actor once a day. You get only new jobs each morning.

### Input example

```json
{
  "searchTerms": ["software engineer", "data analyst"],
  "locations": ["New York, NY", "Austin, TX"],
  "sites": ["indeed", "linkedin"],
  "country": "usa",
  "maxJobsPerSearch": 200,
  "postedWithinHours": 168,
  "remoteOnly": false,
  "linkedinDescriptions": true,
  "annualSalary": true
}
```

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | **Required.** Job titles, skills or company names, one per line. |
| `locations` | array | Cities, states or countries. Empty means the whole country. |
| `sites` | array | `indeed`, `linkedin` or both. Default both. |
| `country` | string | Indeed country site. Default `usa`. |
| `maxJobsPerSearch` | integer | Jobs per term, location and site. Default 100, maximum 1,000. |
| `postedWithinHours` | integer | Only jobs from the last N hours. 0 means any time. |
| `jobType` | string | `fulltime`, `parttime`, `contract` or `internship`. |
| `remoteOnly` | boolean | Only remote jobs. |
| `distance` | integer | Radius in miles. Default 50. |
| `linkedinDescriptions` | boolean | Fetch full LinkedIn descriptions, level, industry and emails. Default on. |
| `descriptionFormat` | string | `markdown` or `html`. |
| `annualSalary` | boolean | Convert all pay to yearly. |
| `maxItems` | integer | Cap on jobs for the whole run. 0 means no cap. |

### Output example

```json
{
  "site": "indeed",
  "title": "Senior Software Engineer",
  "company": "Acme Health",
  "location": "New York, NY, US",
  "datePosted": "2026-09-27",
  "jobType": "fulltime",
  "isRemote": false,
  "salaryMin": 150000,
  "salaryMax": 185000,
  "salaryInterval": "yearly",
  "salaryCurrency": "USD",
  "salarySource": "direct_data",
  "jobUrl": "https://www.indeed.com/viewjob?jk=5e409e577046abcd",
  "applyUrl": "https://careers.acmehealth.com/jobs/4821",
  "emails": ["talent@acmehealth.com"],
  "description": "**About the role**\n\nYou will design and build services that ...",
  "companyIndustry": "Health Care",
  "companyWebsite": "https://www.acmehealth.com",
  "companyEmployees": "1,001 to 5,000",
  "searchTerm": "software engineer",
  "searchLocation": "New York, NY"
}
```

### Pricing

Pay per job. **No start fee, no monthly rental, no minimum.**

| Event | Charged for | Price |
|---|---|---|
| `job-scraped` | each unique job delivered, description included | **$1.49 / 1,000** |

| You export | You pay |
|---|---|
| 1,000 jobs | **$1.49** |
| 10,000 jobs | **$14.90** |
| 100,000 jobs | **$149.00** |

Proxies are included. Duplicate jobs, searches that fail and searches that return nothing are free.

### Use cases

#### Job boards and aggregators

Fill a niche job board with fresh listings. Schedule daily runs with **Posted within** set to 24 hours and de-duplicate on `jobUrl`.

#### Recruiting and staffing lead generation

Companies that are hiring are companies that buy recruiting services. Export who is hiring for which roles, with `emails`, `companyWebsite` and `companyEmployees`, and you have a prospect list.

#### B2B sales intelligence

Hiring signals reveal budgets and priorities. A company posting five data engineering roles is about to spend on data tooling. Search by skill or tool name to find them.

#### Salary benchmarking

Collect pay ranges by title and city. With annual conversion on, you can compare markets directly in a spreadsheet.

#### Labour market and skills research

Track which skills appear in job descriptions over time. Full descriptions in Markdown are ready for keyword counts or an LLM.

#### Job search automation

Collect matching jobs across both boards every morning and send them to a sheet, Slack or your own matching model.

### FAQ

**Do I need an Indeed or LinkedIn account?**
No. The Actor reads public listings without logging in.

**How many jobs can I get per search?**
Each board stops a single search at about 1,000 results. To collect more, split the search: add more locations, more specific titles, or run by posting date.

**Why did LinkedIn return fewer jobs than I asked for?**
LinkedIn limits how fast listings can be read. The Actor rotates proxies and retries, but a broad search can still end early. Narrower searches by city or title return more in total. You are billed only for jobs delivered.

**How fast is it?**
Indeed returns about 500 jobs with full descriptions in under a minute. LinkedIn takes 3 to 5 seconds per job when full descriptions are on. Turn **Get full LinkedIn descriptions** off for a faster listing-only export.

**Are salaries always present?**
No. They appear when the employer or the board publishes them. Coverage is highest on Indeed in the United States.

**Can I combine the date filter with job type and remote-only?**
On LinkedIn, yes. Indeed accepts only one of these groups per search, and the date filter takes priority. Remote-only is still applied to the results afterwards.

**Which countries are supported?**
Indeed is available in 70+ countries from the **Country** list. LinkedIn is global and uses the location you type.

**Are other job boards supported?**
Not at the moment. Glassdoor, ZipRecruiter, Google Jobs and Naukri currently block automated access, so they are left out rather than returning partial data.

**I set a date filter but the board showed older jobs. Are they in my export?**
No. Job boards let promoted and reposted listings through their own date filter. The Actor checks every posting date itself and drops listings older than your window. Dropped listings are free.

**Are duplicates removed?**
Yes. A job found by several searches in the same run is delivered and billed once.

### Integrations

- **Apify API** - start runs and fetch datasets from Python, Node.js, cURL or any HTTP client.
- **MCP server** - call this Actor as a tool from Claude, Cursor, ChatGPT agents and any MCP client.
- **No-code** - Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- **Schedules** - run daily for new jobs and append to the same dataset.
- **Exports** - JSON, JSONL, CSV, Excel (XLSX), XML, HTML table.

### Related actors

**Google**

- [Google Search Results Scraper](https://apify.com/zaver.api/google-search-scraper) - organic results, news and People Also Ask
- [Google Maps Scraper](https://apify.com/zaver.api/google-maps-scraper) - places with ratings, phone, website and GPS
- [Google Places Scraper](https://apify.com/zaver.api/google-places-scraper) - local businesses by keyword and location
- [Google Shopping Scraper](https://apify.com/zaver.api/google-shopping-scraper) - products, prices, sellers and ratings
- [Google Images Scraper](https://apify.com/zaver.api/google-images-scraper) · [Google Videos Scraper](https://apify.com/zaver.api/google-videos-scraper) · [Google Patents Scraper](https://apify.com/zaver.api/google-patents-scraper)

**Reddit**

- [Reddit Scraper](https://apify.com/zaver.api/reddit-scraper) - posts, comments, search, users and communities
- [Reddit Comments Scraper](https://apify.com/zaver.api/reddit-comments-scraper) - every comment and nested reply from any post
- [Reddit Search Scraper](https://apify.com/zaver.api/reddit-posts-search-scraper) - posts, communities and users by keyword
- [Reddit Lead Finder](https://apify.com/zaver.api/reddit-lead-finder) - people asking for what you sell, scored by buying intent

### Credits

Built on the open-source [JobSpy](https://github.com/speedyapply/JobSpy) library (MIT License).

***

*Not affiliated with, endorsed by or sponsored by Indeed or LinkedIn. This Actor reads only publicly available job listings and does not log in. You are responsible for using the data in line with applicable laws and each site's terms.*

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for, one per line: a job title (<code>software engineer</code>), a skill (<code>python</code>) or a company name. Each term is searched in every location on every selected site.

## `locations` (type: `array`):

Cities, states or countries, one per line, for example <code>New York, NY</code>, <code>London</code> or <code>Bangalore</code>. Leave empty to search the whole country.

## `sites` (type: `array`):

Which job boards to search. Both are searched by default.

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

Which Indeed country site to search. LinkedIn is global and uses only the location.

## `maxJobsPerSearch` (type: `integer`):

Maximum jobs per search term, location and site. Each job board stops a single search at about 1,000 results.

## `postedWithinHours` (type: `integer`):

Only jobs posted in the last N hours: <code>24</code> for the past day, <code>168</code> for the past week. 0 means any time. On Indeed this filter cannot be combined with job type or remote-only; the date filter wins.

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

Employment type.

## `remoteOnly` (type: `boolean`):

Return only remote jobs.

## `distance` (type: `integer`):

Distance from the location.

## `linkedinDescriptions` (type: `boolean`):

Open each LinkedIn job to get the full description, seniority level, industry, job function and emails. Included in the price. Adds 3 to 5 seconds per LinkedIn job; turn off for a faster listing-only export.

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

Format of the job description text.

## `annualSalary` (type: `boolean`):

Convert hourly, daily, weekly and monthly pay to a yearly figure so salaries are comparable.

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

Hard cap on jobs for the whole run. 0 means no cap.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "locations": [
    "New York, NY"
  ],
  "sites": [
    "indeed",
    "linkedin"
  ],
  "country": "usa",
  "maxJobsPerSearch": 100,
  "postedWithinHours": 0,
  "jobType": "",
  "remoteOnly": false,
  "distance": 50,
  "linkedinDescriptions": true,
  "descriptionFormat": "markdown",
  "annualSalary": false,
  "maxItems": 0
}
```

# Actor output Schema

## `results` (type: `string`):

All dataset items.

## `resultsCsv` (type: `string`):

CSV download.

## `runSummary` (type: `string`):

Counts for the run.

# 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 = {
    "searchTerms": [
        "software engineer"
    ],
    "locations": [
        "New York, NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaver.api/indeed-linkedin-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 = {
    "searchTerms": ["software engineer"],
    "locations": ["New York, NY"],
}

# Run the Actor and wait for it to finish
run = client.actor("zaver.api/indeed-linkedin-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 '{
  "searchTerms": [
    "software engineer"
  ],
  "locations": [
    "New York, NY"
  ]
}' |
apify call zaver.api/indeed-linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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