# Linkedin Job Scraper 💼 (`webscrap18/linkedin-job-scraper`) Actor

Collect LinkedIn job listings effortlessly 🔍
Extract structured job data for recruitment, market research, and career analysis — fast, reliable, and scalable ⚡

- **URL**: https://apify.com/webscrap18/linkedin-job-scraper.md
- **Developed by:** [WebScrap](https://apify.com/webscrap18) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 57 total users, 1 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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?

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 - Pay Per Event

A professional job scraping service that extracts job listings from LinkedIn using a pay-per-event pricing model. You only pay for the results you receive.

### 🚀 Pay-Per-Event Pricing

This Actor uses **Pay-Per-Event (PPE)** pricing with the following events:

#### Events Charged:

1. (Synthetic Event) - $0.003 per item
   - Charged for each job result delivered to your dataset
   - Includes both successful job results and error responses
   - No manual charging needed - automatically triggered by data delivery

#### Cost Examples:

- **20 jobs found**: ~$0.02005 (1x start + 20x results)
- **100 jobs found**: ~$0.10005 (1x start + 100x results)
- **No jobs found**: ~$0.00105 (1x start + 1x error response)

### 📊 What You Get

Each job result includes:

- Company name and profile
- Job title and description
- Location and remote work status
- Job type (Full-time, Part-time, Contract, Internship)
- Experience level requirements
- Application URL
- Posting date
- Categorized job type (Frontend, Backend, Data Science, etc.)

### 🔧 Configuration

#### Required Parameters:

- **Search Term**: Keywords to search for (e.g., "software engineer")
- **Location**: Geographic location (e.g., "San Francisco, CA")

#### Optional Parameters:

- **Results Per Site**: Number of jobs to fetch (1-500, default: 20)
- **Maximum Job Age**: Only show jobs posted within X hours (default: 72)
- **Distance**: Maximum distance from location in miles (default: 50)
- **Job Type**: Filter by employment type (fulltime, parttime, internship, contract)
- **Remote Only**: Only show remote positions (default: false)
- **Result Offset**: Skip first N results for pagination (default: 0)
- **Proxies**: Optional proxy list for enhanced reliability

### 💡 Best Practices

1. **Spending Control**: Set spending limits in the Apify Console to control costs
2. **Result Optimization**: Use specific search terms to get more relevant results
3. **Location Targeting**: Be specific with locations for better job matches
4. **Type Filtering**: Use job\_type parameter to filter by employment type

### 🎯 Revenue Model

This Actor generates revenue through:

- Transparent per-result pricing
- No hidden subscription fees
- Pay only for successful data delivery
- Automatic charging handled by Apify platform

### 🛠️ Technical Implementation

- Uses JobSpy library for reliable LinkedIn scraping
- Implements Apify's synthetic charging events
- Includes automatic retry logic and proxy rotation
- Provides structured data output with consistent schema
- Handles rate limiting and anti-bot protection

### 📈 Scaling

- Handles 1-500 results per run
- Supports proxy rotation for higher volume
- Implements batched data delivery
- Respects user spending limits automatically

***

**Start scraping jobs now and pay only for what you get!**

# Actor input Schema

## `search_term` (type: `string`):

Job search keywords (e.g., 'software engineer', 'data scientist')

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

Job location (e.g., 'San Francisco, CA', 'New York, NY')

## `results_wanted` (type: `integer`):

Number of job listings to retrieve per site.

## `hours_old` (type: `integer`):

Only show jobs posted within this many hours.

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

Maximum distance from the location in miles.

## `job_type` (type: `string`):

Type of job to search for.

## `is_remote` (type: `boolean`):

Only show remote jobs.

## `offset` (type: `integer`):

Number of results to skip (useful for pagination).

## `proxies` (type: `array`):

List of proxies to use for scraping (format: 'user:pass@host:port' or 'host:port').

## Actor input object example

```json
{
  "search_term": "software engineer",
  "location": "San Francisco, CA",
  "results_wanted": 20,
  "hours_old": 72,
  "distance": 50,
  "is_remote": false,
  "offset": 0
}
```

# 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 = {
    "search_term": "software engineer",
    "location": "San Francisco, CA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webscrap18/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 = {
    "search_term": "software engineer",
    "location": "San Francisco, CA",
}

# Run the Actor and wait for it to finish
run = client.actor("webscrap18/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 '{
  "search_term": "software engineer",
  "location": "San Francisco, CA"
}' |
apify call webscrap18/linkedin-job-scraper --silent --output-dataset

```

## MCP server setup

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