LinkedIn Jobs Scraper
Pricing
from $0.90 / 1,000 results
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
Maintained by CommunityActor 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, andf_WTsince 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)
| Field | Description |
|---|---|
| jobId | LinkedIn numeric job ID |
| url | Canonical job URL |
| title | Job title |
| company | Hiring company |
| location | Location string |
| description | Full job description (plain text) |
| descriptionHtml | Full description (HTML) |
| descriptionLength | Char count |
| seniority | Seniority level (from criteria block) |
| employmentType | Full-time, Part-time, Contract, etc. |
| jobFunction | Job function |
| industries | Industry list |
| salaryText | Salary string when disclosed |
| salaryRange | Structured salary range when available |
| applicantsCount | Number of applicants (parsed integer) |
| applicantsRaw | Raw applicant caption |
| isEasyApply | Easy Apply flag |
| applyUrl | Apply button target |
| postedAgo | Relative posted date |
| criteria | Full criteria block as a map |
| jsonLd | Structured JobPosting JSON-LD when present |
Job card (when fetchDetails: false)
| Field | Description |
|---|---|
| jobId / url | Identity |
| title / company / location | Core fields |
| postedAt / postedAgo | Posted date |
| companyLogo | Logo 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.
| Results | Cost |
|---|---|
| 100 | $0.09 |
| 1,000 | $0.90 |
| 10,000 | $9.00 |
How to use it
- Pick a Mode.
- For search: enter Keywords and optionally Locations.
- Optionally set Posted Within (the only server-side filter that still works).
- Set Fetch Full Details on to get description + salary + applicants.
- Optionally apply Job Type / Experience Level / Remote Only client-side filters.
- 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/searchand/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-scrapingwithhttp2: 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), andsortBy. Onlyf_TPR(posted within) andf_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 × maxScanMultipliercards (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_WTare 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
startincrementing by 25. LinkedIn caps deep pages at around 1,000 results per query. postedWithinuses LinkedIn'srXXXformat —r86400(24h),r604800(7d),r2592000(30d).- Applicant counts can be coarse. LinkedIn shows "Over 200 applicants" for high-volume roles; the actor returns
nullin 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.