# LinkedIn Jobs Scraper (`lergassy/linkedin-jobs-scraper`) Actor

Scrape LinkedIn job listings worldwide without login: title, company, location, seniority, job function, industries, applicants, salary when posted, full description, apply link and recruiter emails from the posting.

- **URL**: https://apify.com/lergassy/linkedin-jobs-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Stats:** 2 total users, 1 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

**LinkedIn Jobs Scraper** turns any LinkedIn job search into a clean table — **without login, cookies or a LinkedIn account**. Every row has the title, company, location, seniority, job function, industries, number of applicants, salary when the employer posts it, the full description, and recruiter emails and phones found in the posting. Worldwide, by any location LinkedIn understands.

Type job titles and a location 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 LinkedIn Jobs Scraper?

It is a **LinkedIn jobs scraper and LinkedIn jobs API** for recruiters, job boards, lead generation, labour-market research and AI agents. LinkedIn has no public job-search API; this Actor reads LinkedIn's public guest job pages — the ones anyone can open without signing in — so no account is ever at risk.

- **No login, no cookies:** nothing to connect, nothing to get banned.
- **Full descriptions** and LinkedIn's own fields: `seniority`, `jobFunction`, `industries`, `applicants`, `benefits`.
- **Filters at the source:** posted within, remote / hybrid / on-site filter, job type, experience level, radius, sort by date.
- **Contacts:** emails and phones from the posting text; optional look-up of general contacts on the company website.

### What data does it return?

| Field | Example |
|---|---|
| `id`, `url` | 4466180813 · https://de.linkedin.com/jobs/view/senior-data-engineer-at-trust-in-soda-4466180813 |
| `title`, `company`, `companyUrl`, `companyLogo` | Senior Data Engineer · Trust In SODA · https://uk.linkedin.com/company/trust-in-soda · … |
| `location`, `queryLocation` | Berlin, Germany · Berlin, Germany |
| `seniority`, `jobFunction`, `industries` | Mid-Senior level · Engineering · Software Development |
| `applicants`, `applicantsText` | 189 · "189 applicants" |
| `isRemote`, `employmentType`, `jobTypes` | false · fulltime · \["fulltime"] |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | 85000 · 110000 · EUR · year (when the employer posts pay) |
| `postedAt`, `postedText`, `description`, `descriptionHtml` | 2026-09-15T00:00:00.000Z · "1 week ago" · full text · HTML |
| `emails`, `phones` | from the posting text, when present |

### How much does it cost?

Pay per job row; **error rows are free**.

| Row | Price |
|---|---|
| Job | $0.003 — 1,000 LinkedIn 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 LinkedIn jobs

1. Enter **Job titles or keywords** (one per line) and a **Location** (city, region, country or "Worldwide").
2. Pick filters: posted within, workplace, job types, experience level, radius, sort.
3. Keep **Full descriptions** on if you need the job text (one extra request per job).
4. Click **Start**; export the dataset or read it through the API.

### ⬇️ Input

```json
{
  "keywords": ["data engineer", "product manager"],
  "location": "Berlin, Germany",
  "maxJobsPerQuery": 200,
  "datePosted": "week",
  "experience": ["mid"],
  "includeDescription": true
}
```

Remote jobs worldwide, newest first:

```json
{ "keywords": ["react developer"], "location": "Worldwide", "remote": "remote", "sortBy": "date", "datePosted": "day" }
```

### ⬆️ Output

```json
{
  "type": "job",
  "source": "linkedin",
  "id": "4466180813",
  "title": "Senior Data Engineer",
  "company": "Trust In SODA",
  "location": "Berlin, Germany",
  "seniority": "Mid-Senior level",
  "jobFunction": "Engineering",
  "industries": "Software Development",
  "employmentType": "fulltime",
  "applicants": 189,
  "salaryMin": 85000,
  "salaryMax": 110000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "postedAt": "2026-09-15T00:00:00.000Z",
  "url": "https://de.linkedin.com/jobs/view/senior-data-engineer-at-trust-in-soda-4466180813",
  "description": "Senior Data Engineer - E-Commerce Scale-Up …"
}
```

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

### Use cases

- **Recruiting and sourcing:** who is hiring for a role, where, how many applicants already.
- **Job boards and alerts:** fresh LinkedIn postings on a schedule; dedupe on `id`.
- **Lead generation:** companies hiring for a function are buying tools for it — export `company` and contacts.
- **Market research:** seniority, functions and industries across thousands of postings.
- **AI agents:** typed rows an agent can filter.

### 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

#### Do I need a LinkedIn account or cookies?

No. Only LinkedIn's public guest job pages are read.

#### How many jobs can I get?

Up to 1,000 per search — the same ceiling LinkedIn shows to any visitor. Split big searches by location or keyword.

#### I also need Indeed 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 [Indeed Jobs Scraper](https://apify.com/lergassy/indeed-jobs-scraper).

#### Is this legal?

It reads public job postings without logging in and returns factual listing data and public business contacts. Respect LinkedIn'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.
- [Indeed Jobs Scraper](https://apify.com/lergassy/indeed-jobs-scraper) — Indeed jobs from 60+ countries.
- [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.

## `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.

## `experience` (type: `array`):

LinkedIn's seniority filter. Empty = all.

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

Distance around the location.

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

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

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

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

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

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

## `includeDescription` (type: `boolean`):

Opens each LinkedIn job page for the description, seniority, employment type, function, industries, applicants and apply link (one request per job). Indeed and career sites include descriptions already.

## `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",
  "maxJobsPerQuery": 25,
  "datePosted": "any",
  "remote": "any",
  "radius": 25,
  "sortBy": "relevance",
  "includeDescription": true,
  "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,
    "includeDescription": true,
    "includeContacts": false
};

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

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

```

## MCP server setup

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