# LinkedIn Jobs Scraper | No Cookie | Login (`rexreus/linkedin-jobs-scraper`) Actor

Lightweight LinkedIn jobs scraper using fast HTTP guest endpoints (no login). Bypasses the 1,000-result cap using query segmentation. Supports advanced filters (job type, experience, schedule) and optional li\_at cookie for richer data. Cost-effective, fast, and residential proxy ready.

- **URL**: https://apify.com/rexreus/linkedin-jobs-scraper.md
- **Developed by:** [REXREUS D.O](https://apify.com/rexreus) (community)
- **Categories:** Automation, Jobs, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 job listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

<img src="https://i.imgur.com/FvoD4rE.jpeg" align="center">

> A lightweight, anti-bot-resilient Apify Actor that scrapes public LinkedIn job postings at scale — without a browser and without login.

`Apify Actor` · `TypeScript` · `Crawlee` · `CheerioCrawler` · `HTTP-first` · `Residential Proxy`

The **LinkedIn Jobs Scraper** collects job listings from LinkedIn's public guest endpoints using a fast, HTTP-only crawler. It runs in **guest mode by default** (no credentials required), optionally accepts an `li_at` cookie for richer data, and uses **query segmentation** to break past LinkedIn's ~1,000-results-per-query limit. Results are streamed directly to the dataset, keeping runs light on memory and compute.

---

### Table of Contents

- [Features](#features)
- [How It Works](#how-it-works)
- [Input Reference](#input-reference)
- [Example Input](#example-input)
- [Example Output](#example-output)
- [Guest Mode vs. `li_at` Cookie Mode](#guest-mode-vs-li_at-cookie-mode)
- [Anti-Bot & Rate-Limit Strategy](#anti-bot--rate-limit-strategy)
- [Performance & Cost](#performance--cost)
- [Limitations](#limitations)
- [Troubleshooting](#troubleshooting)
- [Optional Playwright Fallback](#optional-playwright-fallback)
- [Running Locally & Deploying](#running-locally--deploying)
- [Legal & Compliance](#legal--compliance)

---

### Features

- **Lightweight, HTTP-first crawling.** Built on [Crawlee](https://crawlee.dev/)'s `CheerioCrawler`, which fetches and parses raw HTML without launching a headless browser. This makes runs dramatically faster and cheaper than browser-based scrapers. `CheerioCrawler` uses `got-scraping` internally, so realistic browser-like headers and TLS fingerprints are applied automatically.
- **No-login guest mode.** By default the Actor targets LinkedIn's **public guest endpoints** and requires no account or credentials.
- **Optional `li_at` cookie.** Provide a session cookie to unlock richer, more complete data. The cookie is treated as a secret and **is never written to logs or the dataset**.
- **Anti-bot resilience.** Combines Apify **Residential Proxy** with an automatic **session pool** that rotates IPs on rate-limit, soft-ban, or CAPTCHA signals — plus retries with exponential backoff and configurable request throttling.
- **Query segmentation to exceed the ~1,000-result cap.** Automatically splits a single search into multiple filtered sub-queries (by posted time, experience level, and work type) so you can collect far more than the ~1,000 results LinkedIn returns for any single query. Global de-duplication by `jobId` prevents duplicates across segments.
- **Full job fields.** Extracts a comprehensive set of fields including title, company, location, salary, seniority, employment type, job function, industries, applicant count, and the full job description (HTML and plain text).
- **Streaming output.** Each job is pushed to the dataset as soon as it is parsed (`Actor.pushData`), so memory stays flat even on very large runs.

---

### How It Works

The Actor uses a **two-stage architecture** driven by a Crawlee `RequestQueue`:

1. **Search list stage (`SEARCH_LIST`).** The Actor requests LinkedIn's guest job-search endpoint, parses each job card, extracts the `jobId`, and enqueues a detail request for it. It then enqueues the next page of results (`start += 25`) until it runs out of results, reaches `maxResults`, or hits the per-segment page limit.
2. **Detail stage (`JOB_DETAIL`).** For each queued job, the Actor fetches the guest job-posting endpoint and parses the full detail (description, criteria, seniority, etc.), then streams the finished record to the dataset. If `includeJobDescription` is `false`, records are pushed directly from the list stage and the detail stage is skipped for speed.

#### Segmentation Strategy (in plain terms)

LinkedIn only returns roughly the first **1,000 results** for any single search, no matter how many jobs actually match. To get more, the Actor splits one broad search into many narrower ones that together cover the same ground:

1. First it segments by **posted time** (e.g. past 24 hours / past week / past month).
2. Then, within each of those, it segments by **experience level** (6 levels).
3. Then, within each of those, it segments by **work type** (on-site / remote / hybrid).

Each combination is its own search with its own pagination, so each one gets its own ~1,000-result budget. Because different segments can surface the same job, a global **de-duplication set keyed on `jobId`** ensures every job is emitted only once. Segmentation is enabled by default and can be turned off with `enableSegmentation: false`.

---

### Input Reference

Every input field is defined in the Actor's input schema. All fields except `keywords` are optional.

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | *(required)* | Search terms for the job title/role, e.g. `"software engineer"`. |
| `location` | string | `"United States"` | Geographic location to search within, e.g. a country, city, or region. |
| `maxResults` | integer | `100` | Maximum number of jobs to collect. Use `0` for no explicit cap (bounded by LinkedIn availability and segmentation). |
| `timePosted` | string (enum) | `"any"` | Filter by posting recency. One of `any`, `24h`, `week`, `month`. Maps to LinkedIn's `f_TPR`. |
| `experienceLevel` | array of string (enum) | `[]` | Filter by seniority. Values: `internship`, `entry-level`, `associate`, `mid-senior`, `director`, `executive`. Maps to `f_E`. |
| `jobType` | array of string (enum) | `[]` | Filter by employment type. Values: `full-time`, `part-time`, `contract`, `temporary`, `volunteer`, `internship`. Maps to `f_JT`. |
| `workSchedule` | array of string (enum) | `[]` | Filter by work arrangement. Values: `on-site`, `remote`, `hybrid`. Maps to `f_WT`. |
| `easyApplyOnly` | boolean | `false` | If `true`, restrict results to Easy Apply jobs. Maps to `f_AL`. |
| `includeJobDescription` | boolean | `true` | If `true`, fetch each job's detail page for the full description and extra fields. Set to `false` for faster, lighter list-only runs. |
| `enableSegmentation` | boolean | `true` | If `true`, split the search into filtered sub-queries to exceed the ~1,000-result-per-query cap. |
| `liAtCookie` | string (secret) | `""` | Optional LinkedIn `li_at` session cookie for richer data. Treated as a secret and never logged or stored. |
| `proxyConfiguration` | object | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }` | Apify proxy configuration. Residential proxies are strongly recommended for reliability. |
| `maxConcurrency` | integer | `50` | Maximum number of requests processed in parallel. |
| `maxRequestRetries` | integer | `3` | Maximum retry attempts per request before it is marked failed. |
| `maxRequestsPerMinute` | integer | `200` | Global throttle on request rate to reduce the chance of rate limiting. |

---

### Example Input

```json
{
  "keywords": "software engineer",
  "location": "United States",
  "maxResults": 200,
  "timePosted": "week",
  "experienceLevel": ["mid-senior", "associate"],
  "jobType": ["full-time"],
  "workSchedule": ["remote", "hybrid"],
  "easyApplyOnly": false,
  "includeJobDescription": true,
  "enableSegmentation": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  },
  "maxConcurrency": 50,
  "maxRequestRetries": 3,
  "maxRequestsPerMinute": 200
}
````

***

### Example Output

Each dataset item represents one job posting:

```json
{
  "jobId": "3801234567",
  "title": "Senior Software Engineer",
  "company": "Acme Corporation",
  "companyUrl": "https://www.linkedin.com/company/acme-corp",
  "location": "San Francisco, CA",
  "workplaceType": "Hybrid",
  "salary": "$150,000 - $190,000/yr",
  "postedAt": "2026-07-02T00:00:00.000Z",
  "jobUrl": "https://www.linkedin.com/jobs/view/3801234567",
  "description": "We are looking for a Senior Software Engineer to join our platform team. You will design, build, and operate scalable backend services...",
  "descriptionHtml": "<p>We are looking for a <strong>Senior Software Engineer</strong> to join our platform team. You will design, build, and operate scalable backend services...</p>",
  "seniorityLevel": "Mid-Senior level",
  "employmentType": "Full-time",
  "jobFunction": ["Engineering", "Information Technology"],
  "industries": ["Software Development", "Technology, Information and Internet"],
  "applicantsCount": 47,
  "easyApply": false,
  "criteria": [
    { "name": "Seniority level", "value": "Mid-Senior level" },
    { "name": "Employment type", "value": "Full-time" },
    { "name": "Job function", "value": "Engineering and Information Technology" },
    { "name": "Industries", "value": "Software Development" }
  ],
  "scrapedAt": "2026-07-09T12:34:56.000Z"
}
```

#### Output Fields

| Field | Type | Description |
|---|---|---|
| `jobId` | string | LinkedIn's unique identifier for the posting. |
| `title` | string | Job title. |
| `company` | string | Hiring company name. |
| `companyUrl` | string | null | LinkedIn URL of the company page. |
| `location` | string | Job location as displayed by LinkedIn. |
| `workplaceType` | string | null | On-site, Remote, or Hybrid. |
| `salary` | string | null | Salary text if published. |
| `postedAt` | string (ISO 8601) | null | When the job was posted. |
| `jobUrl` | string | Public URL of the job posting. |
| `description` | string | null | Full job description as plain text. |
| `descriptionHtml` | string | null | Full job description as HTML. |
| `seniorityLevel` | string | null | Seniority level. |
| `employmentType` | string | null | Employment type (Full-time, Contract, etc.). |
| `jobFunction` | array of string | Job function categories. |
| `industries` | array of string | Relevant industries. |
| `applicantsCount` | integer | null | Number of applicants, when available. |
| `easyApply` | boolean | Whether the posting supports LinkedIn Easy Apply. |
| `criteria` | array of object | Name/value pairs of the job criteria block. |
| `scrapedAt` | string (ISO 8601) | Timestamp when the record was scraped. |

The dataset ships with two views:

- **overview** — a compact table: `title`, `company`, `location`, `postedAt`, `jobUrl`.
- **detailed** — all fields above.

***

### Guest Mode vs. `li_at` Cookie Mode

#### Guest Mode (default)

The Actor targets LinkedIn's **public guest endpoints** and needs no account. This is the recommended starting point:

- No credentials to manage and no risk to a personal account.
- Fully covers the core fields most users need.
- Lower friction and simpler to run reliably.

#### `li_at` Cookie Mode (optional)

Supplying a valid `li_at` session cookie can unlock **richer and more complete data** on some pages (for example, more consistent applicant counts or fields that guest pages omit).

> **Security warning.** A `li_at` cookie is equivalent to being logged into that LinkedIn account. Handle it with care:
>
> - **Use a secondary / throwaway account**, never your primary personal account. Automated access may trigger account restrictions or bans.
> - The cookie field is marked as a **secret**; its value is **never printed to logs and never stored in the dataset** (it is redacted as `[REDACTED]` everywhere).
> - Cookies expire. If richer fields stop appearing, refresh the cookie (see [Troubleshooting](#troubleshooting)).
> - Never commit cookies to source control or share them.

***

### Anti-Bot & Rate-Limit Strategy

LinkedIn actively defends against automated access. This Actor uses several layers to stay resilient:

- **Residential proxy rotation.** By default it routes traffic through Apify's `RESIDENTIAL` proxy group, which presents real consumer IPs that are far less likely to be blocked than datacenter IPs.
- **Session pool with automatic retirement.** A pool of sessions is maintained; when a session encounters a **429 (rate limit)**, **999 (soft ban)**, or a **CAPTCHA / challenge** response, that session is retired so the next request uses a fresh IP and identity.
- **Retries with exponential backoff.** Failed requests are retried up to `maxRequestRetries` times, with increasing delays to avoid hammering the target.
- **Request throttling.** `maxRequestsPerMinute` caps the global request rate, and `maxConcurrency` bounds parallelism — both help you stay under LinkedIn's radar.
- **Realistic fingerprints.** `CheerioCrawler` (via `got-scraping`) applies browser-like headers and TLS fingerprints automatically.
- **Defensive parsing.** Every field is extracted with null-safe helpers wrapped in per-card `try/catch`, so a markup change or a missing field yields `null`/defaults instead of failing an entire page.

If you still see frequent blocks, lower `maxConcurrency` and `maxRequestsPerMinute`, and keep Residential proxies enabled.

***

### Performance & Cost

This Actor is designed to be **lightweight ("ringan")**: because it uses `CheerioCrawler` (raw HTTP + HTML parsing) instead of a headless browser, it consumes far fewer compute units (CUs) than browser-based alternatives.

Practical guidance for keeping usage light:

- **Start small.** Set a modest `maxResults` (e.g. `50`–`200`) for your first runs to validate your inputs before scaling up.
- **Skip detail pages when you can.** Set `includeJobDescription: false` to collect list-level fields only — this roughly halves the number of requests and is significantly faster and cheaper.
- **Disable segmentation for small jobs.** If you only need a few hundred results, set `enableSegmentation: false` to avoid issuing many sub-queries.
- **Tune concurrency to your needs.** Lower `maxConcurrency` and `maxRequestsPerMinute` reduce peak resource usage and block risk; raise them (carefully) for throughput.
- **Proxy costs.** Residential proxy traffic is billed separately from compute. Fetching detail pages increases proxy usage, so `includeJobDescription: false` also reduces proxy spend.

> Actual compute units depend on result volume, whether detail pages are fetched, and retry rates. Monitor your first few runs in the Apify console to calibrate.

***

### Limitations

- **~1,000 results per query cap.** LinkedIn returns at most ~1,000 results for any single search. The Actor mitigates this with **query segmentation** (enabled by default), but the total reachable set is still bounded by the filter combinations available.
- **JS-rendered content.** Some content is rendered client-side and may not appear in the raw HTML served to an HTTP client. Such fields may be `null`. For those cases, see the [Optional Playwright Fallback](#optional-playwright-fallback).
- **Markup changes.** LinkedIn changes its markup periodically, which can break selectors. Parsing is defensive and selectors are centralized to ease updates, but occasional maintenance may be required.
- **Terms of Service.** Scraping LinkedIn may conflict with LinkedIn's Terms of Service. You are responsible for how you use this Actor — see [LEGAL\_NOTES.md](./LEGAL_NOTES.md).

***

### Troubleshooting

**Getting 429 / 999 / CAPTCHA responses or frequent retries**

- Ensure `proxyConfiguration` uses Apify **Residential** proxies.
- Lower `maxConcurrency` (e.g. to `10`–`20`) and `maxRequestsPerMinute` (e.g. to `60`–`100`).
- Increase `maxRequestRetries` slightly to give sessions more chances to recover.

**Empty or very few results**

- Verify `keywords` and `location` are valid and not overly narrow.
- Relax filters (`timePosted`, `experienceLevel`, `jobType`, `workSchedule`, `easyApplyOnly`).
- Confirm the proxy is working (check run logs for proxy errors).
- Try again later — transient blocking can temporarily reduce results.

**Missing detail fields (description, applicants, etc.)**

- Ensure `includeJobDescription: true`.
- Some fields are only reliably available with a valid `li_at` cookie — consider cookie mode.

**Cookie no longer works / richer fields disappeared**

- `li_at` cookies expire. Log in with your secondary account, copy a fresh `li_at` value, and update the `liAtCookie` input.

**Fewer results than expected on large searches**

- Make sure `enableSegmentation: true`.
- Remember the ~1,000-per-query cap; add more specific filters to create additional segments.

***

### Optional Playwright Fallback

For the rare pages whose content is only available after client-side JavaScript execution, a **Playwright-based browser fallback** could be added as an escape hatch. This is **documented but not implemented by default**, because a headless browser is heavier, slower, and more expensive in compute units — which conflicts with this Actor's lightweight goal.

If you need it, the intended approach is to swap `CheerioCrawler` for `PlaywrightCrawler` (or add a secondary crawler) for the specific requests that require rendering, keeping the same proxy, session, and parsing strategy. Enable this only when HTTP-first parsing genuinely cannot retrieve the data you need.

***

### Running Locally & Deploying

#### Prerequisites

- [Node.js 20+](https://nodejs.org/)
- [Apify CLI](https://docs.apify.com/cli): `npm install -g apify-cli`
- An Apify account and API token for proxy access: `apify login`

#### Run locally

```bash
## Install dependencies
npm install

## Build (TypeScript -> JavaScript)
npm run build

## Provide your input in ./storage/key_value_stores/default/INPUT.json
## then run the Actor locally
apify run
```

Local run output is written to `./storage/datasets/default/`.

#### Deploy to the Apify platform

```bash
## Push the Actor to your Apify account
apify push
```

Once deployed, you can run the Actor from the Apify console, via the API, or on a schedule.

***

### Legal & Compliance

Please read [LEGAL\_NOTES.md](./LEGAL_NOTES.md) before using this Actor. It covers LinkedIn's Terms of Service, `robots.txt`, GDPR and personal-data handling, ethical scraping practices, and an important disclaimer. **You are solely responsible for ensuring your use complies with all applicable laws and terms.**

# Actor input Schema

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

Job search keywords (e.g. job title, skill, company).

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

Geographic location to search within (e.g. "United States", "Berlin, Germany").

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

Maximum number of job postings to scrape. Set to 0 for no limit (bounded only by LinkedIn availability & segmentation).

## `timePosted` (type: `string`):

Filter jobs by how recently they were posted.

## `experienceLevel` (type: `array`):

Filter jobs by required experience level (maps to LinkedIn f\_E).

## `jobType` (type: `array`):

Filter jobs by employment type (maps to LinkedIn f\_JT).

## `workSchedule` (type: `array`):

Filter jobs by workplace type / work schedule (maps to LinkedIn f\_WT).

## `easyApplyOnly` (type: `boolean`):

Only return jobs that support LinkedIn Easy Apply (maps to f\_AL).

## `includeJobDescription` (type: `boolean`):

Fetch the full detail page for each job (description, criteria, etc.). Disabling is faster but returns list-level fields only.

## `enableSegmentation` (type: `boolean`):

Split the search into multiple segmented queries (by posted time, experience level, workplace type) to bypass LinkedIn's ~1000 results-per-query cap.

## `liAtCookie` (type: `string`):

Optional LinkedIn li\_at session cookie for richer data. Its value is never logged or stored in the dataset.

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

Proxy settings. Residential Apify Proxy is strongly recommended to reduce blocking.

## `maxConcurrency` (type: `integer`):

Maximum number of concurrent requests.

## `maxRequestRetries` (type: `integer`):

Maximum number of retries per request on failure (e.g. blocking, network error).

## `maxRequestsPerMinute` (type: `integer`):

Throttle the crawler to at most this many requests per minute.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "United States",
  "maxResults": 100,
  "timePosted": "any",
  "experienceLevel": [],
  "jobType": [],
  "workSchedule": [],
  "easyApplyOnly": false,
  "includeJobDescription": true,
  "enableSegmentation": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 50,
  "maxRequestRetries": 3,
  "maxRequestsPerMinute": 200
}
```

# Actor output Schema

## `dataset` (type: `string`):

The dataset containing all scraped job listings.

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

The JSON summary of this run containing execution stats.

# 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": "United States"
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Jobs Scraper | No Cookie | Login",
        "description": "Lightweight LinkedIn jobs scraper using fast HTTP guest endpoints (no login). Bypasses the 1,000-result cap using query segmentation. Supports advanced filters (job type, experience, schedule) and optional li_at cookie for richer data. Cost-effective, fast, and residential proxy ready.",
        "version": "0.0",
        "x-build-id": "TQscC8yNLcNzwYE7K"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rexreus~linkedin-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rexreus-linkedin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/rexreus~linkedin-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-rexreus-linkedin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/rexreus~linkedin-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-rexreus-linkedin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "keywords"
                ],
                "properties": {
                    "keywords": {
                        "title": "Search keywords",
                        "type": "string",
                        "description": "Job search keywords (e.g. job title, skill, company)."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Geographic location to search within (e.g. \"United States\", \"Berlin, Germany\")."
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of job postings to scrape. Set to 0 for no limit (bounded only by LinkedIn availability & segmentation).",
                        "default": 100
                    },
                    "timePosted": {
                        "title": "Date posted",
                        "enum": [
                            "any",
                            "24h",
                            "week",
                            "month"
                        ],
                        "type": "string",
                        "description": "Filter jobs by how recently they were posted.",
                        "default": "any"
                    },
                    "experienceLevel": {
                        "title": "Experience level",
                        "type": "array",
                        "description": "Filter jobs by required experience level (maps to LinkedIn f_E).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "internship",
                                "entry-level",
                                "associate",
                                "mid-senior",
                                "director",
                                "executive"
                            ],
                            "enumTitles": [
                                "Internship",
                                "Entry level",
                                "Associate",
                                "Mid-Senior level",
                                "Director",
                                "Executive"
                            ]
                        },
                        "default": []
                    },
                    "jobType": {
                        "title": "Job type",
                        "type": "array",
                        "description": "Filter jobs by employment type (maps to LinkedIn f_JT).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full-time",
                                "part-time",
                                "contract",
                                "temporary",
                                "volunteer",
                                "internship",
                                "other"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time",
                                "Contract",
                                "Temporary",
                                "Volunteer",
                                "Internship",
                                "Other"
                            ]
                        },
                        "default": []
                    },
                    "workSchedule": {
                        "title": "Workplace type",
                        "type": "array",
                        "description": "Filter jobs by workplace type / work schedule (maps to LinkedIn f_WT).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "on-site",
                                "remote",
                                "hybrid"
                            ],
                            "enumTitles": [
                                "On-site",
                                "Remote",
                                "Hybrid"
                            ]
                        },
                        "default": []
                    },
                    "easyApplyOnly": {
                        "title": "Easy Apply only",
                        "type": "boolean",
                        "description": "Only return jobs that support LinkedIn Easy Apply (maps to f_AL).",
                        "default": false
                    },
                    "includeJobDescription": {
                        "title": "Include job description",
                        "type": "boolean",
                        "description": "Fetch the full detail page for each job (description, criteria, etc.). Disabling is faster but returns list-level fields only.",
                        "default": true
                    },
                    "enableSegmentation": {
                        "title": "Enable query segmentation",
                        "type": "boolean",
                        "description": "Split the search into multiple segmented queries (by posted time, experience level, workplace type) to bypass LinkedIn's ~1000 results-per-query cap.",
                        "default": true
                    },
                    "liAtCookie": {
                        "title": "li_at cookie (optional)",
                        "type": "string",
                        "description": "Optional LinkedIn li_at session cookie for richer data. Its value is never logged or stored in the dataset."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential Apify Proxy is strongly recommended to reduce blocking.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of concurrent requests.",
                        "default": 50
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of retries per request on failure (e.g. blocking, network error).",
                        "default": 3
                    },
                    "maxRequestsPerMinute": {
                        "title": "Max requests per minute",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Throttle the crawler to at most this many requests per minute.",
                        "default": 200
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
