# LinkedIn Jobs Scraper — 12 Fields, No Login, No Browser (`themineworks/linkedin-jobs-scraper`) Actor

Scrape public LinkedIn job listings by keyword and location: title, company, seniority, type, applicants, apply URL. No login. $3/1k. MCP ready.

- **URL**: https://apify.com/themineworks/linkedin-jobs-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 5 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job listings

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

## 💼 LinkedIn Jobs Scraper: Public Listings, No Login

> ⚡ Rebuilt July 2026 on LinkedIn's public guest API — no browser, no login, no cookies.

> 💸 You're only charged for delivered results. Empty searches, failed pages and duplicate listings are never billed.

### Overview

LinkedIn Jobs Scraper turns a keyword and a location into a structured feed of public LinkedIn job listings. Give it `software engineer` in `United States` or `product manager` in `Remote` and it returns clean JSON for every listing: title, company, location, posting date, job type, seniority level, applicant count, description snippet, and apply URL. No cookies, no account, no login of any kind.

LinkedIn runs one of the most aggressive anti bot systems on the web, and scraping it while logged in is the fastest way to lose an account. This actor never authenticates: no email, no password, no cookies, no session token. It reads only the public jobs search results LinkedIn already serves to logged out visitors, using a real Chromium browser and residential proxy so the traffic looks human. Your own LinkedIn identity is never involved.

Reliability posture: login walls, empty runs, and failed listings are never charged. You only pay for a job listing that was actually delivered.

✅ No login required | ✅ No cookies | ✅ Pay only for jobs returned | ✅ MCP-ready for AI agents

### Features

Keyword and location search. Point the actor at any public LinkedIn job search and paginate up to 500 listings.
Full listing record. Title, company, seniority, job type, applicant count, description snippet, and apply URL.
Login wall safe. If LinkedIn asks for auth on a query, the actor stops gracefully and does not charge.
Real browser fingerprint. Chromium over residential IPs, indistinguishable from a normal visitor.
Pay per job. Only successful, deduplicated listings count against your bill.

### How it works

The actor opens `linkedin.com/jobs/search` with your keyword and location in the query string, the same URL a logged out visitor would use. It waits for the results feed to render in a real Chromium browser, scrolls to load the requested `maxResults` window, and extracts each card. Every listing is then enriched with a lightweight detail fetch to pull seniority, job type, and applicant count where LinkedIn exposes them.

If a query hits LinkedIn's login wall, the actor stops immediately, writes `login_wall_hit: true` on the summary record, and does not charge for the run. Empty runs and errors are also never charged: you only pay for real, delivered listings.

### 🧾 Input configuration

```json
{
  "keywords": "software engineer",
  "location": "United States",
  "maxResults": 25,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### 📤 Output format

Real record delivered by a live run against `keywords: "software engineer", location: "United States"` on 2026-07-15:

```json
{
  "job_url": "https://www.linkedin.com/jobs/view/software-engineer-early-career-at-notion-4437461678",
  "title": "Software Engineer, Early Career",
  "company": "Notion",
  "company_url": "https://www.linkedin.com/company/notionhq",
  "location": "San Francisco, CA",
  "posted_at": "2026-07-06",
  "job_type": "Full-time",
  "seniority_level": "Not Applicable",
  "description": "Who We Are. Notion is the collaborative AI workspace where teams and agents think together. We're building one place where your knowledge, projects, meetings, and AI tools live side by side, so work is faster, clearer, and less fragmented...",
  "scraped_at": "2026-07-15T01:12:13.710Z"
}
```

`job_id` and `applicant_count` are included when LinkedIn exposes them on the listing; they were not present on this posting at capture time, so those fields are dropped rather than sent as null. A final `_type: "summary"` record is appended to every run with counts and a `login_wall_hit` flag.

Every job record contains these fields:

| Field | Description |
| --- | --- |
| 🆔 `job_id` | LinkedIn numeric job ID |
| 🔗 `job_url` | Full URL to the LinkedIn job posting |
| 📌 `title` | Job title |
| 🏢 `company` | Company name |
| 🔗 `company_url` | LinkedIn company page URL |
| 📍 `location` | Job location as listed on LinkedIn |
| 📅 `posted_at` | Posting date or relative time (e.g. `2 days ago`) |
| ⏳ `job_type` | Employment type: Full-time, Part-time, Contract, etc. |
| 🎚️ `seniority_level` | Seniority level: Entry, Mid-Senior, Director, etc. |
| 📝 `description` | Job description snippet, up to 500 characters |
| 👥 `applicant_count` | Applicant count when LinkedIn exposes it |
| 🕒 `scraped_at` | ISO timestamp when the record was captured |

### 💼 Common use cases

**Recruiting intelligence**
See which companies are hiring for which roles right now, refreshed on demand.
Identify hiring surges as growth signals for account targeting.

**Job board ingestion**
Ingest fresh public LinkedIn listings into your own aggregator or vertical job product.
Deduplicate against your existing feed using `job_id` and `job_url`.

**Salary and talent research**
Analyse seniority mix, employment type, and applicant counts across cities and roles.
Track how demand for a skill shifts across markets and quarters.

**Sales prospecting**
Companies hiring for a function often need related tools and services. Turn open roles into a warm outbound list.
Prioritise accounts by hiring velocity in your ICP function.

### 🚀 Getting started

1. Enter Job keywords like `software engineer` or `product manager`.
2. Enter a Location like a city, country, or `Remote`.
3. Set Max results to cap the number of listings (default 25, up to 500).
4. Leave Proxy on the default `RESIDENTIAL` group. LinkedIn blocks datacenter IPs.
5. Click Start. Export the dataset as JSON, CSV, or Excel, or pull it via API or MCP.

### 💵 Pricing

| Event | Price | You pay when |
| --- | --- | --- |
| Job posting delivered | $0.003 | A posting lands in your dataset |

$3.00 per 1,000 postings — above the ~$2.20/1k jobs-category median, and the honest reason is that LinkedIn is the most actively defended source in the category. If your target companies' own ATS boards cover your need, our [ATS Jobs Scraper](https://apify.com/themineworks/ats-jobs) does the same job from the primary source at $1/1k — use that instead.

### ⏰ Run it on a schedule

Daily scheduled runs with a modest `maxResults` (≤50) are the reliable pattern — smaller frequent runs complete faster and give you fresher postings than rare deep ones, at the same per-posting price.

1. On this actor's page, click **⋯ → Schedule actor** (or Console → **Schedules → Create new**).
2. Pick a frequency — `@daily` for standing searches.
3. Your saved input is reused on every run; each run appends to a named dataset.
4. Wire the dataset to Google Sheets, Slack, or a webhook via the actor's **Integrations** tab so new rows reach you automatically.

### FAQ

**Do I need a LinkedIn account?**
No. The actor scrapes only the public jobs search, the same results anyone can view logged out. Your credentials and cookies are never used, so your account is never at risk.

**Will this get my LinkedIn account banned?**
No. Because the actor never logs in as you, there is no account identity to ban. It behaves like an anonymous public visitor.

**Which proxy should I use?**
Always `RESIDENTIAL` (the default). LinkedIn rate limits datacenter IPs aggressively.

**How many jobs can I get per search?**
The public jobs page shows up to roughly 500 jobs per search. Use specific keywords for the best coverage.

**What if LinkedIn shows a login wall?**
The actor stops gracefully with `login_wall_hit: true` in the summary record and does not charge you.

**Do I get the full job description?**
You get a snippet up to 500 characters plus the `job_url`, from which you can open the full posting.

**How is pricing calculated?**
Pay per event: $0.003 per job successfully scraped, which is $3 per 1,000 jobs. Empty runs, login wall blocks, and errors are never charged.

**I saw older runs of this actor time out — what changed?**
The actor was rebuilt in July 2026. The old version drove a full browser against LinkedIn's sign-in wall; the current version calls the same public guest API that LinkedIn serves to search engines — plain HTTP, under a second per call. Timeouts in older stats predate the rebuild.

**Do I need a LinkedIn account or cookies?**
No. The actor reads public job search results only — nothing to ban.

**Why did my large run take long?**
Deep result sets on contested sources take longer paths. Cap `maxResults` and schedule frequent small runs — fresher data, same price per posting, and runs that deliver nothing bill nothing.

### 🤖 Use from Claude, ChatGPT & any MCP agent

Hosted MCP endpoint — no install, OAuth on first connect:

```
https://mcp.apify.com/?tools=themineworks/linkedin-jobs-scraper
```

Claude Desktop / Cursor config (token auth):

```json
{
  "mcpServers": {
    "linkedin-jobs": {
      "url": "https://mcp.apify.com/?tools=themineworks/linkedin-jobs-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Ask your agent: *"Find remote data-engineering roles posted this week for \[keyword] and rank them by company."*

For the full recruiting stack in one connection (ATS boards + LinkedIn jobs + profiles + company data), use our [Recruiting & Jobs MCP server](https://apify.com/themineworks/recruiting-jobs-mcp) — seven tools behind one endpoint.

Or call it programmatically with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/linkedin-jobs-scraper').call({
  keywords: 'software engineer',
  location: 'United States',
  maxResults: 25,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### 🛠️ Related LinkedIn actors

Job listings are the signal. Turn them into people, companies, and outreach with the full LinkedIn wedge:

- **[LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper)**: full profile detail (experience, education, skills) from a `linkedin.com/in/` URL.
- **[LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details)**: firmographics for the companies that are hiring.
- **[LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees)**: find the people at a hiring company as B2B leads.
- **[LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search)**: search public LinkedIn posts by keyword.
- **[LinkedIn Candidate Finder](https://apify.com/themineworks/linkedin-candidate-finder)**: a matched candidate shortlist from role, skills, and location.
- **[B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder)**: named decision-maker contacts with business emails and phone numbers from a company or domain list.

Typical flow: jobs scraper flags hiring accounts, company and employees scrapers add firmographics and people, profile scraper enriches individuals, and post scraper surfaces what those people are already saying in public.

***

**Disclaimer:** This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. LinkedIn is a registered trademark of LinkedIn Corporation. All trademarks are the property of their respective owners. Use scraped public data in line with GDPR, CCPA, and your local laws.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.

# Actor input Schema

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

Job title, skill, or keyword to search for

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

City, country, or 'Remote'

## `maxResults` (type: `integer`):

Maximum number of job listings to return

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

Also fetch each job's description, seniority level and employment type (one extra request per job). On by default; turn off for a faster, cheaper title-only run.

## `proxy` (type: `object`):

Apify proxy. Defaults to datacenter — the LinkedIn guest jobs API is public and Google-indexed, so it does not need residential. Set a group explicitly to override.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "United States",
  "maxResults": 25,
  "includeDescription": true,
  "proxy": {
    "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 = {
    "keywords": "software engineer",
    "location": "United States",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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": "software engineer",
    "location": "United States",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/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": "software engineer",
  "location": "United States",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call themineworks/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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