LinkedIn Jobs Scraper: Full Details, Salaries & New-Job Monitor
Pricing
from $0.40 / 1,000 job with full details
LinkedIn Jobs Scraper: Full Details, Salaries & New-Job Monitor
Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts. No login. Get only new jobs on a schedule and go past the 1,000-result limit.
Pricing
from $0.40 / 1,000 job with full details
Rating
0.0
(0)
Developer
Stratum ICS
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
LinkedIn Jobs Scraper collects job postings from LinkedIn Jobs and saves each one as a clean row: title, company, location, posting date, full description, salary range, seniority, employment type, industries, applicant count and the job link. Use it as a LinkedIn jobs API with no LinkedIn account, and schedule it to return only new jobs on every run.
Type keywords and a location, or paste LinkedIn job search URLs from your browser. The scraper pages through the results, opens every job page for the details, removes duplicates across your searches, and saves the jobs to a dataset you can download as JSON, CSV or Excel, or read through the API.
Why use this LinkedIn Jobs Scraper?
- Only new jobs on every scheduled run. Turn on "Only new jobs", give the monitor a name and schedule the Actor. Each run returns postings you have not received before. Jobs it skips are not charged.
- Filters that really filter. LinkedIn's public job search no longer applies the job type, experience level and workplace filters, so a search for part-time work comes back full of full-time jobs. This scraper checks those values on every job page and saves only the jobs that match. In one test, 23 of 33 results for a part-time search URL were not part-time; none of them were saved or charged.
- More salaries. You get LinkedIn's pay range when it shows one, and otherwise the first pay range written in the description, parsed into minimum, maximum, currency and period. In a test of 180 US and UK jobs, LinkedIn's own pay box covered 9% of jobs and the descriptions brought salary coverage to 36%.
- Past the 1,000-result limit. LinkedIn stops every search at 1,000 results. Ask for more and the scraper splits the search by state or region and by posting date, then merges the results without duplicates.
- Low price, no subscription. You pay per job saved, with no monthly rental. Jobs a monitor skips are free, so frequent monitoring stays cheap.
- No login, no cookies. It reads the job pages LinkedIn shows to logged-out visitors, so no account is put at risk.
- Everything Apify adds: scheduling, an API, integrations with Zapier, Make, n8n and Google Sheets, proxy rotation, and run monitoring.
What data can you get from LinkedIn jobs?
| Field | What it holds |
|---|---|
jobId, url | LinkedIn job ID and link |
title | Job title |
companyName, companyUrl, companyLogo | Hiring company, its LinkedIn page and logo |
location | Job location as LinkedIn shows it |
workplaceType | Remote, Hybrid or On-site, when the posting states it |
postedAt, postedTimeAgo | Posting date (YYYY-MM-DD) and LinkedIn's "2 days ago" text |
salary | Pay range text, min, max, currency, period and source |
employmentType | Full-time, Part-time, Contract, Temporary, Internship and so on |
seniorityLevel | Entry level, Associate, Mid-Senior level, Director and so on |
industries | Industries LinkedIn lists for the job |
applicantsCount, applicantsText | Applicant number and LinkedIn's applicant line |
applyType, applyUrl | Easy Apply or the employer's site, and where to apply |
insights | Badges such as "Actively Hiring" or "Be an early applicant" |
descriptionText | Full description as plain text with line breaks |
descriptionHtml | Full description as HTML (optional) |
jobPosterName, jobPosterTitle, jobPosterProfileUrl | Who posted the job, when shown (optional) |
searchKeywords, searchLocation, searchUrl | Which of your searches found the job |
scrapedAt | When the job was scraped |
How to scrape LinkedIn jobs
- Open the Actor and go to the Input tab.
- Under Job searches, add one row per search: keywords such as "registered nurse" and a location such as "Texas, United States". Or paste LinkedIn search URLs under LinkedIn URLs.
- Pick any filters: date posted, job type, experience level, workplace, Easy Apply, fewer than 10 applicants, company IDs or distance.
- Set Max jobs per search. Above 1,000, keep "Get past LinkedIn's 1,000-result limit" on.
- Click Start and watch the jobs appear in the Output tab.
- Download the results as JSON, CSV, Excel or HTML, or connect them to another tool.
How much does it cost to scrape LinkedIn jobs?
This Actor uses pay-per-event pricing. You pay $0.50 per 1,000 jobs with full details ($0.0005 per job) and $0.20 per 1,000 jobs when "Full job details" is off. Each run also has a start fee of $0.0005 (a twentieth of a cent). Jobs removed by your filters, duplicates and jobs a monitor has already seen are not charged. Platform usage is included.
Larger Apify plans pay less automatically: jobs with full details cost $0.45 per 1,000 on Scale and $0.40 on Business.
Worked examples:
- 1,000 jobs with full descriptions cost about $0.50.
- A daily monitor that returns 40 new jobs a day costs about $0.62 a month.
- Apify's free plan includes $5 of monthly credit, enough for about 10,000 jobs with details.
You can also set a maximum cost per run in the run options. The scraper stops as soon as that budget is used, and you are never charged beyond it.
Input
See the Input tab for every option. A typical input:
{"searches": [{ "keywords": "registered nurse", "location": "Texas, United States" },{ "keywords": "data analyst", "location": "London, England, United Kingdom" }],"datePosted": "past-week","jobTypes": ["full-time"],"maxJobsPerSearch": 200,"fetchJobDetails": true}
Keyword searches use the filters in the form. A pasted LinkedIn search URL keeps the filters inside the URL instead, and the scraper still checks its job type, experience and workplace filters on every job page.
Monitor LinkedIn for new jobs on a schedule
- Create a task with your searches, set Date posted to "Past 24 hours", turn on Only new jobs and give the monitor a name such as
nurses-texas. - In Apify Console open Schedules, create a schedule (for example
0 7 * * *for every day at 07:00), and add the task. - Every run now returns only jobs it has not returned before. Connect the dataset to Google Sheets, Slack or email to get the new jobs where you work.
{"searches": [{ "keywords": "registered nurse", "location": "Texas, United States" }],"datePosted": "past-24h","onlyNewJobs": true,"monitorName": "nurses-texas","maxJobsPerSearch": 500}
The monitor remembers up to 100,000 job IDs in a named storage on your account. The first run returns everything that matches; later runs return only new postings. Use a different monitor name for each task.
How the 1,000-result limit is handled
LinkedIn shows at most 1,000 results for any one search. When a search reaches that limit and you asked for more, the scraper runs it again in slices:
- By region, when the location is one of 14 supported countries: United States, Canada, United Kingdom, India, Germany, France, Australia, Netherlands, Spain, Italy, Brazil, Mexico, Poland and United Arab Emirates. Each state, province or region is its own search with its own 1,000 results.
- By posting date, for cities and for regions that are still too large: past hour, 6 hours, 12 hours, day, 2 days, 3 days, 5 days, week, 2 weeks and month.
Duplicates between slices are removed before saving, so you only pay for unique jobs. The RUN_SUMMARY record of each run tells you whether a search reached the limit and how many slices it used.
Output
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Two jobs from a real run, with the descriptions shortened:
[{"jobId": "4479602490","title": "Software Engineer III, Full Stack - Global Servicing Technology","companyName": "American Express","companyUrl": "https://www.linkedin.com/company/american-express","companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQGRhsociEn4gQ/company-logo_100_100/company-logo_100_100/0/1631367875582?e=2147483647&v=beta&t=bk_i8KnJwZyUrbBXvWK0NMb6W3nPq64rupEGTrKvxYU","location": "Sunrise, FL","workplaceType": "Hybrid","postedAt": "2026-10-17","postedTimeAgo": "22 hours ago","url": "https://www.linkedin.com/jobs/view/4479602490","applyUrl": null,"applyType": "EXTERNAL","salary": {"text": "$103,750.00/yr - $174,750.00/yr","min": 103750,"max": 174750,"currency": "USD","period": "YEAR","source": "linkedin"},"employmentType": "Full-time","seniorityLevel": "Not Applicable","jobFunction": null,"industries": "Financial Services","applicantsCount": 37,"applicantsText": "37 applicants","insights": ["Actively Hiring"],"descriptionText": "Job Description\n\nJoining Amex Tech means discovering and shaping your contribution to something big. Here, you can work alongside talented tech teams and build a unique career with the Powerful Backing of American Express. With a range of ...","searchKeywords": "software engineer","searchLocation": "United States","searchUrl": null,"scrapedAt": "2026-10-18T00:04:11.998Z"},{"jobId": "4471688471","title": "Registered Nurse (RN) - Day","companyName": "Baylor Scott & White Institute for Rehabilitation","companyUrl": "https://www.linkedin.com/company/bswrehab","companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQHCr2cTPFurhg/company-logo_100_100/company-logo_100_100/0/1681746337203/bswrehab_logo?e=2147483647&v=beta&t=dvtg70QbHPovigpR-NXHLnhCKY6fxvg847bE9GT6WxU","location": "Fort Worth, TX","workplaceType": null,"postedAt": "2026-09-24","postedTimeAgo": "3 weeks ago","url": "https://www.linkedin.com/jobs/view/4471688471","applyUrl": "https://www.linkedin.com/jobs/view/4471688471","applyType": "EASY_APPLY","salary": {"text": "$39.38 - $53.00 per hour","min": 39.38,"max": 53,"currency": "USD","period": "HOUR","source": "description"},"employmentType": "Full-time","seniorityLevel": "Not Applicable","jobFunction": null,"industries": "Hospitals and Health Care","applicantsCount": 25,"applicantsText": "Be among the first 25 applicants","insights": ["Be an early applicant"],"descriptionText": "Baylor Scott & White Institute for Rehabilitation\n\nJoint venture with Select Medical\n\nRegistered Nurse (RN)\n\nFort Worth, TX\n\nDay Shift\n\nHours: 6:45 a.m. - 7:15 p.m.\n\nCompensation Depends Upon Candidate’s Years Of Experience\n\nHourly Pay ...","searchKeywords": "registered nurse","searchLocation": "Texas, United States","searchUrl": null,"scrapedAt": "2026-10-18T00:02:38.916Z"}]
Tips for better results
- Remote jobs: pick "Remote" under Workplace. LinkedIn hides the workplace label from logged-out visitors, so the scraper reads it from the title, location and description and leaves out jobs that never say. Many remote postings put "Remote" in the title, so adding "remote" to your keywords can bring more of them into the results.
- Narrow searches work better than one very wide one. LinkedIn's search matches loosely, so the last pages of a broad search often drift away from your keywords.
- Faster lists: turn off "Full job details" to get title, company, location, date and link several times faster, at a lower price.
- Many searches in one run: add them all; each gets its own limit and duplicates across searches are removed.
- Check the summary: the RUN_SUMMARY record in the run's storage lists, for each search, jobs saved, jobs filtered out, jobs skipped as already seen and pages read.
Integrations and API
- API: start a run and get the jobs back in one call with
POST https://api.apify.com/v2/acts/stratumics~linkedin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>. See the API tab for every endpoint. - Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_TOKEN>")run = client.actor("stratumics/linkedin-jobs-scraper").call(run_input={"searches": [{"keywords": "data analyst", "location": "United States"}], "maxJobsPerSearch": 100})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], job["companyName"], job["salary"])
- JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_TOKEN>' });const run = await client.actor('stratumics/linkedin-jobs-scraper').call({searches: [{ keywords: 'data analyst', location: 'United States' }],maxJobsPerSearch: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
- No-code tools: send new jobs to Google Sheets, Airtable, Slack or email with the Apify integrations for Zapier, Make and n8n, or with a webhook when a run finishes.
- AI agents: connect the Apify MCP server to your agent and it can search LinkedIn jobs with this Actor as a tool, with the input schema discovered automatically.
FAQ
Do I need a LinkedIn account?
No. The scraper reads the public job pages LinkedIn shows to anyone who is not logged in. You do not share any login or cookies.
Is it legal to scrape LinkedIn jobs?
Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
Job postings are published by employers to be seen. The only personal data this Actor can collect is the name, headline and profile link of the person who posted a job, and only when you turn on "Include the job poster".
Why are some fields empty?
LinkedIn shows less to logged-out visitors than to members. The job function and the employer's external application link are hidden from them, so jobFunction is usually empty and applyUrl is filled only for Easy Apply jobs. workplaceType is filled only when the posting says remote, hybrid or on-site, and salary only when there is a pay range to read. Fields LinkedIn does not show are null, never made up.
Why did I get fewer jobs than I asked for?
Usually the search has fewer matching jobs, your filters removed some, or the monitor skipped jobs it had already returned. The RUN_SUMMARY record shows which. Searches stop at LinkedIn's 1,000-result limit when splitting is turned off.
How fast is it?
Speed depends on how many proxy IPs your Apify plan has, because LinkedIn limits requests per IP address. In platform tests with Apify's shared datacenter proxy, 100 jobs with full details took between 30 seconds and 3.5 minutes. Jobs without full details come several times faster (about six times in a local test), because one search page lists 10 to 25 jobs while full details need one page per job.
What happens when LinkedIn rate-limits the scraper?
LinkedIn answers too many requests from one IP address with an error. The scraper waits, switches to another proxy IP and tries again, and it slows itself down while the errors continue. You are never charged for retries.
How does "Only new jobs" decide what is new?
A job is new when this monitor has never returned its LinkedIn job ID. When an employer reposts a job, LinkedIn usually gives it a new ID, so it comes back as new.
Where can I report a problem or ask for a feature?
Open an issue in the Issues tab. Include the run ID so the run can be checked.
Other tools from this developer
Other tools from Stratum ICS
- App Store Reviews Scraper: Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.
- Google Maps Scraper: Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles.
- Google News Scraper: Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- Google Play Reviews Scraper: Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.
- Google Trends Scraper: Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- Telegram Channel Scraper: Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- Website Contact Scraper: Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- YouTube Scraper: Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.