LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $0.90 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape LinkedIn jobs without login via the public guest API. Search cards plus optional detail enrichment: full description, salary, seniority, employment type, industries, and applicant count. HTTP/1.1 + residential proxy.

Pricing

from $0.90 / 1,000 results

Rating

0.0

(0)

Developer

Aurenic

Aurenic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Scrape LinkedIn jobs without login via the public guest API. Search cards plus optional detail enrichment: full description, salary, seniority, employment type, industries, and applicant count. HTTP/1.1 + residential proxy.

What does LinkedIn Jobs Scraper do?

Extract jobs from LinkedIn's public guest API in two modes:

  • Search by keywords + location — returns title, company, location, posted date, and job URL. Optional detail enrichment opens each job page for the full description, salary, seniority, employment type, industries, and applicant count.
  • Fetch specific job URLs — pass direct LinkedIn job URLs and get full detail records.

Unlike most LinkedIn scrapers on the Store, this actor:

  • Uses client-side filtering for job type, experience level, and remote — because LinkedIn silently ignores f_JT, f_E, and f_WT since 11 September 2026 (returns identical result sets regardless of the parameter value).
  • Runs on HTTP/1.1 via got-scraping — LinkedIn's edge blocks HTTP/2 fingerprints regardless of headers.
  • Rotates residential proxy sessions every N requests, well under LinkedIn's 50–100 request per-IP rate limit.

Output fields

Job detail (default when fetchDetails: true)

FieldDescription
jobIdLinkedIn numeric job ID
urlCanonical job URL
titleJob title
companyHiring company
locationLocation string
descriptionFull job description (plain text)
descriptionHtmlFull description (HTML)
descriptionLengthChar count
senioritySeniority level (from criteria block)
employmentTypeFull-time, Part-time, Contract, etc.
jobFunctionJob function
industriesIndustry list
salaryTextSalary string when disclosed
salaryRangeStructured salary range when available
applicantsCountNumber of applicants (parsed integer)
applicantsRawRaw applicant caption
isEasyApplyEasy Apply flag
applyUrlApply button target
postedAgoRelative posted date
criteriaFull criteria block as a map
jsonLdStructured JobPosting JSON-LD when present

Job card (when fetchDetails: false)

FieldDescription
jobId / urlIdentity
title / company / locationCore fields
postedAt / postedAgoPosted date
companyLogoLogo URL

Who is it for?

  • Recruiters and talent-sourcing teams tracking competitor hiring and building candidate pipelines
  • Job board aggregators feeding LinkedIn listings into their own products
  • Market researchers analyzing salary trends, applicant competition, and skill demand
  • Career coaches and job seekers monitoring specific roles across companies
  • AI/ML builders sourcing job descriptions for training or RAG pipelines
  • Sales teams identifying companies with active hiring signals

Pricing

$0.90 per 1,000 results. No subscription.

ResultsCost
100$0.09
1,000$0.90
10,000$9.00

How to use it

  1. Pick a Mode.
  2. For search: enter Keywords and optionally Locations.
  3. Optionally set Posted Within (the only server-side filter that still works).
  4. Set Fetch Full Details on to get description + salary + applicants.
  5. Optionally apply Job Type / Experience Level / Remote Only client-side filters.
  6. Click Start.

Output example

{
"recordType": "job-detail",
"jobId": "3847291023",
"url": "https://www.linkedin.com/jobs/view/3847291023/",
"title": "Senior Software Engineer",
"company": "Stripe",
"location": "San Francisco, CA",
"description": "We're looking for a senior engineer to join the Payments Infrastructure team. You'll design, build, and operate the systems that move billions of dollars...",
"descriptionLength": 2847,
"seniority": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering",
"industries": "Financial Services",
"salaryText": "$180,000/yr - $250,000/yr",
"salaryRange": "$180K/yr - $250K/yr",
"applicantsCount": 142,
"applicantsRaw": "142 applicants",
"isEasyApply": false,
"applyUrl": "https://stripe.com/jobs/apply/...",
"postedAgo": "2 days ago",
"criteria": {
"Seniority level": "Mid-Senior level",
"Employment type": "Full-time",
"Job function": "Engineering",
"Industries": "Financial Services"
},
"searchKeyword": "software engineer",
"searchLocation": "United States",
"scrapedAt": "2026-09-26T12:00:00.000Z"
}

Technical details

  • LinkedIn public guest API — https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search and /jobs-guest/jobs/api/jobPosting/{id}. No login, no cookies, no account.
  • HTTP/1.1 required — LinkedIn's edge blocks HTTP/2 fingerprints even with browser headers. The actor uses got-scraping with http2: false.
  • Residential proxy mandatory — datacenter IPs hit 429 after 50–100 requests. The actor rotates sessions every 40 requests by default.
  • Server-side filter caveat — as of 11 September 2026, LinkedIn silently ignores f_JT (job type), f_E (experience), f_WT (remote), and sortBy. Only f_TPR (posted within) and f_AL (easy apply) still change the result set. The actor handles this by scanning extra pages and filtering client-side.
  • Scan cap logic — with rare filters (e.g. contract-only), the actor scans up to maxJobs × maxScanMultiplier cards (capped at 500) so filters with <10% hit rate still return matches. Non-matching jobs cost nothing.
  • No browser, no login — pure HTTP + Cheerio.

Known limits

  • Residential proxy bandwidth is real cost. Detail mode adds one request per job. For 1,000 jobs, budget ~1,000 extra proxy requests.
  • f_JT, f_E, f_WT are broken server-side. The actor applies these client-side, which means scanning more pages than the result count suggests. Rare filters (contract, entry level) can require 5–10× the scan volume.
  • Some listings don't show salary or applicant count. Those fields return empty strings / null. This is a LinkedIn source limitation, not an actor bug.
  • Search returns ~25 cards per page. Pagination is via start incrementing by 25. LinkedIn caps deep pages at around 1,000 results per query.
  • postedWithin uses LinkedIn's rXXX format — r86400 (24h), r604800 (7d), r2592000 (30d).
  • Applicant counts can be coarse. LinkedIn shows "Over 200 applicants" for high-volume roles; the actor returns null in that case (no numeric to parse).
  • Job cards may duplicate across pages. The actor dedupes by jobId.

FAQ

Do I need a LinkedIn account? No. Public guest endpoints only — no login, no cookies, no risk to your account.

Do I need a proxy? Yes. Residential proxy is pre-configured and required — LinkedIn rate-limits datacenter IPs after ~50 requests.

Why do job-type filters sometimes return nothing? LinkedIn silently ignores f_JT. The actor filters client-side, which means scanning many pages. With a very rare filter (e.g. contract on a keyword with mostly full-time roles), you may hit the scan cap before finding matches. Raise maxScanMultiplier or broaden the keyword.

Why is the run slow? Two reasons: (1) LinkedIn rate-limits, so the actor defaults to 2.5s between requests; (2) detail mode adds one request per job. 500 jobs at full detail ≈ 25 minutes.

Can I fetch jobs by URL? Yes — use detail mode with an array of LinkedIn job URLs.

How do I export data? After a run, go to Storage → Export as JSON, CSV, Excel.

Support

Open an issue on the Actor's page for bugs or feature requests.