# Linkedin Jobs Scraper (`excitable_pickle/linkedin-jobs-scraper`) Actor

Scrape Linkedin jobs from jobs search results using search URLs or filters. Get full job details, job poster and company details.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

<p align="center">
  <img src="https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/linkedin.svg" width="90" height="90" alt="LinkedIn Logo" />
</p>

## LinkedIn Jobs Scraper

Scrape Linkedin jobs search results with full job details and optionally details of companies for each job.

Provide **either**:

1. A LinkedIn jobs search URL — go to [linkedin jobs search page](https://www.linkedin.com/jobs/search/) on incognito window, apply filters, copy the full URL from the address bar; or
2. **AI search filters** in the actor input (keywords, location, date posted, company IDs, under 10 applicants, etc.) — used only when the URLs list is empty (if URLs are provided, filters are ignored)

### Supported job search filters

Filters come from a pasted LinkedIn jobs search URL **or** from the structured AI search filter fields in the input.

> **Update:** Since Aug 2026 LinkedIn rolled out new AI powered job search which only supports a few URL filters: **Date posted** (`f_TPR`), **Company** (`f_C`), **Easy apply** (`f_AL`), and **Under 10 applicants** (`f_EA`). Old search filters like Experience level, job type, etc are no longer available seperately and LinkedIn recommends mentioning these filters in the search query itself. Read more about that [here](https://www.linkedin.com/help/linkedin/answer/a6889044). We added **Auto convert to AI search** option to add backward compatibility for old search URLs. When **Auto convert to AI search** is enabled (default): discontinued filters are converted into natural-language and appended to search keywords in attempt to improve accuracy, But we can't guarantee that this 100% works.

**Kept as URL filters**

- `f_TPR` / `f_TP`: Date posted
- `f_C`: Company
- `f_AL`: Easy apply
- `f_EA`: Under 10 applicants
- `keywords`, `location`, `geoId`, `distance`

**Converted into search terms (backward compatible)**

- `f_E`: Experience level
- `f_JT`: Job type → e.g.
- `f_WT` / `f_WRA`: Workplace / remote

**Not convertible** (LinkedIn IDs with no public label in the URL): `f_I` (industry), `f_F` (function), `f_T` (title), `f_PP`, and similar. Prefer describing those in the search keywords yourself.

### Information provided by the job scraper

| 📝 **Field**                | **Description**                                                                      |
|-----------------------------|-------------------------------------------------------------------------------------|
| 🆔 id                       | Unique job identifier                                                               |
| 🔗 link                     | Direct URL to the LinkedIn job posting                                              |
| 🏷️ title                    | Job title                                                                           |
| 🏢 companyName               | Company name posting the job                                                        |
| 🔗 companyLinkedinUrl        | LinkedIn URL of the company                                                         |
| 🖼️ companyLogo               | Logo image URL of the company                                                       |
| 🌍 location                  | Job location                                                                        |
| 💰 salaryInfo                | Salary information if available                                                     |
| 📅 postedAt                  | Date when the job was posted                                                        |
| 🎁 benefits                  | Key job benefits (e.g., "Actively Hiring")                                          |
| 📝 descriptionHtml           | Job description in HTML format                                                      |
| 🧑‍💼 applicantsCount          | Number of applicants (if shown)                                                     |
| 📃 descriptionText           | Job description in plain text                                                       |
| 🤝 jobPosterName             | Name of the person who posted the job                                               |
| 🏷️ jobPosterTitle            | Job poster’s LinkedIn title                                                         |
| 🖼️ jobPosterPhoto            | URL of job poster’s LinkedIn profile photo                                          |
| 🔗 jobPosterProfileUrl       | LinkedIn profile URL of the job poster                                              |
| 🎖️ seniorityLevel            | Required seniority level (e.g., Associate, Director)                               |
| 📝 employmentType            | Employment type (e.g., Full-time, Contract)                                        |
| 🛠️ jobFunction                | Department or main job function                                                     |
| 🏭 industries                | Industries of the job                                                               |
| 🏢 companyDescription         | Description about the company                                                       |
| 🌏 companyWebsite             | Company's main website                                                              |
| 👥 companyEmployeesCount      | Number of employees at the company                                                  |
| 📊 salaryInsights             | Available salary insights if enabled (may include compensation breakdown)           |
| 🔎 applyMethod                | Details about the apply process or method, if captured                             |
| ⏰ expireAt                   | Date/time when the job post is expected to expire (if available)                    |
| 🏠 workRemoteAllowed          | Whether remote work is allowed                                                      |
| 🏢 workplaceTypes             | Types of workplace arrangements possible (on-site, remote, hybrid)                  |
| 📆 postedAtTimestamp          | Timestamp (in ms/ISO) of when posted, if available                                 |
| ⭐ insights                   | Array of extra job insight texts provided by LinkedIn                               |

#### Sample data

You can get the output data in any format of your preference.

Here is the sample output of this actor in json format:

```json
{
	"id": "3692563200",
	"link": "https://www.linkedin.com/jobs/view/english-data-labeling-analyst-at-facebook-3692563200?refId=WG865nttvc0AIFSWNZZS8w%3D%3D&trackingId=wcG3vxpHJfGtFUkaaMVelQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card",
	"title": "English Data Labeling Analyst",
	"companyName": "Facebook",
	"companyLinkedinUrl": "https://www.linkedin.com/company/facebook?trk=public_jobs_jserp-result_job-search-card-subtitle",
	"companyLogo": "https://media.licdn.com/dms/image/C4E0BAQHi-wrXiQcbxw/company-logo_100_100/0/1635988509026?e=2147483647&v=beta&t=pKAh1a653MsJvWqrqxSunoCVUALyq29eXX1oqobspnE",
	"location": "Los Angeles Metropolitan Area",
	"salaryInfo": [
		"$17.00",
		"$19.00"
	],
	"postedAt": "2023-08-16",
	"benefits": [
		"Actively Hiring"
	],
	"descriptionHtml": "<p>APPROVED REMOTE LOCATIONS:</p><p>Los Angeles, CA, San Fransisco Bay Area, CA, San Diego, CA, New York, NY, Denver, CO, Houston, TX, Seattle, WA.</p><p><br></p><p>Summary:</p><p>The main function of a data labeling analyst is to create and manage labeling and change processes within the data management systems. The typical data labeling analyst will have experience in data quality assurance.</p><p><br></p><p>Job Responsibilities:</p><p>• Create and modify data labels ensuring compliance to all regulatory and legal requirements.</p><p>• Maintain batch records, room logs, product travelers, and inventory records.</p><p>• Label and analyze large data sets to inform product decisions.</p><p>• Asses data quality.</p><p><br></p><p>Skills:</p><p>• Ability to identify trends within large data sets.</p><p>• Excellent communication skills, verbal and written.</p><p>• Problem solving skills.</p><p>• Team oriented with attention for detail.</p><p><br></p><p>Education/Experience:</p><ul><li>• Bachelors degree in related field.</li></ul>",
	"applicantsCount": "200",
	"applyUrl": "",
	"descriptionText": "APPROVED REMOTE LOCATIONS:Los Angeles, CA, San Fransisco Bay Area, CA, San Diego, CA, New York, NY, Denver, CO, Houston, TX, Seattle, WA.Summary:The main function of a data labeling analyst is to create and manage labeling and change processes within the data management systems. The typical data labeling analyst will have experience in data quality assurance.Job Responsibilities:• Create and modify data labels ensuring compliance to all regulatory and legal requirements.• Maintain batch records, room logs, product travelers, and inventory records.• Label and analyze large data sets to inform product decisions.• Asses data quality.Skills:• Ability to identify trends within large data sets.• Excellent communication skills, verbal and written.• Problem solving skills.• Team oriented with attention for detail.Education/Experience:• Bachelors degree in related field.",
	"jobPosterName": "Andrea Cowan",
	"jobPosterTitle": "Technical Recruiter at Meta",
	"jobPosterPhoto": "https://media.licdn.com/dms/image/C5603AQErv53vemaq_A/profile-displayphoto-shrink_100_100/0/1657753132661?e=1699488000&v=beta&t=5R1WgyX-TbL6qhhsntBeR5qmjKdTL5G2l2KtroVTntM",
	"jobPosterProfileUrl": "https://ca.linkedin.com/in/andrea-cowan-458b5423b",
	"seniorityLevel": "Associate",
	"employmentType": "Contract",
	"jobFunction": "Other",
	"industries": "Retail Office Equipment",
	"companyDescription": "The Facebook company is now Meta. Meta builds technologies that help people connect, find communities, and grow businesses. When Facebook launched in 2004, it changed the way people connect. Apps like Messenger, Instagram and WhatsApp further empowered billions around the world. Now, Meta is moving beyond 2D screens toward immersive experiences like augmented and virtual reality to help build the next evolution in social technology. \n\nWe want to give people the power to build community and bring the world closer together. To do that, we ask that you help create a safe and respectful online space. These community values encourage constructive conversations on this page:\n\n• Start with an open mind. Whether you agree or disagree, engage with empathy.\n• Comments violating our Community Standards will be removed or hidden. So please treat everybody with respect. \n• Keep it constructive. Use your interactions here to learn about and grow your understanding of others.\n• Our moderators are here to uphold these guidelines for the benefit of everyone, every day. \n• If you are seeking support for issues related to your Facebook account, please reference our Help Center (https://www.facebook.com/help) or Help Community (https://www.facebook.com/help/community).\n\nFor a full listing of our jobs, visit http://www.facebookcareers.com ",
	"companyWebsite": "https://www.meta.com",
	"companyEmployeesCount": 36275
}
```

### How to scrape more than 1000 Linkedin jobs per search

Linkedin limits number of jobs per search to 1000 even though total number of jobs matching the search are far more than that. To overcome this limit you can enable "Split search urls by location" feature.

Just provide a target country and the scraper will generate multiple search urls with same filters but targeting different cities in the country. It will also ignore duplicate jobs.

### How to scrape new jobs every day automatically

On Linkedin jobs search page, Select date filter (By default it is set to "Anytime") to "Last 24 hours" and fill in other required filters and copy the search URL from address bar.

Then schedule this actor to run daily with copied jobs search URL as input. You don't need to generate the search URL everyday as Linkedin knows from the search url that it needs to apply last 24 hours filter.

### Related scrapers

For scraping jobs across multiple job platforms simultaneously, use [Unified Job Search Radar](https://apify.com/excitable_pickle/unified-job-search-radar) which aggregates LinkedIn, Indeed, and Naukri in a single run. For Indian tech recruitment, use [Naukri Job Deep Scraper](https://apify.com/excitable_pickle/naukri-job-deep-scraper).

### Integrations

Connect this Actor directly to Claude Desktop, Cursor, or your AI workflow via the Model Context Protocol endpoint:

```text
https://mcp.apify.com/?token=YOUR_APIFY_TOKEN_HERE&tools=actors,docs,excitable_pickle/linkedin-jobs-scraper
```

### Linkedin jobs API

The actor stores results in a dataset. You can export data in various formats such as CSV, JSON, XLS, etc.
You can scrape and access data on demand using the Apify REST API.

# Actor input Schema

## `urls` (type: `array`):

Go to [public linkedin jobs search page](https://www.linkedin.com/jobs/search/) on incognito window (to access public version), search with required filters and once you are done, copy the full URL from address bar and pass it here. You can pass multiple search URLs.

When URLs are provided, the AI search filters below are ignored. Leave this empty to use the filters instead.

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

Job title, skills, or free-text search (e.g. "software engineer remote"). Used only when the URLs list above is empty.

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

City, region, or country as you would type it on LinkedIn (e.g. "United States", "London, United Kingdom", "Remote").

## `geoId` (type: `string`):

Optional LinkedIn geoId for precise location targeting (found in a LinkedIn search URL as `geoId=`). Overrides free-text location when LinkedIn resolves it.

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

Search radius in miles around the location. Leave empty for LinkedIn's default.

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

Only return jobs posted within this window.

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

LinkedIn numeric company IDs (from a company URL or `f_C=` in a search URL), e.g. "1441" for Google.

## `under10Applicants` (type: `boolean`):

Only jobs with fewer than 10 applicants.

## `autoConvertToAiSearch` (type: `boolean`):

LinkedIn is now forcing AI job search which removed many classic filters (experience, job type, workplace, salary, sort, etc.)

When this option is enabled, the filters in old search URLs are converted to natural language and appended to search keywords. Date posted, Company, Easy apply, and Under 10 applicants stay as URL filters on AI search.

## `scrapeCompany` (type: `boolean`):

This will require additional scraping requests for each job record and take longer to scrape

## `limitPerSource` (type: `integer`):

Maximum number of jobs to scrape from each input URL (or from the AI search filters when no URLs are provided). Leave empty to scrape as many as LinkedIn returns for each search (up to ~1000).

## `splitByLocation` (type: `boolean`):

Enable this to split your search by cities within a country. This helps bypass LinkedIn's 1000 job limit per search URL by creating separate searches for each city. This will overwrite the location filter in input search URLs.

## `splitCountry` (type: `string`):

Select the country whose cities will be used to split the search. Only used when 'Split search by city locations' is enabled. Required to when 'Split search by city locations' is enabled.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/jobs/search/?position=1&pageNum=0"
  ],
  "datePosted": "anyTime",
  "companyIds": [],
  "under10Applicants": false,
  "autoConvertToAiSearch": true,
  "scrapeCompany": true,
  "limitPerSource": 100,
  "splitByLocation": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "urls": [
        "https://www.linkedin.com/jobs/search/?position=1&pageNum=0"
    ],
    "limitPerSource": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("excitable_pickle/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 = {
    "urls": ["https://www.linkedin.com/jobs/search/?position=1&pageNum=0"],
    "limitPerSource": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("excitable_pickle/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 '{
  "urls": [
    "https://www.linkedin.com/jobs/search/?position=1&pageNum=0"
  ],
  "limitPerSource": 100
}' |
apify call excitable_pickle/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,excitable_pickle/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/y1hXxHmDdmDsPl3HB/builds/XQkPLNWwv71EYXcDp/openapi.json
