LinkedIn Jobs Scraper — full descriptions, normalized pay
Pricing
from $1.50 / 1,000 job results
LinkedIn Jobs Scraper — full descriptions, normalized pay
Search LinkedIn public job postings and get clean, deduped results: title, company, location, remote flag, normalized salary, employment type, seniority, posting date, apply URL and full description. Public guest postings only. Maintained to stay green as LinkedIn changes. Pay per event.
Pricing
from $1.50 / 1,000 job results
Rating
0.0
(0)
Developer
Rez Archer
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
LinkedIn Jobs Scraper
Search LinkedIn's public job postings and get back clean, deduped, fully-normalized results — in one stable schema you can load straight into a database, an ATS, or a job-matching model. No cookies, no login, no scraping code to maintain on your side.
Built and kept green by Grey Ridge — when LinkedIn changes its page shape or rate limits harder, we fix the extractor and tune the proxy strategy so your pipeline doesn't break.
What you get per job
| Field | Example |
|---|---|
title | Software Engineer II (Java/AWS) |
company | JPMorganChase |
location | New York, NY |
remote | true |
employment_type | Full-time |
seniority_level | Mid-Senior level (with fullDescription) |
industries | Financial Services (with fullDescription) |
department | Engineering (LinkedIn job function, with fullDescription) |
salary | USD123500 - USD150000 / year |
salary_min / salary_max | 123500 / 150000 |
salary_currency / salary_period | USD / year |
posted_at | 2026-10-08T00:00:00.000Z (ISO, from LinkedIn's datetime attribute) |
url | https://www.linkedin.com/jobs/view/… (canonical, tracking params stripped) |
job_key | 4476983365 (LinkedIn's numeric job id — use it to dedupe across runs) |
description_text / description_html | full job description (with fullDescription) |
source_platform | linkedin |
Every result is deduped on LinkedIn's numeric job id within a run, so you never pay for the same posting twice.
Input
{"keywords": "software engineer","location": "United States","remoteOnly": true,"datePosted": "week","experienceLevel": "mid-senior level","jobType": "full-time","fullDescription": true,"maxResults": 200}
keywords/location— provide at least one (or acompany/companyId).geoId— LinkedIn's numeric geo id for an exact-location match (optional).remoteOnly— restrict to remote (LinkedIn workplace-type = Remote).datePosted—past24h·week·month.experienceLevel— internship · entry level · associate · mid-senior level · director · executive.jobType— full-time · part-time · contract · temporary · internship · volunteer.company/companyId— narrow to a company by name, or an exact feed by LinkedIn company id.sortBy—relevance(default) ordate(most recent first).fullDescription— fetch each job's detail page for the complete description, salary, seniority, job function and industries (slower, more proxy traffic).maxResults— hard cap that bounds your cost; you know your maximum spend before the run.
Salary normalization
LinkedIn shows compensation as free text in several shapes —
"$123,500.00/yr - $150,000.00/yr""$55.00/hr", "€4,000/mo - €5,000/mo", "From $80,000/yr",
"Base pay range $120K/yr - $150K/yr". We parse all of them into structured
salary_min / salary_max / salary_currency / salary_period, so you can filter and
compare across postings without writing your own parser.
Reliability
LinkedIn's public job pages rate-limit aggressively (HTTP 429 and LinkedIn's signature
999 status) once a single IP pulls hard — which is why self-built LinkedIn scrapers rot
and why half-maintained ones drift to low ratings. This actor:
- escalates proxy tier only when needed (datacenter first, residential on a block) to keep runs cheap;
- aborts a run early with a circuit breaker if the block-rate spikes, rather than burning your usage on an unwinnable pull;
- is monitored and patched when LinkedIn changes its markup or tightens limits.
Pricing
Pay per event — priced per job returned. You pay only for jobs actually returned;
rate-limited or blocked pages cost nothing. maxResults is your hard ceiling — set it and
you know your maximum spend before the run starts. Billing is event-based, so autonomous
agents can call and pay for this actor per request.
Try it free (no account)
The bundled CLI fetches LinkedIn's public postings live for small pulls — no account, no key — and also parses pages you've already saved:
npx linkedin-jobs search "software engineer" --location "United States" --remote --max 25 --prettynpx linkedin-jobs search "data scientist" --since week --full # with full descriptionsnpx linkedin-jobs detail 4476983365 # one job id -> detailnpx linkedin-jobs parse saved-search.html --pretty # parse a saved page
For high volume and always-green reliability (rotating residential proxy, retries, circuit breaker), use this actor.
Same schema as our Indeed & Multi-ATS Jobs Scrapers
The field names here match our Indeed Jobs Scraper and Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable) exactly — so you can merge LinkedIn results with Indeed and direct-from-ATS results in one table with no remapping. That unified cross-source schema is unique on the store: together the three actors are a single jobs-data layer.
Scope & notes
- Public guest job postings only. No login, no authenticated/member-area data, no personal profile data — only the fields LinkedIn publishes openly on a job post.
posted_atcomes from LinkedIn's owndatetimeattribute, falling back to a best-effort ISO date resolved from relative text ("3 weeks ago").seniority_level,industries,departmentand the full description requirefullDescription(they live on the detail page, not the search card).- Very broad searches are bounded by
maxResults.