# LinkedIn Job Scraper (`arisma_tech/linkedin-job-scraper`) Actor

Extract LinkedIn jobs by keyword, location and filters: title, company, location, posted date, applicants, salary info, seniority, employment type, job function, industries, full description and apply link. No login or cookies needed. Pay only for jobs actually scraped. Export to JSON, CSV or Excel.

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

## Pricing

from $3.00 / 1,000 results

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 Job Scraper

Scrape LinkedIn Jobs by keyword, location and filters — and get structured results in seconds. **No login, no cookies, no browser automation.**

For every job you get the title, company, location, posted date, applicant count, salary info (when LinkedIn shows it), seniority level, employment type, job function, industries, the **full job description**, and the apply link.

### What is it for?

- **Lead generation** — find companies that are hiring (a hiring signal is a buying signal) and feed them into your outreach
- **Recruitment & market research** — track who is hiring for what roles, where, and at which seniority
- **Competitor monitoring** — watch rivals' hiring to spot new products, teams and markets early
- **Job boards & aggregators** — keep your listings fresh with structured, deduplicated job data

### Input

| Field | Description |
|---|---|
| **Keywords** | Job title, skill or company, e.g. `software engineer` |
| **Location** | City, region or country, e.g. `United States`, `London, United Kingdom`, `Remote` |
| **LinkedIn Jobs search URLs** | Optional. Paste full `linkedin.com/jobs/search/...` URLs to scrape exactly those searches (keyword fields are then ignored) |
| **Date posted** | Any time, past 24 hours, past week or past month |
| **Job type** | Full-time, Part-time, Contract, Temporary, Internship, Volunteer, Other |
| **Experience level** | Internship → Executive |
| **Work type** | On-site, Remote, Hybrid |
| **Sort by** | Most relevant or most recent |
| **Maximum jobs** | Cap the run so testing stays fast and cheap |
| **Scrape full job details** | On: full description, criteria, applicants, apply link. Off: fast card-only run (title/company/location/posted date) |
| **Proxy** | Residential proxies recommended — LinkedIn rate-limits datacenter IPs quickly |

Example input:

```json
{
  "keywords": "software engineer",
  "location": "United States",
  "datePosted": "pastWeek",
  "workType": ["remote"],
  "maxItems": 50,
  "scrapeJobDetails": true
}
```

### Output

One dataset item per job:

```json
{
  "id": "4419969671",
  "title": "Senior Software Engineer – Go (Golang)",
  "companyName": "General Motors",
  "companyUrl": "https://www.linkedin.com/company/general-motors",
  "companyLogo": "https://media.licdn.com/...",
  "location": "United States",
  "jobUrl": "https://www.linkedin.com/jobs/view/4419969671",
  "applyUrl": "https://www.linkedin.com/jobs/view/4419969671",
  "postedAtText": "1 day ago",
  "postedAt": "2026-10-23",
  "applicantsText": "37 applicants",
  "salaryText": null,
  "seniorityLevel": "Mid-Senior level",
  "employmentType": "Full-time",
  "jobFunction": "Engineering and Information Technology",
  "industries": "Motor Vehicle Manufacturing",
  "descriptionText": "Full job description as plain text…",
  "descriptionHtml": "<p>Full job description as HTML…</p>",
  "searchUrl": "…",
  "scrapedAt": "2026-10-24T00:00:00.000Z"
}
```

Export to JSON, CSV or Excel, or pull results through the Apify API and integrations (Zapier, Make, Google Sheets, webhooks).

### Pricing

Two plans only — **Starter** and **Business**. There is **no free plan** for this Actor.

| Charge | Starter | Business | When |
|---|---|---|---|
| **Result** (`result`) | **$3.00 / 1,000 results** ($0.003 per job) | **$2.00 / 1,000 results** ($0.002 per job) | For every job actually saved to the dataset. Duplicates and failed jobs are never charged. |
| **Apify Proxy traffic** (`proxy-traffic`) | $0.80 / 1,000 units ($0.0008 per 100 KB) | $0.80 / 1,000 units ($0.0008 per 100 KB) | Per 100 KB of traffic through Apify Proxy, metered from the responses the Actor downloads. Only charged when Apify Proxy is used. |
| **Actor start** (`apify-actor-start`) | $0.00005 | $0.00005 | Once per run start (per GB of memory), charged by Apify. |

Example: 1,000 jobs with full details ≈ $3.00 in results on Starter ($2.00 on Business) + roughly $1–2 of proxy traffic + $0.00005 start.

### Tips

- Start with **Maximum jobs = 25** and details on to check the output shape, then scale up.
- Narrow with **Date posted = Past 24 hours** + a schedule (Apify Schedules) for a daily fresh-jobs feed.
- Turn **details off** for cheap, wide scans; turn them on when you need descriptions for filtering or enrichment.
- Jobs are deduplicated automatically, even across multiple search URLs in one run.

### Notes & limits

- This Actor reads LinkedIn's public (logged-out) job pages. Jobs that LinkedIn only shows to logged-in users will not appear.
- LinkedIn rate-limits aggressively; very large runs need residential proxies and still run at a steady pace by design.
- Only scrape data you are allowed to use, and respect LinkedIn's terms and applicable law.

# Actor input Schema

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

Only return jobs posted within this window.

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

Filter by seniority. Leave empty for all levels.

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

Filter by employment type. Leave empty for all types.

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

Job title, skill or company to search for, e.g. "software engineer" or "data analyst".

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

City, region or country, e.g. "United States", "London, United Kingdom" or "Remote". Leave empty to search worldwide.

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

Stop after collecting this many jobs. Keeps runs fast and cheap while testing.

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

LinkedIn rate-limits datacenter IPs quickly. Residential proxies are strongly recommended for detail scraping and for runs above ~100 jobs.

## `scrapeJobDetails` (type: `boolean`):

Open every job page for the full description, seniority level, employment type, job function, industries, applicant count and apply link. Turn off for a faster, cheaper title/company/location-only run.

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

Most relevant first (LinkedIn default) or most recent first.

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

Paste full LinkedIn Jobs search URLs (linkedin.com/jobs/search/...) to scrape exactly those searches. When filled, the keyword/location fields above are ignored.

## `workType` (type: `array`):

On-site, remote or hybrid. Leave empty for all.

## Actor input object example

```json
{
  "datePosted": "any",
  "experienceLevel": [],
  "jobType": [],
  "keywords": "software engineer",
  "location": "United States",
  "maxItems": 25,
  "proxyConfiguration": {
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "useApifyProxy": true
  },
  "scrapeJobDetails": true,
  "sortBy": "relevant",
  "startUrls": [],
  "workType": []
}
```

# Actor output Schema

## `results` (type: `string`):

Job records from the run.

# 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 = {
    "datePosted": "any",
    "experienceLevel": [],
    "jobType": [],
    "keywords": "software engineer",
    "location": "United States",
    "maxItems": 25,
    "proxyConfiguration": {
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "useApifyProxy": true
    },
    "scrapeJobDetails": true,
    "sortBy": "relevant",
    "startUrls": [],
    "workType": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("arisma_tech/linkedin-job-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 = {
    "datePosted": "any",
    "experienceLevel": [],
    "jobType": [],
    "keywords": "software engineer",
    "location": "United States",
    "maxItems": 25,
    "proxyConfiguration": {
        "apifyProxyGroups": ["RESIDENTIAL"],
        "useApifyProxy": True,
    },
    "scrapeJobDetails": True,
    "sortBy": "relevant",
    "startUrls": [],
    "workType": [],
}

# Run the Actor and wait for it to finish
run = client.actor("arisma_tech/linkedin-job-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 '{
  "datePosted": "any",
  "experienceLevel": [],
  "jobType": [],
  "keywords": "software engineer",
  "location": "United States",
  "maxItems": 25,
  "proxyConfiguration": {
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "useApifyProxy": true
  },
  "scrapeJobDetails": true,
  "sortBy": "relevant",
  "startUrls": [],
  "workType": []
}' |
apify call arisma_tech/linkedin-job-scraper --silent --output-dataset

```

## MCP server setup

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