LinkedIn Jobs Scraper — full descriptions, normalized pay avatar

LinkedIn Jobs Scraper — full descriptions, normalized pay

Pricing

from $1.50 / 1,000 job results

Go to Apify Store
LinkedIn Jobs Scraper — full descriptions, normalized pay

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

Rez Archer

Maintained by Community

Actor 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

FieldExample
titleSoftware Engineer II (Java/AWS)
companyJPMorganChase
locationNew York, NY
remotetrue
employment_typeFull-time
seniority_levelMid-Senior level (with fullDescription)
industriesFinancial Services (with fullDescription)
departmentEngineering (LinkedIn job function, with fullDescription)
salaryUSD123500 - USD150000 / year
salary_min / salary_max123500 / 150000
salary_currency / salary_periodUSD / year
posted_at2026-10-08T00:00:00.000Z (ISO, from LinkedIn's datetime attribute)
urlhttps://www.linkedin.com/jobs/view/… (canonical, tracking params stripped)
job_key4476983365 (LinkedIn's numeric job id — use it to dedupe across runs)
description_text / description_htmlfull job description (with fullDescription)
source_platformlinkedin

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 a company / 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) or date (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 --pretty
npx linkedin-jobs search "data scientist" --since week --full # with full descriptions
npx linkedin-jobs detail 4476983365 # one job id -> detail
npx 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_at comes from LinkedIn's own datetime attribute, falling back to a best-effort ISO date resolved from relative text ("3 weeks ago").
  • seniority_level, industries, department and the full description require fullDescription (they live on the detail page, not the search card).
  • Very broad searches are bounded by maxResults.