# LinkedIn Job Scraper | Job Search API, Counts & Autocomplete (`johnvc/linkedin-job-search-scraper`) Actor

Search LinkedIn jobs with no login and no cookies. Get listings with the total results count, full job details with salary and applicants, plus title, company and location autocomplete for precise filters. Pay per row delivered: no start fee, filters run at the source.

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

## Pricing

from $0.45 / 1,000 job listings

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

Search LinkedIn jobs with no account, no login, and no cookies. This LinkedIn job scraper reads LinkedIn's public guest pages, so it needs nothing from you but a query: search job listings with filters and get the total results count, scrape full job details from any job URL, and pull the same autocomplete suggestions the LinkedIn search box shows. It doubles as a LinkedIn job search API: every mode returns clean JSON you can read over the Apify API, export to CSV or Excel, or wire into an AI agent over MCP.

### What this actor returns

- **Job listings** from a keyword plus location search: job title, company name and LinkedIn page, location, posted date, and the canonical job URL, one row per unique job.
- **The total results count**, free with every search: LinkedIn's own caption such as `7,000+ Semiconductor Engineering Jobs in United States`, both verbatim and parsed to a number with a capped flag.
- **Full job records** from job URLs or ids: complete description (text and HTML), seniority level, employment type, job function, industries, applicant count, salary when published, similar jobs, and the people-also-viewed list.
- **Typeahead suggestions**: job titles, companies with the numeric ids the company filter takes, and locations with their `geoId` values for precision targeting.
- **Honest filters only**: date posted, company, Easy Apply, and under-10-applicants filters run at the source, before billing. Filters LinkedIn's guest search does not reliably honor are not exposed at all.

### Use cases

- **Job market monitoring**: run a daily search for a title and territory, use the free results-count row to track demand over time, and dedupe listings across runs by jobId.
- **Recruiting intelligence**: watch a competitor's openings by filtering to their company id, including roles with fewer than 10 applicants.
- **Lead generation**: turn fresh postings into signals; a company hiring semiconductor process engineers this week is buying tooling next quarter.
- **Job board enrichment**: feed job URLs into the job mode to hydrate your board with descriptions, salary, and applicant counts.
- **AI agents**: give an agent search, detail, and autocomplete tools over MCP; the suggestion modes return the exact ids that make follow-up searches precise.

### Input parameters

| Field | Required | Default | What it does |
|---|---|---|---|
| `search_mode` | yes | `search` | One of `search`, `job`, `autocomplete`, `companySuggestions`, `locationSuggestions`. |
| `keywords` | search | - | What to search for, for example `semiconductor engineer`. |
| `location` | search | - | Free-text place, for example `United States` or `Philadelphia, PA`. |
| `geoId` | no | - | LinkedIn geo id from the locationSuggestions mode; use together with `location`. |
| `datePosted` | no | `any` | `past24h`, `pastWeek`, or `pastMonth`. |
| `companyIds` | no | `[]` | Numeric company ids from the companySuggestions mode; multiple ids combine as OR. |
| `easyApplyOnly` | no | `false` | Only jobs with LinkedIn Easy Apply. |
| `under10Applicants` | no | `false` | Only jobs with fewer than 10 applicants. |
| `jobUrls` | job | - | `linkedin.com/jobs/view/` URLs or bare numeric ids; duplicates of the same job collapse into one billed row. |
| `query` | suggestions | - | The text to complete, for example `semic`. |
| `maxItems` | no | `100` | Cap on billable rows. Free rows never count. |

### Example output

A `jobListing` row from the search mode:

```json
{
  "resultType": "jobListing",
  "jobId": "4451264908",
  "jobTitle": "Silicon Design Engineer",
  "companyName": "AMD",
  "companyLinkedinUrl": "https://www.linkedin.com/company/amd",
  "location": "Austin, TX",
  "jobUrl": "https://www.linkedin.com/jobs/view/silicon-design-engineer-at-amd-4451264908",
  "postedDate": "2026-08-24",
  "postedText": "3 days ago",
  "position": 1,
  "searchKeywords": "semiconductor engineering",
  "searchLocation": "United States",
  "viaResidentialProxy": false,
  "fetchedAt": "2026-08-27T23:04:11Z"
}
```

And the free `searchMeta` row that precedes it:

```json
{
  "resultType": "searchMeta",
  "searchKeywords": "semiconductor engineering",
  "searchLocation": "United States",
  "datePosted": "pastWeek",
  "resultsCountCaption": "7,000+ Semiconductor Engineering Jobs in United States",
  "resultsCountParsed": 7000,
  "resultsCountIsCapped": true,
  "searchUrl": "https://www.linkedin.com/jobs/search?keywords=semiconductor+engineering&location=United+States&f_TPR=r604800"
}
```

A `job` row from the job mode adds the full description, `seniorityLevel`, `employmentType`, `jobFunction`, `industries`, `numApplicants`, parsed salary fields, `similarJobs`, `peopleAlsoViewed`, and `similarSearches`.

### Pricing

Pay per event, only for delivered rows. No start fee, no minimum.

| Event | When it is charged | Price |
|---|---|---|
| Job listing | per unique job returned by a search | $0.0005 |
| Full job record | per successfully scraped job page | $0.002 |
| Suggestion row | per typeahead suggestion returned | $0.0001 |
| Residential fallback | only on the rare row that needed the residential proxy | $0.0008 |

The `searchMeta` row and any `error` rows are always free, and filtered or duplicate jobs are never billed. A typical 100-listing search costs about $0.05; hydrating those 100 jobs with full details costs about $0.20 more.

### How to get started

1. [View on Apify Store](https://apify.com/johnvc/linkedin-job-search-scraper?fpr=9n7kx3) and press Run.
2. Pick a mode, enter keywords and a location (the defaults run a real search out of the box), and start the run.
3. Read rows from the dataset tab, or export as JSON, CSV, or Excel. The run summary repeats the results caption and tells you exactly why the run stopped.

Need company ids or geoIds for precise filters? Run the `companySuggestions` or `locationSuggestions` mode once and feed the returned ids back into the search.

### 🔌 Use this API from Claude (MCP)

Add this actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any other MCP client through the hosted Apify MCP server:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-job-search-scraper
```

https://www.youtube.com/watch?v=jREWahDGhJM

Setup details are in the [Apify MCP integration docs](https://docs.apify.com/platform/integrations/mcp).

### 💸 Pay per run with crypto (x402)

The LinkedIn Job Scraper supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-job-search-scraper) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### Works well with

- [LinkedIn Jobs API](https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3) - managed jobs feed with salary data at scale
- [LinkedIn Profile API](https://apify.com/johnvc/linkedin-profile-api?fpr=9n7kx3) - enrich the people behind the postings
- [LinkedIn Company API](https://apify.com/johnvc/linkedin-company-api?fpr=9n7kx3) - firmographics for the companies you find hiring
- [LinkedIn Posts API](https://apify.com/johnvc/linkedin-posts-api?fpr=9n7kx3) - what those companies and people are saying
- [LinkedIn Learning API](https://apify.com/johnvc/linkedin-learning-api?fpr=9n7kx3) - course and skills data to match roles to the training that fills them

### FAQ

#### Does this need my LinkedIn login or cookies?

No. It only reads LinkedIn's public guest pages. There is no cookie input at all, and the client discards any cookie a response tries to set. Your LinkedIn account is never involved.

#### How deep can a search go?

LinkedIn's guest search stops serving results near 1,000 per query; the run then stops with `stoppedReason: "depthCap"`. To go deeper, slice the query: run it per week with `datePosted`, per `geoId`, or per company id, and dedupe across runs by `jobId`.

#### Is the results count exact?

It is LinkedIn's own caption, and LinkedIn caps it (`7,000+` means at least 7,000). The row carries the verbatim caption, the parsed number, and `resultsCountIsCapped` so you always know which case you have. The actor never uses the caption for pagination; end of results is detected from the result pages themselves.

#### Why does the apply link go through a LinkedIn sign-up page?

Guest pages route Apply through LinkedIn's sign-up interstitial, so most rows carry a null `applyUrl`. When the employer's own application site is embedded in the page, it is returned as `externalApplyUrl`. The `jobUrl` always opens the posting.

#### What happens if a job URL is dead or the page changes?

You get a free `error` row (`not_found` or `parse_failed`) with the source URL, and you are not charged for it. Only successfully delivered rows are billed.

#### Why did my filtered search return nothing?

LinkedIn serves guest searches from more than one backend, and one of them ignores classic filters. The actor detects an empty filtered result, rotates its session, and retries before believing it; a persistent zero means LinkedIn really has no matches for that filter combination right now.

***

### 💡 Example tasks

Ready-to-run configurations, each on its own landing page:

- [Search LinkedIn Jobs Without an Account or Login](https://apify.com/johnvc/linkedin-job-search-scraper/examples/search-linkedin-jobs-without-an-account?fpr=9n7kx3) - listings with no login, no cookies
- [Look Up LinkedIn Company IDs for Job Filters](https://apify.com/johnvc/linkedin-job-search-scraper/examples/look-up-linkedin-company-ids-for-job-filters?fpr=9n7kx3) - resolve a company name to the id the filter needs
- [Find LinkedIn Jobs With Under 10 Applicants](https://apify.com/johnvc/linkedin-job-search-scraper/examples/find-linkedin-jobs-with-under-10-applicants?fpr=9n7kx3) - surface quiet, fresh postings
- [Get LinkedIn GeoIDs for Any City or Country](https://apify.com/johnvc/linkedin-job-search-scraper/examples/get-linkedin-geoids-for-any-city-or-country?fpr=9n7kx3) - live location codes for precise targeting
- [Track LinkedIn Job Counts by Keyword and Location](https://apify.com/johnvc/linkedin-job-search-scraper/examples/track-linkedin-job-counts-by-keyword-and-location?fpr=9n7kx3) - the free results-count row for market tracking
- [免登录搜索领英职位](https://apify.com/johnvc/linkedin-job-search-scraper/examples/mian-denglu-sousuo-lingying-zhiwei?fpr=9n7kx3) - search LinkedIn jobs with no account
- [提取领英职位详情](https://apify.com/johnvc/linkedin-job-search-scraper/examples/tiqu-lingying-zhiwei-xiangqing?fpr=9n7kx3) - full job details from a URL

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/linkedin-job-search-scraper/issues/open?fpr=9n7kx3).

Last Updated: 2026.09.04

# Actor input Schema

## `search_mode` (type: `string`):

search returns job listings for keywords plus location with filters, and always pushes a free searchMeta row with the total results count caption. job scrapes full details for each URL or id in jobUrls. autocomplete returns job title suggestions for query. companySuggestions returns company names with the numeric ids the companyIds filter needs. locationSuggestions returns places with the geoId values the geoId field needs.

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

What to search for: a job title, skill, or any phrase, for example semiconductor engineer. Search mode only.

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

Free-text place name, for example United States, Texas, or Philadelphia, PA. LinkedIn resolves it server-side. Search mode only.

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

Optional LinkedIn geo id from the locationSuggestions mode, for example 104937023 for Philadelphia. Works best together with the location text, not instead of it. Search mode only.

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

Only return jobs posted within this window.

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

Numeric LinkedIn company ids to restrict the search to, for example 1441 for Google. Multiple ids combine as OR. Get ids from the companySuggestions mode. Search mode only.

## `easyApplyOnly` (type: `boolean`):

Only jobs with LinkedIn Easy Apply. The filter is forwarded to LinkedIn as-is; listing rows do not carry an Easy Apply marker to verify against. Search mode only.

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

Only jobs with fewer than 10 applicants so far. The filter is forwarded to LinkedIn as-is. Search mode only.

## `jobUrls` (type: `array`):

linkedin.com/jobs/view/ URLs or bare numeric job ids, mixed freely. Tracking parameters are stripped and duplicates of the same job collapse into one billed row. Job mode only.

## `query` (type: `string`):

The text to complete, for example semic for job titles, appl for companies, or phila for locations.

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

Maximum billable rows to return. Free rows (searchMeta, errors) never count. The guest search itself caps out near 1000 results per query; slice by date, location, or company to go deeper.

## Actor input object example

```json
{
  "search_mode": "search",
  "keywords": "semiconductor engineer",
  "location": "United States",
  "datePosted": "any",
  "companyIds": [],
  "easyApplyOnly": false,
  "under10Applicants": false,
  "jobUrls": [
    "https://www.linkedin.com/jobs/view/4443416712"
  ],
  "query": "software",
  "maxItems": 100
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row this run produced, including the free searchMeta and error rows.

## `overview` (type: `string`):

Search results with the headline fields: title, company, location, posted date, and the job URL.

## `jobDetails` (type: `string`):

Full job records: description, criteria, salary, applicants, and related jobs.

## `suggestions` (type: `string`):

Typeahead rows: job titles, companies with filter ids, and locations with geoIds.

## `searchMeta` (type: `string`):

One free row per search with LinkedIn's total results caption and the public search URL.

## `runSummary` (type: `string`):

Pages fetched, rows pushed, stop reason, and proxy escalation count for 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 = {
    "keywords": "semiconductor engineer",
    "location": "United States",
    "companyIds": [],
    "jobUrls": [
        "https://www.linkedin.com/jobs/view/4443416712"
    ],
    "query": "software"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/linkedin-job-search-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": "semiconductor engineer",
    "location": "United States",
    "companyIds": [],
    "jobUrls": ["https://www.linkedin.com/jobs/view/4443416712"],
    "query": "software",
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/linkedin-job-search-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": "semiconductor engineer",
  "location": "United States",
  "companyIds": [],
  "jobUrls": [
    "https://www.linkedin.com/jobs/view/4443416712"
  ],
  "query": "software"
}' |
apify call johnvc/linkedin-job-search-scraper --silent --output-dataset

```

## MCP server setup

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