# Linkedin Jobs Scraper (`minyo/linkedin-jobs-scraper`) Actor

A powerful and customizable scraper that extracts public LinkedIn job data — no login or cookies required. Get clean, structured results with job titles, companies, locations, salaries, and more. Fast, reliable, and proxy-ready (coming soon). Perfect for analysis and automation.

- **URL**: https://apify.com/minyo/linkedin-jobs-scraper.md
- **Developed by:** [minyo](https://apify.com/minyo) (community)
- **Categories:** Automation, AI, Integrations
- **Stats:** 27 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

## 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

### ⭐ What does LinkedIn Jobs Scraper do?

**LinkedIn Jobs Scraper** is a powerful, customizable, and efficient scraper designed to extract **public job data directly from LinkedIn — no login or cookies required**.
It delivers clean and structured data ready for **analysis, automation, or integration** into your own systems.

You can extract detailed job information such as:

- 🧑‍💼 **Job title**
- 🏢 **Company name**
- 🗺️ **Location**
- 💻 **Remote availability**
- 📝 **Job description**
- 💰 **Compensation details**
- ⏰ **Date posted**
- 🔗 **Job URL and direct application link**
- 🏷️ **Job type, function, level and industry**

***

### 🔥 Why use LinkedIn Jobs Scraper?

1. 🎯 **Focused on LinkedIn** — specifically optimized for LinkedIn’s job data structure.
2. 🧠 **No login or cookies needed** — it runs entirely with public listings, making setup instant.
3. 🤖 **Smart User-Agent rotation** — automatically generates realistic browser fingerprints for every run.
4. ⚡ **Fast and reliable** — scrapes job data efficiently while minimizing compute unit usage.
5. 🔒 **Proxy support coming soon** — although it works perfectly fine without proxies.
6. 📊 **Clean and standardized output** — easy to process, analyze, or integrate with any system.
7. 🧩 **Apify-native integration** — runs smoothly inside Apify (Dataset, KV Store, API & webhooks).

***

### 💡 Common use cases

- 📈 **Market analysis** — identify hiring trends and job demand by region or industry.
- 💼 **HR automation** — feed job data into CRMs, ATS or recruitment tools.
- 🔍 **Competitive research** — track where your competitors are hiring and which roles they prioritize.
- 🧭 **Career exploration** — discover new opportunities that match your goals or location.
- 📚 **Academic / data research** — analyze employment patterns or salary evolution.

***

### 🚀 How to use

You can run the scraper in **two simple ways**:

#### 1️⃣ Run from Apify Console

1. Open the actor in your **Apify Dashboard**.
2. Fill in your desired **search term** and **location** (required).
3. Adjust optional filters like `distance`, `job_type`, `is_remote`, or `company IDs`.
4. Click **Save & Start**.
5. Once finished, open the **Dataset** tab to browse or download your results.

#### 2️⃣ Run via API

You can also start the scraper programmatically with an HTTP request:

```bash
curl "https://api.apify.com/v2/acts/username~linkedin-jobs-scraper/runs?token=YOUR_APIFY_TOKEN" \
-d '{
  "search_term": "Frontend Developer",
  "location": "Madrid, Spain",
  "distance": 30
}'
```

***

### ⚙️ Input configuration

Below is an example of how to configure your input:

```json
{
  "search_term": "Software Engineer",
  "location": "Barcelona, Spain",
  "distance": 50,
  "results_wanted": 100,
  "job_type": "fulltime",
  "is_remote": false,
  "linkedin_company_ids": [76987811, 1815218],
  "easy_apply": false,
  "published_at": "72",
  "fetch_description": true
}
```

#### Input fields

| Field                  | Type    | Default            | Description                                                      |
| ---------------------- | ------- | ------------------ | ---------------------------------------------------------------- |
| `search_term`          | string  | –                  | Keywords to search, e.g. "data analyst", "project manager".      |
| `location`             | string  | `Barcelona, Spain` | **Required.** City, region or country.                           |
| `distance`             | integer | `50`               | Search radius in miles.                                          |
| `results_wanted`       | integer | `50`               | Maximum number of job results to retrieve (1–1000).              |
| `job_type`             | string  | –                  | Filter by job type (fulltime, parttime, internship, etc.).       |
| `is_remote`            | boolean | `false`            | If true, only returns remote jobs.                               |
| `linkedin_company_ids` | array   | `[]`               | Filter by specific LinkedIn company IDs.                         |
| `easy_apply`           | boolean | `false`            | Filter for jobs with LinkedIn “Easy Apply”.                      |
| `published_at`         | string  | `"72"`             | Only include jobs posted in the last N hours (24, 48, 72, etc.). |
| `fetch_description`    | boolean | `true`             | Fetch full job descriptions and details.                         |

> ⚠️ **Important:** You cannot combine `easy_apply` and `published_at` in the same run due to LinkedIn limitations.

***

### 📤 Example output

Each item represents a job posting and follows this structure:

```json
{
  "id": "li-4308729964",
  "title": "Software Engineer",
  "company_name": "Tech Solutions",
  "company_url": "https://www.linkedin.com/company/tech-solutions/",
  "location": "Barcelona, Spain",
  "is_remote": true,
  "date_posted": "2025-10-07T09:24:00Z",
  "job_url": "https://www.linkedin.com/jobs/view/4308729964/",
  "job_url_direct": "https://www.linkedin.com/jobs-apply/4308729964",
  "job_type": "fulltime",
  "job_level": "Mid-Senior",
  "job_function": "Engineering",
  "company_industry": "Information Technology",
  "company_logo": "https://media.licdn.com/logo.png",
  "description": "We are looking for a software engineer to join our growing team...",
  "emails": ["hr@techsolutions.com"],
  "compensation": {
    "salary_source": "LinkedIn",
    "interval": "yearly",
    "min_amount": 35000,
    "max_amount": 45000,
    "currency": "EUR"
  }
}
```

***

### 💾 Output format

- All results are automatically pushed to your **Apify Dataset**.
- A full JSON copy is also saved to the **Key-Value Store** as `jobs.json`.
- You can export results directly as:

  - 📄 JSON
  - 📑 CSV
  - 📊 XLSX

***

### 💰 Pricing

The **LinkedIn Jobs Scraper** is available for **$2/1000 results**.
It’s optimized for performance, so you can run many searches with minimal cost.

> 🧩 Proxy support coming soon — but the scraper already runs perfectly without proxies.

***

### ⚖️ Legal notice

This actor only extracts **publicly available information** from LinkedIn.
Always comply with LinkedIn’s **Terms of Service**, data protection laws, and ethical scraping practices.

***

### 💬 Feedback & support

We are constantly improving **LinkedIn Jobs Scraper**.
If you find a bug or have suggestions, please open an issue in the **Apify console → Issues tab**.
Your feedback helps us make it better every day! 🚀

***

## 🇪🇸 LinkedIn Jobs Scraper (Versión en Español)

### ⭐ ¿Qué hace LinkedIn Jobs Scraper?

**LinkedIn Jobs Scraper** es una herramienta potente, personalizable y eficiente diseñada para **extraer datos públicos de ofertas de trabajo directamente desde LinkedIn — sin necesidad de iniciar sesión ni usar cookies**.
Devuelve datos limpios y estructurados, listos para **análisis, automatización o integración** en tus propios sistemas.

Podrás obtener información detallada como:

- 🧑‍💼 **Título del puesto**
- 🏢 **Nombre de la empresa**
- 🗺️ **Ubicación**
- 💻 **Disponibilidad remota**
- 📝 **Descripción del trabajo**
- 💰 **Detalles del salario o compensación**
- ⏰ **Fecha de publicación**
- 🔗 **URL del empleo y enlace directo para aplicar**
- 🏷️ **Tipo de contrato, nivel y sector**

***

### 🔥 ¿Por qué usar LinkedIn Jobs Scraper?

1. 🎯 **Enfocado 100% en LinkedIn** — optimizado específicamente para su estructura.
2. 🧠 **Sin login ni cookies** — funciona solo con ofertas públicas, listo para usar.
3. 🤖 **Rotación automática de User-Agent** — simula navegadores reales de forma inteligente.
4. ⚡ **Rápido y confiable** — obtiene datos de alta calidad minimizando el consumo.
5. 🔒 **Soporte para proxies próximamente** — aunque ya funciona perfectamente sin ellos.
6. 📊 **Salida limpia y estandarizada** — ideal para análisis, dashboards o integraciones.
7. 🧩 **Totalmente integrado con Apify** — compatible con Datasets, KV Store, API y webhooks.

***

### 💡 Casos de uso

- 📈 **Análisis de mercado laboral** — detecta tendencias y demanda de empleo.
- 💼 **Automatización de RRHH** — alimenta CRMs o sistemas de reclutamiento.
- 🔍 **Investigación competitiva** — analiza dónde y en qué roles contratan tus competidores.
- 🧭 **Exploración profesional** — descubre oportunidades según tus habilidades o ubicación.
- 📚 **Investigación académica o económica** — analiza salarios, sectores o evolución laboral.

***

### 🚀 Cómo usarlo

Puedes ejecutar el scraper de **dos formas muy sencillas**:

#### 1️⃣ Desde la consola de Apify

1. Abre el actor desde tu **panel de Apify**.
2. Completa los campos **search term** y **location** (obligatorios).
3. Ajusta los filtros opcionales: `distance`, `job_type`, `is_remote`, etc.
4. Haz clic en **Save & Start**.
5. Al finalizar, abre la pestaña **Dataset** para ver o descargar tus resultados.

#### 2️⃣ Desde la API

También puedes ejecutarlo mediante una petición HTTP:

```bash
curl "https://api.apify.com/v2/acts/username~linkedin-jobs-scraper/runs?token=TU_TOKEN_APIFY" \
-d '{
  "search_term": "Desarrollador Frontend",
  "location": "Madrid, España",
  "distance": 30
}'
```

***

### ⚙️ Ejemplo de configuración

```json
{
  "search_term": "Ingeniero de software",
  "location": "Barcelona, España",
  "distance": 50,
  "results_wanted": 100,
  "job_type": "fulltime",
  "is_remote": false,
  "linkedin_company_ids": [76987811, 1815218],
  "easy_apply": false,
  "published_at": "72",
  "fetch_description": true
}
```

> ⚠️ **Importante:** No se pueden combinar los filtros `easy_apply` y `published_at` en la misma ejecución por limitaciones de LinkedIn.

***

### 📤 Ejemplo de salida

```json
{
  "id": "li-4308729964",
  "title": "Software Engineer",
  "company_name": "Tech Solutions",
  "location": "Barcelona, España",
  "is_remote": true,
  "date_posted": "2025-10-07T09:24:00Z",
  "job_url": "https://www.linkedin.com/jobs/view/4308729964/",
  "job_type": "fulltime",
  "company_industry": "Tecnología de la Información",
  "description": "Buscamos un ingeniero de software para unirse a nuestro equipo...",
  "compensation": {
    "interval": "año",
    "min_amount": 35000,
    "max_amount": 45000,
    "currency": "EUR"
  }
}
```

***

### 💰 Precio

**LinkedIn Jobs Scraper** está disponible por **2$/1000 resultados**.
Está optimizado para ser rápido y eficiente, por lo que puedes ejecutar muchas búsquedas con un coste muy bajo.

> 🧩 **Soporte para proxies próximamente**, aunque el scraper ya funciona perfectamente sin ellos.

***

### ⚖️ Aviso legal

Este actor solo extrae **información pública disponible en LinkedIn**.
Cumple siempre con los **Términos de Servicio de LinkedIn**, las leyes de protección de datos y las buenas prácticas de scraping ético.

***

### 💬 Soporte y sugerencias

Estamos mejorando continuamente **LinkedIn Jobs Scraper**.
Si encuentras un error o tienes sugerencias, abre un issue en la **consola de Apify → pestaña Issues**.
¡Tu feedback nos ayuda a hacerlo aún mejor! 🚀

# Actor input Schema

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

Maximum number of jobs to return for LinkedIn.

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

Keywords to search for, e.g. 'software engineer', 'data analyst'.

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

Optional LinkedIn job type filter.

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

If true, return only remote jobs.

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

City, region or country to search in, e.g. 'Barcelona, Spain' or 'New York, USA'.

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

Search radius in miles. Default is 50.

## `linkedin_company_ids` (type: `array`):

Filter for jobs by company IDs (e.g. \[76987811, 1815218] for Facebook and Uber)

## `easy_apply` (type: `boolean`):

Filter for jobs hosted on LinkedIn. NOTE: LinkedIn easy apply filter is known to be unreliable per upstream docs.

## `published_at` (type: `string`):

Only include jobs posted in the last N hours (e.g. 24, 72, 168).

## `fetch_description` (type: `boolean`):

Fetches full job descriptions & extracts relevant information from them.

## Actor input object example

```json
{
  "results_wanted": 50,
  "is_remote": false,
  "location": "Barcelona, Spain",
  "distance": 50,
  "linkedin_company_ids": [],
  "easy_apply": false,
  "published_at": "72",
  "fetch_description": 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 = {};

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

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

```

## MCP server setup

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