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

Scrape public LinkedIn job listings by keyword and location, without login or cookies: title, company, seniority, employment type, applicants, salary, full description and apply link. Filters and alerts.

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

## Pricing

$0.50 / 1,000 jobs

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

## LinkedIn Jobs Scraper

**Scrape public LinkedIn job listings by keyword and location, without login or cookies.** Get title, company, location, seniority, employment type, job function, industry, number of applicants, salary as numbers, full description and apply link. Export to JSON, CSV or Excel, or use the API. **$0.50 per 1,000 jobs, no start fee.**

Scrape jobs from **LinkedIn**, the largest job site in the world, the way you search on linkedin.com/jobs: keywords, location and filters. The Actor reads only the public job pages LinkedIn shows to visitors who are not logged in, so there is no account to connect and nothing to ban. Each job comes with the full description, seniority, employment type, job function, industries, the number of applicants and the salary as numbers when the job states one. LinkedIn lists at most 1,000 jobs per search; for the United States this scraper searches **state by state to get more**. Run it on a schedule to get **only new jobs**.

### What can this LinkedIn jobs scraper do?

- 🔎 **Search like on the website**: keywords such as `data analyst` or `registered nurse`, any country, region or city, or paste any linkedin.com/jobs search link.
- 🔓 **No login, no cookies**: only public job listings. Your LinkedIn account is never used.
- 🎛️ **Filters that really work**: date posted, Easy Apply only, distance around a city, job type and experience level. LinkedIn ignores job type and experience level for visitors who are not logged in, so the Actor checks them on every job page; jobs that do not match are skipped and free.
- ♾️ **Beyond 1,000 results in the US**: a search of the whole United States that reaches LinkedIn's limit is searched again in each state, then merged without duplicates.
- 📄 **Full job details**: description as text and HTML, seniority, employment type, job function, industries, number of applicants, and whether you apply with Easy Apply or on the company site.
- 💰 **Salary as numbers**: pay ranges from the listing or the description, such as "$81,499.00 - $138,549.00", become `min`, `max`, `currency` and `interval`.
- 🛡️ **Built not to break**: requests go through rotating residential proxy addresses, and a blocked or empty page is tried again from another one. If a job page still fails, the job is saved with the search result data instead of being lost.
- 🆕 **Only new jobs since the last run**: for job alerts, recruiting pipelines and market monitoring.
- 🧩 **Same output as our other job scrapers**, listed at the end of this page, so LinkedIn jobs and jobs from other boards and career sites fit into one table.

### What data does it extract?

| Field | Example |
|---|---|
| `title` | Data Analyst |
| `companyName` / `companyUrl` | ICF / https://www.linkedin.com/company/icf-international |
| `location` | Silver Spring, MD |
| `seniorityLevel` / `employmentType` | Entry level / full-time |
| `jobFunction` / `industries` | Information Technology / Business Consulting and Services |
| `applicants` / `applicantsCount` | Over 200 applicants / 200 |
| `salary` | `{ "min": 81499, "max": 138549, "currency": "USD", "interval": "year" }` |
| `postedAt` | 2026-09-24 |
| `easyApply` | false (apply on the company site) |
| `jobUrl` / `applyUrl` | https://www.linkedin.com/jobs/view/4470050151/ |
| `descriptionText` / `descriptionHtml` | full job description |

### How to scrape LinkedIn jobs

1. Enter **job titles or keywords**, one search per line, for example `data analyst`. Or paste links of searches you made on linkedin.com/jobs.
2. Enter a **location** such as `United States`, `London, England, United Kingdom` or `Berlin`. Leave it empty to search worldwide.
3. Optionally choose a **date range**, **Easy Apply only**, a **distance**, **job types** or **experience levels**.
4. Click **Start**. Download the jobs as JSON, CSV, Excel or HTML, or get them through the API.

#### Example input

```json
{
  "searchQueries": ["data analyst", "business intelligence analyst"],
  "location": "United States",
  "jobTypes": ["F"],
  "experienceLevels": ["2", "3"],
  "postedWithinDays": 7
}
```

Job types are `F` full-time, `P` part-time, `C` contract, `T` temporary, `V` volunteer, `I` internship and `O` other; experience goes from `1` internship to `6` executive. In the form you simply pick them from a list.

#### Example output

```json
{
  "ats": "linkedin",
  "company": "icf-international",
  "companyName": "ICF",
  "jobId": "4470050151",
  "title": "Data Analyst",
  "department": "Information Technology",
  "location": "Silver Spring, MD",
  "locations": ["Silver Spring, MD"],
  "remote": false,
  "workplaceType": null,
  "employmentType": "full-time",
  "salary": { "min": 81499, "max": 138549, "currency": "USD", "interval": "year", "text": "$81,499.00 - $138,549.00", "source": "description" },
  "postedAt": "2026-09-24T00:00:00.000Z",
  "jobUrl": "https://www.linkedin.com/jobs/view/4470050151/",
  "applyUrl": "https://www.linkedin.com/jobs/view/4470050151/",
  "descriptionText": "Description\n\nICF is seeking a Data Analyst to support an enterprise learning data and analytics platform…",
  "descriptionHtml": "<strong>Description<br><br></strong>ICF is seeking a Data Analyst…",
  "seniorityLevel": null,
  "jobFunction": "Information Technology",
  "industries": "Business Consulting and Services",
  "applicants": "Over 200 applicants",
  "applicantsCount": 200,
  "easyApply": false,
  "insights": ["Actively Hiring"],
  "reposted": false,
  "companyUrl": "https://www.linkedin.com/company/icf-international",
  "companyLogoUrl": "https://media.licdn.com/dms/image/v2/D4E0BAQH2RAazN8LIPA/company-logo_100_100/…",
  "scrapedAt": "2026-09-27T16:13:14.753Z"
}
```

`seniorityLevel` is empty when LinkedIn shows "Not Applicable". LinkedIn does not show visitors whether a job is on-site, hybrid or remote, so `workplaceType` stays empty.

### Use cases

- **Recruiters and staffing agencies**: see every new role for your niche and region each morning, with the number of applicants.
- **Job boards and aggregators**: fill a job board with fresh listings from the largest job site.
- **Sales and lead generation**: companies hiring are growing. Industries and company pages turn job ads into leads.
- **Labor market research**: track demand, seniority and pay by role, industry and location over time.
- **AI agents**: give an agent one tool to search LinkedIn jobs.

### How much does it cost?

You pay only for the jobs you get: **$0.50 per 1,000 jobs**. There is no start fee, and the residential proxies are included in the price. Jobs filtered out by your settings are free. The Apify free plan covers about 10,000 jobs every month.

### Tips

- **Daily job alerts**: save your input as a task, turn on **Only new jobs since the last run** and add a schedule. Send new jobs to Slack, email or Google Sheets with Apify integrations.
- **Fast lists**: turn off **Load full job details**. You still get title, company, location, date and link, about ten times faster.
- **Stricter results**: LinkedIn also matches related words. Use **Title must contain** to keep only jobs with your keyword in the title.
- **Complete big searches**: searches of the whole United States continue state by state by themselves. Elsewhere, search by region or city, or use **Posted in the last days**, when a search has more than 1,000 jobs. With job type or experience level filters, a search reads the first 1,000 jobs LinkedIn lists.
- **Remote jobs**: LinkedIn does not show visitors which jobs are remote. Add `remote` to your keywords, for example `remote data analyst`.
- **Errors per search**: see the `SUMMARY` record in the run's key-value store.

### FAQ

**Do I need a LinkedIn account or cookies?** No. The Actor reads the public job pages that LinkedIn shows to everyone without login. It never logs in, so no account can be restricted.

**Does it collect data about people?** No. Names, profiles and photos of job posters, recruiters and employees are not collected. Only job listings and the companies that post them.

**Why do some jobs have no salary?** LinkedIn shows pay only when the employer adds it. Many employers state it in the description, and the Actor reads it from there; `salary.source` says where it came from.

**Why does LinkedIn show a different number of jobs?** The count on the website is rounded ("11,000+"), and LinkedIn lists at most 1,000 jobs per search. See the tip on big searches above.

**Is it legal to scrape LinkedIn?** The Actor reads only public job listings that LinkedIn shows to every visitor, without login, and collects no personal data. Check LinkedIn's terms and the laws that apply to your use case.

### Integrations and API

- **Google Sheets, Slack, email and CRMs**: connect the Actor to Make, Zapier or n8n, or use the **Integrations** tab of this Actor. With **Only new jobs since the last run** and a schedule, each run sends only the new jobs.
- **Webhooks**: call your own URL when a run finishes, for example to load the new jobs into your database.
- **AI agents (MCP)**: add `https://mcp.apify.com?tools=robertosan16/linkedin-jobs-scraper` as an MCP server in Claude, Cursor or VS Code, and your agent can search jobs with this Actor. Tell it how many jobs you need, so it sets **Maximum jobs in total**.
- **LangChain and LlamaIndex**: load the jobs into your LLM app with the Apify loaders.
- **API**: one request runs the Actor and returns the jobs, for runs of up to 5 minutes. Start longer runs with the `runs` endpoint and read the dataset when they finish.

```bash
curl -X POST "https://api.apify.com/v2/acts/robertosan16~linkedin-jobs-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["data analyst"],"location":"United States","maxItems":20}'
```

### More job scrapers with the same output

- [Greenhouse Jobs Scraper](https://apify.com/robertosan16/greenhouse-jobs-scraper): every job of any company on Greenhouse, with salary ranges
- [Lever Jobs Scraper](https://apify.com/robertosan16/lever-jobs-scraper): every job of any company on Lever, including EU sites
- [Ashby Jobs Scraper](https://apify.com/robertosan16/ashby-jobs-scraper): startup jobs from Ashby job boards, with compensation
- [Workday Jobs Scraper](https://apify.com/robertosan16/workday-jobs-scraper): every job from any Workday career site, past the 2,000 search limit
- [Dice Jobs Scraper](https://apify.com/robertosan16/dice-jobs-scraper): US tech jobs from Dice.com, with skills and salaries
- [Welcome to the Jungle Jobs Scraper](https://apify.com/robertosan16/welcome-to-the-jungle-jobs-scraper): startup jobs in France, Europe, the UK and the US
- [SEEK Jobs Scraper](https://apify.com/robertosan16/seek-jobs-scraper): jobs in Australia and New Zealand, with salaries as numbers
- [StepStone Jobs Scraper](https://apify.com/robertosan16/stepstone-jobs-scraper): jobs in Germany, with benefits and English-language jobs
- [Jobstreet Jobs Scraper](https://apify.com/robertosan16/jobstreet-jobs-scraper): jobs in Malaysia, Singapore, the Philippines and Indonesia, with salaries as numbers
- [JobsDB Jobs Scraper](https://apify.com/robertosan16/jobsdb-jobs-scraper): jobs in Hong Kong and Thailand, with salaries as numbers
- [Reed Jobs Scraper](https://apify.com/robertosan16/reed-jobs-scraper): UK jobs from Reed.co.uk, with salaries, contract type and hybrid or remote
- [InfoJobs Jobs Scraper](https://apify.com/robertosan16/infojobs-jobs-scraper): jobs in Spain from InfoJobs.net, with salaries and remote policy
- [All-in-One Jobs Scraper](https://apify.com/robertosan16/all-in-one-jobs-scraper): LinkedIn and all of these job sites and career sites in one search, without duplicates

Missing a field or a feature? Open an issue in the Issues tab and we will reply quickly.

*This Actor is not affiliated with, endorsed or sponsored by LinkedIn. LinkedIn is a trademark of LinkedIn Corporation.*

# Actor input Schema

## `searchQueries` (type: `array`):

What to search, for example <code>data analyst</code> or <code>registered nurse</code>. Each line is a separate search with the filters below. You can also paste links of job searches from linkedin.com/jobs; their own filters are used.

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

A country, region or city as on LinkedIn, for example <code>United States</code>, <code>London, England, United Kingdom</code> or <code>Berlin</code>. Leave empty to search worldwide.

## `distance` (type: `integer`):

Also find jobs this far from a city, for example 25. Leave empty for the LinkedIn default.

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

Leave empty for all. LinkedIn does not filter by job type for visitors who are not logged in, so the Actor checks each job page: jobs of other types are skipped and free. With this filter a search reads the first 1,000 jobs LinkedIn lists.

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

Leave empty for all. Checked on each job page like the job type; jobs that LinkedIn marks "Not Applicable" are skipped when you choose levels.

## `postedWithinDays` (type: `integer`):

Keep jobs posted in the last N days: 1 means today and yesterday. Leave empty or 0 for any date.

## `easyApply` (type: `boolean`):

Only jobs you can apply to on LinkedIn with Easy Apply.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these, for example <code>intern</code> or <code>senior</code>. Common word endings are included.

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

Keep only jobs whose title contains any of these words or phrases. LinkedIn searches descriptions too, so this makes results stricter. Add <code>*</code> for any ending: <code>data*</code>.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs that state a pay range or rate.

## `onlyNew` (type: `boolean`):

For scheduled runs: save only jobs that were not seen in earlier runs of the same saved task. The first run saves all current jobs and remembers them. Jobs that did not match your filters are remembered too.

## `includeDescription` (type: `boolean`):

Open each job page for the full description (text and HTML), seniority, employment type, job function, industries and number of applicants. Turn off for fast results with a short summary instead.

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

Stop after saving this many jobs. Leave empty or 0 for no limit. The example is kept small so the first run takes seconds.

## `maxItemsPerCompany` (type: `integer`):

Save at most this many jobs from each search. Leave empty or 0 for no limit.

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

LinkedIn limits how many pages one address can open, so the Actor sends its requests through Apify residential proxies with rotating addresses, also when no proxy is set here. Set other proxies here only if you prefer your own.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "location": "United States",
  "easyApply": false,
  "onlyWithSalary": false,
  "onlyNew": false,
  "includeDescription": true,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Job postings with title, company, locations, salary, dates, description and links.

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

Jobs found, matched and saved for each company, with errors.

# 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 = {
    "searchQueries": [
        "python developer"
    ],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("robertosan16/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 = {
    "searchQueries": ["python developer"],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("robertosan16/linkedin-jobs-scraper").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 '{
  "searchQueries": [
    "python developer"
  ],
  "location": "United States",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call robertosan16/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

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/kR8Ia5qeHhFSHGI9t/builds/zNkZAkBGfdcjtxWJJ/openapi.json
