# LinkedIn Jobs Scraper (`calm_builder/linkedin-jobs-scraper`) Actor

Scrape LinkedIn job listings from search URLs or keyword-based searches with date, job-type, experience, and remote filters. Each result includes title, company, location, salary, full description, criteria, apply links, and optional company profiles. No login required.

- **URL**: https://apify.com/calm\_builder/linkedin-jobs-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 job saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Collect structured job listing data from public [LinkedIn](https://www.linkedin.com/jobs) job searches — using search URLs or keyword-based queries. Add one or more searches, start a run, and receive clean JSON records in your Apify dataset. No LinkedIn login required.

Use it for **recruiting pipelines**, **job board aggregation**, **market research**, **competitive hiring intelligence**, **lead generation**, and **talent analytics** — without copying listings manually.

---

### What you get

Each saved row is **one job listing**, organized into clear sections:

| Section | What it contains |
| -------- | ---------------- |
| **Job identity** | Job ID, title, job URL, and company logo |
| **Company (listing)** | Company name, LinkedIn company ID, and company page URL |
| **Location & workplace** | Location string and workplace type (on-site, remote, or hybrid) when shown |
| **Posting details** | Posted date, relative posted text, salary when available, benefits, Easy Apply flag, and promoted flag |
| **Description** | Full job description as plain text and HTML |
| **Employment criteria** | Seniority, employment type, job function, industry, and related labels |
| **Apply information** | Apply type, apply URL, and applicant count when shown |
| **Search context** | Which search produced the job (`searchId`, keywords, location) |
| **`input`** | Snapshot of the search configuration that produced this job |
| **`company`** *(optional)* | Enriched company profile when **Fetch company details** is enabled |

Results are saved to the dataset **as each job is processed**, so you can preview progress before the run finishes.

---

### Quick start on Apify

1. Open the Actor in the Apify Console.
2. Add at least one **LinkedIn search URL** or **keyword search**.
3. Optionally enable **Fetch company details** for enriched company profiles.
4. Click **Start** and open the **Dataset** tab as jobs are saved.

You can combine direct search URLs and keyword searches in a single run.

**Example input:**

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "Python Developer",
      "location": "United States"
    }
  ],
  "maxJobsPerSearch": 25,
  "deduplicateJobs": true,
  "fetchCompanyDetails": true
}
````

***

### Input parameters

Provide at least one **LinkedIn search URL** or **keyword search**. You can use both in the same run.

#### Direct search URLs

| | |
| --- | --- |
| **Field** | `startUrls` |
| **Type** | List of URLs |
| **Description** | Add one LinkedIn job search URL per row. Each URL is scraped exactly as provided, including filters already in the link. |

Copy URLs from your browser after applying filters on LinkedIn (date posted, job type, remote, etc.).

**Example:**

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
    }
  ]
}
```

#### Keyword searches

| | |
| --- | --- |
| **Field** | `keywordSearches` |
| **Type** | List of objects |
| **Required per row** | `keywords` |
| **Optional per row** | `location` (city, region, or country) |

The filters in the next section apply to keyword searches only. Direct search URLs are not modified.

**Example:**

```json
{
  "keywordSearches": [
    {
      "keywords": "Python Developer",
      "location": "United States"
    }
  ]
}
```

#### Filters *(keyword searches only)*

These filters apply to **keyword searches only**. Direct search URLs are scraped as-is.

| Field | Description |
| ----- | ----------- |
| `datePosted` | Time range: any time, last hour, last 12/24 hours, last 3/7/14/30 days |
| `jobTypes` | Full-time, part-time, contract, temporary, internship, volunteer, or other |
| `experienceLevels` | Internship, entry, associate, mid-senior, director, or executive |
| `workplaceTypes` | On-site, remote, or hybrid |
| `companyIds` | Limit results to specific LinkedIn company IDs (one numeric ID per row) |
| `easyApplyOnly` | Include only jobs that support LinkedIn Easy Apply |
| `excludePromoted` | Remove promoted listings from results |

#### Output configuration

| Field | Default | Description |
| ----- | ------- | ----------- |
| `maxJobsPerSearch` | `25` | Maximum jobs to collect from each search URL or keyword search (1–10,000) |
| `deduplicateJobs` | `true` | When enabled, the same job appearing in multiple searches is saved only once |
| `fetchCompanyDetails` | `false` | When enabled, each job includes an enriched `company` object. Each unique company is fetched once per run and reused across jobs |

***

### What you will see during a run

The run log is written for end users — messages describe collection progress only.

Typical messages:

- `Starting job collection for N search(es).`
- `Company profile enrichment is enabled.` *(when fetch company details is on)*
- `Progress: 25 job(s) saved to the dataset.`
- `No jobs were found for: …` *(when a search returns no results)*
- `N job(s) from "…" could not be fully retrieved.` *(partial detail failures)*
- `N job(s) from "…" could not be enriched with company details.` *(when company enrichment is enabled)*
- `Run complete. Saved N job(s) to the dataset.`

If one search fails or returns incomplete data, other searches in the same run can still succeed.

On the Apify **free plan**, you may also see a notice when free-tier limits apply (see [Free plan limits](#free-plan-limits)).

***

### Output overview

#### Dataset structure

- Results are saved to a **single Apify dataset**
- Each row is one job object with nested sections (`criteria`, `input`, and optionally `company`)
- Jobs from multiple searches include `searchId`, `searchKeywords`, and `searchLocation` so you can trace which query produced each result
- The nested **`input`** object records the exact search configuration for that job

Field presence varies by listing: not every job shows salary, benefits, workplace type, applicant count, or a job poster. Missing fields are omitted from the output — not necessarily a scraper error.

When **Fetch company details** is disabled, jobs do not include the `company` object. Basic company fields (`companyName`, `companyId`, `companyUrl`) are still included from the job listing.

***

### Output fields

#### Job identity and listing

| Field | Description |
| ----- | ----------- |
| `jobId` | LinkedIn job ID |
| `title` | Job title |
| `jobUrl` | Public LinkedIn job view URL |
| `logoUrl` | Company logo URL from the listing |

#### Company (from listing)

| Field | Description |
| ----- | ----------- |
| `companyName` | Employer name |
| `companyId` | LinkedIn company slug |
| `companyIdNumeric` | Numeric LinkedIn company ID when available |
| `companyUrl` | LinkedIn company page URL |

#### Location, posting, and compensation

| Field | Description |
| ----- | ----------- |
| `location` | Job location as shown on the listing |
| `workplaceType` | On-site, remote, or hybrid when shown |
| `postedAt` | Parsed posting date (`YYYY-MM-DD`) when available |
| `postedText` | Relative posting text (for example `5 days ago`) |
| `postedAgeDays` | Estimated age in days when parseable |
| `salary` | Salary or pay range when LinkedIn displays it |
| `benefits` | Benefits text when shown |
| `easyApply` | Whether LinkedIn Easy Apply is available |
| `promoted` | Whether the listing is marked as promoted |

#### Description and criteria

| Field | Description |
| ----- | ----------- |
| `description` | Full job description as plain text |
| `descriptionHtml` | Job description with HTML formatting |
| `criteria` | Array of `{ label, value }` pairs (seniority, employment type, job function, industries) |
| `contractType` | Employment type label when parsed |
| `experienceLevel` | Seniority level when parsed |
| `workType` | Job function when parsed |
| `sector` | Industry when parsed |
| `applicantText` | Applicant count label when shown (for example `Over 200 applicants`) |

#### Apply and poster

| Field | Description |
| ----- | ----------- |
| `applyType` | Apply method (for example `EXTERNAL` or Easy Apply) |
| `applyUrl` | URL to apply or view the application |
| `posterProfileUrl` | LinkedIn profile URL of the job poster when shown |
| `posterFullName` | Name of the job poster when shown |

#### Search context

| Field | Description |
| ----- | ----------- |
| `searchId` | Internal ID for the search that produced this job |
| `searchKeywords` | Keywords from a keyword search (null for direct URL searches) |
| `searchLocation` | Location from a keyword search (null for direct URL searches) |
| `input` | Snapshot of the search input — source, keywords, URL, filters, and limits |

#### `company` *(when Fetch company details is enabled)*

| Field | Description |
| ----- | ----------- |
| `companyUrl` | Canonical LinkedIn company page URL |
| `pageType` | Page type (`company` or `showcase`) |
| `companyId` | LinkedIn company slug |
| `companyIdNumeric` | Numeric company ID |
| `name` | Company name |
| `tagline` | Company tagline when shown |
| `followerCount` | Follower count when available |
| `logoUrl` | Company logo URL |
| `description` | Company about text |
| `industry` | Primary industry |
| `companySize` | Employee count range |
| `headquarters` | Headquarters location |
| `website` | Company website URL |
| `organizationType` | Organization type (for example Privately Held) |
| `founded` | Year founded when shown |
| `specialties` | List of company specialties |
| `address` | Structured address when available |
| `affiliatedCompanies` | Related companies with `name` and `url` when shown |

***

### Example output

The excerpts below come from a real run combining a keyword search and a direct search URL. Full output is available in the run dataset.

#### Example input

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "Python Developer",
      "location": "United States"
    }
  ],
  "maxJobsPerSearch": 25,
  "deduplicateJobs": true,
  "fetchCompanyDetails": true
}
```

#### Excerpt — keyword search job with description and enriched company

```json
{
  "jobId": "3952273769",
  "title": "Python Developer",
  "companyName": "Open Systems Technologies",
  "companyId": "open-systems-technologies",
  "companyIdNumeric": "11655",
  "companyUrl": "https://www.linkedin.com/company/open-systems-technologies?trk=public_jobs_topcard-org-name",
  "location": "New York, NY",
  "postedAt": "2026-06-22",
  "postedText": "5 days ago",
  "postedAgeDays": 5,
  "salary": "$150",
  "easyApply": false,
  "promoted": false,
  "jobUrl": "https://www.linkedin.com/jobs/view/python-developer-at-open-systems-technologies-3952273769",
  "searchId": "keyword_2",
  "searchKeywords": "Python Developer",
  "searchLocation": "United States",
  "input": {
    "source": "keywordSearch",
    "searchId": "keyword_2",
    "keywords": "Python Developer",
    "location": "United States",
    "searchUrl": "https://www.linkedin.com/jobs/search?keywords=Python+Developer&location=United+States",
    "maxJobsPerSearch": 25,
    "filters": {
      "easyApplyOnly": false,
      "excludePromoted": false
    }
  },
  "description": "A major financial firm is looking for a Python Developer to join their team in New York, NY. Compensation: $150-200k/year …",
  "criteria": [
    { "label": "Seniority level", "value": "Not Applicable" },
    { "label": "Employment type", "value": "Full-time" },
    { "label": "Job function", "value": "Engineering and Information Technology" },
    { "label": "Industries", "value": "Staffing and Recruiting" }
  ],
  "applicantText": "Over 200 applicants",
  "contractType": "Full-time",
  "experienceLevel": "Not Applicable",
  "workType": "Engineering and Information Technology",
  "sector": "Staffing and Recruiting",
  "applyType": "EXTERNAL",
  "applyUrl": "https://www.linkedin.com/jobs/view/3952273769",
  "company": {
    "companyUrl": "https://www.linkedin.com/company/open-systems-technologies/",
    "pageType": "company",
    "companyId": "open-systems-technologies",
    "companyIdNumeric": "11655",
    "name": "Open Systems Technologies",
    "followerCount": 286921,
    "description": "Open Systems Technologies is a tier-one vendor for the world's most competitive financial and technology companies…",
    "industry": "Staffing and Recruiting",
    "companySize": "201-500 employees",
    "headquarters": "New York, NY",
    "website": "http://www.opensystemstech.com",
    "organizationType": "Privately Held",
    "founded": "1990",
    "specialties": [
      "Staffing agency",
      "Consulting services",
      "Technology jobs"
    ]
  }
}
```

#### Excerpt — direct search URL job

```json
{
  "jobId": "4434091820",
  "title": "Front-End Engineer",
  "companyName": "InAir",
  "companyId": "inairstudio",
  "location": "United States",
  "postedAt": "2026-06-27",
  "postedText": "1 day ago",
  "postedAgeDays": 1,
  "jobUrl": "https://www.linkedin.com/jobs/view/front-end-engineer-at-inair-4434091820",
  "searchId": "url_1",
  "searchKeywords": null,
  "searchLocation": null,
  "input": {
    "source": "startUrl",
    "searchId": "url_1",
    "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400",
    "maxJobsPerSearch": 25
  },
  "description": "We're looking for a full time Front-End Engineer (React) with strong hands-on coding experience…",
  "criteria": [
    { "label": "Seniority level", "value": "Not Applicable" },
    { "label": "Employment type", "value": "Contract" },
    { "label": "Job function", "value": "Engineering and Information Technology" },
    { "label": "Industries", "value": "Software Development" }
  ],
  "applicantText": "183 applicants",
  "contractType": "Contract",
  "applyType": "EXTERNAL"
}
```

***

### Pricing

Job collection is included when you run the Actor. See the **Pricing** tab on the Apify Store listing for compute and platform costs.

When **Fetch company details** is enabled, a **`company_detail`** event is charged for each **unique company profile successfully retrieved** in the run. If the same company appears on multiple jobs, it is counted once. Failed company lookups are not charged. Cached companies within the same run are not charged again.

Disable **Fetch company details** if you only need listing-level company fields (`companyName`, `companyId`, `companyUrl`).

***

### Free plan limits

On the Apify **free plan**, the Actor may automatically apply:

| Limit | Value |
| ----- | ----- |
| Direct search URLs per run | **2** |
| Keyword searches per run | **2** |
| Maximum jobs per search | **10** |

Additional searches or higher job limits are trimmed for free-plan runs. Paid Apify plans can use the full input without these caps. If limits apply, the run log will include a short notice.

***

### Public listings and data coverage

**No LinkedIn login required**\
The Actor reads publicly visible job search and listing pages. It does not sign in to LinkedIn and does not use your account or cookies.

**Guest view vs signed-in view**\
Results reflect what LinkedIn shows to visitors who are not logged in. Compared with what you see when signed in, output may include:

- Fewer applicant details or poster information
- Missing or partial salary data
- Shorter company descriptions
- Limited workplace type labels

Coverage varies by listing, company, and region.

**Search URL vs keyword search**\
Direct URLs preserve every filter in the link. Keyword searches use the Actor's filter fields. For precise control (for example a specific LinkedIn date filter), use a copied search URL.

**Company enrichment**\
The optional `company` object comes from the public LinkedIn company page. Some companies expose more fields than others. Enrichment adds time to the run proportional to the number of unique companies.

**Compliance**\
You are responsible for using collected data in line with applicable laws and [LinkedIn's terms of service](https://www.linkedin.com/legal/user-agreement).

***

### Tips for best results

1. **Copy search URLs from LinkedIn** — When you need exact filters, paste the URL from your browser instead of rebuilding filters manually.
2. **Combine searches in one run** — Use multiple keyword searches and URLs together; enable **Remove duplicate jobs** to avoid repeats.
3. **Start with a small `maxJobsPerSearch`** — Test with 10–25 jobs per search before large exports.
4. **Enable company details when you need firmographics** — Turn on **Fetch company details** for industry, size, headquarters, website, and specialties.
5. **Use `jobId` as a stable key** — Deduplicate across runs on `jobId` when refreshing listings over time.
6. **Filter on `input.searchId`** — Split results by search when running multiple queries in one job.
7. **Schedule recurring runs** — Use Apify schedules to monitor new postings for your target roles and locations.
8. **Export flexibly** — Download the dataset as JSON, CSV, Excel, or connect via API to your ATS, CRM, or data warehouse.

***

### Frequently asked questions

**Can I use both search URLs and keyword searches in one run?**\
Yes. Provide at least one of either type, or combine both. Enable **Remove duplicate jobs** to avoid saving the same listing twice.

**Why is `salary` empty for some jobs?**\
LinkedIn only shows salary on some listings. When pay is not displayed publicly, the field is omitted or null.

**Why is there no `company` object on my results?**\
The `company` object is only included when **Fetch company details** is enabled. Without it, you still receive `companyName`, `companyId`, and `companyUrl` from the job listing.

**How is company enrichment billed?**\
Each unique company profile successfully retrieved counts as one **`company_detail`** event. Repeated jobs from the same employer in one run do not incur additional company charges. See the **Pricing** tab for rates.

**Why did some jobs or company profiles fail?**\
Individual listings or company pages may be temporarily unavailable or restricted. The run continues for other searches and jobs; check the run log for counts of partial failures.

**Do filters apply to my search URLs?**\
No. Filters in the input apply to **keyword searches only**. Direct URLs are scraped exactly as provided.

**Can I scrape individual job URLs?**\
This Actor is built for **job search results** (search URLs or keyword queries). Paste a search URL or configure a keyword search rather than a single job view URL.

**Why does the same job look different from my browser?**\
If you are signed in to LinkedIn, you may see more detail than a public guest visitor. This Actor matches the guest view.

***

### Support

For Actor-specific issues, use the **Issues** tab on the Apify Store listing or contact the publisher through Apify.

For platform questions (runs, billing, API, schedules), see [Apify documentation](https://docs.apify.com) and Apify support.

# Actor input Schema

## `startUrls` (type: `array`):

Add one LinkedIn job search URL per row. Each URL is processed as-is with the filters and parameters already in the link.

## `keywordSearches` (type: `array`):

Add one row per search with a job title or keywords and an optional location.

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

Show jobs posted within the selected time range. Applies to keyword searches only.

## `jobTypes` (type: `array`):

Filter by employment type. Leave empty to include all types.

## `experienceLevels` (type: `array`):

Filter by seniority level. Leave empty to include all levels.

## `workplaceTypes` (type: `array`):

Filter by on-site, remote, or hybrid roles. Leave empty to include all workplace types.

## `companyIds` (type: `array`):

Limit results to specific companies by LinkedIn company ID. Add one numeric ID per row. Leave empty to search all companies.

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

When enabled, only jobs that support LinkedIn Easy Apply are included.

## `excludePromoted` (type: `boolean`):

When enabled, promoted job listings are removed from the results.

## `maxJobsPerSearch` (type: `integer`):

Maximum number of jobs to collect from each search URL or keyword search.

## `deduplicateJobs` (type: `boolean`):

When enabled, the same job appearing in multiple searches is included only once in the final output.

## `fetchCompanyDetails` (type: `boolean`):

When enabled, each job includes an enriched company profile (description, industry, size, headquarters, website, specialties, and more). Each unique company is fetched once per run and reused across jobs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "Python Developer",
      "location": "United States"
    }
  ],
  "datePosted": "any",
  "easyApplyOnly": false,
  "excludePromoted": false,
  "maxJobsPerSearch": 25,
  "deduplicateJobs": true,
  "fetchCompanyDetails": false
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
        }
    ],
    "keywordSearches": [
        {
            "keywords": "Python Developer",
            "location": "United States"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("calm_builder/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 = {
    "startUrls": [{ "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400" }],
    "keywordSearches": [{
            "keywords": "Python Developer",
            "location": "United States",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("calm_builder/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 '{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/jobs/search?keywords=Full+Stack+Developer&location=United+States&f_TPR=r86400"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "Python Developer",
      "location": "United States"
    }
  ]
}' |
apify call calm_builder/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Jobs Scraper",
        "description": "Scrape LinkedIn job listings from search URLs or keyword-based searches with date, job-type, experience, and remote filters. Each result includes title, company, location, salary, full description, criteria, apply links, and optional company profiles. No login required.",
        "version": "0.0",
        "x-build-id": "UAsAsbVz7jpuQiSqL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/calm_builder~linkedin-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-calm_builder-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/calm_builder~linkedin-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-calm_builder-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/calm_builder~linkedin-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-calm_builder-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",
                "properties": {
                    "startUrls": {
                        "title": "LinkedIn search URLs",
                        "type": "array",
                        "description": "Add one LinkedIn job search URL per row. Each URL is processed as-is with the filters and parameters already in the link.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "keywordSearches": {
                        "title": "Keyword searches",
                        "type": "array",
                        "description": "Add one row per search with a job title or keywords and an optional location.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "keywords": {
                                    "title": "Job title or keywords",
                                    "type": "string",
                                    "description": "The job title, role, or keywords to search for.",
                                    "minLength": 1,
                                    "prefill": "Software Engineer"
                                },
                                "location": {
                                    "title": "Location",
                                    "type": "string",
                                    "description": "City, region, or country (for example, United States, New York, NY, or London).",
                                    "prefill": "United States"
                                }
                            },
                            "required": [
                                "keywords"
                            ]
                        }
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "any",
                            "last_hour",
                            "last_12_hours",
                            "last_24_hours",
                            "last_3_days",
                            "last_7_days",
                            "last_14_days",
                            "last_30_days"
                        ],
                        "type": "string",
                        "description": "Show jobs posted within the selected time range. Applies to keyword searches only.",
                        "default": "any"
                    },
                    "jobTypes": {
                        "title": "Job type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Filter by employment type. Leave empty to include all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full_time",
                                "part_time",
                                "contract",
                                "temporary",
                                "internship",
                                "volunteer",
                                "other"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time",
                                "Contract",
                                "Temporary",
                                "Internship",
                                "Volunteer",
                                "Other"
                            ]
                        }
                    },
                    "experienceLevels": {
                        "title": "Experience level",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Filter by seniority level. Leave empty to include all levels.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "internship",
                                "entry",
                                "associate",
                                "mid_senior",
                                "director",
                                "executive"
                            ],
                            "enumTitles": [
                                "Internship",
                                "Entry level",
                                "Associate",
                                "Mid-Senior level",
                                "Director",
                                "Executive"
                            ]
                        }
                    },
                    "workplaceTypes": {
                        "title": "Workplace type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Filter by on-site, remote, or hybrid roles. Leave empty to include all workplace types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "onsite",
                                "remote",
                                "hybrid"
                            ],
                            "enumTitles": [
                                "On-site",
                                "Remote",
                                "Hybrid"
                            ]
                        }
                    },
                    "companyIds": {
                        "title": "Company IDs",
                        "type": "array",
                        "description": "Limit results to specific companies by LinkedIn company ID. Add one numeric ID per row. Leave empty to search all companies.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "easyApplyOnly": {
                        "title": "Easy Apply only",
                        "type": "boolean",
                        "description": "When enabled, only jobs that support LinkedIn Easy Apply are included.",
                        "default": false
                    },
                    "excludePromoted": {
                        "title": "Exclude promoted jobs",
                        "type": "boolean",
                        "description": "When enabled, promoted job listings are removed from the results.",
                        "default": false
                    },
                    "maxJobsPerSearch": {
                        "title": "Maximum jobs per search",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of jobs to collect from each search URL or keyword search.",
                        "default": 25
                    },
                    "deduplicateJobs": {
                        "title": "Remove duplicate jobs",
                        "type": "boolean",
                        "description": "When enabled, the same job appearing in multiple searches is included only once in the final output.",
                        "default": true
                    },
                    "fetchCompanyDetails": {
                        "title": "Fetch company details",
                        "type": "boolean",
                        "description": "When enabled, each job includes an enriched company profile (description, industry, size, headquarters, website, specialties, and more). Each unique company is fetched once per run and reused across jobs.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
