# LinkedIn Jobs Scraper (no cookies) (`mina_safwat/linkedin-jobs-scraper-no-cookies`) Actor

Searches LinkedIn job listings and returns title, company, location, posting date, salary and full description — without a session cookie.

- **URL**: https://apify.com/mina\_safwat/linkedin-jobs-scraper-no-cookies.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Jobs, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Jobs Scraper

### What does LinkedIn Jobs Scraper do?

**Search [LinkedIn](https://www.linkedin.com) job listings by keyword and location, and get the results as structured data** — job title, company, location, posting date, salary when shown, a link to apply, and the full job description.

No LinkedIn account, login, or cookie is needed. Type what you are looking for, press Start, and download the results as JSON, CSV or Excel — or pull them straight from the Apify API.

### Why use LinkedIn Jobs Scraper?

- **Track a job market** — see what roles are being posted, where, and by whom.
- **Build a job board** — pull fresh listings for a niche and publish or share them.
- **Watch competitors** — see who is hiring, for what, and how fast they are growing.
- **Recruiting research** — compare titles, seniority and locations across many postings at once.
- **Job hunting** — collect every relevant opening into one spreadsheet instead of scrolling.

### How to use LinkedIn Jobs Scraper

1. Enter your **Search keywords**, for example `python developer`.
2. Enter a **Location**, for example `United States` or `Berlin, Germany`. Leave it empty to search everywhere.
3. Set **Maximum jobs** to how many results you want.
4. Narrow things down with the filters if you like — date posted, job type, experience level, remote or on-site.
5. Tick **Include full job description** if you want the whole description text.
6. Click **Start**, then open the **Output** tab when it finishes.

### Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| **Search keywords** (`keywords`) | string | Yes | What to search for. |
| **Location** (`location`) | string | No | Where to search. Empty means worldwide. |
| **Maximum jobs** (`limit`) | integer | No | How many jobs to return. Default 50. |
| **Date posted** (`date_posted`) | select | No | Any time, past 24 hours, past week, or past month. |
| **Job type** (`job_type`) | select | No | Full-time, part-time, contract, temporary, volunteer or internship. |
| **Experience level** (`experience_level`) | select | No | Internship through executive. |
| **Workplace type** (`remote`) | select | No | On-site, remote or hybrid. |
| **Include full job description** (`include_description`) | boolean | No | Adds the description and job criteria. Slower. Off by default. |

Example input:

```json
{
  "keywords": "python developer",
  "location": "United States",
  "limit": 25,
  "date_posted": "past week",
  "remote": "remote",
  "include_description": true
}
```

### Output

One record per job:

```json
{
  "job_id": "4451909310",
  "title": "Python Django Developer",
  "company": "Tata Consultancy Services",
  "company_url": "https://www.linkedin.com/company/tata-consultancy-services",
  "company_logo": "https://media.licdn.com/dms/image/v2/…",
  "location": "Morrisville, NC",
  "posted_at": "2026-08-11",
  "posted_relative": "5 days ago",
  "salary": null,
  "job_url": "https://www.linkedin.com/jobs/view/python-django-developer-at-tata-consultancy-services-4451909310",
  "description": "Job Description. Must have technical skills…",
  "seniority_level": "Not Applicable",
  "employment_type": "Full-time",
  "job_function": "Engineering and Information Technology",
  "industries": "IT Services and IT Consulting",
  "applicants": "Be among the first 25 applicants",
  "search_keywords": "python developer",
  "search_location": "United States"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
| --- | --- |
| `job_id` | LinkedIn's own id for the posting. |
| `title` | Job title. |
| `company` | Hiring company. |
| `company_url` | Link to the company's LinkedIn page. |
| `company_logo` | Company logo image. |
| `location` | Where the job is based. |
| `posted_at` | Date the job was posted. |
| `posted_relative` | The same date as LinkedIn shows it, e.g. "5 days ago". |
| `salary` | Pay range, when the employer published one. |
| `job_url` | Link to the posting, where you can apply. |
| `description` | The full job description. Needs **Include full job description**. |
| `seniority_level` | Seniority, e.g. Entry level, Mid-Senior level. Needs **Include full job description**. |
| `employment_type` | Full-time, contract, and so on. Needs **Include full job description**. |
| `job_function` | Job function, e.g. Engineering. Needs **Include full job description**. |
| `industries` | Industry of the hiring company. Needs **Include full job description**. |
| `applicants` | How many people have applied, when LinkedIn shows it. Needs **Include full job description**. |
| `search_keywords`, `search_location` | The search that produced this row, handy when you merge several runs. |

### What it cannot return

- **Salary on every job.** Most employers do not publish one, so `salary` is usually empty.
- **Anything behind a login.** Recruiter details, applicant lists and saved-job state are not public.
- **Unlimited depth.** LinkedIn stops paging a public job search after roughly a thousand results, so very broad searches are best split into narrower ones.

### How much does it cost to scrape LinkedIn jobs?

Very little. Twenty-five jobs with full descriptions took about a minute and cost around a cent and a half. Leaving **Include full job description** off is several times cheaper, because it skips one request per job.

### Tips

- **Narrow the search rather than raising the limit.** Splitting by location or job type gives better coverage than one broad search, because of the paging limit above.
- **Only tick Include full job description when you need the text** — it is one extra request per job.
- **Use Date posted for monitoring.** Setting it to "past 24 hours" on a daily schedule gives you a clean feed of new postings with no duplicates to filter.

### FAQ and support

**Do I need a LinkedIn account or cookie?** No. Job listings are public, and this Actor reads only what any visitor can see.

**Why do some jobs have no salary?** Because the employer did not publish one. LinkedIn shows a range only when it is provided.

**Can I get more than a thousand results for one search?** Not in a single search — that is LinkedIn's own limit. Split the search by location, job type or date range instead.

**Is scraping LinkedIn legal?** This Actor collects only publicly available data. You are responsible for how you use it, and you should not collect personal data without a legal basis. If in doubt, take legal advice.

Found a bug, or need a field that is not here? Open an issue on the **Issues** tab.

# Actor input Schema

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

What to search for, e.g. "python developer" or "marketing manager".

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

Where to search, e.g. "United States", "London" or "Berlin, Germany". Leave empty to search worldwide.

## `limit` (type: `integer`):

How many jobs to return.

## `date_posted` (type: `string`):

Only return jobs posted within this window.

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

Filter by employment type.

## `experience_level` (type: `string`):

Filter by seniority.

## `remote` (type: `string`):

Filter by on-site, remote or hybrid.

## `include_description` (type: `boolean`):

Opens each job to add its description, seniority, employment type, job function, industries and applicant count. Slower, since it is one extra request per job.

## Actor input object example

```json
{
  "keywords": "python developer",
  "location": "United States",
  "limit": 50,
  "date_posted": "any time",
  "job_type": "any",
  "experience_level": "any",
  "remote": "any",
  "include_description": 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 = {
    "keywords": "python developer",
    "location": "United States"
};

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

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "keywords": "python developer",
  "location": "United States"
}' |
apify call mina_safwat/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,mina_safwat/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/6RfHO0MPdIn34wbCm/builds/7bUHdtIj4J8zSZybJ/openapi.json
