# LinkedIn Jobs Scraper — Jobs, Salary, Companies & Hiring Data (`zapticx/linkedin-jobs-scraper`) Actor

Scrape LinkedIn jobs by keyword, location, or URL. Extract descriptions, salary when published, company data, applicants, skills, and hiring metadata. $0.75/1,000 jobs.

- **URL**: https://apify.com/zapticx/linkedin-jobs-scraper.md
- **Developed by:** [Zapticx](https://apify.com/zapticx) (community)
- **Stats:** 6 total users, 4 monthly users, 93.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 1,000 job 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?

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 — Jobs, Salary, Companies & Hiring Data

Scrape public [LinkedIn Jobs](https://www.linkedin.com/jobs/) listings by keyword and location, from a LinkedIn Jobs search URL, or from an individual job URL. This LinkedIn jobs scraper returns clean job, company, applicant, and hiring data with full descriptions, salary information when published, and structured skills when recognized.

Use the results as recruitment data, job market data, or an employment-data feed through the Apify API and webhooks. Export every run as JSON, CSV, or Excel for analysis and recruitment automation.

💰 **Pricing:** $0.00075 per successful unique job result — $0.75 per 1,000 results.

**Data source: [LinkedIn Jobs](https://www.linkedin.com/jobs/)**

### What can you do with this Actor?

- Build job-listing and recruitment datasets by role and location.
- Track company hiring activity and workforce demand.
- Research technologies and skills mentioned in job descriptions.
- Analyze salary-bearing listings without guessing missing compensation.
- Monitor job-market trends across multiple searches.
- Feed structured LinkedIn job data into workflows, dashboards, databases, and AI systems.

### How to use this Actor

- 👉 **Register for a free Apify account** — no credit card required.
- 🎉 Just click [**Sign up free on Apify →**](https://console.apify.com/sign-up?fpr=1h3gvi) and complete a quick signup.
- 💰 A free Apify account includes $5 in monthly credits — enough to test this Actor.
- ⏳ Start on Apify's free plan, with no commitment or upfront payment required.
- 💼 Open the Actor and add job keywords and locations, or paste a supported public LinkedIn Jobs search or job URL.
- ▶️ Click **Start** and export the results to JSON, CSV, Excel, or use them through the API.

### Features

- Keyword and location search, including multiple searches in one run
- Public LinkedIn Jobs search URLs and individual job URLs
- Pagination beyond the first result page
- Global deduplication by LinkedIn job ID with input provenance
- Full public job descriptions in clean text and description-only HTML
- Company LinkedIn URL and public company logo
- Employment type, experience level, industry, and applicant metadata when exposed
- Conservative applicant-count parsing that distinguishes explicit lower bounds
- Salary text and structured salary fields when compensation is published
- Structured skills extracted from descriptions when recognized supported technologies or skills are present
- Canonical LinkedIn job URLs
- HTTP-first collection with retry, blocking detection, and no browser automation
- No proxy required by default

### Data fields

Optional fields are `null` or an empty array when the public listing does not expose them.

| Field | Description |
|---|---|
| `jobId` | Stable LinkedIn job identifier |
| `title` | Published job title |
| `companyName` | Published hiring company |
| `companyLinkedInUrl` | Public LinkedIn company URL when exposed |
| `companyLogo` | Public company logo URL when exposed |
| `location` | Published job location |
| `employmentType` | Employment type when exposed |
| `experienceLevel` | Seniority or experience level when exposed |
| `industries` | Published industry values |
| `postedAt` | Normalized ISO posting timestamp when reliable source data exists |
| `postedDate` | Normalized ISO posting date |
| `salaryText` | Original published compensation text |
| `salaryMin`, `salaryMax` | Parsed numeric salary bounds without period conversion |
| `salaryCurrency` | Explicit published currency code |
| `salaryPeriod` | `HOUR`, `DAY`, `WEEK`, `MONTH`, or `YEAR` when parsed |
| `applicantsText` | Original applicant wording |
| `applicantsCount` | Conservatively parsed applicant number |
| `applicantsCountIsLowerBound` | Whether the parsed number is explicitly a lower bound |
| `skills` | Recognized normalized skills from the job description |
| `descriptionText` | Clean full job-description text |
| `descriptionHtml` | Description-only HTML |
| `jobUrl` | Canonical LinkedIn job URL |
| `matchedSearches` | Inputs that discovered the job after global deduplication |
| `collectedAt` | UTC collection timestamp |

### Input

| Input | Type | Default | Description |
|---|---|---:|---|
| `searches` | array | Editor prefill | Keyword and optional location searches, processed in order |
| `startUrls` | array | `[]` | Public LinkedIn Jobs search URLs or individual job URLs |
| `maxItems` | integer | `10` | Global maximum number of unique valid jobs saved |
| `maxItemsPerSearch` | integer | — | Optional maximum of newly discovered unique jobs from each search source |
| `postedWithin` | enum | `week` | Keyword-search date filter: `any`, `24h`, `week`, or `month` |
| `includeDescription` | boolean | `true` | Fetch public details and available enrichment metadata |
| `extractSkills` | boolean | `true` | Extract recognized skills when description text is available |
| `proxyConfiguration` | object | Proxy disabled | Optional Apify proxy settings; no proxy is the validated and recommended default |

At least one `searches` or `startUrls` entry is required. `postedWithin` maps to LinkedIn's any-time, past-24-hours, past-week, and past-month filters for keyword searches. A supplied LinkedIn search URL keeps its own URL filters.

Example input:

```json
{
  "searches": [
    { "keyword": "Software Engineer", "location": "United States" }
  ],
  "maxItems": 10,
  "postedWithin": "week",
  "includeDescription": true,
  "extractSkills": true
}
```

### Output

Each unique valid job is written once to the default Dataset. Results can be exported as JSON, CSV, or Excel, or retrieved through the Apify API.

```json
{
  "jobId": "4419969671",
  "title": "Senior Platform Engineer",
  "companyName": "Example Corp",
  "companyLinkedInUrl": "https://www.linkedin.com/company/example",
  "companyLogo": "https://media.example/logo.png",
  "location": "Remote, United States",
  "employmentType": "Full-time",
  "experienceLevel": "Mid-Senior level",
  "industries": ["Software Development"],
  "postedAt": "2026-10-02T00:00:00.000Z",
  "postedDate": "2026-10-02",
  "salaryText": "$120,000 - $150,000 a year",
  "salaryMin": 120000,
  "salaryMax": 150000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "applicantsText": "Over 100 applicants",
  "applicantsCount": 100,
  "applicantsCountIsLowerBound": true,
  "skills": ["Python", "AWS", "Docker", "Kubernetes", "PostgreSQL"],
  "descriptionText": "Build and operate reliable platform services…",
  "descriptionHtml": "<p>Build and operate reliable platform services…</p>",
  "jobUrl": "https://www.linkedin.com/jobs/view/4419969671/",
  "matchedSearches": [
    { "keyword": "Software Engineer", "location": "United States", "searchIndex": 0 }
  ],
  "collectedAt": "2026-10-04T12:00:00.000Z"
}
```

### Pricing

- **Job result (`job-result`):** $0.00075 per successful unique job
- **Equivalent:** $0.75 per 1,000 successful unique jobs

| Jobs | Price |
|---:|---:|
| 100 | $0.075 |
| 500 | $0.375 |
| 1,000 | $0.75 |
| 5,000 | $3.75 |
| 10,000 | $7.50 |

Only successful unique results written to the Dataset are charged. Search requests, detail requests, retries, failed records, duplicates, and run metadata are not separate charged results.

### Examples / Ready-to-use Tasks

#### Software Engineer jobs in the United States

```json
{
  "searches": [{ "keyword": "Software Engineer", "location": "United States" }],
  "maxItems": 10,
  "postedWithin": "week",
  "includeDescription": true,
  "extractSkills": true
}
```

#### AI Engineer and Data Engineer market comparison

```json
{
  "searches": [
    { "keyword": "AI Engineer", "location": "United States" },
    { "keyword": "Data Engineer", "location": "Canada" }
  ],
  "maxItems": 20,
  "maxItemsPerSearch": 10
}
```

#### Existing LinkedIn Jobs search URL

```json
{
  "startUrls": [{ "url": "https://www.linkedin.com/jobs/search/?keywords=Data%20Engineer&location=Canada" }],
  "maxItems": 10
}
```

#### Individual LinkedIn job URL

```json
{
  "startUrls": [{ "url": "https://www.linkedin.com/jobs/view/example-role-4419969671/" }],
  "maxItems": 1
}
```

### API & Integrations

Actor slug: `zapticx/linkedin-jobs-scraper`

Run this LinkedIn jobs API through the [Apify API](https://docs.apify.com/api/v2), call it from Python or JavaScript, or trigger downstream work with Apify webhooks. Apify workflows can connect results to Make, Zapier, n8n, Google Sheets, Airtable, databases, and other tools available in your account. You can also save inputs as Tasks and run them on an Apify Schedule.

### Limitations

- Public fields vary by listing; salary is returned only when published, and optional metadata may be absent.
- Skills are returned only when recognized supported technologies or skills appear in an available description.
- Removed, expired, private, or otherwise unavailable jobs may not resolve.
- LinkedIn can change public markup, access behavior, geography, and result depth.
- The Actor does not scrape separate company pages, so it does not return company websites or company descriptions.

Built by **[Zapticx](https://www.zapticx.com/)** — AI automation and data solutions.

### Search keywords

LinkedIn jobs scraper, LinkedIn job scraper, LinkedIn Jobs API, Apify LinkedIn scraper, LinkedIn job data extraction, job listings scraper, recruitment data, hiring data, salary jobs scraper, skills extraction, job market research, employment data, workforce analytics, recruitment automation

**Disclaimer**: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by **LinkedIn Corporation or Microsoft Corporation**.

# Actor input Schema

## `searches` (type: `array`):

One or more LinkedIn job searches by keyword and optional location. Searches run in input order and share the global maximum.

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

Public LinkedIn Jobs search URLs or individual LinkedIn job URLs. You can use these instead of keyword searches.

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

Maximum number of unique valid jobs saved across all inputs.

## `maxItemsPerSearch` (type: `integer`):

Optional cap for each keyword search or search URL.

## `postedWithin` (type: `string`):

Date filter for keyword searches: any time, past 24 hours, past week, or past month. Existing search URLs keep their own URL filters.

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

Fetch each public job detail page for full descriptions and available employment, experience, industry, applicant, and salary metadata.

## `extractSkills` (type: `boolean`):

Extract recognized, normalized skills from full job descriptions when supported technologies or skills are present.

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

Optional Apify proxy settings. No proxy is the validated and recommended default.

## Actor input object example

```json
{
  "searches": [
    {
      "keyword": "Software Engineer",
      "location": "United States"
    }
  ],
  "startUrls": [],
  "maxItems": 10,
  "postedWithin": "week",
  "includeDescription": true,
  "extractSkills": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searches": [
        {
            "keyword": "Software Engineer",
            "location": "United States"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/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 = { "searches": [{
            "keyword": "Software Engineer",
            "location": "United States",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("zapticx/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 '{
  "searches": [
    {
      "keyword": "Software Engineer",
      "location": "United States"
    }
  ]
}' |
apify call zapticx/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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