# LinkedIn Search Jobs Scraper (`socialdataapi/linkedin-search-jobs-scraper`) Actor

LinkedIn Search Jobs Scraper — Search and extract LinkedIn job listings, including job titles, company names, locations, salary details, employment types, experience levels, posting dates, and job URLs. Useful for recruitment research, job market analysis, hiring insights, and lead generation.

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

## Pricing

from $0.39 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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 Search Jobs Scraper — jobs, companies, applicants, criteria

LinkedIn Search Jobs Scraper extracts public LinkedIn job postings from keyword searches, job search links, company names or links, and direct job links: title, company, location, posting age, applicant count, full description, and criteria such as seniority and employment type. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a recruiting pipeline. **No LinkedIn account or cookies are needed**: add one line per search and get one row per job, scaling from one keyword to a full sourcing list.

![LinkedIn Search Jobs Scraper: scrape data as JSON](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-linkedin-search-jobs-hero.webp)

***

### What data can I extract with LinkedIn Search Jobs Scraper?

As a LinkedIn job postings scraper, you can extract LinkedIn job listings with the following data:

| 🆔 Job ID | 💼 Title | 🏢 Company | 📍 Location |
|---|---|---|---|
| 🕒 Posted (text) | 👥 Applicants (text) | 🔢 Applicants (number) | 📝 Full description |
| ✅ Criteria (seniority, employment type, industries) | 🚀 Job link | 🏷️ Company link (if the company has a page) | 🖼️ Company logo (if available) |
| ⏱️ Scraped at | 🔁 Job summary (id, link, title, company, location) | | |

***

### How to use LinkedIn Search Jobs Scraper

Anyone who needs to scrape LinkedIn jobs by keyword, company or direct link gets one row per job from a single run, without writing a scraper.

**Copy to your AI assistant:**

```text
LinkedIn Search Jobs Scraper (Apify Actor ID: socialdataapi/linkedin-search-jobs-scraper, https://apify.com/socialdataapi/linkedin-search-jobs-scraper) returns public LinkedIn job postings as structured JSON: job title, company name, location, posting age, applicant count, full description, and criteria such as seniority and employment type. Use it whenever someone needs LinkedIn job postings without cookies, a login, or a browser - tracking which companies are hiring, building a job board or alert feed, or sourcing postings for a recruiting pipeline. Inputs: startUrls (array of strings - one search, company or job link per line: keywords, "keywords, location", a LinkedIn job-search link, a company name or link, or a job link or ID), sortOrder ("relevant" default | "recent" for most recent first), maxJobs (integer 1-1000, default 10, applied per search or company entry; a job link or ID always gives one job), proxyConfiguration (object, Apify Proxy settings). LinkedIn shows at most about 1000 jobs per search, and maxJobs can't be set higher than that.
```

#### LinkedIn Search Jobs Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at it and the agent can search LinkedIn job postings on its own — by keyword, location, company or job link, all from one field. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/linkedin-search-jobs-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. [Open this Actor in the Apify Store](https://apify.com/socialdataapi/linkedin-search-jobs-scraper).
3. Enter your searches, companies or job links, one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale LinkedIn Search Jobs Scraper to bulk

`startUrls` takes a list, and every entry in it runs at the same time in the same run, so one run can cover dozens of keyword searches, companies and job links together instead of one run per entry. Each job is saved to the dataset as soon as its posting is read, so a large run's results start arriving right away rather than all at once at the end. For a recurring job list, schedule the run (for example daily) with `sortOrder` set to "recent" so each run leads with the newest postings. To go beyond one run, loop API calls from your own code, one call per batch of entries.

***

### ✨ Features

LinkedIn Search Jobs Scraper is a LinkedIn job search scraper that fetches clean, structured job postings from LinkedIn. It's ideal for recruiting pipelines, sales prospecting on hiring signals, job market research, and job board or alert feeds that need fresh postings on a schedule.

It extracts, per job:

- **Title** – the job title
- **Company** – the hiring company's name
- **Location** – where the job is based, as LinkedIn shows it
- **Full description** – the complete posting text
- **Applicant count** – LinkedIn's applicant text and, when shown, the number
- **Criteria** – seniority level, employment type, job function and industries
- **Company logo** – the hiring company's logo image, when it has one

⚡ Every job is saved to the dataset the moment its posting is read, so results start arriving while the run is still going, not just at the end.

***

### Use cases 💡

- **Recruiter** — track new postings for target companies by keyword and location.
- **Sales rep** — spot companies hiring for a role your product supports.
- **Job board builder** — pull fresh postings on a schedule with most-recent-first sorting.
- **Market researcher** — count open roles by title, industry or seniority level.
- **AI agent builder** — feed job postings into a RAG pipeline or a job-search agent tool.

It works well as a LinkedIn jobs scraper for recruiters, sales teams and researchers alike. Building an AI agent? [Connect it over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

1. **Ten jobs from two searches, saved as they're found.** A recorded run searched "data analyst, Texas" and the company "microsoft" at the same time and saved all 10 jobs (5 from each) in 5.7 seconds, each one written to the dataset the moment its posting was read.
2. **The full posting, not a summary.** A recorded row for a Microsoft opening came back with the complete job description, all 3 of LinkedIn's criteria fields (seniority, employment type, industries), the company logo link and the posting age, in one JSON object.
3. **One field, seven ways to search.** The same list accepts plain keywords, keywords with a location, a LinkedIn job-search link, a company name, a company link, a job link, or a bare job ID — mixed freely in the same run.

***

### ⬇️ Input

![LinkedIn Search Jobs Scraper input fields](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-linkedin-search-jobs-input.webp)

Add your searches, companies or job links to one list, one entry per line; `startUrls` is the only required field.

| Parameter | Required | Type | Description | Example value |
| --- | --- | --- | --- | --- |
| `startUrls` | Yes | Array of strings | Searches, companies or job links, one per entry: keywords, "keywords, location", a LinkedIn job-search link, a company name or link, or a job link or ID | `["data analyst, Texas", "microsoft"]` |
| `sortOrder` | No | String | `relevant` (default) for LinkedIn's own order, or `recent` to collect the newest postings first | `"relevant"` |
| `maxJobs` | No | Integer | Jobs collected per search or company entry, 1 to 1000 (default 10); a job link or ID always gives one job. Free plan: up to 20 jobs per run (all entries together) and 200 per month; paid plans have no limit | `5` |
| `proxyConfiguration` | No | Object | Apify Proxy settings; off by default, with blocked requests retried through Apify's residential proxy | `{"useApifyProxy": false}` |

#### Free plan limits

Users on the Apify free plan can fetch up to 20 jobs per run (all searches, companies and job links together) and 200 jobs per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

#### Example input

```json
{
  "startUrls": [
    "data analyst, Texas",
    "microsoft"
  ],
  "sortOrder": "relevant",
  "maxJobs": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

***

### ⬆️ Output

![LinkedIn Search Jobs Scraper output: example JSON fields](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-linkedin-search-jobs-output.webp)

Every job is one typed, normalized JSON item with the same field names on every run. Export your LinkedIn job search to CSV, Excel or JSON straight from the dataset.

#### Example output

A recorded run with the example input above saved 10 jobs in 5.7 seconds. Two real rows (description shortened with `...`):

```json
[
  {
    "id": "4444613232",
    "criteria": [
      { "title": "Seniority level", "value": "Not Applicable" },
      { "title": "Employment type", "value": "Full-time" },
      { "title": "Industries", "value": "Law Practice" }
    ],
    "company": "Husch Blackwell",
    "location": "Austin, TX",
    "title": "Enterprise Data Analyst",
    "link": "https://www.linkedin.com/company/husch-blackwell?trk=public_jobs_topcard-org-name",
    "postedTimeAgo": "1 week ago",
    "numberOfApplicants": "Over 200 applicants",
    "applicantsCount": 200,
    "description": "Husch Blackwell LLP is a full-service litigation and business law firm with multiple locations across the United States, serving clients with domestic and international operations...",
    "jobUrl": "https://www.linkedin.com/jobs/view/enterprise-data-analyst-at-husch-blackwell-4444613232",
    "companyLogoUrl": "https://media.licdn.com/dms/image/v2/C560BAQEc9DoSTcDYkQ/company-logo_100_100/company-logo_100_100/0/1674759385660/husch_blackwell_logo",
    "scrapedAt": "2026-10-08T08:48:14Z",
    "job": {
      "id": "4444613232",
      "link": "https://www.linkedin.com/jobs/view/enterprise-data-analyst-at-husch-blackwell-4444613232",
      "title": "Enterprise Data Analyst",
      "company": "Husch Blackwell",
      "location": "Austin, TX"
    }
  },
  {
    "id": "4474728901",
    "criteria": [
      { "title": "Seniority level", "value": "Not Applicable" },
      { "title": "Employment type", "value": "Full-time" },
      { "title": "Industries", "value": "Software Development" }
    ],
    "company": "Microsoft",
    "location": "Redmond, WA",
    "title": "Principal Software Engineer",
    "link": "https://www.linkedin.com/company/microsoft?trk=public_jobs_topcard-org-name",
    "postedTimeAgo": "5 days ago",
    "numberOfApplicants": "Be among the first 25 applicants",
    "applicantsCount": null,
    "description": "Azure Local is a globally distributed team responsible for the expanding development and operation of Microsoft's Azure platform by extending Azure's cloud capabilities to on-premises, multi-cloud, and edge environments...",
    "jobUrl": "https://www.linkedin.com/jobs/view/principal-software-engineer-at-microsoft-4474728901",
    "companyLogoUrl": "https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_100_100/B56ZYQ0mrGGoAU-/0/1744038948046/microsoft_logo",
    "scrapedAt": "2026-10-08T08:48:17Z",
    "job": {
      "id": "4474728901",
      "link": "https://www.linkedin.com/jobs/view/principal-software-engineer-at-microsoft-4474728901",
      "title": "Principal Software Engineer",
      "company": "Microsoft",
      "location": "Redmond, WA"
    }
  }
]
```

***

### How does it work?

LinkedIn Search Jobs Scraper reads the same public job search and job posting pages that a visitor without an account would see - no LinkedIn login, cookies or browser needed on your side. Each search is sent as a plain HTTP request; Apify's residential proxy is used automatically whenever a request gets blocked, and the request is retried so a temporary block does not lose a job. Only publicly visible information is returned: what the posting itself shows, nothing from a private account or behind a login wall. The output fields stay the same even when LinkedIn changes how its pages look, so your integration keeps working without changes on your end. The actor is maintained as LinkedIn's pages evolve.

***

### How do you integrate LinkedIn Search Jobs Scraper into your stack?

It works with what you already use: call it as a LinkedIn job search API over REST from any language, hook it up via MCP for AI agents, or use it from no-code tools. Any agent or script that can call an HTTP endpoint can search LinkedIn jobs programmatically, without opening a browser.

#### MCP integration for AI agents

Registering Apify's MCP server with this Actor preloaded gives your agent direct access to it as a callable tool - no need to search for it or add it first. This registers LinkedIn Search Jobs Scraper as a tool your agent can call directly, so it can run a job search, read the postings, and use them mid-conversation without any scraping code in your prompts. It works the same way in Claude Code, Cursor and Windsurf, or any other MCP-compatible client that can run the command below.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/linkedin-search-jobs-scraper"
```

#### No-code tools (n8n, Make, LangChain)

In n8n, use the Apify node's "Run an Actor" operation, or the HTTP Request node pointed at the run-sync endpoint with your Apify token. In Make, use the Apify app's "Run an Actor" module followed by "Get Dataset Items" to pull the saved jobs into your scenario. In LangChain, the `langchain-apify` package's `ApifyActorsTool` can call this actor from an agent or chain the same way it calls any other Apify Actor.

***

### Is it legal to scrape LinkedIn jobs?

Collecting publicly available data is generally lawful, although LinkedIn's User Agreement restricts automated access to its site. LinkedIn Search Jobs Scraper returns only publicly available job posting data — what any visitor sees without logging in, nothing from behind a login wall. Job postings mostly describe a role rather than a person, but a posting can still name a recruiter or hiring manager; if you store that, make sure you have a lawful basis under GDPR or a similar data-protection law for your country. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does LinkedIn Search Jobs Scraper return?

Title, company, location, full description and applicant count are the top fields; see [the data fields section](#what-data-can-i-extract-with-linkedin-search-jobs-scraper) for the complete list.

#### Does LinkedIn Search Jobs Scraper require a LinkedIn account or login?

No. It's a LinkedIn jobs scraper no login or cookie can block, since only public job posting data is extracted.

#### How fast does LinkedIn Search Jobs Scraper run?

A recorded run searched one keyword-and-location entry and one company at the same time and saved 10 jobs in 5.7 seconds. Every job is read live, not served from a cache.

#### What happens if a job is private or doesn't exist?

A job that's no longer listed is skipped (not charged) and the next matching job takes its place, so a search still fills up whenever LinkedIn has enough jobs. A company that doesn't exist on LinkedIn gives 0 jobs, unless the text also works as a keyword search, in which case it's searched that way instead.

#### Can I scrape multiple LinkedIn job searches at once?

Yes. `startUrls` takes a list of any size — keyword searches, companies or job links mixed together — and every entry runs at the same time in one run, so it works as a LinkedIn job link scraper across many links or as a keyword scraper across many searches.

#### Does LinkedIn Search Jobs Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — LinkedIn Search Jobs Scraper is available as an MCP tool. Run `claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/linkedin-search-jobs-scraper"` to register it in Claude Code, Cursor or Windsurf. Any agent that can call an HTTP endpoint can use the REST API directly.

#### Does LinkedIn Search Jobs Scraper return data in a format LLMs can use directly?

Yes. Every job is typed, normalized JSON with consistent field names. There's no HTML to parse and no selectors to write — pass the response straight to an LLM, index it into a vector store, or feed it to an agent tool.

#### What happens when LinkedIn changes its layout or updates its anti-bot system?

The actor is maintained. When LinkedIn changes its pages, the actor is updated to match — your calls keep returning the same JSON schema with no changes on your end.

#### Can I use LinkedIn Search Jobs Scraper without managing proxies or browser infrastructure?

Yes. Proxy handling runs on the actor's side: requests go out directly by default, and a request LinkedIn blocks is retried through Apify's residential proxy automatically. You send one request and get structured JSON back.

#### Which LinkedIn job fields work best for AI training data and RAG indexing?

For RAG indexing: the full description and the criteria (seniority, employment type, industries) carry the most context. For training data: the applicant count, posting age and criteria fields are the most structurally consistent across jobs. All fields are typed primitives — strings, integers or arrays of simple objects — no normalization needed.

***

### Your feedback

Found a bug or a search that didn't come out right? Let us know so the actor can be kept accurate and up to date.

# Actor input Schema

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

One entry per line. Each entry is one of: keywords (software engineer); keywords and a location (Sales, United States; several keywords combined into one search as Sales|Marketing, United States); a JSON object such as {"keywords": \["python developer"], "location": "Germany"} (location defaults to United States); a LinkedIn job search link (https://www.linkedin.com/jobs/search/?keywords=nurse\&location=Texas), which keeps its keywords, location and date filter; a company link (https://www.linkedin.com/company/microsoft) or a one-word company username (microsoft), which gives that company's own jobs and is searched as keywords when no such company exists; a job link (https://www.linkedin.com/jobs/view/1234567890) or job ID. Duplicate entries run once and invalid entries are skipped.

## `sortOrder` (type: `string`):

Most relevant follows LinkedIn's own order. Most recent first collects the newest postings first: posted in the past hour, then the past 6 hours, the past day, and so on.

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

How many jobs to collect for each search or company entry, 1 to 1000 (default 10). LinkedIn shows at most about 1000 jobs per search, and a search with fewer matches gives fewer. A job link or job ID always gives one job. Free plan: up to 20 jobs per run (all searches, companies and job links together) and 200 per month; paid plans have no limit.

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

Off by default: requests go out directly, and a request LinkedIn blocks is retried through Apify's residential proxy (when your account has it). Turn it on to use Apify Proxy for every request.

## Actor input object example

```json
{
  "startUrls": [
    "software engineer, United States"
  ],
  "sortOrder": "relevant",
  "maxJobs": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the Actor's default dataset.

# 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 = {
    "startUrls": [
        "software engineer, United States"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/linkedin-search-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 = {
    "startUrls": ["software engineer, United States"],
    "proxyConfiguration": { "useApifyProxy": False },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialdataapi/linkedin-search-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/3arIZFSYX99BsWyW4/builds/l2Kh7Vd3umgYbkM1F/openapi.json
