# LinkedIn Jobs Scraper ⚡ Fast, No Cookies (`analytics_tupiniquim/linkedin-jobs-scraper`) Actor

Scrape LinkedIn job postings from any jobs search URL — no login or cookies. Get title, company, location, posted date, seniority, employment type, description and more. Fast, HTTP-only, low cost.

- **URL**: https://apify.com/analytics\_tupiniquim/linkedin-jobs-scraper.md
- **Developed by:** [Guilherme Teixeira](https://apify.com/analytics_tupiniquim) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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 💼 (No Cookies)

Scrape **LinkedIn job postings** from any jobs search URL — **no login, no cookies**.
Get job title, company (with logo, website, description & employee count), location,
posted date, salary, benefits, seniority, employment type, function, industries,
applicant count and the full job description (HTML + text).

> 🇬🇧 English · [🇧🇷 Português](#-português-brasil) · [🇪🇸 Español](#-español)

***

### Why this scraper?

- 💸 **60% cheaper** than the alternatives — **$0.40 per 1,000 jobs**, one flat price, no add-ons.
- 🍪 **No cookies, no login** — reads LinkedIn's public jobs data over plain HTTP.
- ⚡ **Fast & low-cost** — no browser.
- 🔎 **Respects your search filters** — date posted, remote, experience level, job type… whatever is in your search URL.
- 🌎 **Trilingual docs** — English, Portuguese, Spanish.

### Input

| Field | Type | Description |
|---|---|---|
| `searchUrls` | array | LinkedIn jobs search URLs (`linkedin.com/jobs/search/?keywords=...&location=...`). All URL filters are respected. |
| `keywords` | string | Simple keyword search (used if no URL is given). |
| `location` | string | Location for the keyword search. |
| `count` | integer | Max jobs to scrape. Default `100`. |
| `scrapeJobDetails` | boolean | Fetch each job's full description (HTML + text), seniority, type, function, industries, salary & applicant count. Default `true`. |
| `scrapeCompany` | boolean | Also fetch each company's page (description, website, employee count). Deduplicated per company. Default `true`. |
| `proxyConfiguration` | object | Proxy settings. Datacenter (default) is cheapest and works well. |

#### Example input

```json
{
    "searchUrls": ["https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"],
    "count": 100,
    "scrapeJobDetails": true,
    "scrapeCompany": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

Each job posting is one dataset item:

```json
{
    "id": "4443011652",
    "link": "https://www.linkedin.com/jobs/view/4443011652",
    "title": "Marketing Data Scientist, Measurement & Experimentation",
    "companyName": "LinkedIn",
    "companyLinkedinUrl": "https://www.linkedin.com/company/linkedin",
    "companyLogo": "https://media.licdn.com/dms/image/.../company-logo_100_100/...",
    "location": "New York, NY",
    "postedAt": "2026-07-20",
    "postedAtTimestamp": 1784678400000,
    "benefits": ["Actively Hiring"],
    "salaryInfo": ["$120,000.00/yr", "$180,000.00/yr"],
    "seniorityLevel": "Mid-Senior level",
    "employmentType": "Full-time",
    "jobFunction": "Sales",
    "industries": "Technology, Information and Internet",
    "workplaceType": "Hybrid",
    "applicantsCount": "Over 200 applicants",
    "descriptionHtml": "<p>About the team ...</p>",
    "descriptionText": "About the team ...",
    "applyUrl": "https://www.linkedin.com/jobs/view/4443011652",
    "jobPosterName": null,
    "jobPosterTitle": null,
    "jobPosterPhoto": null,
    "jobPosterProfileUrl": null,
    "companyDescription": "LinkedIn is the world's largest professional network ...",
    "companyWebsite": "https://linkedin.com",
    "companyEmployeesCount": 25000,
    "companySlogan": "Welcome to your professional community.",
    "detailsScraped": true,
    "scrapedAt": "2026-07-28T14:00:00.000Z"
}
```

#### Output fields

| Field | Notes |
|---|---|
| `id`, `link`, `title` | Job identifier, URL and title. |
| `companyName`, `companyLinkedinUrl`, `companyLogo` | Company basics (from the job card). |
| `location`, `postedAt`, `postedAtTimestamp` | Location and posting date (string + epoch ms). |
| `benefits`, `salaryInfo` | Benefit badges and salary range when LinkedIn shows them. |
| `seniorityLevel`, `employmentType`, `jobFunction`, `industries`, `workplaceType` | Job criteria (needs `scrapeJobDetails`). |
| `applicantsCount`, `descriptionHtml`, `descriptionText` | Applicant count and description in HTML and plain text. |
| `companyDescription`, `companyWebsite`, `companyEmployeesCount`, `companySlogan` | Company details (needs `scrapeCompany`). |
| `applyUrl`, `jobPoster*` | Best-effort — LinkedIn hides these behind a sign-in wall on the public page, so they are often `null`. |

> ℹ️ `salaryInfo`, `workplaceType`, `applyUrl` and the `jobPoster*` fields depend on what LinkedIn exposes publicly for each posting and are frequently empty — this is a limit of cookie-free scraping, not a bug.

### 💰 Cost example

| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Job scraped | $0.0004 per job ($0.40 / 1,000) |

**Scraping 1,000 jobs** → `1 × $0.001` + `1,000 × $0.0004` = **≈ $0.40 total**.

### How to get a search URL

Go to [LinkedIn Jobs](https://www.linkedin.com/jobs/), search and apply any filters you want, then copy the URL from your browser. Paste it into `searchUrls`.

### FAQ

**Does it need my LinkedIn cookie or login?** No. It reads only public job-search data.

**Can I use my existing search filters?** Yes — any filter in the search URL (date posted, remote/on-site, experience level, job type, company) is respected.

***

### 🇧🇷 Português (Brasil)

Extraia **vagas do LinkedIn** de qualquer URL de busca — **sem login, sem cookies**.
Obtenha título, empresa, local, data, senioridade, tipo de contratação, função,
setores e a descrição completa.

#### Por que este scraper?

- 💸 **60% mais barato** que as alternativas — **$0,40 por 1.000 vagas**, preço único, sem add-ons.
- 🍪 **Sem cookies, sem login** — lê dados públicos de vagas via HTTP.
- ⚡ **Rápido e barato** — sem navegador.
- 🔎 **Respeita seus filtros de busca** — data, remoto, senioridade, tipo… o que estiver na URL.
- 🌎 **Documentação trilíngue.**

#### Entrada

| Campo | Tipo | Descrição |
|---|---|---|
| `searchUrls` | array | URLs de busca de vagas do LinkedIn. Todos os filtros da URL são respeitados. |
| `keywords` | string | Busca simples por palavra-chave (se não passar URL). |
| `location` | string | Local para a busca por palavra-chave. |
| `count` | integer | Máximo de vagas. Padrão `100`. |
| `scrapeJobDetails` | boolean | Buscar descrição (HTML + texto), senioridade/tipo/função/setores, salário e nº de candidatos. Padrão `true`. |
| `scrapeCompany` | boolean | Buscar também dados da empresa (descrição, site, nº de funcionários). Deduplicado por empresa. Padrão `true`. |
| `proxyConfiguration` | object | Proxy. Datacenter (padrão) é o mais barato. |

> ℹ️ Campos `salaryInfo`, `workplaceType`, `applyUrl` e `jobPoster*` dependem do que o LinkedIn expõe publicamente por vaga e às vezes vêm vazios — limite do scraping sem cookies, não é bug.

#### 💰 Exemplo de custo

| Evento | Preço |
|---|---|
| Início do actor | $0,001 por execução |
| Vaga extraída | $0,0004 por vaga ($0,40 / 1.000) |

**Extrair 1.000 vagas** → `1 × $0,001` + `1.000 × $0,0004` = **≈ $0,40 no total**.

#### Como obter a URL de busca

Vá ao [LinkedIn Vagas](https://www.linkedin.com/jobs/), busque e aplique os filtros que quiser, copie a URL do navegador e cole em `searchUrls`.

***

### 🇪🇸 Español

Extrae **ofertas de empleo de LinkedIn** desde cualquier URL de búsqueda — **sin inicio de sesión, sin cookies**.
Obtén título, empresa, ubicación, fecha, nivel de experiencia, tipo de empleo, función,
sectores y la descripción completa.

#### ¿Por qué este scraper?

- 💸 **60% más barato** que las alternativas — **$0,40 por cada 1.000 empleos**, precio único, sin cargos ocultos.
- 🍪 **Sin cookies, sin inicio de sesión** — lee datos públicos de empleos por HTTP.
- ⚡ **Rápido y económico** — sin navegador.
- 🔎 **Respeta tus filtros de búsqueda** — fecha, remoto, nivel, tipo… lo que esté en la URL.
- 🌎 **Documentación trilingüe.**

#### Entrada

| Campo | Tipo | Descripción |
|---|---|---|
| `searchUrls` | array | URLs de búsqueda de empleos de LinkedIn. Se respetan todos los filtros de la URL. |
| `keywords` | string | Búsqueda simple por palabra clave (si no das URL). |
| `location` | string | Ubicación para la búsqueda por palabra clave. |
| `count` | integer | Máximo de empleos. Predeterminado `100`. |
| `scrapeJobDetails` | boolean | Obtener descripción (HTML + texto), nivel/tipo/función/sectores, salario y nº de candidatos. Predeterminado `true`. |
| `scrapeCompany` | boolean | Obtener también datos de la empresa (descripción, sitio web, nº de empleados). Deduplicado por empresa. Predeterminado `true`. |
| `proxyConfiguration` | object | Proxy. Datacenter (predeterminado) es el más económico. |

> ℹ️ Los campos `salaryInfo`, `workplaceType`, `applyUrl` y `jobPoster*` dependen de lo que LinkedIn expone públicamente por oferta y a veces vienen vacíos — límite del scraping sin cookies, no es un error.

#### 💰 Ejemplo de costo

| Evento | Precio |
|---|---|
| Inicio del actor | $0,001 por ejecución |
| Empleo extraído | $0,0004 por empleo ($0,40 / 1.000) |

**Extraer 1.000 empleos** → `1 × $0,001` + `1.000 × $0,0004` = **≈ $0,40 en total**.

#### Cómo obtener la URL de búsqueda

Ve a [LinkedIn Empleos](https://www.linkedin.com/jobs/), busca y aplica los filtros que quieras, copia la URL del navegador y pégala en `searchUrls`.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste LinkedIn jobs search URLs (from linkedin.com/jobs/search/?keywords=...\&location=...). All filters in the URL (date posted, remote, experience level, etc.) are respected.

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

Simple keyword search, used if you don't provide a search URL.

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

Location for the keyword search above.

## `count` (type: `integer`):

Maximum number of jobs to scrape in total.

## `scrapeJobDetails` (type: `boolean`):

Fetch each job's page for the full description (HTML + text), seniority level, employment type, job function, industries, salary and applicant count. Disable for a faster, list-only run.

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

Also fetch each company's LinkedIn page for description, website and employee count. Requests are deduplicated per company, so it adds little cost. Disable for a faster run.

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

Proxy settings. Datacenter (the default) is cheapest and works well.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"
  ],
  "keywords": "data scientist",
  "location": "New York",
  "count": 100,
  "scrapeJobDetails": true,
  "scrapeCompany": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

# 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 = {
    "searchUrls": [
        "https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"
    ],
    "count": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("analytics_tupiniquim/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 = {
    "searchUrls": ["https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"],
    "count": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("analytics_tupiniquim/linkedin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"
  ],
  "count": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call analytics_tupiniquim/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=analytics_tupiniquim/linkedin-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/595rNNoQjdMwrES0E/builds/rhPDpDyKhZWRt8Grp/openapi.json
