# LinkedIn Jobs Scraper — Full Details at $0.30/1K (`meka.im/linkedin-jobs-scraper`) Actor

Drop-in compatible with leading LinkedIn Jobs workflows. Fast, resilient delivery of full job, recruiter, and company data—with automatic retry, recovery, and backfill. No login or cookies. Pay per delivered job. Platform usage included.

- **URL**: https://apify.com/meka.im/linkedin-jobs-scraper.md
- **Developed by:** [Meka.im](https://apify.com/meka.im) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 job 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?

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 — Full Details at $0.30/1K

Fast, resilient LinkedIn job data with recruiter and company enrichment. No login, cookies, or proxy setup. Pay per delivered job. Platform usage included.

- **Reliable delivery:** automatic retry, recovery, deduplication, and backfill when LinkedIn has enough matches.
- **Workflow compatible:** migrate existing LinkedIn Jobs workflows without rewriting inputs or Dataset processing.
- **Full enrichment:** job descriptions, recruiter details, and company profiles when enabled and publicly available.
- **Simple pricing:** **$0.30 per 1,000 successfully delivered jobs**. Failed candidates are not written or charged as results.

### Compatibility validation

Validated on September 16, 2026 against the leading Actor's build 1.7.14. In the 100-result comparison:

- Both runs delivered **100 unique jobs**.
- Dataset field union matched **30 of 30 fields**.
- The 99 common jobs had **zero field-type mismatches**.
- No reference-populated field was systematically missing.
- **96.96%** of stable field values matched exactly.

Live rankings, applicant counts, tracking IDs, and some inferred fields can naturally differ between requests.

### Quick start

Start with structured search filters:

```json
{
  "keywords": "software engineer",
  "location": "London, United Kingdom",
  "datePosted": "pastWeek",
  "limitPerSource": 100,
  "scrapeCompany": true
}
```

You can also paste one or more public LinkedIn Jobs search URLs. Existing workflows using the leading Actor's input format can migrate without changing field names. When `urls` is provided, its search criteria take priority over structured filters.

### Search filter compatibility

LinkedIn's current AI search no longer interprets every legacy URL filter consistently. When legacy URL conversion is enabled, the Actor handles filters as follows:

| Behavior | Filters |
|---|---|
| Preserved as URL filters | Date posted, company, Easy Apply, and under 10 applicants |
| Preserved as search inputs | Keywords, location, Geo ID, and distance |
| Converted into search terms | Experience level, job type, and workplace |
| Not reliably convertible | Industry, job function, standardized title, and other ID-only filters |

For filters that are not reliably convertible, describe the requirement in `keywords` instead.

### What each result includes

Each Dataset item represents one job. Available fields include:

- Job ID, title, URL, location, posting date, and employment type
- Description in HTML and plain text
- Salary and applicant information when available
- Seniority, function, and industry
- Recruiter information when publicly available
- Company name, LinkedIn URL, logo, website, description, employee count, address, and slogan when available
- Source URL and LinkedIn tracking metadata

LinkedIn does not expose every field for every job, so optional fields may be absent.

### Run summary

The `OUTPUT` record in the default key-value store provides a concise end-of-run summary:

```json
{
  "status": "completed",
  "delivered": 100,
  "uniqueJobs": 100,
  "searchPages": 10,
  "failedSearches": 0,
  "failedJobDetails": 0,
  "failedCompanies": 0,
  "stoppedByBudget": false,
  "cacheHits": 74
}
```

Representative Dataset item (descriptions and identities shortened):

```json
{
  "id": "4391073032",
  "link": "https://www.linkedin.com/jobs/view/4391073032",
  "title": "Senior Software Engineer",
  "companyName": "Example Company",
  "companyLinkedinUrl": "https://www.linkedin.com/company/example-company",
  "companyLogo": "https://media.licdn.com/example-logo.png",
  "location": "London, United Kingdom",
  "salary": "$120,000 - $160,000 a year",
  "postedAt": "2026-09-12",
  "benefits": [],
  "descriptionHtml": "<p>Build reliable software used by customers worldwide.</p>",
  "applicantsCount": "42",
  "applyUrl": "",
  "descriptionText": "\nBuild reliable software used by customers worldwide.",
  "jobPosterName": "Alex Morgan",
  "jobPosterTitle": "Talent Partner",
  "jobPosterPhoto": "https://media.licdn.com/example-profile.png",
  "jobPosterProfileUrl": "https://www.linkedin.com/in/example-recruiter",
  "seniorityLevel": "Mid-Senior level",
  "employmentType": "Full-time",
  "jobFunction": "Engineering and Information Technology",
  "industries": "Software Development",
  "companyDescription": "We build dependable software products.",
  "companyWebsite": "https://example.com",
  "companyEmployeesCount": 250,
  "companyAddress": {
    "type": "PostalAddress",
    "addressLocality": "London",
    "addressCountry": "GB"
  },
  "companySlogan": "Software that works",
  "inputUrl": "https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=London",
  "refId": "example-reference",
  "trackingId": "example-tracking"
}
```

### Location splitting

For large country-wide searches, enable `splitByLocation` and select `splitCountry`. Results are merged and deduplicated automatically.

### Notes

- Results reflect publicly available LinkedIn data at the time of the run.
- Search rankings and applicant counts can change between runs.
- Use the data responsibly and comply with applicable laws and platform terms.

Location splitting uses city data derived from SimpleMaps and distributed under CC BY 4.0.

### API integration

Built and maintained by [Meka](https://meka.im/). For direct HTTP integration outside Apify, use the [LinkedIn Jobs Data API](https://meka.im/apis/linkedin-jobs).

# Actor input Schema

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

Job title, skills, or free-text search (e.g. "software engineer remote"). Recommended for new searches; ignored when search URLs are provided.

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

City, region, or country as you would type it on LinkedIn (e.g. "United States", "London, United Kingdom", "Remote").

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

Only return jobs posted within this window.

## `limitPerSource` (type: `integer`):

Maximum number of jobs to scrape from each input URL (or from the structured filters when no URLs are provided). Defaults to 1000 when omitted.

## `scrapeCompany` (type: `boolean`):

Add the company website, description, LinkedIn employee count, address, slogan, and logo. Enabled by default and automatically cached for faster repeated runs.

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

Optional LinkedIn geoId for precise location targeting (found in a LinkedIn search URL as `geoId=`). Overrides free-text location when LinkedIn resolves it.

## `distance` (type: `integer`):

Search radius in miles around the location. Leave empty for LinkedIn's default.

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

LinkedIn numeric company IDs (from a company URL or `f_C=` in a search URL), e.g. "1441" for Google.

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

Only jobs with fewer than 10 applicants.

## `urls` (type: `array`):

Advanced: paste one or more public LinkedIn Jobs search URLs to preserve an existing workflow. When URLs are provided, their search criteria take priority over the structured filters. Leave this empty for the recommended keyword search.

## `splitByLocation` (type: `boolean`):

Enable this to split your search by cities within a country. This helps bypass LinkedIn's 1000 job limit per search URL by creating separate searches for each city. This will overwrite the location filter in input search URLs.

## `splitCountry` (type: `string`):

Select the country whose cities will be used to split the search. Required only when 'Split search by city locations' is enabled.

## `autoConvertToAiSearch` (type: `boolean`):

Preserve filters from older LinkedIn search URLs with LinkedIn's current AI search. Experience level, job type, and workplace filters are converted into search terms. Supported URL filters remain unchanged. Other ID-only filters may not be interpreted by LinkedIn; describe them in Keywords instead.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "London, United Kingdom",
  "datePosted": "anyTime",
  "limitPerSource": 1000,
  "scrapeCompany": true,
  "companyIds": [],
  "under10Applicants": false,
  "urls": [],
  "splitByLocation": false,
  "autoConvertToAiSearch": true
}
```

# Actor output Schema

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

One structured record per successfully delivered job.

## `summary` (type: `string`):

Final counts, failures, billing-limit status, and cache usage 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": "software engineer",
    "location": "London, United Kingdom"
};

// Run the Actor and wait for it to finish
const run = await client.actor("meka.im/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": "software engineer",
    "location": "London, United Kingdom",
}

# Run the Actor and wait for it to finish
run = client.actor("meka.im/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": "software engineer",
  "location": "London, United Kingdom"
}' |
apify call meka.im/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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