# LinkedIn Jobs Scraper (No Cookies) (`maximedupre/linkedin-jobs-scraper-no-cookies`) Actor

Find public LinkedIn jobs by keyword, job URL, or ID without a LinkedIn login or cookies. Get titles, employers, locations, and available job details in a dataset for hiring research and job lists.

- **URL**: https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Jobs, Business, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 job listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🔎 Find LinkedIn jobs without cookies

Recruiters, job seekers, and hiring researchers can use LinkedIn Jobs Scraper to turn public job listings into a dataset. Search by keyword or supply job URLs or IDs. Get titles, employers, locations, and available job details to compare roles and build job lists without a LinkedIn account or cookies.

- Find roles with remote work using **[LinkedIn Remote Jobs](https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies/examples/linkedin-remote-jobs)**.
- Collect early-career openings with **[LinkedIn Internships](https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies/examples/linkedin-internships)**.
- Review a named employer's openings with **[LinkedIn Company Jobs](https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies/examples/linkedin-company-jobs)**.
- Find recent openings with **[LinkedIn Jobs Posted Today](https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies/examples/linkedin-jobs-posted-today)**.
- Collect jobs that offer Easy Apply with **[LinkedIn Easy Apply Jobs](https://apify.com/maximedupre/linkedin-jobs-scraper-no-cookies/examples/linkedin-easy-apply-jobs)**.

#### 📦 Public job details for hiring research

Each saved row is one public LinkedIn job listing with a job ID, title, employer, and location. Optional data includes full descriptions, posting dates, job types, pay, benefits, applicant counts, apply links, and company details when the source shows them.

Job data is read from the source during the run. Missing optional details do not prevent a valid job from being saved. Private or unreadable listings are not saved as jobs. Source access limits can affect which jobs are available.

The first eligible occurrence of each source job is saved as it is found. Later matches for that job are ignored within the run.

#### ▶️ Run a LinkedIn job search or lookup

1. Choose **Keyword search**, **Job URLs**, or **Job IDs** in **Find jobs by**.
2. Enter keywords, public job URLs, or numeric job IDs for that method.
3. For keyword search, add any location, employer, date, or job filters you need. All keywords use the same filters.
4. Set **Maximum jobs**, or leave it empty to return all available results until the source is exhausted.
5. Start the Actor and open the **Job listings** dataset link to review or export the jobs.

#### ⚙️ Input

Only fields for the chosen method are used. Search filters apply to keyword search; job URLs and job IDs fetch the listings you supply and ignore those filters.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | string | Choose `keywords`, `urls`, or `ids`. Required. |
| `keywords` | array of strings | Job searches with shared filters. Supports AND, OR, NOT, quotes, and parentheses. |
| `location` | string | City, region, country, or numeric LinkedIn geographic ID. Leave empty for worldwide search. |
| `companyName` | string | Search for jobs at a named employer. |
| `companyReferences` | array of strings | LinkedIn company page URLs or numeric company IDs to filter by employers. |
| `postedWithin` | string | Choose `hour`, `24h`, `week`, or `month`. Leave empty for any posting date. |
| `employmentTypes` | array of strings | Choose `1` full-time, `2` part-time, `3` contract, `4` temporary, `5` volunteer, `6` internship, or `7` other. Empty includes all types. |
| `experienceLevels` | array of strings | Choose `1` internship, `2` entry level, `3` associate, `4` mid-senior level, `5` director, or `6` executive. Empty includes all levels. |
| `workplaceTypes` | array of strings | Choose `1` on-site, `2` remote, or `3` hybrid. Empty includes all workplace types. |
| `industryIds` | array of strings | Numeric LinkedIn industry IDs. Empty includes all industries. |
| `minimumSalary` | string | LinkedIn salary threshold in US dollars: `40000`, `60000`, `80000`, `100000`, `120000`, `140000`, `160000`, `180000`, or `200000`. Results depend on available source salary data. |
| `easyApplyOnly` | boolean | Keep only jobs offering LinkedIn Easy Apply. |
| `fewerThanTenApplicants` | boolean | Keep only jobs LinkedIn marks as having fewer than ten applicants. |
| `titleKeywords` | array of strings | Keep titles containing every keyword in this list. Empty skips this filter. |
| `excludeStaffingAgencies` | boolean | Exclude recruiter and staffing-agency postings. |
| `sortBy` | string | Choose `relevance` or `date` for newest jobs first. |
| `jobUrls` | array of objects | Public LinkedIn job URLs for URL lookup. Each entry has a `url` value. |
| `jobIds` | array of strings | Numeric LinkedIn job IDs for ID lookup. |
| `maxItems` | integer | Stop after this many jobs across the run. Minimum: 1. Leave empty to return all available results until the source is exhausted. There is no fixed upper bound in the input schema. |

**Input example**

This is the public input of the successful current-beta default-input run.

```json
{
  "discoveryMethod": "keywords",
  "keywords": [
    "software engineer"
  ],
  "maxItems": 1
}
```

#### 🧾 Output

The `jobs` output field is a string link to the saved job listings in the default dataset. All three input methods return the same job row shape. The four required fields are `jobId`, `title`, `companyName`, and `location`. Other fields may be missing when the source does not supply them.

**Job row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `jobId` | string | LinkedIn job ID for finding the job or joining data. |
| `title` | string | Job title shown by LinkedIn. |
| `companyName` | string | Employer name on the listing. |
| `location` | string | Job location shown by LinkedIn. |
| `description` | string | Full available description, including stated duties, skills, pay, and benefits. |
| `postedAt` | string | Posting date reported by LinkedIn. |
| `employmentType` | string | Employment type shown on the listing. |
| `seniorityLevel` | string | Source-stated experience or seniority level. |
| `workplaceType` | string | Remote, hybrid, or on-site work as stated by LinkedIn. |
| `industries` | array of strings | Industries shown on the job listing. |
| `jobFunction` | string | Job function shown on the listing. |
| `applicants` | string | Applicant count or range, with the source's wording and limits. |
| `applicationUrl` | string | External apply URL supplied by the source. |
| `applicationMethod` | string | Source-stated way to apply, such as Easy Apply or an external application. |
| `activelyHiring` | boolean | Whether LinkedIn shows the Actively Hiring badge, when reported. |
| `compensation` | string | Stated pay, including currency, pay period, and any stated limits. |
| `benefits` | string | Benefits stated by the source. |
| `listingStatus` | string | Source-reported status of a successfully read listing. |
| `expiresAt` | string | Source-reported expiration date. |
| `closedAt` | string | Source-reported closure date. |
| `viewCount` | integer | Job views reported by the source. |
| `companyLogoUrl` | string | Employer logo URL supplied by LinkedIn. |
| `company` | object | Available details from the employer's public company page. |
| `company.id` | string | LinkedIn company ID. |
| `company.url` | string | Company page URL supplied by LinkedIn. |
| `company.description` | string | Public company description. |
| `company.industries` | array of strings | Industries listed by the company. |
| `company.specialties` | array of strings | Specialties listed by the company. |
| `company.locations` | array of strings | Locations listed by the company. |
| `company.size` | string | Workforce size or range shown by LinkedIn. |
| `company.employeeCount` | integer | Source-reported employee count. |
| `company.followerCount` | integer | Source-reported follower count. |
| `company.headquarters` | string | Headquarters location on the public page. |
| `company.coverImageUrl` | string | Company cover image URL supplied by LinkedIn. |

**Genuine job row**

This complete row is from a successful current-beta run. Public source values are shown without shortening.

```json
{
  "jobId": "4470778326",
  "title": "PGT Biology Teacher",
  "companyName": "Modern School Lucknow",
  "location": "Lucknow, Uttar Pradesh, India",
  "postedAt": "2026-09-26",
  "companyLogoUrl": "https://media.licdn.com/dms/image/v2/C510BAQH4esIGpso9Tw/company-logo_100_100/company-logo_100_100/0/1630573886872?e=2147483647&v=beta&t=7Rw_U-UVCj11BusYS2dQook0jc5u20CgqccVOJ8P-sY",
  "description": "Company Description\n\nEstablished in 1979, Modern School Lucknow is committed to creating an engaging, inquiry-driven learning environment that supports academic growth and development. The school follows the IB curriculum from Nursery to Grade 5, ICSE for Grades 6 to 10 and ISC for Grades 11 and 12.\n\n\n\n\nRole Description\n\nWe are seeking a Biology Teacher for Grades IX–XII for an on-site role in Lucknow. The teacher will deliver engaging lessons, conduct practical and laboratory-based learning, assess student progress and build strong conceptual understanding.\n\n\n\n\nWe are looking for…\n\nA passionate Biology educator who encourages students to observe, question, investigate and develop a deeper understanding of the living world.\n\n\n\n\nQualifications\n\nStrong subject knowledge in Biology/Life Sciences\n\nExperience teaching at secondary/senior secondary level\n\nExpertise in lesson planning and curriculum development\n\nAbility to conduct laboratory work and practicals\n\nExperience with ICSE/ISC curriculum is an advantage\n\nMaster’s degree in Biology/Life Sciences or related field with B.Ed. or equivalent qualification",
  "applicationMethod": "Easy Apply",
  "employmentType": "Other",
  "seniorityLevel": "Entry level",
  "industries": [
    "Primary and Secondary Education"
  ],
  "applicants": "151 applicants",
  "expiresAt": "2027-03-25T04:19:33.000Z"
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The **Job listing** event covers one public LinkedIn job listing read successfully and saved to your dataset. Failed lookups and runs that save no jobs do not create job-listing events. Check the Pricing panel for the current rate.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Export the dataset from Apify for use in spreadsheets or your own hiring research tools. You can run the Actor and read the saved dataset through the Apify API.

#### ❓ FAQ

##### Do search filters apply to job URLs and IDs?

No. Job URLs and IDs fetch the listings you supply. Only keyword search uses the search filters.

##### Can I give each keyword a different location or filter?

All keywords in one run share the same filters. Use separate runs when you need different settings.

##### What happens if several keywords find the same job?

The first eligible occurrence is saved right away. Later matches for the same source job are ignored within that run.

##### Why are some job details missing?

Public listings do not always show every detail. Optional fields are returned only when available. A valid job can still be saved when optional company details are unavailable.

##### Does leaving Maximum jobs empty return every LinkedIn job?

It returns all available results until the source is exhausted. It does not promise every job on LinkedIn. Public source access can limit what is available.

##### Can I use this as a LinkedIn jobs API without cookies?

You can call this Actor through the Apify API and read its dataset. It reads public LinkedIn job data without a LinkedIn account or cookies. It is an independent tool and is not an official LinkedIn API.

##### Does it apply for jobs or collect candidate profiles?

It collects public job listings. It does not submit applications or collect candidate profiles.

### 📝 Changelog

**v0.0** (06-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~linkedin-jobs-scraper-no-cookies/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [LinkedIn Company Profile Scraper](https://apify.com/maximedupre/linkedin-company-scraper): Add public employer facts for company research.
- [Handshake Jobs Scraper](https://apify.com/maximedupre/handshake-jobs-scraper): Collect public Handshake jobs and internships for a wider job list.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/maximedupre/welcometothejungle-jobs-extractor): Compare public WTTJ roles, salaries, and remote policies.
- [CWjobs Scraper](https://apify.com/maximedupre/cwjobs-scraper): Research UK tech openings with employer and salary details.
- [Rozee.pk Jobs Scraper](https://apify.com/maximedupre/rozee-pk-jobs-scraper): Add public Pakistan job listings to hiring research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose how to find jobs. Only fields for your chosen method are used.

## `keywords` (type: `array`):

Enter one or more job searches. Each entry can use LinkedIn Boolean search, such as AND, OR, NOT, quotes, and parentheses. All entries use the same search filters.

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

Enter a city, region, country, or numeric LinkedIn geographic ID. Leave blank to search worldwide.

## `companyName` (type: `string`):

Search for jobs at a named employer.

## `companyReferences` (type: `array`):

Enter LinkedIn company page URLs or numeric company IDs to filter by employers.

## `postedWithin` (type: `string`):

Keep jobs posted during this time window. Leave blank for any posting date.

## `employmentTypes` (type: `array`):

Choose employment types. Leave empty to include all types.

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

Choose experience levels. Leave empty to include all levels.

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

Choose where work takes place. Leave empty to include all workplace types.

## `industryIds` (type: `array`):

Enter numeric LinkedIn industry IDs. Leave empty to include all industries.

## `minimumSalary` (type: `string`):

Use LinkedIn’s salary filter in US dollars. Results depend on the salary data LinkedIn makes available.

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

Keep only jobs offering LinkedIn Easy Apply.

## `fewerThanTenApplicants` (type: `boolean`):

Keep only jobs that LinkedIn marks as having fewer than ten applicants.

## `titleKeywords` (type: `array`):

Keep only jobs whose titles contain every keyword in this list. Leave empty to skip this filter.

## `excludeStaffingAgencies` (type: `boolean`):

Exclude postings from recruiters and staffing agencies.

## `sortBy` (type: `string`):

Choose LinkedIn relevance order or newest jobs first.

## `jobUrls` (type: `array`):

Enter public LinkedIn job listing URLs.

## `jobIds` (type: `array`):

Enter numeric LinkedIn job listing IDs.

## `maxItems` (type: `integer`):

Stop after this many jobs across the run. Leave blank to collect all available jobs until the source has no more results.

## Actor input object example

```json
{
  "discoveryMethod": "keywords",
  "keywords": [
    "software engineer"
  ],
  "maxItems": 1
}
```

# Actor output Schema

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

Open the saved job listings.

# 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 = {
    "discoveryMethod": "keywords",
    "keywords": [
        "software engineer"
    ],
    "maxItems": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/linkedin-jobs-scraper-no-cookies").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 = {
    "discoveryMethod": "keywords",
    "keywords": ["software engineer"],
    "maxItems": 1,
}

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

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

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

```

## CLI example

```bash
echo '{
  "discoveryMethod": "keywords",
  "keywords": [
    "software engineer"
  ],
  "maxItems": 1
}' |
apify call maximedupre/linkedin-jobs-scraper-no-cookies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/linkedin-jobs-scraper-no-cookies"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/J5Ug4Nj0L8iLMduDW/builds/uKHBAqGdFfaXLTHFF/openapi.json
