# LinkedIn Jobs Scraper (`nodeflow/linkedin-job-listings-scraper`) Actor

Scrape public LinkedIn job listings by job title, keyword, and location. Get clean, deduplicated job data including company, workplace type, posting date, salary, and job URL. No LinkedIn login or cookies required.

- **URL**: https://apify.com/nodeflow/linkedin-job-listings-scraper.md
- **Developed by:** [NodeFlow](https://apify.com/nodeflow) (community)
- **Categories:**
- **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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## LinkedIn Job Listings Scraper

Find public LinkedIn job listings by **job title, keyword, and location**—without collecting recruiter profiles, company enrichment, comments, or unrelated personal data. This Apify Actor returns a clean, deduplicated dataset designed for job seekers, job boards, market research, alerts, and workflow automation.

### Why use this LinkedIn jobs scraper?

Many general LinkedIn scrapers return hundreds of fields you do not need. **LinkedIn Job Listings Scraper** focuses on eight useful fields only:

- Job title
- Company name
- Location
- Workplace type: `remote`, `hybrid`, or `on-site`
- Posting date
- Salary, when LinkedIn publishes it
- Canonical LinkedIn job URL
- Search query used for the run

The Actor searches LinkedIn's publicly accessible job pages. It does not require LinkedIn credentials or cookies, and it does not scrape recruiter profiles, employee profiles, comments, applicants, or company details.

### Features

- Search LinkedIn jobs by role, skill, or keyword
- Filter results by city, region, or country
- Choose exactly how many unique job listings to collect
- Automatic duplicate removal by LinkedIn job ID
- Salary extraction from structured job data when available
- Remote, hybrid, and on-site workplace classification
- Fast HTTP-based crawling with no browser overhead
- Optional Apify Proxy support for larger and repeated runs
- Clean JSON, CSV, Excel, XML, and RSS exports through Apify datasets
- API, webhook, schedule, Make, Zapier, and Google Sheets friendly output

### Input

| Field                |    Type | Required |                Default | Description                                   |
| -------------------- | ------: | :------: | ---------------------: | --------------------------------------------- |
| `searchQuery`        |  string |   Yes    |    `Software Engineer` | Job title, skill, or keyword                  |
| `location`           |  string |   Yes    |             `Istanbul` | City, region, or country                      |
| `maxItems`           | integer |   Yes    |                   `50` | Number of unique jobs to collect (`1`–`1000`) |
| `proxyConfiguration` |  object |    No    | Apify Proxy in Console | Optional proxy settings                       |

#### Example input

```json
{
    "searchQuery": "React Developer",
    "location": "Berlin",
    "maxItems": 25
}
```

### Output

Each dataset item contains only the requested job-listing fields. Missing salary or workplace data is returned as `null`; the Actor never invents unavailable values.

#### Example output

```json
{
    "title": "Senior React Developer",
    "companyName": "Example Technologies",
    "location": "Berlin, Germany",
    "workplaceType": "hybrid",
    "postedAt": "2026-09-07",
    "salary": "EUR 70,000–90,000 per year",
    "jobUrl": "https://www.linkedin.com/jobs/view/4012345678",
    "searchQuery": "React Developer"
}
```

### How to use

1. Open the Actor in Apify Console.
2. Enter a job title or keyword in **Search query**.
3. Enter a city, region, or country in **Location**.
4. Choose the **Maximum number of jobs**.
5. Click **Start** and export the resulting dataset in your preferred format.

For frequent or high-volume runs, keep Apify Proxy enabled. Smaller searches can also run through a direct connection.

### Run with the Apify API

```bash
curl "https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-job-listings-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"Data Analyst","location":"London","maxItems":100}'
```

After the run finishes, read items from the run's default dataset or download them as JSON, CSV, Excel, XML, or RSS.

### Run locally

Requirements: Node.js 20 or newer.

```bash
npm install
npm run build
npm test
npm run test:live
```

To run the full Actor locally, place the example input at `storage/key_value_stores/default/INPUT.json`, then start it:

```powershell
New-Item -ItemType Directory -Force storage/key_value_stores/default
Copy-Item INPUT.example.json storage/key_value_stores/default/INPUT.json
npm start
```

Results are written to `storage/datasets/default/`.

### Dataset fields

| Field           | Nullable | Meaning                               |
| --------------- | :------: | ------------------------------------- |
| `title`         |    No    | LinkedIn job-listing title            |
| `companyName`   |    No    | Employer name shown on the listing    |
| `location`      |    No    | Location shown by LinkedIn            |
| `workplaceType` |   Yes    | `remote`, `hybrid`, or `on-site`      |
| `postedAt`      |   Yes    | Published date, normally `YYYY-MM-DD` |
| `salary`        |   Yes    | Published salary range and period     |
| `jobUrl`        |    No    | Tracking-free canonical job URL       |
| `searchQuery`   |    No    | Original search keyword               |

### Common use cases

- Build a personal LinkedIn job search tracker
- Monitor remote or hybrid job opportunities
- Feed a niche job board or career dashboard
- Compare hiring demand by keyword and location
- Create scheduled job alerts with Apify webhooks
- Analyze published salary ranges
- Export clean job leads to Sheets, Airtable, or a database

### Accuracy and limitations

- Results depend on public LinkedIn availability at run time.
- LinkedIn does not publish salary or workplace type for every job, so those values can be `null`.
- Public search availability can vary by country, IP address, and request volume. Use Apify Proxy if direct requests are rate-limited.
- Listings can expire or be removed after collection.
- This Actor is not affiliated with or endorsed by LinkedIn.

### Responsible use

Scrape only publicly available data and use it in accordance with applicable laws and website terms. The Actor deliberately excludes recruiter profiles, personal profile details, comments, applicant data, and company enrichment.

### Turkish quick start / Türkçe hızlı kullanım

Actor'a `searchQuery` alanında pozisyon veya anahtar kelimeyi, `location` alanında lokasyonu, `maxItems` alanında istediğiniz benzersiz ilan sayısını girin. Çıktı; ilan başlığı, şirket, lokasyon, çalışma şekli, yayın tarihi, varsa maaş, ilan bağlantısı ve arama kelimesinden oluşur. LinkedIn hesabı veya çerez gerekmez.

### Support

If a run returns fewer results than requested, try a broader keyword or location and enable Apify Proxy. For reproducible bug reports, include the input (without secrets), run ID, and the relevant log excerpt.

# Actor input Schema

## `searchQuery` (type: `string`):

Job title, role, skill, or keyword to search for (for example: Software Engineer, React Developer, Data Analyst).

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

City, region, or country where you want to find jobs (for example: Istanbul, Turkey, Berlin, or United States).

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

Stop after collecting this many unique LinkedIn job listings.

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

Optional. Apify Proxy is recommended for larger or repeated runs. Direct access is used when no proxy is configured.

## Actor input object example

```json
{
  "searchQuery": "Software Engineer",
  "location": "Istanbul",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "Software Engineer",
    "location": "Istanbul",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nodeflow/linkedin-job-listings-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 = {
    "searchQuery": "Software Engineer",
    "location": "Istanbul",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nodeflow/linkedin-job-listings-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 '{
  "searchQuery": "Software Engineer",
  "location": "Istanbul",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nodeflow/linkedin-job-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nodeflow/linkedin-job-listings-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/d8t4ddhXIDn06kr3K/builds/cfyHnjd4nodNNqR09/openapi.json
