# LinkedIn Jobs Scraper — Full Descriptions, Only New Jobs (`joyouscam35875/linkedin-jobs-scraper`) Actor

Scrape LinkedIn job listings by keyword, location and filters, with the full job description, seniority, employment type, industry and applicant count included on every row. Built-in 'only new jobs' mode for scheduled monitoring. No login, no cookies.

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

## Pricing

Pay per event

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/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 — Full Descriptions, Only New Jobs

Scrape LinkedIn job listings by keyword, location and filters. Every row comes with the **full job description**, seniority level, employment type, job function, industries and applicant count, at no extra charge. Switch on **Only new jobs** and schedule it: each run returns only the jobs posted since the last one, and you pay only for those.

- **Full details included.** No separate "details" add-on price.
- **Built for monitoring.** Only-new mode remembers what earlier runs delivered, per search.
- **All of LinkedIn's filters.** Date posted, job type, experience level, on-site/remote/hybrid, most recent first, or paste any LinkedIn search URL.
- **No login, no cookies.** It reads the public job pages LinkedIn shows logged-out visitors. No LinkedIn account is involved or at risk.
- **Up to 1,000 jobs per search**, which is LinkedIn's own limit. Split large searches by location or keyword to go further.

### Quick start

```json
{
  "keywords": ["python developer", "data engineer"],
  "location": "France",
  "datePosted": "pastWeek",
  "workplaceTypes": ["remote", "hybrid"],
  "maxJobsPerSearch": 200
}
```

**Monitoring:** set `"onlyNewJobs": true`, save the input as a task and schedule it daily. The first run returns the current jobs; every later run returns only new ones.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | array | | One search per keyword. Empty = all jobs in the location. |
| `location` | string | | City, region or country, as typed on LinkedIn. |
| `datePosted` | string | `any` | `any`, `past24h`, `pastWeek`, `pastMonth`. |
| `jobTypes` | array | all | `fullTime`, `partTime`, `contract`, `temporary`, `internship`, `volunteer`, `other`. |
| `experienceLevels` | array | all | `internship`, `entry`, `associate`, `midSenior`, `director`, `executive`. |
| `workplaceTypes` | array | all | `onsite`, `remote`, `hybrid`. |
| `sortBy` | string | `relevance` | `relevance` or `recent`. |
| `searchUrls` | array | | LinkedIn job search URLs; filters are read from the URL. |
| `maxJobsPerSearch` | integer | 100 | Up to 1,000 (LinkedIn's cap). |
| `includeDetails` | boolean | true | Full description and job criteria. Included in the price. |
| `onlyNewJobs` | boolean | false | Return only jobs not delivered by earlier runs of the same search. |
| `proxyConfiguration` | object | off | Optional. Not needed; can speed up very large runs. Billed to your account. |

### Output

```json
{
  "jobId": "4469208089",
  "url": "https://www.linkedin.com/jobs/view/4469208089",
  "title": "Développeur Python / Django (H/F)",
  "companyName": "SoHoft",
  "companyUrl": "https://www.linkedin.com/company/sohoft",
  "companyLogo": "https://media.licdn.com/dms/image/...",
  "location": "Toulouse, Occitanie, France",
  "postedAt": "2026-09-18",
  "postedTimeText": "4 days ago",
  "salary": null,
  "benefits": "Be an early applicant",
  "descriptionText": "SoWhat !? C'est juste des passionnés de conseil et de tech...",
  "descriptionHtml": "SoWhat !? C'est juste des passionnés...<br><br>...",
  "seniorityLevel": "Executive",
  "employmentType": "Full-time",
  "jobFunction": "Information Technology and Engineering",
  "industries": "IT Services and IT Consulting",
  "applicantsText": "Be among the first 25 applicants",
  "applicantsCount": null,
  "applyUrl": null,
  "detailsStatus": "ok",
  "searchKeywords": "python developer",
  "searchLocation": "France",
  "scrapedAt": "2026-09-22T21:21:56+00:00"
}
```

`salary` is filled when LinkedIn shows a pay range, which is common for US listings and rare elsewhere. `applicantsCount` is `null` when LinkedIn only says "Be among the first 25 applicants". `applyUrl` is filled only when LinkedIn exposes an external apply link to logged-out visitors.

### Pricing

Pay per event: one `job` event per job row, details included, plus a tiny actor-start fee. With **Only new jobs** on, a run that finds nothing new costs only the start fee.

### Use cases

- **Job alerts** for a role, company type or region, delivered to Slack, email or a sheet via Apify integrations
- **Recruiting and sales intelligence:** which companies are hiring for what, where, and how fast
- **Labor-market research:** seniority mix, remote share, industries hiring
- **Job boards and aggregators:** a daily feed of fresh listings with full descriptions

### Integrations

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("joyouscam35875/linkedin-jobs-scraper").call(run_input={
    "keywords": ["python developer"],
    "location": "Germany",
    "datePosted": "past24h",
    "onlyNewJobs": True,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["postedAt"], job["companyName"], job["title"], job["url"])
```

Also works from Make, Zapier, n8n, Google Sheets, schedules and webhooks, and as an MCP tool for AI agents.

### FAQ

**Do I need a LinkedIn account or cookies?** No. The actor only reads what LinkedIn shows to logged-out visitors.

**Why do I get fewer than 1,000 jobs?** LinkedIn shows at most 1,000 results per search, and fewer when the search is narrow. Split big searches by city or keyword.

**Why can a very specific keyword return loosely related jobs?** When nothing matches, LinkedIn itself falls back to broader suggestions. Check the `title` field if precision matters.

**Is it legal?** The actor reads publicly visible job listings. You are responsible for how you use the data and for complying with LinkedIn's terms and applicable law, including data protection rules.

### Feedback

Missing a field, hit a bug, or need an input this actor doesn't take yet? Open an issue on the actor's **Issues** tab. If the LinkedIn Jobs Scraper saved you time, a short review on the Store page helps other people find it.

### Related actors by the same developer

| Actor | What it does |
|---|---|
| [France Job Scraper](https://apify.com/joyouscam35875/france-job-scraper) | Welcome to the Jungle, France Travail and Hellowork listings |
| [Google Trends Scraper](https://apify.com/joyouscam35875/google-trends-scraper) | Interest over time, related queries, regions |
| [Website Content Crawler](https://apify.com/joyouscam35875/website-content-crawler) | Clean Markdown for RAG and LLMs |
| [YouTube Channel & Search Scraper](https://apify.com/joyouscam35875/youtube-channel-scraper) | Videos, Shorts and search, no API key |

# Actor input Schema

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

One search per entry, e.g. 'python developer', 'account executive'. Leave empty to list all jobs in the location.

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

City, region or country as you would type it on LinkedIn, e.g. 'Paris', 'Germany', 'United States', 'Remote'.

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

Only jobs posted within this window.

## `jobTypes` (type: `array`):

Leave empty for all.

## `experienceLevels` (type: `array`):

Leave empty for all.

## `workplaceTypes` (type: `array`):

Leave empty for all.

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

Most relevant (LinkedIn's default) or newest first. 'Only new jobs' forces newest first.

## `searchUrls` (type: `array`):

Optional. Paste job search URLs from linkedin.com/jobs/search; keywords, location and filters are read from the URL.

## `maxJobsPerSearch` (type: `integer`):

LinkedIn shows at most 1,000 jobs per search. 0 = up to that limit.

## `includeDetails` (type: `boolean`):

Fetch each job page for the full description, seniority, employment type, job function, industries and applicant count. Included in the price.

## `onlyNewJobs` (type: `boolean`):

Remember jobs delivered by earlier runs of the same search and return only jobs not seen before. Sorts by most recent. You only pay for new jobs.

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

Optional. Runs work without a proxy; LinkedIn's occasional rate limits are handled with retries. For large runs, Apify datacenter proxies make them faster. Proxy usage is billed to your account.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "location": "France",
  "datePosted": "any",
  "sortBy": "relevance",
  "maxJobsPerSearch": 100,
  "includeDetails": true,
  "onlyNewJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per job listing.

# 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": [
        "python developer"
    ],
    "location": "France",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("joyouscam35875/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": ["python developer"],
    "location": "France",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("joyouscam35875/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": [
    "python developer"
  ],
  "location": "France",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call joyouscam35875/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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