LinkedIn Search Jobs Scraper avatar

LinkedIn Search Jobs Scraper

Pricing

$19.99/month + usage

Go to Apify Store
LinkedIn Search Jobs Scraper

LinkedIn Search Jobs Scraper

LinkedIn Search Jobs Scraper extracts job listings from any LinkedIn search query. Capture titles, companies, locations, descriptions, salaries, and posting dates. Ideal for market research, hiring, lead generation, and workflows needing structured LinkedIn job search data.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

3

Bookmarked

64

Total users

2

Monthly active users

6 days ago

Last modified

Share

LinkedIn Jobs Scraper — Extract Job Listings, Companies & Applicants

LinkedIn Jobs Scraper extracts job listings, company details, and applicant data directly from LinkedIn's public, logged-out job-search and job-posting pages — no LinkedIn account, cookies, or API key required. Give it keywords, a keyword, location pair, a company profile URL, or a direct job URL, and it returns every listing as typed, normalized JSON: no HTML, no selectors, no parsing to write. By the end of this page you'll know exactly which fields it returns, how its search-and-scrape pipeline works, and where its real limits are.

🤖 What is LinkedIn Jobs Scraper?

LinkedIn Jobs Scraper is an Apify Actor that searches LinkedIn's public guest job-search pages and scrapes each matching job's own detail page — it never logs in, sets a cookie, or calls a LinkedIn API key. It accepts plain keywords, structured keyword, location strings, LinkedIn job-search URLs, company profile URLs, or direct job URLs/IDs, and returns job listings, the employer's company details, and applicant/job-criteria data for each one.

  • 🔍 Scrape job listings by keyword, structured keyword+location, search URL, or job URL/ID
  • 🏢 Scrape a specific company's job openings from its LinkedIn company profile URL
  • 🔢 Scrape applicant counts and job criteria (seniority, employment type, job function, industries)
  • 📦 Export results as JSON, CSV, Excel, or XML from the Apify dataset
  • 🌐 Runs without a proxy by default; Apify Proxy is optional for extra reliability

📋 What data does LinkedIn Jobs Scraper collect?

Each run returns three groups of data for every job it scrapes — the listing itself, the employer's company details, and applicant/criteria data — all in one JSON row per job.

Data TypeKey FieldsJSON Field Names
Job Listingstitle, location, description, time posted, canonical job linktitle, location, description, postedTimeAgo, jobUrl
Company Detailsemployer name, company profile link, company logocompany, link, companyLogoUrl
Applicant & Criteria Dataapplicant count (text and normalized number), seniority/employment-type/job-function/industry pairsnumberOfApplicants, applicantsCount, criteria

Need more LinkedIn data?

Job listings only tell you who's hiring — pair this Actor with API-Empire's LinkedIn Profile & Post Scraper when you also need the LinkedIn profiles or recent posts of the recruiters, hiring managers, or companies behind those listings.

Why not build this yourself?

LinkedIn does not offer a self-serve public API for job-search data — its Talent Solutions and Marketing APIs are partner-gated and require an approved business relationship, not a signup form. Building your own scraper means handling LinkedIn's guest-page quirks yourself: a company profile URL's slug (e.g. notionhq) silently fails LinkedIn's own f_C search filter and returns an unfiltered, unrelated job firehose instead of an error — the fix requires resolving the slug to LinkedIn's real numeric organization ID from the company's own guest page first. You'd also need to handle session warm-up (a bare company-URL request as the very first request on a session gets stricter anti-bot scrutiny), retry/backoff on HTTP 429 and 999 responses, and canonical-URL resolution for direct job-ID inputs. This Actor already does all of that, and gets maintained when LinkedIn's markup changes.

🎯 Why do developers and teams scrape LinkedIn jobs?

For recruiters and talent teams

Track which roles a target company is actively hiring for by pointing the Actor at that company's LinkedIn profile URL — it resolves to the employer's real organization ID so only that company's own listings come back. Feed title, location, and criteria (seniority level, employment type) into an ATS or sourcing sheet to prioritize outreach, or monitor a shortlist of companies for newly posted roles between runs.

For sales and market-intelligence teams

Hiring signals are a proxy for company growth, budget, and expansion plans. Search by keyword and location, or by company URL, to flag accounts that are scaling a department — a sudden run of "DevOps Engineer" postings at a target account is a warning sign worth surfacing to an account executive before a competitor gets there first.

For labour-market researchers and analysts

Query the same keyword, location structured input across multiple regions in a single run to compare postings volume, employment type mix, and industry distribution across geographies, using only LinkedIn's publicly accessible listings — no login-gated or private data involved.

For developers building job-data products

Because every field comes back as stable, typed JSON (applicantsCount normalized to a number, criteria as a consistent array of {title, value} pairs), you can pipe results straight into a database or search index without writing an HTML parser, and re-run the same startUrls on a schedule to track postings over time.

🧭 How to scrape LinkedIn jobs (step by step)

  1. Open the LinkedIn Jobs Scraper on its Apify Store listing and click Try for free (or Run, if you already use it).
  2. Add at least one entry to startUrls — a keyword, a keyword, location string, a company profile URL, a job search URL, or a direct job URL. This is the only required input.
  3. Set sortOrder (relevant or recent) and maxJobs (1–1000 per input); enable proxyConfiguration if you're scraping a company-profile URL or requests get blocked.
  4. Start the run — the Actor discovers matching job IDs first, then scrapes each listing's own detail page and pushes it to the dataset live, as it's collected.
  5. Download the results as JSON, CSV, Excel, or XML from the Output tab, or pull them via the Apify API.

What to do when LinkedIn changes its structure

This Actor is actively maintained, and its output schema is designed to stay stable — the same field names and types keep working on your end even after an internal fix to how a page is parsed. No specific turnaround time is promised for any given breakage.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarray of stringsLinkedIn job search URLs, keywords, company profile URLs, or structured keyword, location / keyword1|keyword2, location inputs. One entry per line. A company profile URL auto-resolves to that employer's real numeric LinkedIn ID before searching."software engineer, United States"
sortOrderNostring (enum: relevant, recent)Sort results by relevance or by recency. Default: relevant."recent"
maxJobsNointeger (1–1000)Maximum number of jobs to scrape per input. Default: 10. Values above 1000 are automatically capped.25
proxyConfigurationNoobjectOptional Apify Proxy configuration. Runs with direct requests (no proxy) by default.{"useApifyProxy": false}

Example JSON input:

{
"startUrls": [
"software engineer, United States",
"https://www.linkedin.com/company/microsoft"
],
"sortOrder": "relevant",
"maxJobs": 25,
"proxyConfiguration": {
"useApifyProxy": false
}
}

The most common mistake is expecting maxJobs above 1000 to return more rows for a single input — LinkedIn's guest search pagination realistically doesn't expose results past that depth, so any higher value is silently capped, with a warning logged in the run console.

⬆️ Output

Every run pushes typed, normalized JSON to the Apify dataset — one row per job — exportable as JSON, CSV, Excel, or XML from the Output tab or the Apify API.

Scraped job listing

{
"id": "4333046374",
"title": "Software Engineering Intern, Summer 2026",
"company": "The Walt Disney Company",
"location": "Glendale, CA",
"postedTimeAgo": "1 day ago",
"numberOfApplicants": "Over 200 applicants",
"applicantsCount": 200,
"description": "About the Role & Program: Product Engineering builds the software and systems which prepare, deliver, and play streaming media content across the Disney media brands...",
"criteria": [
{ "title": "Seniority level", "value": "Mid-Senior level" },
{ "title": "Employment type", "value": "Internship" },
{ "title": "Job function", "value": "Information Technology" },
{ "title": "Industries", "value": "Entertainment Providers" }
],
"jobUrl": "https://www.linkedin.com/jobs/view/software-engineering-intern-summer-2026-at-the-walt-disney-company-4333046374",
"companyLogoUrl": "https://media.licdn.com/dms/image/v2/example/company-logo_100_100/example",
"link": "https://www.linkedin.com/company/the-walt-disney-company",
"scrapedAt": "2026-08-01T12:00:00Z",
"job": {
"id": "4333046374",
"link": "https://www.linkedin.com/jobs/view/software-engineering-intern-summer-2026-at-the-walt-disney-company-4333046374",
"title": "Software Engineering Intern, Summer 2026",
"company": "The Walt Disney Company",
"location": "Glendale, CA"
}
}

numberOfApplicants is LinkedIn's own display text; applicantsCount is the same number parsed out, or null when LinkedIn shows no applicant count for that listing — it is never a faked 0. criteria is an array of {title, value} pairs scraped directly from the listing's own criteria panel, so which titles appear (seniority level, employment type, job function, industries) depends on what LinkedIn published for that specific job. companyLogoUrl is null when no logo is present on the page. job is a legacy nested duplicate of id/link/title/company/location, kept only for backward compatibility with earlier versions of this Actor — the top-level fields carry the same values and are the ones to use.

How does LinkedIn Jobs Scraper compare to other LinkedIn job scrapers?

FeatureLinkedIn Jobs ScraperGeneric alternative
Output formatTyped, normalized JSON✅ / Raw HTML requiring your own parser
Company-scoped searchResolves company URL to LinkedIn's real numeric organization ID❌ Often sends the URL slug straight into the search filter, returning unrelated results
Applicant dataOriginal text plus a normalized numeric count❌ Text only, or not extracted
Input flexibilityKeywords, structured keyword, location, search URLs, company URLs, direct job URLs/IDs❌ Usually keyword-only
Anti-bot handlingRetries with backoff on rate-limit/blocked responses, session warm-up, optional proxy❌ Often none

If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature. Every field above is available the moment the run finishes, with no post-processing step required.

How many jobs can you scrape with LinkedIn Jobs Scraper?

LinkedIn Jobs Scraper caps at 1,000 jobs per individual input — one keyword search, one company, or one search URL — because LinkedIn's own guest job-search pagination doesn't reliably expose results past that depth. The maxJobs parameter (max 1000) sets your target below that ceiling; requesting more for a single input won't return more rows.

Internally, the Actor discovers job IDs 25 at a time, fetching successive pages until it hits your maxJobs target, the 1,000-job ceiling, or a page that returns no new listings. To scrape more than 1,000 jobs in total, add multiple entries to startUrls in the same run — each input gets its own 1,000-job budget, and results are de-duplicated by job ID across the whole run. There is no published benchmark for run duration; it depends on how many inputs and how many jobs per input you request.

Integrate LinkedIn Jobs Scraper and automate your workflow

LinkedIn Jobs Scraper works with any language or tool that can send an HTTP request, through the Apify API.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("YOUR_USERNAME/linkedin-search-jobs-scraper").call(
run_input={
"startUrls": ["software engineer, United States"],
"sortOrder": "relevant",
"maxJobs": 25,
}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"], job["location"])

Works in Python, Node.js, Go, Ruby, cURL.

Automation platforms (n8n, Make)

Apify's own n8n node and Make module can run this Actor by its Actor ID and read back the resulting dataset, so you can trigger a run on a schedule and route new job listings into a spreadsheet, CRM, or Slack channel without writing any glue code yourself.

Yes — LinkedIn Jobs Scraper only extracts job listings that are already publicly visible on LinkedIn's logged-out guest pages, not private or login-gated data. Job postings are business content published by employers to advertise openings, not personal data about identifiable individuals, so this falls under LinkedIn's Terms of Service and general database/content-rights considerations rather than GDPR or CCPA, which govern personal data. Review LinkedIn's Terms of Service for your intended use, and consult legal counsel for commercial use cases, particularly bulk or repeated collection.

❓ Frequently asked questions

Does LinkedIn Jobs Scraper work without a LinkedIn account?

Yes. It only reads LinkedIn's public, logged-out guest job-search and job-posting pages — no login, cookies, or API key are used or required.

How often is the scraped data updated?

Every run fetches live from LinkedIn at the moment it executes; nothing is served from a cache. Each row's scrapedAt field records the UTC timestamp of that fetch.

What happens if a job posting has been removed or expired?

If a listing's detail page can't be loaded, or comes back without both a title and a company name, the Actor logs a warning and skips that listing rather than pushing an incomplete or fabricated row.

Can I scrape private or login-gated LinkedIn job details?

No. The Actor only reads LinkedIn's publicly accessible, logged-out guest pages — job details that require a LinkedIn login to view are not accessible to it.

How is LinkedIn Jobs Scraper priced?

It uses Apify's pay-per-event pricing model, charged per job result returned. Check the Actor's Pricing tab on its Apify Store listing for the current rate.

Does LinkedIn Jobs Scraper work for AI agent workflows and LLM pipelines?

Yes — it's callable as an HTTP endpoint through the Apify API by any agent framework. Every response is typed JSON, ready to pass into an LLM context window or index into a vector store without a parsing step.

How does LinkedIn Jobs Scraper handle LinkedIn's anti-bot system?

It retries with exponential backoff when LinkedIn returns a 429 (rate limit) or 999 (blocked) response, randomizes delays between requests, and warms up each session with an initial homepage request before hitting company or search pages. Apify Proxy is optional and off by default.

Does this scraper extract salary data?

No. LinkedIn's public guest job pages rarely publish structured salary figures, and this Actor does not attempt to extract or infer salary from unstructured text.

Does LinkedIn Jobs Scraper return data in a format LLMs can use directly?

Yes. Every field is typed, normalized JSON with stable field names — no HTML, no selectors, no parsing before you pass it to an LLM.

Can I use LinkedIn Jobs Scraper without managing proxies?

Yes. It runs with direct requests by default; Apify Proxy is an optional input if you're scraping company-profile URLs at volume or requests start getting blocked.

What happens when LinkedIn changes its structure or blocks the scraper?

This Actor is actively maintained, and its output schema is designed to stay stable on your end — field names and types don't change even when the underlying scraping logic is updated. No specific turnaround time is promised.

💬 Your feedback

Found a bug, or missing a field you need? Open an issue on this Actor's Issues tab in the Apify Console — that feedback goes directly to the people maintaining it.