# Perfect LinkedIn Job Scraper (`perfect_scrapers/perfect-linkedin-job-scraper`) Actor

Searches and extracts public LinkedIn job listings for any role and location without requiring a login or account. Collects job titles, companies, locations, posting dates, direct URLs, and optional full job descriptions into structured JSON/CSV datasets.

- **URL**: https://apify.com/perfect\_scrapers/perfect-linkedin-job-scraper.md
- **Developed by:** [Vinay Kumar Balisetti](https://apify.com/perfect_scrapers) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 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/platform/actors/running/actors-in-store#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

A reliable Apify Actor to search and extract job listings from LinkedIn without requiring a LinkedIn account or login. Collect job titles, companies, locations, posting dates, direct URLs, and full job descriptions into structured datasets.

***

### 🎯 What You Get

Every run extracts structured job details pushed directly to your Apify Dataset.

#### Output JSON Example

{

"title": "Senior AI Engineer",

"company": "Tech Corp",

"location": "Bengaluru, Karnataka, India",

"url": "https://www.linkedin.com/jobs/view/4123456789",

"postedAt": "1 week ago",

"postedAtISO": "2026-07-28",

"aboutJob": "We are seeking a Senior AI Engineer to build cutting-edge LLM pipelines...\n\nKey Responsibilities:\n- Design scalable ML models\n- Deploy APIs...",

"searchRole": "AI Engineer",

"searchLocation": "Bengaluru",

"searchDatePosted": "any",

"scrapedAt": "2026-08-04T21:30:00.000Z"

}

#### Extracted Data Fields

- `title`: Official job title.
- `company`: Hiring company or agency name.
- `location`: Workplace location (city, state, country, or Remote).
- `url`: Direct link to the job posting.
- `postedAt`: Human-readable posting date (e.g., `"2 days ago"`).
- `postedAtISO`: Standardized ISO date format (when available).
- `aboutJob`: Full job description text (`null` if description fetching is turned off).
- `searchRole`: Role or keyword parameter used for the search.
- `searchLocation`: Location parameter used for the search.
- `searchDatePosted`: Date filter applied to the search.
- `scrapedAt`: ISO timestamp when the listing was scraped.

***

### ✨ Key Features

- **No Account Required**: Works on public listings—no login, cookies, or personal account risk.
- **Full Job Descriptions**: Captures complete "About the job" text for every vacancy.
- **Custom Filters**: Search by job title, location, and posting timeframe (Past 24 hours, Past week, Past month, or Any time).
- **Flexible Data Volume**: Fully user-controlled limits for target job counts and search pages.
- **Export Formats**: Export results seamlessly to JSON, CSV, Excel, XML, or HTML via the Apify platform.

***

### 🚀 How To Use

#### Input Configuration Example

{

"role": "AI Engineer",

"location": "Bengaluru",

"datePosted": "any",

"fetchJobDescription": true,

"maxResults": 25,

"maxPages": 3,

"parallelLanes": 3,

"proxyConfiguration": {

```
"useApifyProxy": true
```

}

}

#### Input Parameters

| Parameter | Type | Default | Description |
| :---- | :---- | :---- | :---- |
| `role` | `String` | `"AI Engineer"` | **Required.** Job title or keywords to search for. |
| `location` | `String` | `"Bengaluru"` | **Required.** Target location, city, or `"Remote"`. |
| `datePosted` | `String` | `"any"` | Time filter: `"any"`, `"month"` (Past month), `"week"` (Past week), or `"day"` (Past 24 hours). |
| `fetchJobDescription` | `Boolean` | `true` | Set to `true` to collect full job descriptions. Set to `false` for a faster, listing-only extract. |
| `maxResults` | `Integer` | `25` | Maximum number of job listings to collect (1–1000). |
| `maxPages` | `Integer` | `3` | Maximum search result pages to scan (~25 items per page). |
| `parallelLanes` | `Integer` | `3` | Concurrency speed setting for description extraction (1–8). |
| `proxyConfiguration` | `Object` | `{ "useApifyProxy": true }` | Enables Apify Proxy to prevent IP blocking and rate limits. |

***

### 💡 Best Practices

- **Enable Proxies**: Keep `useApifyProxy: true` enabled to avoid rate limits when scraping larger sets of jobs.
- **Fast Listing Mode**: Turn off `fetchJobDescription` (`false`) if you only need job links, titles, and locations for a quick overview.

***

### ⚖️ Disclaimer

This Actor extracts publicly available job listings from LinkedIn.

# Actor input Schema

## `role` (type: `string`):

e.g. 'AI Engineer'

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

e.g. 'Bengaluru'

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

Matches LinkedIn's 'Any time / Past month / Past week / Past 24 hours' filter

## `fetchJobDescription` (type: `boolean`):

If on, visits each job's page to pull the full description. Slower and more requests to LinkedIn (higher block risk).

## `maxResults` (type: `integer`):

Stops once this many postings are scraped. Fully user-controlled, no fixed cap in code.

## `maxPages` (type: `integer`):

Each LinkedIn search page holds ~25 postings; this caps how many pages of results the actor will page through. Fully user-controlled, no fixed cap in code.

## `parallelLanes` (type: `integer`):

Number of concurrent, independently-throttled Cheerio crawlers used to fetch 'About the job' text after the search stage finishes. Higher = faster but more concurrent load on LinkedIn; 3 is a reasonable default.

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

Optional. Routes requests through Apify Proxy to reduce 429 blocks and allow safer higher concurrency. Leave default to use Apify Proxy if available on your plan; requests fall back to direct connections if none is configured.

## Actor input object example

```json
{
  "role": "AI Engineer",
  "location": "Bengaluru",
  "datePosted": "any",
  "fetchJobDescription": true,
  "maxResults": 25,
  "maxPages": 3,
  "parallelLanes": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("perfect_scrapers/perfect-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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("perfect_scrapers/perfect-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call perfect_scrapers/perfect-linkedin-job-scraper --silent --output-dataset

```

## MCP server setup

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