# LinkedIn Jobs Scraper · No Login · $0.5/1k (`alfalfa/linkedin-jobs-scraper`) Actor

LinkedIn jobs scraper: search public job postings by keyword, location, date, company or LinkedIn URL and export them to Excel, CSV or JSON, no login. Title, company, location, salary, applicants, full description, seniority, job function, industries, poster. $0.50 per 1,000 jobs, no start fee.

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

## Pricing

from $0.35 / 1,000 jobs

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/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 Jobs Scraper (No Login)

Search **public LinkedIn job postings** by keyword, location, date, company or a LinkedIn URL and get every job as a clean record: title, company with logo and page URL, location, posting date, salary when shown, applicant count, the full description, seniority, employment type, job function, industries and the recruiter who posted it. No LinkedIn account, login or cookies needed. **Same field names as the most used LinkedIn jobs Actor** at **$0.50 per 1,000 jobs**, with **no start fee** and **job details included**.

Export to JSON, CSV or Excel, read the dataset through the API, or run it on a schedule from n8n, Make or Zapier.

### What you can do with LinkedIn job data

- **Job boards and aggregators**: pull new postings for a niche or a city every morning and publish them.
- **Lead generation**: a company hiring for a role is a company buying what that role needs. Get the companies, the roles and the recruiter names for a territory in one table.
- **Salary and market research**: titles, seniority, employment types and posted salaries across thousands of postings.
- **Recruiting**: track which competitors are hiring, where, and how many applicants each posting has.
- **Job search automation**: filter by keyword, date and Easy Apply, push matches to a spreadsheet or a chat alert.

### What data do you get

| Field | Example |
|---|---|
| `id`, `link`, `title` | `4463607193`, the job URL, `Brand Manager, Foodservice` |
| `companyName`, `companyLinkedinUrl`, `companyLogo` | `Libbey`, the company page, logo URL |
| `location`, `postedAt`, `postedAgo` | `Toledo, OH`, `2026-09-04`, `6 days ago` |
| `salaryInfo`, `benefits` | `["$85,000.00", "$110,000.00"]`, `["Actively Hiring"]` |
| `applicantsCount`, `applicantsText` | `71`, `71 applicants` (`<25` when LinkedIn only says "be among the first 25", `>200` for "over 200") |
| `descriptionHtml`, `descriptionText` | the full posting |
| `seniorityLevel`, `employmentType`, `jobFunction`, `industries` | `Mid-Senior level`, `Full-time`, `Marketing and Sales`, `Manufacturing` |
| `jobPosterName`, `jobPosterTitle`, `jobPosterProfileUrl`, `jobPosterPhoto` | the recruiter when the posting shows one |
| `applyUrl`, `inputUrl` | external apply link when exposed, the search or URL the job came from |

### How to scrape LinkedIn jobs

1. Type **Keywords** and a **Location**, pick **Date posted**, or paste LinkedIn search URLs and job URLs into **LinkedIn URLs**.
2. Set **Max jobs per search** and keep **Include job details** on for the full description and the criteria.
3. Click **Start**. Jobs stream into the dataset as they are found; export as JSON, CSV or Excel, or read them through the API.

### Input

| Field | Type | Description |
|---|---|---|
| `keywords` | string | Job title, skill or free text. |
| `location` | string | City, region or country as typed on LinkedIn. |
| `datePosted` | `anyTime` / `past24Hours` / `pastWeek` / `pastMonth` | Posting window. |
| `maxJobs` | integer | Max jobs per search or URL (default 100). LinkedIn returns at most 1,000 per search. `limitPerSource` and `rows` are accepted too. |
| `scrapeDetails` | boolean | Open each job for description, criteria, applicants, salary, poster (default on). |
| `startUrls` | array | LinkedIn search URLs (filters in the URL are kept) or job URLs. |
| `companyIds` | array of strings | Numeric company IDs (`f_C=` in a search URL). |
| `experienceLevel`, `jobType`, `workplaceType` | arrays | Passed to LinkedIn; applied only where LinkedIn's search still supports these filters. |
| `easyApply`, `under10Applicants` | boolean | Easy Apply only; fewer than 10 applicants only. |
| `sortBy` | `relevance` / `date` | LinkedIn's order or newest first. |
| `geoId`, `distance` | string, integer | Precise location ID and radius in miles. |
| `maxConcurrency` | integer | Searches in parallel (default 5). |
| `proxyConfiguration` | object | Residential proxies by default, included in the price. |

Example:

```json
{
  "keywords": "data engineer",
  "location": "Berlin",
  "datePosted": "pastWeek",
  "maxJobs": 200,
  "scrapeDetails": true
}
```

### Output

One record per job (trimmed):

```json
{
  "id": "4463607193",
  "link": "https://www.linkedin.com/jobs/view/4463607193",
  "title": "Brand Manager, Foodservice",
  "companyName": "Libbey",
  "companyLinkedinUrl": "https://www.linkedin.com/company/libbey",
  "companyLogo": "https://media.licdn.com/dms/image/v2/...",
  "location": "Toledo, OH",
  "postedAt": "2026-09-04",
  "postedAgo": "6 days ago",
  "salaryInfo": [],
  "benefits": [],
  "applicantsCount": "<25",
  "applicantsText": "Be among the first 25 applicants",
  "descriptionText": "The Brand Manager, Foodservice is responsible for ...",
  "descriptionHtml": "<p><strong>Summary</strong></p><p>The Brand Manager ...",
  "seniorityLevel": "Not Applicable",
  "employmentType": "Full-time",
  "jobFunction": "Marketing and Sales",
  "industries": "Manufacturing",
  "jobPosterName": null,
  "applyUrl": "",
  "inputUrl": "https://www.linkedin.com/jobs/search?keywords=marketing+manager&location=United+States"
}
```

### Pricing

**$0.50 per 1,000 jobs** ($0.0005 per job), **no start fee**, details included, platform usage and residential proxies included. You pay only for records written to the dataset. Set the maximum budget per run in the Actor settings; the scraper stops when it is reached and never overshoots.

| Monthly spend | Jobs |
|---|---|
| $5, which is what the free plan includes | about 10,000 |
| $49 | about 98,000 |
| $499 | about 998,000 |

For comparison, the most used LinkedIn jobs Actor charges $2 per 1,000 jobs on the free plan and $1 on paid plans.

### Switching from another LinkedIn jobs Actor

Field names follow the most used one (`id`, `link`, `title`, `companyName`, `companyLinkedinUrl`, `companyLogo`, `location`, `salaryInfo`, `postedAt`, `benefits`, `descriptionHtml`, `descriptionText`, `applicantsCount`, `applyUrl`, `jobPosterName`, `jobPosterTitle`, `jobPosterPhoto`, `jobPosterProfileUrl`, `seniorityLevel`, `employmentType`, `jobFunction`, `industries`), and its `urls`, `keywords`, `location`, `geoId`, `distance`, `datePosted`, `companyIds`, `under10Applicants` and `limitPerSource` inputs are understood. Company enrichment (employee count, website) is not included yet.

### Limitations

- Only what LinkedIn shows a visitor without an account: public job postings. Nothing that needs a login.
- LinkedIn returns at most 1,000 jobs per search. For more, split by location, date window or company.
- LinkedIn has retired several classic filters (experience level, job type, workplace) for many searches; they are passed along and applied when LinkedIn honours them. Date, Easy Apply, under-10-applicants and company filters work.
- `applyUrl` is usually empty: LinkedIn hides the external apply link behind a login for most postings. The job URL in `link` always works.

### FAQ

#### Do I need a LinkedIn account?

No. The scraper reads the public job pages that LinkedIn shows to anyone. Nothing is posted, no account of yours is used.

#### How fast is it?

About 100 jobs with full details in a minute; five times faster with details off.

#### Can I run it every day and get only new jobs?

Yes. Set *Date posted* to *Past 24 hours* and schedule the run; each run returns only the new postings.

#### Is scraping LinkedIn jobs legal?

Job postings are public data companies publish to be found. Reading public pages without an account is generally legal (the hiQ v. LinkedIn rulings in the US), but you are responsible for how you use the data; respect privacy laws for the recruiter names. This Actor is not affiliated with LinkedIn or Microsoft.

### Use it from n8n, Make, Zapier or an AI agent

- **n8n, Make, Zapier**: add the Apify node, pick `alfalfa/linkedin-jobs-scraper`, paste the JSON input above and read the run's dataset in the next step. See the [Apify integrations docs](https://docs.apify.com/platform/integrations).
- **AI agents and MCP**: connect the Apify MCP server with this Actor as a tool, `https://mcp.apify.com/?tools=alfalfa/linkedin-jobs-scraper`. See [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).
- **API and scheduling**: every run is available through the [Apify API](https://docs.apify.com/api/v2); schedules, webhooks and exports are built in.

### More scrapers by Alfalfa

| Actor | What it does | Price |
|---|---|---|
| [Facebook Ads Library Scraper](https://apify.com/alfalfa/facebook-ads-library-scraper) | ads from the Meta Ad Library with creatives, dates, platforms and EU reach | $0.50 per 1,000 ads |
| [YouTube Scraper](https://apify.com/alfalfa/youtube-scraper) | videos of a search, channel, playlist or URL list with views, likes, date, tags, plus transcripts and comments; no API key | $0.50 per 1,000 rows |
| [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper) | posts of any public page or profile | $2 per 1,000 posts |
| [Facebook Comments Scraper](https://apify.com/alfalfa/facebook-comments-scraper) | comments and replies of any public post | $0.50 per 1,000 comments |
| [Facebook Pages Scraper](https://apify.com/alfalfa/facebook-pages-scraper) | page details with email, phone, address | from $3.50 per 1,000 pages |
| [Facebook Events Scraper](https://apify.com/alfalfa/facebook-events-scraper) | events by search, city, page or URL | $5 per 1,000 events |

### Not working?

Open an issue in the **Issues** tab with your input and the run ID. LinkedIn changes its pages now and then; fixes usually ship within a day.

# Actor input Schema

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

Job title, skill or free text, as you would type it on LinkedIn: <code>data engineer</code>, <code>marketing manager remote</code>.

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

City, region or country as you would type it on LinkedIn: <code>United States</code>, <code>London, United Kingdom</code>, <code>Berlin</code>.

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

Only jobs posted within this window.

## `maxJobs` (type: `integer`):

Maximum jobs per search or start URL. LinkedIn shows at most 1,000 results per search; split broad searches by location or date to get more. <code>limitPerSource</code> and <code>rows</code> are accepted as aliases.

## `scrapeDetails` (type: `boolean`):

Open every job page for the full description, seniority, employment type, job function, industries, applicant count, salary when shown and the job poster. One extra request per job, no surcharge. Off = list fields only (title, company, location, date), about five times faster.

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

LinkedIn job search URLs copied from your browser (<code>linkedin.com/jobs/search?keywords=...\&location=...</code>, filters in the URL are kept) or single job URLs (<code>linkedin.com/jobs/view/1234567890</code>). Each URL is one task on top of the search above.

## `companyIds` (type: `array`):

Numeric LinkedIn company IDs to restrict the search to, e.g. <code>1441</code> for Google (the <code>f\_C=</code> value in a search URL).

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

LinkedIn applies this filter only where its search still supports it; results may ignore it.

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

LinkedIn applies this filter only where its search still supports it; results may ignore it.

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

On-site, remote or hybrid. LinkedIn applies this filter only where its search still supports it.

## `easyApply` (type: `boolean`):

Only jobs with LinkedIn's Easy Apply.

## `under10Applicants` (type: `boolean`):

Only jobs with fewer than 10 applicants so far.

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

LinkedIn's relevance order or newest first.

## `geoId` (type: `string`):

Optional numeric geoId from a LinkedIn search URL for a precise location; overrides the location text.

## `distance` (type: `integer`):

Search radius around the location, in miles.

## `maxConcurrency` (type: `integer`):

Searches run in parallel (default 5). Pages of one search are always read in order.

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

Residential proxies are included in the price per job. Leave the default unless you want your own proxy servers.

## Actor input object example

```json
{
  "keywords": "marketing manager",
  "location": "United States",
  "datePosted": "pastWeek",
  "maxJobs": 100,
  "scrapeDetails": true,
  "experienceLevel": [],
  "jobType": [],
  "workplaceType": [],
  "easyApply": false,
  "under10Applicants": false,
  "sortBy": "relevance",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped jobs as JSON. Append ?format=csv for CSV.

# 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": "marketing manager",
    "location": "United States",
    "datePosted": "pastWeek",
    "maxJobs": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfalfa/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": "marketing manager",
    "location": "United States",
    "datePosted": "pastWeek",
    "maxJobs": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alfalfa/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 '{
  "keywords": "marketing manager",
  "location": "United States",
  "datePosted": "pastWeek",
  "maxJobs": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alfalfa/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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