LinkedIn Jobs Scraper - Job Listings, Salaries & Companies
Pricing
from $0.37 / 1,000 jobs
LinkedIn Jobs Scraper - Job Listings, Salaries & Companies
LinkedIn jobs scraper for job listings and job postings: full job descriptions, salaries, seniority, applicants and company details. Search by keyword and location, with date, company, job type and remote filters, any number of jobs. Export or use the API. No login or cookies. $0.46 per 1,000 jobs.
Pricing
from $0.37 / 1,000 jobs
Rating
0.0
(0)
Developer
Social Scrapers
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
12 minutes ago
Last modified
Categories
Features
Share
LinkedIn Jobs Scraper extracts LinkedIn job listings, also called job postings: titles, full job descriptions, salaries, seniority levels, employment types, industries, applicant counts and job posters, plus the hiring company's website, size and headquarters. Search by keyword and location, or paste LinkedIn search and job links. It works without a LinkedIn account, login or cookies, and costs $0.46 per 1,000 jobs.
💡 Need a feature that isn't here? Just ask. Open an issue on the Issues tab and tell us what you need: a new field, filter, input type or output format. We build requested features fast, usually within 24 hours, at no extra cost.
⭐ Found it useful? A short review on the Reviews tab helps other people find this scraper, and tells us what to build next.
What does LinkedIn Jobs Scraper do?
LinkedIn Jobs Scraper turns LinkedIn's public job search into clean, structured data you can download or read through an API:
- 🔎 Search by keywords and location: type your keywords (one search per line) and a location in plain form fields, no JSON needed. Location can be a city, a state or region, a country, or worldwide. Need many searches with different filters? Add them as a JSON list under Advanced.
- 🎛️ Filters: date posted (past hour, 24 hours, week, month, or any window you set), company (by name or LinkedIn company ID), job type, experience level, workplace (remote, hybrid, on-site), Easy Apply only and fewer than 10 applicants.
- 🆕 Only new jobs: schedule a task and each run returns only the jobs it has not delivered before. Jobs delivered earlier are skipped and never charged, and a search that was read to its end is read only from where the last run stopped.
- 🚫 Title words and job IDs to skip: keep only jobs whose title names words you choose, skip titles with words like
seniororintern*, or list job IDs never to save. Skipped jobs are free. - 🔗 Paste links: LinkedIn job search URLs copied from your browser (every filter in them is kept), links to single jobs or job IDs, company page links (that company's jobs) and lnkd.in short links.
- ♾️ No 1,000-job ceiling: LinkedIn shows about 1,000 results for one search. Ask for more, or for every job (
maxJobs: 0), and the scraper splits the search by state or region, by city and by date posted on its own, then saves each job once. - 📄 Full job details: description as HTML and plain text, seniority level, employment type, industries, applicants, salary with minimum, maximum, currency and period, apply type, whether the job still accepts applications, and the job poster when LinkedIn shows one.
- 🏢 Company details (optional): website, industry, company size, employees on LinkedIn, headquarters and full address, company type, year founded, specialties, followers and About text.
- 🎯 Only jobs that mention your keywords (optional): LinkedIn fills a search that has few matches with related jobs. Keep only jobs whose title, or title or description, names every word of your keywords; the others are never charged.
- 🧹 No duplicates: a job found by several searches is saved once, and you pay for it once.
- 💸 Pay per job: you pay only for jobs saved to your dataset. Set a maximum cost per run and it stops exactly there.
What data can you extract from LinkedIn job postings?
| Data | Fields |
|---|---|
| Job | id, link, title, location, postedAt (YYYY-MM-DD), postedAtRelative ("3 days ago"), isClosed |
| Description | descriptionHtml, descriptionText |
| Job criteria | seniorityLevel, employmentType, industries, jobFunction |
| Salary | salaryInfo (as shown), salaryMin, salaryMax, salaryCurrency, salaryPeriod (HOUR, DAY, WEEK, MONTH or YEAR), additionalCompensation |
| Applicants | applicantsCount, applicantsText, benefits ("Actively Hiring", "Be an early applicant") |
| How to apply | applyType (EASY_APPLY or EXTERNAL), applyUrl |
| Hiring company | companyName, companyId, companyLinkedinUrl, companyLogo |
| Company details (option) | companyWebsite, companyIndustry, companySize, companyEmployeesOnLinkedin, companyHeadquarters, companyAddress, companyType, companyFounded, companySpecialties, companyFollowers, companyDescription, companySlogan |
| Job poster | jobPosterName, jobPosterTitle, jobPosterProfileUrl, jobPosterPhoto |
| Source | searchKeywords, searchLocation, inputUrl, scrapedAt |
Every job has the same 48 fields in the same order. Fields LinkedIn does not show for a job are null (or an empty list), so the data drops straight into spreadsheets, databases and AI pipelines.
How to scrape LinkedIn jobs
- Open LinkedIn Jobs Scraper in Apify Console and click Try for free.
- Type your Keywords (one search per line, e.g.
data analyst) and a Location, and pick the filters you want: date posted, job type, experience level, remote, companies, Easy Apply, fewer than 10 applicants. - Set Max jobs per search: a number, or
0for every job the search has. - Optional: paste LinkedIn search URLs or job URLs under LinkedIn links, and turn on Include company details.
- Click Start. Download the LinkedIn jobs as JSON, CSV, Excel, XML or HTML, or read them through the API.
- To collect new jobs every day, turn on Only new jobs, save the input as a task and schedule it.
How much does it cost to scrape LinkedIn jobs?
$0.46 per 1,000 jobs saved to your dataset. Apify subscribers pay less: Silver 10% off ($0.414 per 1,000), Gold 20% off ($0.368 per 1,000). Platform usage and proxies are included, and so are company details.
- Duplicates, jobs that no longer exist and jobs that don't match your job type or experience level filters are free.
- Example: 10,000 data analyst jobs in the United States, with descriptions: $4.60 ($3.68 on Gold).
- Example: 500 new jobs every day for a month, about 15,000 jobs: about $6.92 with the start fees.
- Each run also has a $0.0005 start fee.
- Apify's free plan includes monthly platform credit (currently $5), enough to try the scraper on about 10,000 jobs.
Set a maximum cost per run when you start it, and the scraper stops cleanly before the first job that would go over it.
Input example
The plain search fields, as the input page fills them in:
{"searchKeywords": ["data analyst", "data scientist"],"searchLocation": "United States","searchDatePosted": "pastWeek","searchExperienceLevels": ["entryLevel", "associate"],"searchWorkplaceTypes": ["remote"],"maxJobsPerSearch": 200,"onlyNewJobs": true,"titleExcludeWords": ["senior", "intern*"]}
Several searches with their own filters, links and company details (the JSON list under Advanced):
{"searches": [{"keywords": "data analyst","location": "United States","datePosted": "pastWeek","experienceLevels": ["entryLevel", "associate"],"maxJobs": 2000},{"keywords": "registered nurse","location": "Texas, United States","jobTypes": ["fullTime"],"maxJobs": 0},{"keywords": "product manager","companies": ["Stripe"],"workplaceTypes": ["remote"]}],"searchUrls": ["https://www.linkedin.com/jobs/search?keywords=accountant&location=London&f_TPR=r86400"],"jobUrls": ["https://www.linkedin.com/jobs/view/4484651478"],"includeDescription": true,"includeCompanyDetails": true}
| Field | What it does |
|---|---|
searchKeywords | Keywords to search for, one search per line (job titles, skills or company names). Each line is searched with the location and filters below. |
searchLocation | City, state or region, or country. Empty for worldwide; Remote means remote jobs. |
searchDatePosted | anyTime, pastMonth, pastWeek, past24Hours or pastHour. |
searchJobTypes, searchExperienceLevels, searchWorkplaceTypes | Job types, experience levels, and remote, hybrid or on-site (the values listed for searches below). |
searchCompanies, searchEasyApply, searchUnder10Applicants | Companies (names, IDs or company page links), Easy Apply only, fewer than 10 applicants. |
onlyNewJobs | Skip jobs an earlier run already delivered, never charged (default off; see the FAQ below). |
memoryName, memoryRetentionDays | Runs with the same memory name share what was delivered (empty: each saved task has its own memory). Jobs are remembered for 30 days by default, up to 365. |
titleIncludeWords, titleExcludeWords | Keep only jobs whose title names one of these words or phrases, or skip jobs whose title names one. Whole words, any case; intern* also matches Internship. |
skipJobIds | Job IDs or job links never to save. |
searches | Advanced: a list of searches, each with its own filters. Each one can have keywords, location, datePosted (anyTime, pastMonth, pastWeek, past24Hours, pastHour, or a window in seconds such as r7200), companies (names or LinkedIn company IDs), jobTypes (fullTime, partTime, contract, temporary, internship, volunteer, other), experienceLevels (internship, entryLevel, associate, midSenior, director, executive), workplaceTypes (onSite, remote, hybrid), easyApply, under10Applicants and maxJobs. |
searchUrls | LinkedIn job search links copied from your browser (every filter in them is kept). |
jobUrls | Links to single LinkedIn jobs, or job IDs. |
maxJobsPerSearch | Jobs to save per line of keywords, per search URL, and per search without its own maxJobs (default 100, 0 for every job). |
includeDescription | Open each job for its description and details (default on). Turn off for a faster list with the search-result fields only. |
includeCompanyDetails | Add each hiring company's website, size, industry, headquarters and more (default off). Each company page is read once per run. |
keywordMatch | off (default, LinkedIn's results as they are), title (every word of the keywords in the job title) or titleOrDescription. Jobs left out are not charged. |
filtersAsKeywords | Add the job type, experience level and workplace you pick to the search words (default on, see Limits). |
proxyConfiguration | Keep the default: Apify Proxy, with refused pages retried through residential IPs automatically. |
Output example
A real job from a search for software engineers in London, trimmed:
{"id": "4484651478","link": "https://www.linkedin.com/jobs/view/4484651478","title": "Backend GOLANG Software Engineers 100% remote in the UK","companyName": "Huxley","companyId": "7355","companyLinkedinUrl": "https://uk.linkedin.com/company/huxley","location": "City Of London, England, United Kingdom","postedAt": "2026-11-03","postedAtRelative": "5 days ago","applicantsCount": 76,"applicantsText": "76 applicants","salaryInfo": ["£69,000.00/yr", "£125,000.00/yr"],"salaryMin": 69000,"salaryMax": 125000,"salaryCurrency": "GBP","salaryPeriod": "YEAR","benefits": ["Actively Hiring"],"seniorityLevel": "Not Applicable","employmentType": "Full-time","jobFunction": null,"industries": "Technology, Information and Internet","descriptionText": "Backend GOLANG Software Engineers 100% remote in the UK\n\nThis is a new and exclusive opportunity for a Backend GO Software Engineer ...","applyType": "EXTERNAL","applyUrl": null,"isClosed": false,"companyWebsite": "http://www.huxley.com","companyIndustry": "Staffing and Recruiting","companySize": "201-500 employees","companyEmployeesOnLinkedin": 773,"companyHeadquarters": "London, England","companyAddress": { "street": "55 Basinghall Street", "city": "London", "region": "England", "postalCode": "EC2V 5DX", "country": "GB" },"companyType": "Public Company","companyFounded": 1995,"companySpecialties": ["Banking", "Engineering", "IT", "Financial Services"],"companyFollowers": 641278,"companySlogan": "Outpace tomorrow, together.","searchKeywords": "software engineer","searchLocation": "London","inputUrl": "https://www.linkedin.com/jobs/search?keywords=software+engineer&location=London&f_TPR=r604800","scrapedAt": "2026-11-08T11:12:45.436Z"}
In Apify Console the results also open as tables: Overview (the main fields), Details (descriptions, salary, poster) and Companies (company details).
Use cases
- 📋 Job boards and job alerts: feed fresh LinkedIn job postings into your job board, newsletter, Slack channel or spreadsheet every day.
- 🎯 Lead generation: find companies hiring for roles your product or service supports, with their website, size, industry and headquarters.
- 💰 Salary research: compare posted salary ranges by role, seniority, location and company.
- 📈 Hiring signals and market research: follow which companies are hiring, for what, where and how fast, and track demand for skills over time.
- 🧑💼 Recruiting: track open roles at competitors and see who posts them.
Use it via API, Python, JavaScript and integrations
Run LinkedIn Jobs Scraper from your own code with the Apify API and read the jobs from the run's dataset.
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("socialscrapers/linkedin-jobs-scraper").call(run_input={"searchKeywords": ["data analyst"],"searchLocation": "United States","searchDatePosted": "past24Hours","maxJobsPerSearch": 500,"onlyNewJobs": True,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], "|", job["companyName"], "|", job["location"], "|", job["salaryInfo"])
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('socialscrapers/linkedin-jobs-scraper').call({searches: [{ keywords: 'nurse', location: 'Texas, United States', maxJobs: 0 }],includeCompanyDetails: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`${items.length} jobs`);
- No-code: connect the scraper to Make, Zapier, n8n, Google Sheets, Slack, Airbyte and more through Apify integrations.
- Webhooks and schedules: run it every hour or day, and get notified or push the results when a run finishes.
- AI agents: let AI assistants and agents run it and read the jobs through the Apify MCP server.
Limits
- Public data only. The scraper reads what LinkedIn shows to visitors who are not signed in.
- External apply links are shown by LinkedIn to signed-in members only, so
applyUrlis empty forEXTERNALjobs;applyTypestill tells you which kind of job it is. - Job function is not shown on public job pages at the moment, so
jobFunctionis usually empty. - Remote, hybrid or on-site is not stated on public job pages. LinkedIn's public search reads job type, experience level and workplace as words of the search, so the scraper adds them to your keywords and checks each job's employment type and seniority level on its page; workplace results follow LinkedIn's reading of the search.
- Related jobs: LinkedIn fills a search with few matching jobs with related ones, as on its website. Use
keywordMatchto keep only jobs that mention your keywords. - Salaries, applicants and job posters appear only when LinkedIn shows them for the job.
- About 1,000 results per LinkedIn search. Bigger searches are split automatically by location (states and regions of 12 countries, main cities of the busiest regions, countries for worldwide searches) and by date posted. Very broad searches can still leave out some older, lower-ranked jobs that LinkedIn never lists.
postedAtis the exact day for jobs found by a search, and an estimate from "2 weeks ago" for jobs added by URL.- Share and short links work.
lnkd.in/…links are followed to the page they open and read like that link pasted in Search URLs (a job, a job search or a company page, with the same Max jobs per search), job links with tracking parameters (?trackingId=…,?refId=…,currentJobId=…) are read as their job, a company page link (linkedin.com/company/…) is read as that company's jobs, and a job link given as a search URL (or a search link given as a job URL) is read as what it is. An unusable link is skipped with a warning; following a link is never charged. - Input is read generously. Words typed into Search URLs are searched for, a location of "Remote" means remote jobs, date windows such as "past week" or "3 days" are understood, and fields named as other job scrapers name them (
title,keyword,rows,urls,titleInclude,titleExclude,skipJobId…) are read as this scraper's own. A value that cannot be used is left out with a warning instead of stopping the run. - Only new jobs keeps its memory in your account: a key-value store named after this Actor (
linkedin-jobs-scraper-memory), one record per memory name, with the IDs of the jobs delivered and the time window of each search read to its end. Delete a record, or pick a new memory name, to start afresh. Runs that share a memory should not overlap in time. - A run with 0 results still succeeds. When a job is no longer available, a company is not found, a short link is dead or a search matches nothing, the run ends as Succeeded with a status message naming each input and why, and nothing is charged. When nothing in the input can be used at all, the run also ends as Succeeded, with a status message that starts "Nothing to scrape:" and says what to fix; no results are charged. A run fails only when LinkedIn refuses every one of 3 or more inputs and a well-known public LinkedIn page is refused too (the scraper is then blocked; try again later).
FAQ
Is it legal to scrape LinkedIn jobs?
LinkedIn Jobs Scraper collects only job listings that LinkedIn shows publicly to any visitor, without logging in. Scraping public data is generally lawful, but rules differ by country and by use, and job posters' names are personal data under laws like the GDPR. You are responsible for how you use the data; ask a lawyer if you are unsure.
Do I need a LinkedIn account or cookies?
No. LinkedIn Jobs Scraper never logs in and needs no cookies, so no LinkedIn account is put at risk.
How many LinkedIn jobs can I scrape?
As many as LinkedIn lists for your searches. Set maxJobs to any number, or 0 for all of them; searches over LinkedIn's limit of about 1,000 results are split automatically.
Why did I get fewer jobs than I asked for?
The search had fewer results, some jobs were already found by another search in the run, some did not match your job type or experience level, or the run reached its maximum cost. The run log says which, for each search.
Why do some jobs not match my keywords?
LinkedIn shows related jobs after the matching ones when a search has few matches (a made-up word still lists thousands of jobs). Set keywordMatch to title or titleOrDescription to keep only jobs that mention every word of your keywords; the rest are skipped for free.
How do I get only new jobs every day?
Turn on Only new jobs, save the input as a task and schedule it (daily, hourly, or as often as you like). Each run skips the jobs earlier runs of the task delivered, so you get and pay for each job once. A search that a run read to its end is read the next time only from where that run stopped, with an hour of overlap for jobs LinkedIn lists late, so runs stay fast and cheap. Several tasks can share one memory: give them the same Memory name.
Can I leave out senior roles or internships?
Yes. Put senior and intern* in Job title excludes: jobs whose title names them are skipped and not charged. Words match whole words, so intern does not match "International"; end a word with * for any ending. Job title includes keeps only jobs whose title names at least one of your words.
How do I filter by company?
Put the company name in companies and the scraper finds its LinkedIn company ID, as LinkedIn's company filter does. You can also give the ID itself: it's in every job's companyId field.
Can I limit how much a run costs?
Yes. Set the maximum cost per run when you start it: the scraper saves jobs until the next one would go over that amount, then stops.
Other scrapers by Social Scrapers
| Scraper | What it gets |
|---|---|
| TikTok Scraper | Videos, Profiles, Hashtags and Comments |
| Instagram Comments Scraper | Comments, Likes and Reply Counts |
| Instagram Hashtag Scraper | Reels and Keyword Search |
| Instagram Post Scraper | Posts, Reels and Comments |
| Instagram Profile Scraper | Followers, Bio, Posts and Reels |
| Instagram Reels Scraper | Reels, Plays, Likes and Comments |
| YouTube Channel Scraper | Videos, Shorts, Subscribers and About |
| YouTube Comments Scraper | Comments, Replies and Likes |
| YouTube Scraper | Videos, Shorts, Channels and Comments |
| YouTube Shorts Scraper | Shorts, Views, Likes and Search |
| YouTube Transcript Scraper | Subtitles, Captions and SRT |
| Facebook Ads Library Scraper | Meta Ad Library and Spend |
| Facebook Groups Scraper | Public Group Posts and Reactions |
| Facebook Posts Scraper | Pages, Profiles and Timelines |
| Facebook Pages Scraper | Profiles, Contact Info and Reviews |
| X (Twitter) Profile Scraper | Followers, Bio and Tweets |
| X (Twitter) Tweet Scraper | Latest Posts by Profile |
| Threads Scraper | Posts, Profiles, Replies and Search |
| Reddit Scraper | Posts, Comments, Subreddits, Users and Search |
| Quora Scraper | Answers, Questions, Profiles and Topic Search |
| LinkedIn Ad Library Scraper | Ads, Advertisers and Impressions |
| Google News Scraper | Headlines, Articles and Search |
| Google Ads Transparency Scraper | Ad Creatives and Advertisers |
| Telegram Channel Scraper | Posts, Views and Media |