LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

$0.10 / actor start

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape LinkedIn job listings by job title, skill, and location. Extract job title, company, location, posting date, job link, and LinkedIn job ID.

Pricing

$0.10 / actor start

Rating

5.0

(2)

Developer

Dinesh Kumar Wadhwani

Dinesh Kumar Wadhwani

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

1

Monthly active users

7 days ago

Last modified

Share

LinkedIn Jobs Scraper — Multi-Role, Multi-Location, Ultra-Fast

Extract LinkedIn job listings by role, skill, and location in under 60 seconds — no browser required, no bloat, production-ready.

Built for developers, data teams, and recruiters who need clean, deduplicated job data fast and cheap. Runs on Crawlee's HTTP-only crawler, not a full browser — making it up to 23x faster and 8x cheaper than equivalent Playwright-based LinkedIn scrapers on the Apify Store.


Why this Actor

This ActorTypical browser-based LinkedIn scrapers
⏱ Runtime (100 jobs)~10–65 seconds3–5 minutes
💰 Cost per run~$0.001–$0.003~$0.008–$0.02
🧠 Memory needed256 MB512–1024 MB
🔁 DeduplicationGlobal, across all locationsUsually per-location only
🔍 Multi-role searchYes — up to 3 roles, OR-combinedRarely

No Playwright. No Chrome. No scrolling loops. Just clean HTTP requests and fast HTML parsing.


What it does

This Actor scrapes LinkedIn's job search results for up to:

  • 3 job roles — combined into a single OR-query so you cover title variants in one pass
  • 3 skills — appended as supporting keywords to tighten relevance
  • 3 locations — each gets its own search, results pooled and deduplicated globally
  • 1 time frame — last 24 hours, 48 hours, 7 days, or 15 days

Results are automatically deduplicated by job ID and URL across all locations. The run stops the moment 100 unique jobs are collected — no wasted requests, no runaway costs.


Input

FieldTypeRequiredLimitDescription
rolesstring[]✅ Yes3Job titles to search for (e.g. "VP Engineering", "Head of Product")
skillsstring[]No3Supporting keywords (e.g. "SaaS", "Python", "AWS")
locationsstring[]✅ Yes3Cities, regions, or countries (e.g. "Bangalore", "Remote")
timeFramestringNor86400 = 24h · r172800 = 48h · r604800 = 7 days · r1296000 = 15 days · "" = any time
liAtCookiestringNoOptional LinkedIn session cookie for authenticated access

Example — Senior engineering leadership roles across India

{
"roles": ["VP Engineering", "Head of Engineering", "Engineering Director"],
"skills": ["SaaS", "Platform"],
"locations": ["Bangalore", "Pune", "Hyderabad"],
"timeFrame": "r604800"
}

This runs 3 searches (one per location), each using the combined query:

"VP Engineering" OR "Head of Engineering" OR "Engineering Director" SaaS Platform

Example — Full-stack developer roles

{
"roles": ["Full Stack Developer", "Software Engineer"],
"skills": ["React", "Node.js", "AWS"],
"locations": ["Remote"],
"timeFrame": "r86400"
}

Output

Each result is saved as a flat JSON record to the Apify dataset. Fields:

{
"title": "Vice President of Engineering",
"company": "Acme Corp",
"location": "Bangalore, Karnataka, India",
"link": "https://www.linkedin.com/jobs/view/4426507200",
"postedAt": "2026-06-28",
"jobId": "4426507200",
"searchLocation": "Bangalore",
"searchKeywords": "\"Vice President\" AI",
"roles": ["Vice President"],
"skills": ["AI"]
}
FieldDescription
titleJob title as listed on LinkedIn
companyHiring company name
locationLocation as shown on the job card
linkDirect URL to the job posting
postedAtISO date the job was posted (if available)
jobIdLinkedIn's internal job ID — used as the deduplication key
searchLocationWhich of your input locations produced this result
searchKeywordsThe exact keyword string sent to LinkedIn's search API
rolesEcho of your input roles
skillsEcho of your input skills

Results are ready to pipe directly into spreadsheets, databases, Slack alerts, ATS systems, or downstream AI pipelines.


How it works (technical)

This Actor uses Crawlee's CheerioCrawler — plain HTTP requests with server-side HTML parsing — instead of a full browser. This is possible because LinkedIn's guest job search API (/jobs-guest/jobs/api/seeMoreJobPostings/search) returns server-rendered HTML fragments that contain the full job card data without requiring JavaScript execution.

Search strategy (cost-optimised):

  1. All input roles are OR-combined into a single keyword string (e.g. "Role A" OR "Role B").
  2. Skills are appended as plain supporting terms.
  3. One HTTP request is fired per location using this combined keyword string.
  4. Results are paginated using the start offset parameter (10 results per page).
  5. Pagination stops as soon as a page returns no new unique results, or the global 100-job cap is hit.
  6. All results are deduplicated globally using jobId first, then link as a fallback.

This means a run with 3 roles + 3 skills + 3 locations fires a maximum of ~33 HTTP requests total (3 locations × up to ~11 pages) — compared to browser-based scrapers that may fire hundreds of rendering/network events per page.


Performance benchmarks

Tested on Apify platform, 512 MB memory, development build:

InputResultsDurationCost
1 role · 1 skill · 2 locations · last 24h48 jobs10 seconds$0.001
1 role · 1 skill · 2 locations · last 7 days100 jobs65 seconds$0.003

💡 Tip: Set memory to 256 MB in your actor settings. This Actor does not launch a browser and needs very little RAM — halving the memory allocation reduces cost further without affecting reliability.


Use cases

  • Recruiters & talent teams — monitor fresh job postings by competitor companies or target roles on a schedule
  • Job seekers — run daily searches across multiple cities and pipe results to a spreadsheet or email alert
  • Market researchers — track hiring trends by role, skill, and region over time
  • HR analytics — benchmark job title conventions and skill demand across companies
  • AI pipelines — feed structured job data into LLM workflows for summarisation, matching, or classification
  • ATS integrations — pull and deduplicate job listings before importing into applicant tracking systems

Scheduling & automation

This Actor works well on a schedule. To run it daily:

  1. Open the Actor on Apify and click Schedule.
  2. Set your preferred cron (e.g. 0 8 * * * for 8am daily).
  3. Connect the output dataset to a Google Sheet, webhook, or downstream actor using Apify integrations.

Use timeFrame: "r86400" (last 24 hours) on daily schedules to avoid collecting the same jobs repeatedly.


Limitations

  • Returns up to 100 unique jobs per run. If you need more, split searches across multiple runs with different location or role combinations.
  • Does not visit individual job detail pages — full job descriptions are not included. Only data visible on the search results card is captured.
  • LinkedIn's guest search is publicly accessible but subject to rate limiting. If you're running this at high frequency, provide a valid li_at session cookie for more reliable access.
  • LinkedIn's HTML structure can change without notice. If results drop to 0 unexpectedly, check the Actor's run log for login wall or block warnings.

FAQ

Does this require a LinkedIn account? No. It works without authentication using LinkedIn's public guest job search. The optional liAtCookie field is available for high-frequency use cases where authenticated access improves reliability.

Why do I sometimes get more results than LinkedIn's UI shows? LinkedIn's "X jobs" count in the UI is an estimate and varies based on your login state, IP location, and personalization. The Actor hits the raw search API directly and often returns more listings than the UI count suggests.

Can I search for remote jobs? Yes — add "Remote" as one of your locations.

Can I run this on a schedule? Yes — use Apify's built-in scheduler. Pair with timeFrame: "r86400" on a daily schedule to only collect new postings each day.

Is this Actor maintained? Yes — it is actively maintained. If LinkedIn changes its HTML structure and the Actor stops returning results, open an issue or check for an updated version on the Apify Store.


Input schema reference

{
"roles": ["VP Engineering", "Head of Engineering"],
"skills": ["SaaS", "B2B"],
"locations": ["Bangalore", "Pune"],
"timeFrame": "r604800",
"liAtCookie": ""
}

timeFrame values:

ValueMeaning
r86400Last 24 hours
r172800Last 48 hours
r604800Last 7 days
r1296000Last 15 days
"" (empty)Any time