# LinkedIn Jobs Scraper — Salary, Company & Descriptions (`scrapersdelight/linkedin-jobs-scraper`) Actor

Scrape LinkedIn job postings by keyword & location: title, company, location, posted date, salary, seniority, employment type, industry & full description. Filter by date, experience, job type & remote. No login, no cookies.

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

## Pricing

$0.63 / 1,000 per job returneds

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/platform/actors/running/actors-in-store#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 is LinkedIn Jobs Scraper?

LinkedIn Jobs Scraper extracts **job postings from LinkedIn** by keyword and location — title,
company, location, posted date, salary where shown, and the full job description.

Type what you're hiring for (or hunting for), pick a location, and run it. **No login, no cookies,
no LinkedIn account** — it reads LinkedIn's public guest job pages.

- **No account needed** — nothing to connect, no session to keep alive, no risk to your own profile
- **Filter before you pay** — date posted, remote/hybrid/on-site, job type and experience level are
  applied by LinkedIn itself, so you only collect what you asked for
- **Full descriptions** — the complete posting text, plus seniority, employment type, job function
  and industry
- **Runs on standard proxies** — no residential proxy required, which keeps runs cheap
- Export to Excel, CSV, JSON or HTML; run it on a schedule or from the API

### What data can this scraper extract?

| | | |
|---|---|---|
| 💼 Job title | 🏢 Company name | 🔗 Company LinkedIn URL |
| 📍 Location | 📅 Posted date | ⏱️ Posted (relative) |
| 💰 Salary range | 🎁 Benefits | 👥 Applicant count |
| 📈 Seniority level | 📄 Employment type | 🧭 Job function |
| 🏭 Industries | 📝 Full description (text + HTML) | 🆔 Job ID + URL |

Seniority, employment type, job function, industries, applicant count and the description come from
the **full description add-on** — LinkedIn does not put them in the search results.

**A note on salary:** LinkedIn only shows a salary on postings where the employer published one, so
this field is sparse — often empty on a majority of rows. That is the source data, not the scraper.
When present it is returned both raw and parsed into `salary_min` / `salary_max` / `salary_period` /
`salary_currency`.

**There is no apply link.** LinkedIn does not expose the employer's off-site apply URL to logged-out
visitors — the only "apply" link on a public posting is LinkedIn's own signup page. Rather than hand
you a login link labelled as an apply link, the field is left out. Use `job_url` to open the posting.

### How much does it cost?

Pay per event — you're charged for what you actually receive.

- **Scraped job** — the base charge, once per unique job returned.
- **Add-on: full job description** — only when you switch it on, charged per job enriched.

Jobs already collected in the same run are deduplicated by job ID before you're charged.

### How do I use it?

#### ⬇️ Input

```json
{
  "keywords": "registered nurse",
  "location": "Chicago",
  "maxItems": 100,
  "datePosted": "week",
  "workplaceType": ["remote"],
  "fetchDetails": true
}
```

`maxItems: 0` collects everything LinkedIn will serve for the query. Note LinkedIn caps a single
search at roughly **1,000 results** — to go deeper, split the search (by city, by job type, by
seniority) and run it several times.

#### Filters

All optional, and all applied by LinkedIn before results reach you:

- **Date posted** — past 24 hours / week / month
- **Remote / on-site** — remote, hybrid, on-site
- **Job type** — full-time, part-time, contract, temporary, internship, volunteer, other
- **Experience level** — internship through executive
- **Sort by** — most relevant (LinkedIn's ranking) or most recent

#### ⬆️ Output

One row per job:

```json
{
  "job_id": "4409873117",
  "job_url": "https://www.linkedin.com/jobs/view/registered-nurse-ambulatory-...",
  "title": "Registered Nurse - Ambulatory",
  "company": "Incredible Health",
  "company_url": "https://www.linkedin.com/company/incredible-health",
  "location": "Chicago, IL",
  "posted_date": "2026-04-08",
  "posted_raw": "1 month ago",
  "salary_raw": null,
  "salary_min": null,
  "salary_max": null,
  "seniority_level": "Not Applicable",
  "employment_type": "Full-time",
  "job_function": "Health Care Provider",
  "industries": "Health and Human Services",
  "applicants_raw": "Over 200 applicants",
  "description_text": "…",
  "scraped_at": "2026-07-29T22:48:10.743Z"
}
```

### Common uses

- **Recruiters & staffing** — track which employers are hiring for a role across a whole market
- **Sales / GTM** — a company posting a role is a live hiring-intent signal; pair it with contact
  enrichment for outbound
- **Labour-market & salary research** — aggregate posting volume, seniority mix and salary bands
- **Job boards & aggregators** — ingest structured postings on a schedule

### Frequently asked questions

**Do I need a LinkedIn account or cookies?**
No. This reads LinkedIn's public guest job endpoints. You never connect an account, so your own
profile is never used or put at risk.

**Do I need residential proxies?**
No. It was measured at 18/18 successful calls on standard Apify datacenter proxies, which is why
the default proxy setting is the cheap one.

**How many jobs can I get from one search?**
LinkedIn serves roughly 1,000 results per query. Split by location, job type or seniority to cover
a bigger market.

**Why is salary empty on so many rows?**
Because most employers don't publish one. See the note above.

**Is scraping LinkedIn legal?**
This scraper only reads publicly visible pages, with no login and no personal profile data. Scraping
public data is generally lawful in many jurisdictions, but LinkedIn's Terms of Service restrict
automated access regardless, and rules differ by country. You are responsible for how you use this
tool and for complying with applicable law and LinkedIn's terms.

### Your feedback

We keep improving this scraper. If you hit a bug or want another field, open an issue on the Issues
tab.

# Actor input Schema

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

Job title or skill, exactly as you would type it into LinkedIn — e.g. 'registered nurse', 'python developer'. Leave empty to sweep everything in the location.

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

City, state, region or country as LinkedIn shows it — e.g. 'Chicago', 'United States', 'London, England'. Leave empty for worldwide.

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

Stop after this many jobs. Set 0 for every job LinkedIn will serve for the query (it caps a single search at roughly 1,000).

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

Only jobs posted within this window.

## `jobType` (type: `array`):

Employment types to include.

## `workplaceType` (type: `array`):

Workplace arrangement.

## `experienceLevel` (type: `array`):

Seniority levels to include.

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

Most relevant matches LinkedIn's own ranking; most recent puts the newest postings first.

## `fetchDetails` (type: `boolean`):

Opens each posting for the full description, seniority level, employment type, job function, industries and the external apply link. Slower, and charged per job.

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

Apify Proxy is enough — this scraper was measured at 18/18 successful calls on standard datacenter proxies. Residential is not required.

## `requestConcurrency` (type: `integer`):

Parallel requests for the description add-on. Keep modest to respect the site.

## Actor input object example

```json
{
  "keywords": "registered nurse",
  "location": "United States",
  "maxItems": 20,
  "datePosted": "",
  "jobType": [],
  "workplaceType": [],
  "experienceLevel": [],
  "sortBy": "R",
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestConcurrency": 5
}
```

# Actor output Schema

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

Title, company, company URL, location, posted date, salary, benefits, seniority, employment type, job function, industries, applicant count and the full job 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 = {
    "keywords": "registered nurse",
    "location": "United States",
    "maxItems": 20,
    "fetchDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/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": "registered nurse",
    "location": "United States",
    "maxItems": 20,
    "fetchDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/linkedin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "registered nurse",
  "location": "United States",
  "maxItems": 20,
  "fetchDetails": false
}' |
apify call scrapersdelight/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapersdelight/linkedin-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/tfBlr9U6pW6prbXKr/builds/kM7eHc9r4W2RoSuFV/openapi.json
