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

LinkedIn Jobs Scraper pulls job listings from any LinkedIn job search URL. Get title, company, location, salary, posted date, applicant count, seniority, benefits and apply link. Export to JSON, CSV or Excel for recruiting, job market research and lead generation. No login needed.

- **URL**: https://apify.com/alpha-scraper/linkedin-jobs-scraper.md
- **Developed by:** [Alpha Scraper](https://apify.com/alpha-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

LinkedIn Jobs Scraper turns any LinkedIn job search URL into a structured dataset of job postings. Paste a LinkedIn search link, choose how many jobs you want, and the Actor returns titles, companies, locations, salaries, posting dates, applicant counts, seniority levels, employment types and full job descriptions.

It works on public LinkedIn job pages, so you do not need a LinkedIn account, cookies or login. LinkedIn Jobs Scraper is built for recruiters, market researchers, sales teams and job-board builders who want to follow hiring demand without copying listings by hand.

The easiest way to start is to run a search on LinkedIn, copy the address and let LinkedIn Jobs Scraper do the collecting. Results export as JSON, CSV or Excel straight from Apify.

> **📌 LinkedIn Jobs Scraper at a glance**
>
> - **Platform:** LinkedIn public job search
> - **Input:** one or more LinkedIn job search URLs
> - **Output:** one dataset item per job posting
> - **Login required:** no

### 🔹 LinkedIn Jobs Scraper – Key Features

LinkedIn Jobs Scraper focuses on the job data that matters for hiring and market research:

- **Any job search URL** – copy a LinkedIn search link with your keywords, location and supported filters.
- **Several searches per run** – add multiple LinkedIn search URLs and collect jobs from each one.
- **Full job details** – every LinkedIn job includes the description as text and HTML, plus seniority, employment type, job function and industries.
- **Salary and applicants** – pay information and the applicant count are captured whenever LinkedIn shows them.
- **Optional company details** – switch on company enrichment to add website, slogan, description, employee count, size, headquarters and address.
- **Split by city** – break one LinkedIn search into city searches for a chosen country and go beyond the roughly 1,000 jobs LinkedIn returns per search.
- **No duplicates** – LinkedIn Jobs Scraper returns each job once per input URL.
- **Flexible export** – download your LinkedIn jobs data as JSON, CSV or Excel, or read it through the Apify API.

### 📊 LinkedIn Jobs Scraper – What Data You Can Extract

Each dataset item describes one job posting. LinkedIn Jobs Scraper leaves a field empty when LinkedIn does not show it, so your columns stay consistent from run to run.

| Group | Fields |
|---|---|
| Job basics | `id`, `title`, `companyName`, `location`, `link` |
| Dates | `postedAt` (as shown on LinkedIn, such as "2 days ago"), `postedDate` |
| Description | `descriptionText`, `descriptionHtml` |
| Job criteria | `seniorityLevel`, `employmentType`, `jobFunction`, `industries` |
| Pay | `salary`, `salaryInfo`, `benefits` |
| Application | `applyUrl`, `applicantsCount` |
| Company | `companyLinkedinUrl`, `companyLogo` |
| Hiring team (when shown) | `jobPosterName`, `jobPosterTitle`, `jobPosterPhoto`, `jobPosterProfileUrl` |
| Company details (optional) | `companyWebsite`, `companySlogan`, `companyDescription`, `companyEmployeesCount`, `companySize`, `companyHeadquarters`, `companyAddress` |
| Run context | `inputUrl`, `refId`, `trackingId` |

In short, LinkedIn Jobs Scraper gives you the role, the employer, the pay and the application path in a single record.

### 🚀 How to Use LinkedIn Jobs Scraper

You can start LinkedIn Jobs Scraper from the Apify Console in a few minutes:

- **Step 1:** Open the LinkedIn jobs page, enter keywords and a location, and apply the filters you want.
- **Step 2:** Copy the full address from your browser and paste it into **LinkedIn Job Search URLs**.
- **Step 3:** Set **Maximum Number of Jobs** to control how many jobs you collect per URL.
- **Step 4:** Optionally enable **Scrape Company Details** or **Split search by city locations**.
- **Step 5:** Click **Start**. LinkedIn Jobs Scraper collects the jobs, then you can open the **Output** tab to preview, filter and download them.

> **💡 Tip:** Start with the default of 5 jobs to confirm the search is right, then raise the limit.

### 🎯 LinkedIn Jobs Scraper – Use Cases

LinkedIn Jobs Scraper fits any workflow that starts with a list of open roles:

- **Recruiting and sourcing** – use LinkedIn Jobs Scraper to see which employers hire for a role on LinkedIn and how they describe it.
- **Job market research** – compare salaries, seniority levels and employment types across LinkedIn listings.
- **Lead generation** – find companies that are actively hiring and enrich them with LinkedIn company details.
- **Job boards and aggregators** – feed fresh LinkedIn postings into your own site or database.
- **Competitor monitoring** – watch which teams a rival is growing through its LinkedIn job ads.
- **Salary benchmarking** – collect the pay ranges that employers publish on LinkedIn.
- **Trend reports** – schedule LinkedIn Jobs Scraper weekly and compare how demand for a skill changes over time.

### 🧩 How LinkedIn Jobs Scraper Works

When a run starts, LinkedIn Jobs Scraper reads each search URL, keeps the search filters and passes them to LinkedIn's public job search. It pages through the results, skips jobs it has already seen, and opens each job's public page to read the full details.

If company enrichment is on, the Actor also reads each company page once and reuses the result for later jobs from the same employer. Finished LinkedIn jobs are saved to the dataset as each page of results is processed, so you can watch data appear during the run.

If LinkedIn temporarily refuses a request, LinkedIn Jobs Scraper retries it before moving on. A job whose page cannot be loaded is still returned with the basic details from the search results.

### 🔎 How to Scrape LinkedIn Jobs From a Search URL

To scrape LinkedIn jobs for a role and city, paste a search link like the one below. The Actor reads the keywords and location from the URL and pages through the public results.

```json
{
  "urls": [
    "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London"
  ],
  "count": 50,
  "scrapeCompany": true
}
```

Only job search URLs are supported. Links to a single job or a company page are skipped with a warning.

### ⚙️ LinkedIn Jobs Scraper – Input

All settings are available in the Console form and through the Apify API. Only `urls` is required. LinkedIn Jobs Scraper checks every URL before it starts and skips anything that is not a LinkedIn job search link. If no valid link remains, the run ends with an error message.

| Field | Type | Default | What it does |
|---|---|---|---|
| `urls` | array | 2 prefilled searches | **Required.** LinkedIn job search URLs to scrape. |
| `count` | integer | 5 | Maximum jobs per URL. LinkedIn returns about 1,000 jobs per search. |
| `scrapeCompany` | boolean | false | Adds company details. Each company page is fetched once per run, so runs are slower. |
| `splitByLocation` | boolean | false | Splits the search into city searches and replaces the location in your URL. |
| `splitCountry` | string | – | Country whose cities are used for splitting. Needed when splitting is on. |
| `proxyConfiguration` | object | preconfigured | Optional proxy settings. The default works for most runs. |

> **⚠️ Filters:** LinkedIn applies keywords, location, date posted, company, Easy Apply and early applicant filters to logged-out visitors. Work type, experience level, job type, salary, industry and sort order are ignored by LinkedIn and will not narrow results.

Countries without a built-in city list are searched as a whole. More than 50 countries, including the US, UK, India, Germany and Australia, have city lists. When splitting, cities are searched one after another until the job limit is reached, and a job found in several cities is returned once.

### 📦 LinkedIn Jobs Scraper – Output

LinkedIn Jobs Scraper saves one record per job to the default dataset. Here is a shortened example:

```json
{
    "id": "4384671812",
    "link": "https://www.linkedin.com/jobs/view/cashier-at-the-home-depot-4384671812?position=1&pageNum=0&refId=MsVgfnUBR2fDZT6xK3muwQ%3D%3D&trackingId=mIu14ypa2IKhQ0RsykKfpA%3D%3D",
    "title": "Cashier",
    "companyName": "The Home Depot",
    "companyLinkedinUrl": "https://www.linkedin.com/company/the-home-depot",
    "companyLogo": "https://media.licdn.com/dms/image/v2/C4E0BAQHzR2llYqUBtg/company-logo_100_100/company-logo_100_100/0/1630656428961/the_home_depot_logo?e=2147483647&v=beta&t=EZjw3CxR9dQa_S8IcVWwrJLtZ7v0iwT8gQFC8QOkvJw",
    "location": "Syosset, NY",
    "salaryInfo": [
      "$17.50/hr - $18.50/hr"
    ],
    "postedAt": "7 months ago",
    "postedDate": "2026-03-14",
    "descriptionHtml": "<div class=\"show-more-less-html__markup show-more-less-html__markup--clamp-after-20\n            relative overflow-hidden\">\n          78092BR<br><br><strong>Job Description<br><br></strong><strong>Position Purpose:<br><br></strong>Cashiers play a critical customer service role by providing customers with fast, friendly, accurate and safe service. They process Checkout and/or Return transactions, as well as monitor and maintain the Self-Checkout area. They proactively seek product/project knowledge to provide customers with information and identify selling opportunities. They follow all policies and procedures to ensure that shrink is minimized. A Head Cashier will position Cashiers and support them by expediting price checks, approving Point of Sale transactions and markdowns for mainline registers, Self-Checkout, Returns, Pro Desk, Special Services, and Tool Rental. They provide first level escalation for customer issues and assist in the supervision, coaching and training of other Front End Associates by participating in the training of new Cashiers and utilizing all available tools to coach and develop other Cashiers. The preferred qualification for a Head Cashier is 1+ years of Cashier experience.\n        </div>",
    "applicantsCount": "52 applicants",
    "applyUrl": "https://www.linkedin.com/jobs/view/cashier-at-the-home-depot-4384671812?position=1&pageNum=0&refId=MsVgfnUBR2fDZT6xK3muwQ%3D%3D&trackingId=mIu14ypa2IKhQ0RsykKfpA%3D%3D",
    "salary": "$17.50/hr - $18.50/hr",
    "descriptionText": "78092BR\n\nJob Description\n\nPosition Purpose:\n\nCashiers play a critical customer service role by providing customers with fast, friendly, accurate and safe service. They process Checkout and/or Return transactions, as well as monitor and maintain the Self-Checkout area. They proactively seek product/project knowledge to provide customers with information and identify selling opportunities. They follow all policies and procedures to ensure that shrink is minimized. A Head Cashier will position Cashiers and support them by expediting price checks, approving Point of Sale transactions and markdowns for mainline registers, Self-Checkout, Returns, Pro Desk, Special Services, and Tool Rental. They provide first level escalation for customer issues and assist in the supervision, coaching and training of other Front End Associates by participating in the training of new Cashiers and utilizing all available tools to coach and develop other Cashiers. The preferred qualification for a Head Cashier is 1+ years of Cashier experience.",
    "seniorityLevel": "Not Applicable",
    "employmentType": "Full-time",
    "jobFunction": "",
    "industries": "Consumer Services",
    "benefits": [],
    "refId": "MsVgfnUBR2fDZT6xK3muwQ==",
    "trackingId": "mIu14ypa2IKhQ0RsykKfpA==",
    "inputUrl": "https://www.linkedin.com/jobs/search/?position=1&pageNum=0"
  }
```

Company fields appear only when **Scrape Company Details** is on. Hiring-team fields appear only when LinkedIn shows a job poster. You can view the same data as a table in the Output tab or download it in any Apify export format. Because LinkedIn Jobs Scraper uses stable field names, runs are easy to merge in a spreadsheet, database or BI tool.

> **📝 Good to know**
>
> - `applyUrl` falls back to the LinkedIn job link when the external apply link is not public.
> - `benefits` lists benefit bullet points found in the description, so it is often empty.
> - `salary` comes from LinkedIn's pay data or a clear range in the description.

### 💰 LinkedIn Jobs Scraper – Pricing

LinkedIn Jobs Scraper is billed per result, so each job saved to the dataset counts toward your cost. The **Maximum Number of Jobs** setting is therefore your main cost control.

See the Pricing tab on this Actor's page for the current rate. If you want a hard cap, set a maximum cost per run in Apify. LinkedIn Jobs Scraper stops as soon as that cap is reached.

### ✅ Tips and Best Practices for LinkedIn Jobs Scraper

> **Get cleaner results**
>
> - Test a new search with a small `count`, then scale up.
> - Use the date posted filter in the URL to collect only recent LinkedIn postings.
> - Leave **Scrape Company Details** off unless you need it, because it adds extra requests.
> - For large searches, turn on **Split search by city locations** and pick a country.
> - Schedule LinkedIn Jobs Scraper in Apify to monitor new LinkedIn postings every day or week.

Keep one topic per search URL. LinkedIn Jobs Scraper works best with focused searches, which are easier to analyse than one broad query, and the `inputUrl` field tells you which search each job came from.

### ❓ Frequently Asked Questions

#### 🤔 What is LinkedIn Jobs Scraper?

LinkedIn Jobs Scraper is an Apify Actor that collects public job postings from LinkedIn job search URLs and returns them as structured data.

#### 👥 Who uses LinkedIn Jobs Scraper?

Recruiters, HR analysts, sales teams, researchers, job-board owners and developers who need LinkedIn job data in a structured format.

#### 🔐 Can I use LinkedIn Jobs Scraper without logging in?

Yes. The Actor reads public job pages, so no account, cookies or password are needed.

#### 🔢 How many jobs can LinkedIn Jobs Scraper collect per search?

LinkedIn returns about 1,000 jobs for one search. To collect more, enable splitting by city and choose a country. The **Maximum Number of Jobs** limit then covers the whole URL.

#### 🧭 Which filters does LinkedIn Jobs Scraper support?

Keywords, location, date posted, company, Easy Apply and early applicant filters work. LinkedIn ignores other filters for logged-out visitors, and the Actor logs a warning when it finds them in your URL.

#### 💵 Does LinkedIn Jobs Scraper extract salary information?

Yes, when LinkedIn shows pay on the job or a clear salary range appears in the description. Otherwise `salary` stays empty.

#### 🏙️ How do I scrape LinkedIn jobs by city?

Put the city in the LinkedIn search URL, or turn on **Split search by city locations** to search the major cities of a country one by one.

#### 📁 Can I export LinkedIn Jobs Scraper results to Excel or CSV?

Yes. Open the dataset and choose Excel, CSV, JSON or another format, or fetch the data through the Apify API.

#### ⏰ Can I run LinkedIn Jobs Scraper on a schedule?

Yes. Use Apify schedules to run it daily or weekly and connect the results to your tools through integrations.

#### 🔌 Can I start LinkedIn Jobs Scraper through the Apify API?

Yes. Call the Actor with the same JSON input shown above, then read the dataset when the run finishes. This makes it easy to plug LinkedIn Jobs Scraper into your own apps and workflows.

#### 📉 Why did I get fewer LinkedIn jobs than my limit?

LinkedIn may have fewer matching jobs, or it may stop returning results before your limit. Narrow the search or split it by city.

#### ⚖️ Is it allowed to scrape LinkedIn job data?

The Actor collects only publicly visible job information. You remain responsible for using the data lawfully and in line with LinkedIn's terms.

### 📬 Support

Questions, feature requests or a LinkedIn search that does not behave as expected? Share the search URL and your run link so the issue with LinkedIn Jobs Scraper can be reproduced.

- Contact me by email: alphascraper69@gmail.com

# Actor input Schema

## `urls` (type: `array`):

List of LinkedIn Job search URLs to scrape. You can copy the URL from a LinkedIn job search. Only job search URLs are supported (not single job or company pages). Note: LinkedIn only applies keywords, location/geoId, date posted (f_TPR), company (f_C), Easy Apply (f_AL) and early applicant (f_EA) filters to logged-out visitors. Work type, experience level, job type, salary, industry and sort order are ignored by LinkedIn and will not filter the results.

## `count` (type: `integer`):

Maximum number of jobs to scrape per URL. A single LinkedIn search returns at most about 1,000 jobs; enable 'Split search by city locations' to go beyond that (the limit then applies to the whole URL, not to each city).

## `scrapeCompany` (type: `boolean`):

Whether to fetch additional company details (website, slogan, description, employees, headquarters, address). Each company page is fetched once per run. This is slower and uses more bandwidth.

## `splitByLocation` (type: `boolean`):

Enable this to split your search by cities within a country. This helps bypass LinkedIn's 1000 job limit per search URL by creating separate searches for each city. This will overwrite the location filter in input search URLs. Cities are searched one after another until the 'Maximum Number of Jobs' limit is reached; jobs found in several cities are only returned once.

## `splitCountry` (type: `string`):

Select the country whose cities will be used to split the search. Only used when 'Split search by city locations' is enabled. Required when 'Split search by city locations' is enabled. Countries without a built-in city list are searched as a whole.

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

Proxy used for all requests to LinkedIn. LinkedIn rate-limits and blocks data center IPs quickly, so the default is Apify Residential proxy.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/jobs/search/?position=1&pageNum=0",
    "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London"
  ],
  "count": 5,
  "scrapeCompany": false,
  "splitByLocation": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "urls": [
        "https://www.linkedin.com/jobs/search/?position=1&pageNum=0",
        "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London"
    ],
    "count": 5,
    "scrapeCompany": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alpha-scraper/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 = {
    "urls": [
        "https://www.linkedin.com/jobs/search/?position=1&pageNum=0",
        "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London",
    ],
    "count": 5,
    "scrapeCompany": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alpha-scraper/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 '{
  "urls": [
    "https://www.linkedin.com/jobs/search/?position=1&pageNum=0",
    "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London"
  ],
  "count": 5,
  "scrapeCompany": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call alpha-scraper/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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