# LinkedIn Jobs Scraper ✅ All LinkedIn Filters, No Cookies (`data_pool/linkedin-jobs-scraper`) Actor

Search LinkedIn job postings by keyword with LinkedIn's own filters — remote, seniority, job type, date posted, Easy Apply. No login or cookies required.

- **URL**: https://apify.com/data\_pool/linkedin-jobs-scraper.md
- **Developed by:** [Data Pool](https://apify.com/data_pool) (community)
- **Categories:** Jobs, Lead generation, Social media
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 job scrapeds

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/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 - All LinkedIn Filters, No Cookies

Search **LinkedIn job postings by keyword** and get clean, structured results — **without connecting your LinkedIn account, logging in, or pasting any cookies**. Enter your search terms, pick the same filters LinkedIn's own job search offers, and run.

Because it runs without any LinkedIn credentials from you, **your own account is never involved and never at risk**. There is nothing to connect and nothing to keep logged in.

### What you get

For every matching job posting:

- **Job title** and a direct **link to the posting**
- **Company** — name, LinkedIn company page, and logo
- **Location** and **workplace type** (on-site, remote, hybrid)
- **When it was listed**
- **Easy Apply** flag, so you can filter for one-click applications
- **Promoted** and **repost** flags, so you can tell fresh listings from recycled ones
- The **keyword** each job matched

Results are **de-duplicated** within a run, so a job matching two of your keywords appears once — and is only charged once.

### Input

| Field | Description |
|---|---|
| **Keywords** (required) | One or more search terms. The Actor runs a separate job search per term. Each term must be 85 characters or fewer. |
| **Max jobs per keyword** | How many jobs to return per keyword. Use `0` for as many as LinkedIn surfaces (realistically a few hundred per search). Default `100`. |
| **Location** | City, region, or country, typed as you would on LinkedIn — "Berlin", "Greater London", "United States". Leave empty to search worldwide. |
| **Distance from location** | Exact location only, or within 8 / 16 / 40 / 80 / 160 km of it. |
| **Workplace type** | *On-site*, *Remote*, *Hybrid* — any combination. |
| **Experience level** | *Internship*, *Entry level*, *Associate*, *Mid-Senior level*, *Director*, *Executive* — any combination. |
| **Job type** | *Full-time*, *Part-time*, *Contract*, *Temporary*, *Volunteer*, *Internship*, *Other* — any combination. |
| **Date posted** | *Past 24 hours*, *Past week*, or *Past month*. Default: any time. |
| **Sort by** | *Most relevant* or *Most recent*. |
| **Company** | Only jobs from one company, by name. |
| **Industry** | Only jobs in one industry, e.g. "Software Development". |
| **Easy Apply only** | Only jobs you can apply to directly on LinkedIn. |
| **Under 10 applicants** | Only jobs with fewer than 10 applicants so far. |
| **In your network** | Only jobs at companies where the searching account has connections. |

#### Example input

```json
{
  "keywords": ["data engineer", "analytics engineer"],
  "maxItems": 25,
  "location": "Berlin, Germany",
  "locationRadius": "40",
  "workplaceType": ["remote", "hybrid"],
  "seniority": ["mid_senior_level"],
  "employmentStatus": ["full_time"],
  "datePosted": "week",
  "sortBy": "date",
  "easyApply": true
}
```

### Output

Each job is one dataset item you can export to JSON, CSV, or Excel, or pull via the API:

```json
{
  "jobId": "4012345678",
  "jobUrl": "https://www.linkedin.com/jobs/view/4012345678/",
  "title": "Senior Data Engineer",
  "location": "Berlin, Germany",
  "workplaceType": "hybrid",
  "listedAtIso": "2026-08-03T09:12:00Z",
  "isRepost": false,
  "isPromoted": true,
  "easyApply": true,
  "fewApplicants": true,
  "company": {
    "name": "Acme GmbH",
    "profileUrl": "https://www.linkedin.com/company/acme-gmbh",
    "publicIdentifier": "acme-gmbh",
    "logoUrl": "https://media.licdn.com/…"
  },
  "insights": ["Actively hiring"],
  "matchedKeyword": "data engineer",
  "scrapedAt": "2026-08-06T20:00:00Z"
}
```

### How to scrape LinkedIn jobs by keyword

Put your search terms into **Keywords** and run. Each term gets its own LinkedIn job search, and every returned posting records which term it matched in `matchedKeyword`, so one run can cover several roles and still be easy to split apart afterwards.

#### How to find remote jobs only

Set **Workplace type** to *Remote*. Combine it with **Location** if you need remote roles that are still tied to a country or region — many "remote" postings are geographically restricted, and this is how you separate them.

#### How to find jobs with few applicants

Switch on **Under 10 applicants** and set **Date posted** to *Past 24 hours*. This is the highest-signal combination for job seekers: fresh postings that haven't yet been buried under hundreds of applications.

#### How to scrape new jobs automatically every day

Put the Actor on a [schedule](https://docs.apify.com/platform/schedules) with **Date posted** set to *Past 24 hours* and **Sort by** set to *Most recent*. Each run picks up only what's new, which keeps both the cost and the noise down. Send the results onward with a [webhook](https://docs.apify.com/platform/integrations/webhooks) or an integration.

#### How to track a specific company's hiring

Put the company name in **Company** and leave **Keywords** broad. A sudden burst of infrastructure, sales, or compliance roles is one of the clearest public signals of where a company is heading.

#### How to feed a job board or ATS

Run on a schedule, then pull each run's dataset through the [Apify API](https://docs.apify.com/api/v2) or push it onward with a webhook. `jobId` is stable per posting, so you can deduplicate reliably against what you've already imported.

### LinkedIn Jobs API

Every run is reachable through the [Apify API](https://docs.apify.com/api/v2), so you can treat this Actor as a **LinkedIn jobs API** rather than a manual tool. Start a run, poll it, and read the dataset as JSON from your own backend, or receive results through a [webhook](https://docs.apify.com/platform/integrations/webhooks) when a run finishes. Client libraries are available for Python and JavaScript.

### Integrations

- **n8n**, **Make**, and **Zapier** — trigger runs and route postings into your ATS, spreadsheet, or alerting tool using Apify's [official integrations](https://docs.apify.com/platform/integrations).
- **Google Sheets / Airtable / Slack** — push new postings into a sheet or a channel as they appear.
- **AI agents (MCP)** — callable from AI agents through Apify's MCP server, so an assistant can search LinkedIn jobs on request.
- **Webhooks** — fire your own endpoint the moment a run completes.

### Common uses

- **Recruiting and sourcing** — see which roles a market is hiring for, and spot postings with few applicants before they fill up.
- **Job-market and salary research** — track hiring volume by title, location, seniority, or remote share over time.
- **Feeding an ATS or job board** — pull fresh listings on a schedule and load them straight into your own system.
- **Competitor hiring signals** — watch what a specific company is hiring for; a burst of infra or sales roles says a lot about their roadmap.
- **Personal job hunting** — build a filtered, always-current feed of Easy Apply roles that match exactly what you want.

### Limits and scale

- LinkedIn surfaces a few hundred jobs per search realistically, so a very broad keyword returns a capped slice rather than every posting. Several narrow searches beat one huge one.
- Job results vary between runs — LinkedIn's own ranking is not deterministic.
- Runs are paced deliberately to stay within normal usage patterns; large multi-keyword jobs take longer rather than being pushed through aggressively.

### Pricing

**$0.50 per 1,000 jobs — that's it.** No subscription, no per-run fee, and no charge for jobs you don't receive. Duplicates removed within a run aren't charged twice, and you can set a **maximum spend per run** so costs stay predictable.

### FAQ

**Do I need a LinkedIn account, login, or cookies?**
No. You never connect an account, paste an `li_at` cookie, or log in anywhere.

**Can my LinkedIn account get banned for using this?**
Your account isn't used, so it isn't exposed. Tools that ask you to paste a cookie or connect your profile put *your* account in the loop — this one doesn't.

**Is scraping LinkedIn legal?**
Job postings are corporate content published to be seen, which puts this among the lower-risk things to collect. It is still restricted by LinkedIn's own terms, and any personal data you encounter carries obligations under laws such as GDPR. You are responsible for having a lawful basis for what you collect and how you use it.

**Can I export to Excel or CSV?**
Yes. Every run's dataset exports to JSON, CSV, Excel, XML, or RSS, from the Console or the API.

**Can I run this on a schedule?**
Yes, using Apify [Schedules](https://docs.apify.com/platform/schedules) — hourly, daily, weekly, or a custom cron expression. See the recipe above for the settings that keep scheduled runs cheap.

**Does it work with n8n, Make, or Zapier?**
Yes, through Apify's official integrations for each. See [Integrations](#integrations) above.

**Do I get the full job description?**
No — this Actor returns the posting's structured fields (title, company, location, workplace type, dates, flags) rather than the description body. That keeps searches fast and cheap.

**What does "In your network" mean here?**
It reflects the connections of the account performing the search, not your own LinkedIn network. It's useful as a general "well-connected companies" filter, not as a personal one.

**How many jobs can I get for one keyword?**
As many as LinkedIn surfaces, realistically a few hundred per search. Set **Max jobs per keyword** to `0` to take everything available.

**How do I avoid re-importing jobs I already have?**
Deduplicate on `jobId`, which is stable per posting across runs.

### More LinkedIn scrapers — no cookies required

- **[LinkedIn Post Scraper](https://apify.com/data_pool/linkedin-post-scraper)** — search LinkedIn posts by keyword.
- **[LinkedIn Post Reactions & Comments Scraper](https://apify.com/data_pool/linkedin-post-engagement-scraper)** — everyone who reacted to or commented on a post, deduplicated into one lead list.

### Support and feedback

Something not working, or a field you wish this returned? **[Open an issue](https://apify.com/data_pool/linkedin-jobs-scraper/issues)** — issues are read and answered quickly, and most requests are small changes.

If this Actor is useful to you, **please leave a review**. Reviews are the main way other people find it.

### Notes

- LinkedIn job results vary between runs, and availability depends on what LinkedIn surfaces for a given search at the time of the run.
- "In your network" reflects the connections of the account performing the search, not your own LinkedIn network.
- Please use scraped data responsibly and in line with applicable laws (including data-protection rules such as GDPR) and LinkedIn's terms. You are responsible for having a lawful basis to collect and process the data you request.

# Actor input Schema

## `keywords` (type: `array`):

Job search terms. One LinkedIn job search runs per term. Each term must be 85 characters or fewer (LinkedIn's limit).

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

Maximum number of job postings to return per keyword. Use 0 for as many as LinkedIn surfaces (realistically a few hundred per search).

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

City, region, or country to search in, as you would type it on LinkedIn — for example 'Berlin', 'Greater London', or 'United States'. Leave empty to search worldwide.

## `locationRadius` (type: `string`):

How far from the chosen location to include jobs. Only applies when a location is set.

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

Where the work happens. Select any combination; leave empty for all types.

## `seniority` (type: `array`):

Seniority of the role. Select any combination; leave empty for all levels.

## `employmentStatus` (type: `array`):

Type of employment. Select any combination; leave empty for all types.

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

Only return jobs listed within this time window. Leave as 'Any time' for no date filter.

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

Order results by how well they match your keywords, or by how recently they were listed.

## `company` (type: `string`):

Only return jobs from this company, by name as it appears on LinkedIn.

## `industry` (type: `string`):

Only return jobs in this industry, as named on LinkedIn — for example 'Software Development' or 'Financial Services'.

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

Only return jobs that can be applied to directly on LinkedIn.

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

Only return jobs that have fewer than 10 applicants so far.

## `inYourNetwork` (type: `boolean`):

Only return jobs at companies where the searching account has connections.

## Actor input object example

```json
{
  "keywords": [
    "product manager",
    "backend engineer"
  ],
  "maxItems": 100,
  "location": "Berlin, Germany",
  "locationRadius": "0",
  "workplaceType": [],
  "seniority": [],
  "employmentStatus": [],
  "datePosted": "",
  "sortBy": "relevance",
  "company": "Stripe",
  "industry": "Software Development",
  "easyApply": false,
  "under10Applicants": false,
  "inYourNetwork": false
}
```

# Actor output Schema

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

The job postings matched by your keywords, de-duplicated within the run, one item per posting.

# 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": [
        "data engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_pool/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": ["data engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("data_pool/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": [
    "data engineer"
  ]
}' |
apify call data_pool/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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