LinkedIn Jobs Search Scraper
Pricing
from $0.40 / 1,000 job listings
LinkedIn Jobs Search Scraper
The LinkedIn Jobs Search Scraper extracts job postings by keyword and location, breaking past LinkedIn’s 1,000-result cap and removing duplicates, capturing titles, companies, locations, posted dates, salaries, seniority, applicant counts, and company profiles — ideal for recruitment analysis.
Pricing
from $0.40 / 1,000 job listings
Rating
0.0
(0)
Developer
FalconScrape
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
Share
🚀 LinkedIn Jobs Search Scraper
Search LinkedIn jobs by keyword and location and export every matching posting to JSON, CSV or Excel — including the ones a normal scraper can't reach.
LinkedIn serves at most 1,000 results per search, no matter how many jobs actually match. A search for "engineer" in the United States matches over 300,000 postings; ask for them and you get 1,000. This scraper detects when a search hits that ceiling, splits it into narrower searches, runs them, and merges everything with duplicates removed — so you get the jobs, not the ceiling.
Every run tells you how many jobs LinkedIn says match versus how many were actually returned. If your results are incomplete, you'll know.
✨ Features
- Goes past the 1,000-result limit. Automatic search splitting and merging. Measured on "engineer" / United States: 1,500 unique jobs, zero duplicates, in 191 requests — where the plain search tops out at 1,000.
- Deduplicated, always. LinkedIn repeats results across its own result pages, and overlaps between split searches are unavoidable. Every job appears once, keyed on its LinkedIn job ID.
- Multiple titles and locations in one run. Every keyword is searched against every location.
- Three levels of depth, so you pay for what you need:
- Listing — title, company, location, posted date, logo, links
- + Job detail — full description, posted salary parsed into min/max/currency/period, seniority, employment type, job function, industries, applicant count, apply type
- + Company — followers, employee count, industry, website, headquarters, founded, specialties
- Company data is charged once per company, not once per job. A 500-job run usually spans far fewer companies, and the work is only done once.
- Worldwide by default. Leave the location empty and you get jobs from everywhere, not just the country the server happens to sit in.
- Only filters that actually work. Posted-within window, keyword and location all genuinely narrow the search. Workplace type, experience level, job type and salary band are deliberately not offered: LinkedIn accepts them on this endpoint and then ignores them, so exposing them would hand you unfiltered data that looks filtered.
- Honest truncation reporting. Every run writes a
RUN_SUMMARYwithreturned,estimatedTotal,truncatedand the reason. - No proxy needed. Runs clean without one; proxy support is there as a fallback for high volume, not a requirement.
🛠️ How It Works
- Enter your search keywords and locations, plus any filters.
- Choose how much data you want per job — listing, detail, or detail + company.
- Run it. Any search that hits LinkedIn's 1,000-result ceiling is automatically split and merged.
- Export to JSON, CSV, Excel, or pull it from the API.
A capped search is split into narrower posting-date windows, which is the one dimension LinkedIn's guest search actually honours, and the results are merged on job ID. If you set a posted-within window, splits stay inside it — you never get jobs older than you asked for.
📋 Output Fields
Listing (every run)
| Field | Description |
|---|---|
jobId | LinkedIn job posting ID — the deduplication key |
jobUrl | Canonical LinkedIn job URL |
title | Job title |
companyName | Hiring company name |
companyUrl | Company LinkedIn URL, normalised so it works as a join key |
companySlug | Company slug |
location | Job location |
postedDate | Posting date (YYYY-MM-DD) |
postedTimeAgo | Relative posting age, e.g. "2 weeks ago" |
companyLogo | Company logo image |
sourceQuery | Which search this job came from |
scrapedAt | ISO 8601 scrape timestamp |
Job detail
| Field | Description |
|---|---|
description | Full job description text |
salaryText | Posted salary range as displayed |
salaryMin / salaryMax | Parsed salary bounds |
salaryCurrency / salaryPeriod | Currency, and year / hour / month |
seniorityLevel | Entry level, Mid-Senior level, ... |
employmentType | Full-time, Part-time, Contract, ... |
jobFunction | Job function |
industries | Industries |
applicantCount | Applicant count as a number |
numApplicantsCaption | Applicant caption as displayed |
applyType | easyApply or offsite (external ATS) |
jobTitle / jobLocation | Title and location from the posting page |
criteria | Original name/value criteria list |
similarJobs | Similar jobs LinkedIn surfaces alongside this posting |
peopleAlsoViewed | Jobs that viewers of this posting also viewed |
Company
| Field | Description |
|---|---|
companyId | Numeric LinkedIn company ID |
companyFollowers | LinkedIn follower count |
companySize | Employee band as published, e.g. "51-200 employees" |
companyEmployeeCount | Upper bound of that band, as a number |
companyIndustry | Company industry |
companyWebsite | Company website |
companyHeadquarters | Headquarters location |
companyDescription | Company About text |
companyTagline | Company tagline |
companyFounded | Year founded |
companySpecialties | Company specialties |
companyType | Public company, Privately Held, ... |
Salary is only present where the employer posts it — common in the US, rare elsewhere. Fields with no data are null, never invented.
📊 Sample Output Data
{"jobId": "4442224163","jobUrl": "https://www.linkedin.com/jobs/view/4442224163","title": "Critical Facility Engineer II (Day Shift)","companyName": "Salute","companyUrl": "https://www.linkedin.com/company/inc-salute","companySlug": "inc-salute","location": "Cheyenne, WY","postedDate": "2026-07-20","postedTimeAgo": "2 weeks ago","companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQFxKcXt6-AAgw/company-logo_100_100/0/1709501595672/salute_dcs_logo","sourceQuery": "sortBy=DD&keywords=engineer&location=United States","scrapedAt": "2026-08-05T12:51:05.793Z"}
With detail + company depth, each row also carries the description, parsed salary, seniority, applicant count and the hiring company's profile:
{"jobId": "4437106135","title": "Registered Nurse - Ambulatory","companyName": "Incredible Health","location": "Quincy, MA","postedDate": "2026-06-10","salaryText": "$76,003.20 - $163,678.32","salaryMin": 76003.2,"salaryMax": 163678.32,"salaryCurrency": "$","salaryPeriod": "year","seniorityLevel": "Entry level","employmentType": "Full-time","jobFunction": "Health Care Provider","industries": "Health and Human Services","applicantCount": 25,"applyType": "offsite","companyFollowers": 26902,"companySize": "51-200 employees","companyEmployeeCount": 200,"companyIndustry": "Software Development","companyWebsite": "http://www.incrediblehealth.com","companyHeadquarters": "San Francisco, California","companyFounded": "2017"}
💰 Pricing
Pay only for what you extract:
| Event | Price (Free plan) | Price (Gold plan) |
|---|---|---|
| Job listing | $0.0008 | $0.0004 |
| Job with full details | $0.003 | $0.0012 |
| Company profile (per unique company) | $0.01 | $0.004 |
A 500-job run with full job details costs about $1.50 on the Free plan and $0.60 on Gold.
❓ FAQ
Why don't I get all 319,000 jobs LinkedIn says match?
LinkedIn serves 1,000 results per search. Splitting a search multiplies what's reachable but doesn't make it unlimited. Narrow your search — one city instead of a whole country, one keyword instead of a broad one — and run several. The RUN_SUMMARY tells you exactly when and why a run stopped short.
Do I need a proxy? No. Leave it off unless you're running at high volume and start seeing failures.
Do I need a LinkedIn account or cookies? No. Only publicly visible job data is collected.
Can I get jobs for a specific company? Use the LinkedIn Company Jobs Scraper, which resolves the company properly instead of keyword-matching its name.