LinkedIn Jobs Scraper — Salary, Skills, Seniority & Easy Apply
Pricing
from $1.00 / 1,000 results
LinkedIn Jobs Scraper — Salary, Skills, Seniority & Easy Apply
Extract LinkedIn jobs by keyword and location. Returns title, company, salary, skills, seniority, easy-apply flag, and company data. No login required. $1/1K. MCP/API-ready.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(1)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
120
Total users
8
Monthly active users
6 days ago
Last modified
Categories
Share
LinkedIn Jobs Scraper — Salary, Remote & Easy Apply
Extract LinkedIn job listings by keyword and location, or from a direct LinkedIn jobs search URL. This Apify Actor accepts search queries, locations, start URLs, and filters for date posted, job type, experience level, work type, and minimum salary. Each record represents one LinkedIn job listing and can include the job title, company data, salary range, parsed salary min and max, required skills, Easy Apply flag, applicant count, seniority level, full job description, job URL, search query, source URL, and scraped time. The Actor works without LinkedIn login and is usable through Apify MCP.
Best fit and connected workflows
This Actor fits workflows where LinkedIn job data needs to be structured, filtered, and reused across tools.
- Recruiting teams can collect openings by role and location, then review company details, seniority level, salary, and Easy Apply status.
- Sales and lead generation workflows can use hiring activity as a signal for account research and outreach planning.
- Job market analysis workflows can compare salary ranges, work type, and required skills across searches.
- Automation pipelines can store results in datasets, schedule recurring runs, and pass job records to downstream systems.
- AI agent workflows can use the documented output schema to read structured job records through Apify MCP.
When a workflow moves from LinkedIn job discovery to another job board in the same research stream, use a related Actor that matches the next source. For APEC-focused research, continue with APEC Jobs Scraper. For Ashby-powered hiring pages, use Ashby Jobs Scraper. For Bayt listings in MENA research, use Bayt Jobs Data Scraper for MENA Listings.
Practical scenario
Maya is preparing a weekly recruiting report for data engineering roles in the United States. She starts with the query Data Engineer, location United States, and filters for Past week, Remote, and Full-time.
The Actor returns records with fields such as job_title, company_name, location, salary_range, salary_min, salary_max, required_skills, is_easy_apply, posted_at, and job_url. Maya uses the salary range, remote flag, and skill list to shortlist roles for her team, then opens the job_url for the most relevant listings and shares the dataset with a sourcer for follow-up.
Input fields
| Field | Type | Description |
|---|---|---|
searchQueries | array of strings | Job titles, roles, or keywords to search. Each query is run against each location. |
locations | array of strings | Locations to search in, such as cities, states, countries, or Remote. |
startUrls | array of request objects | Direct LinkedIn job search URLs. When provided, these override searchQueries and locations. |
maxResults | integer | Maximum number of job listings to return across all queries and locations combined. |
datePosted | string | Filter by recency: any, r86400, r604800, or r2592000. |
jobType | array of strings | Filter by contract type, such as full-time, part-time, contract, temporary, internship, or other. |
experienceLevel | array of strings | Filter by required experience level from internship through executive. |
workType | array of strings | Filter by on-site, remote, or hybrid roles. |
salaryBase | string | Minimum annual salary filter in USD, when salary is shown on the posting. |
Focused input example
{"searchQueries": ["Software Engineer"],"locations": ["Remote", "United States"],"maxResults": 10,"datePosted": "r604800","jobType": ["F"],"experienceLevel": ["2", "3", "4"],"workType": ["2", "3"],"salaryBase": "100000"}
Output fields
Each result is a JSON object with the following fields:
| Field | Type | Description |
|---|---|---|
job_id | string | LinkedIn's unique job ID |
job_title | string | null | Full job title as listed on LinkedIn |
company_name | string | null | Hiring company name |
company_url | string | null | LinkedIn company profile URL |
company_size | string | null | Employee count range |
company_industry | string | null | Industry category |
location | string | null | City, state, work arrangement |
work_type | string | null | Remote, Hybrid, or On-site |
employment_type | string | null | Full-time, Part-time, Contract, Internship, etc. |
seniority_level | string | null | Entry level, Mid-Senior, Director, Executive, and similar values |
salary_range | string | null | Raw salary string from LinkedIn |
salary_min | number | null | Parsed minimum salary (USD) |
salary_max | number | null | Parsed maximum salary (USD) |
required_skills | array of strings | Extracted skills list |
is_easy_apply | boolean | True if LinkedIn Easy Apply is enabled |
applicant_count | string | null | Example format: 142 applicants |
posted_at | string | null | Relative posting time |
job_description | string | null | Full plain-text description |
job_url | string | Direct link to the job posting |
search_query | string | null | Query that found this job |
source_url | string | URL that was scraped to extract the record |
scraped_at | string | ISO 8601 timestamp of extraction |
Illustrative output record
{"job_id": "3812749302","job_title": "Senior Machine Learning Engineer","company_name": "Anthropic","company_url": "https://www.linkedin.com/company/anthropic","company_size": "201-500 employees","company_industry": "Artificial Intelligence","location": "San Francisco, CA (Hybrid)","work_type": "Hybrid","employment_type": "Full-time","seniority_level": "Mid-Senior level","salary_range": "$180,000–$240,000/yr","salary_min": 180000,"salary_max": 240000,"required_skills": ["Python", "PyTorch", "LLMs", "Distributed Systems"],"is_easy_apply": false,"applicant_count": "142 applicants","posted_at": "2 days ago","job_description": "We are looking for a Senior ML Engineer to join our team...","job_url": "https://www.linkedin.com/jobs/view/3812749302/","search_query": "Machine Learning Engineer","source_url": "https://www.linkedin.com/jobs/view/3812749302/","scraped_at": "2026-03-31T14:22:00.000Z"}
How it works
This Actor is built on Apify's Playwright template and uses the live contract described in this README. It accepts either keyword-and-location searches or direct LinkedIn job search URLs.
The input supports cross-searching multiple queries against multiple locations. It also supports filters for posting age, contract type, experience level, work arrangement, and a minimum salary threshold. When startUrls is provided, those URLs take precedence over keyword and location fields.
The output dataset stores one record per extracted job listing. The dataset schema includes a searchable overview view with the main fields shown in a table.
Pricing
This Actor uses Pay per event pricing plus Apify platform usage. The charged events include an Actor start event and a per-result event for each extracted job listing. Open the Actor's Pricing tab on Apify for the live pricing view.
A simple way to think about cost is by event count. For example, if a run starts once and returns fifty job listings, billing includes one start event and fifty result events, plus normal Apify platform usage for the run.
Use with AI agents (MCP)
This Actor is available through Apify MCP as a tool for retrieving structured LinkedIn job records.
Tool description: Extract LinkedIn job listings by keyword and location or direct LinkedIn search URL, then return structured job records with title, company, salary, skills, work type, seniority, Easy Apply status, applicant count, description, and URLs.
Actor identity: khadinakbar/linkedin-jobs-scraper
Search LinkedIn jobs for remote Python roles in the United States posted in the past week. Return the records with salary, skills, Easy Apply, and company details, then summarize the top matches by seniority and salary range.
Output interpretation:
job_idsupports deduplication across runs.job_urlandsource_urlprovide record provenance.salary_minandsalary_maxsupport numeric comparison, whilesalary_rangepreserves the original displayed value.required_skillshelps downstream filtering and agent reasoning.is_easy_applyseparates LinkedIn-native application flows from external application paths.scraped_atshows when each record was collected.
Scope, pagination, and cost guidance:
maxResultscontrols how many listings are returned across the configured queries and locations.- LinkedIn search results are capped per search, so broader coverage comes from using multiple queries or URLs.
- Cost scales with extracted results because each job listing is charged as a result event.
API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const input = {searchQueries: ['Data Scientist'],locations: ['Remote', 'United States'],maxResults: 5,datePosted: 'r604800',};const run = await client.actor('khadinakbar/linkedin-jobs-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Set APIFY_TOKEN in your environment before running the example. The dataset readback returns the extracted job records from the default dataset for that run.
Best results and outcome guidance
Use either searchQueries plus locations, or startUrls for direct LinkedIn search pages. When a search has multiple target regions, the query-and-location cross-product gives a clean way to structure coverage.
A focused query usually produces easier-to-review results than a broad keyword. If you want salary filtering, combine salaryBase with a recent datePosted value and one or more work-type filters. If you want records ready for downstream processing, use the normalized output fields such as work_type, employment_type, seniority_level, salary_min, salary_max, and required_skills.
Design note
I found that the live dataset contract includes a dedicated job_id field and a table-style overview view built from job_title, company_name, location, work_type, seniority_level, salary_range, employment_type, is_easy_apply, applicant_count, posted_at, and job_url. That makes the dataset especially convenient for deduplication and quick review.
FAQ
When should I use searchQueries instead of startUrls?
Use searchQueries when you have roles or keywords and want the Actor to search across one or more locations. Use startUrls when you already have a LinkedIn jobs search URL with filters applied.
How should I structure searches for multiple locations?
Add several entries to locations. Each query is cross-searched against each location, which is useful when you want the same role reviewed across multiple markets.
Which fields are most useful for recruiting workflows?
job_title, company_name, location, seniority_level, work_type, salary_min, salary_max, required_skills, is_easy_apply, and job_url are the most common review fields.
Which fields are most useful for sourcing or lead-generation workflows?
company_name, company_industry, company_size, job_title, location, and posted_at help identify hiring activity and build a list of active companies.
How can I keep records distinct across runs?
Use job_id as the deduplication key. It is LinkedIn's unique numeric job posting identifier.
When should I move to a related Actor?
Use the related Actor that matches the next source in your research workflow. For example, move from LinkedIn to APEC Jobs Scraper for APEC listings, Ashby Jobs Scraper for Ashby-hosted jobs, or Bayt Jobs Data Scraper for MENA Listings for Bayt-based search.
Responsible use
Use this Actor for lawful, privacy-respecting collection and analysis of publicly accessible job information. Follow LinkedIn's terms, applicable laws, and your organization's policies for storing, processing, and sharing job data. Keep your use case aligned with recruiting, research, automation, or analysis workflows that rely on structured job listings.