LinkedIn Jobs Scraper: Job Postings & Salaries (No Login) · Apify
LinkedIn Jobs Scraper - Job Listings, Salaries & Companies avatar

LinkedIn Jobs Scraper - Job Listings, Salaries & Companies

Pricing

from $0.37 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper - Job Listings, Salaries & Companies

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

Social Scrapers

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

12 minutes ago

Last modified

Features

Limited permissions

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 senior or intern*, 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?

DataFields
Jobid, link, title, location, postedAt (YYYY-MM-DD), postedAtRelative ("3 days ago"), isClosed
DescriptiondescriptionHtml, descriptionText
Job criteriaseniorityLevel, employmentType, industries, jobFunction
SalarysalaryInfo (as shown), salaryMin, salaryMax, salaryCurrency, salaryPeriod (HOUR, DAY, WEEK, MONTH or YEAR), additionalCompensation
ApplicantsapplicantsCount, applicantsText, benefits ("Actively Hiring", "Be an early applicant")
How to applyapplyType (EASY_APPLY or EXTERNAL), applyUrl
Hiring companycompanyName, companyId, companyLinkedinUrl, companyLogo
Company details (option)companyWebsite, companyIndustry, companySize, companyEmployeesOnLinkedin, companyHeadquarters, companyAddress, companyType, companyFounded, companySpecialties, companyFollowers, companyDescription, companySlogan
Job posterjobPosterName, jobPosterTitle, jobPosterProfileUrl, jobPosterPhoto
SourcesearchKeywords, 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

  1. Open LinkedIn Jobs Scraper in Apify Console and click Try for free.
  2. 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.
  3. Set Max jobs per search: a number, or 0 for every job the search has.
  4. Optional: paste LinkedIn search URLs or job URLs under LinkedIn links, and turn on Include company details.
  5. Click Start. Download the LinkedIn jobs as JSON, CSV, Excel, XML or HTML, or read them through the API.
  6. 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
}
FieldWhat it does
searchKeywordsKeywords to search for, one search per line (job titles, skills or company names). Each line is searched with the location and filters below.
searchLocationCity, state or region, or country. Empty for worldwide; Remote means remote jobs.
searchDatePostedanyTime, pastMonth, pastWeek, past24Hours or pastHour.
searchJobTypes, searchExperienceLevels, searchWorkplaceTypesJob types, experience levels, and remote, hybrid or on-site (the values listed for searches below).
searchCompanies, searchEasyApply, searchUnder10ApplicantsCompanies (names, IDs or company page links), Easy Apply only, fewer than 10 applicants.
onlyNewJobsSkip jobs an earlier run already delivered, never charged (default off; see the FAQ below).
memoryName, memoryRetentionDaysRuns 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, titleExcludeWordsKeep 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.
skipJobIdsJob IDs or job links never to save.
searchesAdvanced: 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.
searchUrlsLinkedIn job search links copied from your browser (every filter in them is kept).
jobUrlsLinks to single LinkedIn jobs, or job IDs.
maxJobsPerSearchJobs to save per line of keywords, per search URL, and per search without its own maxJobs (default 100, 0 for every job).
includeDescriptionOpen each job for its description and details (default on). Turn off for a faster list with the search-result fields only.
includeCompanyDetailsAdd each hiring company's website, size, industry, headquarters and more (default off). Each company page is read once per run.
keywordMatchoff (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.
filtersAsKeywordsAdd the job type, experience level and workplace you pick to the search words (default on, see Limits).
proxyConfigurationKeep 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 ApifyClient
client = 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 applyUrl is empty for EXTERNAL jobs; applyType still tells you which kind of job it is.
  • Job function is not shown on public job pages at the moment, so jobFunction is 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 keywordMatch to 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.
  • postedAt is 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

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

ScraperWhat it gets
TikTok ScraperVideos, Profiles, Hashtags and Comments
Instagram Comments ScraperComments, Likes and Reply Counts
Instagram Hashtag ScraperReels and Keyword Search
Instagram Post ScraperPosts, Reels and Comments
Instagram Profile ScraperFollowers, Bio, Posts and Reels
Instagram Reels ScraperReels, Plays, Likes and Comments
YouTube Channel ScraperVideos, Shorts, Subscribers and About
YouTube Comments ScraperComments, Replies and Likes
YouTube ScraperVideos, Shorts, Channels and Comments
YouTube Shorts ScraperShorts, Views, Likes and Search
YouTube Transcript ScraperSubtitles, Captions and SRT
Facebook Ads Library ScraperMeta Ad Library and Spend
Facebook Groups ScraperPublic Group Posts and Reactions
Facebook Posts ScraperPages, Profiles and Timelines
Facebook Pages ScraperProfiles, Contact Info and Reviews
X (Twitter) Profile ScraperFollowers, Bio and Tweets
X (Twitter) Tweet ScraperLatest Posts by Profile
Threads ScraperPosts, Profiles, Replies and Search
Reddit ScraperPosts, Comments, Subreddits, Users and Search
Quora ScraperAnswers, Questions, Profiles and Topic Search
LinkedIn Ad Library ScraperAds, Advertisers and Impressions
Google News ScraperHeadlines, Articles and Search
Google Ads Transparency ScraperAd Creatives and Advertisers
Telegram Channel ScraperPosts, Views and Media