LinkedIn Jobs Scraper — Public Job Listings, No Login Required avatar

LinkedIn Jobs Scraper — Public Job Listings, No Login Required

Pricing

Pay per usage

Go to Apify Store
LinkedIn Jobs Scraper — Public Job Listings, No Login Required

LinkedIn Jobs Scraper — Public Job Listings, No Login Required

Scrape public LinkedIn job listings without authentication. Extract job titles, companies, locations, salaries, posting dates, descriptions, and application links. Filter by keyword, location, job type, experience level, remote/on-site, and posting date. Supports pagination for large result sets. Pe

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ricardo Akiyoshi

Ricardo Akiyoshi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 minutes ago

Last modified

Categories

Share

LinkedIn Jobs Scraper

Scrape public LinkedIn job listings without requiring a LinkedIn account or login. Extract job titles, companies, locations, salaries, descriptions, applicant counts, and application links.

Features

  • No Login Required -- scrapes LinkedIn's public job search pages
  • Rich Data Extraction -- titles, companies, locations, salaries, full descriptions, criteria, apply links
  • Flexible Filters -- keyword, location, time posted, job type, experience level, remote/on-site/hybrid
  • Multiple Parsing Strategies -- handles LinkedIn's frequent HTML changes with 3 fallback strategies
  • User-Agent Rotation -- 8 rotating browser User-Agents to reduce detection
  • Respectful Crawling -- built-in rate limiting and random delays
  • Pagination -- automatically pages through results (up to 1000 per search)
  • PPE Billing -- pay-per-event pricing (charges per job scraped)
  • Proxy Support -- works with Apify residential proxies for reliable results

Input Parameters

ParameterTypeDefaultDescription
keywordstring"software engineer"Job title, skill, or company to search for
locationstring"United States"City, state, country, or "Remote"
timePostedenum"any"any, past24h, pastWeek, pastMonth
jobTypeenum"any"any, fulltime, parttime, contract, internship, temporary, volunteer
experienceLevelenum"any"any, internship, entry, associate, mid-senior, director, executive
remoteFilterenum"any"any, remote, onsite, hybrid
maxResultsinteger25Max jobs to scrape (0 = unlimited)
scrapeJobDetailsbooleantrueVisit each job's detail page for full description
maxConcurrencyinteger2Concurrent requests (keep low for LinkedIn)
proxyConfigurationobject-Apify proxy config (recommended: residential)

Example Input

{
"keyword": "data scientist",
"location": "San Francisco, CA",
"timePosted": "pastWeek",
"jobType": "fulltime",
"experienceLevel": "mid-senior",
"remoteFilter": "remote",
"maxResults": 50,
"scrapeJobDetails": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output

Each scraped job listing contains the following fields:

FieldTypeDescription
titlestringJob title
companystringCompany name
locationstringJob location
salarystringSalary range (if displayed)
jobIdstringLinkedIn job posting ID
jobUrlstringDirect link to job posting
postedDatestringApproximate posting date (ISO 8601)
postedDateRawstringRaw date text from LinkedIn
employmentTypestringFull-time, Part-time, Contract, etc.
experienceLevelstringEntry, Mid-Senior, Director, etc.
industrystringIndustry classification
jobFunctionstringJob function/department
descriptionstringFull job description (plain text)
descriptionHtmlstringFull description (HTML)
criteriaobjectAll job criteria from the detail page
applicantCountstringNumber of applicants text
companyUrlstringCompany LinkedIn page URL
companyDetailsarrayCompany size, industry, etc.
applyUrlstringExternal application URL (if available)
benefitsarrayListed benefits/perks
searchKeywordstringThe keyword used in the search
searchLocationstringThe location used in the search
scrapedAtstringTimestamp when this job was scraped

Example Output

{
"title": "Senior Data Scientist",
"company": "Stripe",
"location": "San Francisco, CA (Remote)",
"salary": "$180,000 - $250,000/yr",
"jobId": "3847291056",
"jobUrl": "https://www.linkedin.com/jobs/view/3847291056/",
"postedDate": "2026-02-25T00:00:00.000Z",
"postedDateRaw": "4 days ago",
"employmentType": "Full-time",
"experienceLevel": "Mid-Senior level",
"industry": "Technology, Information and Internet",
"jobFunction": "Engineering and Information Technology",
"description": "We're looking for a Senior Data Scientist to join our Risk team...",
"descriptionHtml": "<p>We're looking for a Senior Data Scientist...</p>",
"criteria": {
"seniority_level": "Mid-Senior level",
"employment_type": "Full-time",
"job_function": "Engineering and Information Technology",
"industries": "Technology, Information and Internet"
},
"applicantCount": "127 applicants",
"companyUrl": "https://www.linkedin.com/company/stripe",
"companyDetails": ["5,001-10,000 employees", "Financial Services"],
"applyUrl": "https://stripe.com/jobs/listing/senior-data-scientist/...",
"benefits": ["Health insurance", "401(k)"],
"searchKeyword": "data scientist",
"searchLocation": "San Francisco, CA",
"scrapedAt": "2026-03-01T12:00:00.000Z"
}

Use Cases

  • Job Market Research -- analyze hiring trends by role, location, and industry
  • Salary Benchmarking -- collect salary data across companies and regions
  • Competitive Hiring Analysis -- track which companies are hiring for specific roles
  • Lead Generation -- identify companies with open positions for B2B outreach
  • HR & Recruiting -- monitor competitor job postings and compensation
  • Career Planning -- track demand for specific skills and technologies
  • Talent Market Intelligence -- understand which markets have the most openings
  • Academic Research -- study labor market dynamics and trends

Tips for Best Results

  1. Use Proxies -- LinkedIn actively blocks datacenter IPs. Use Apify residential proxies for reliable scraping.
  2. Keep Concurrency Low -- set maxConcurrency to 1-2. LinkedIn is aggressive about rate limiting.
  3. Start Small -- test with maxResults: 10 before scaling up.
  4. Specific Keywords -- more specific keywords yield better results (e.g., "senior react developer" vs "developer").
  5. Off-Peak Hours -- scraping during off-peak hours (weekends, nights) may reduce blocking.

Limitations

  • LinkedIn may change their public page structure at any time. The scraper uses 3 fallback parsing strategies to handle this.
  • Salary data is only available when the employer or LinkedIn chooses to display it (roughly 30-40% of listings).
  • LinkedIn caps public search pagination at approximately 1,000 results.
  • Some job details may require authentication to access -- the scraper extracts what is publicly available.
  • Rate limiting is common. Using residential proxies significantly improves reliability.

Cost / Pricing

This actor uses Pay-Per-Event (PPE) pricing. You are charged for each job listing successfully scraped. There is no charge for failed requests or blocked pages.

Technical Details

  • Built with CheerioCrawler from Crawlee (no browser overhead)
  • ESM modules (Node.js 20+)
  • Handles LinkedIn's auth walls, CAPTCHAs, and 999 error codes
  • Automatic retry with exponential backoff on failures
  • Deduplicates results by LinkedIn job ID

Integration — Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("sovereigntaylor/linkedin-jobs-scraper").call(run_input={
"keyword": "data scientist",
"location": "San Francisco, CA",
"timePosted": "pastWeek",
"maxResults": 50,
"scrapeJobDetails": True,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"]
}
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
salary = job.get("salary", "Not listed")
print(f"{job['title']} at {job['company']}{salary}")

Integration — JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('sovereigntaylor/linkedin-jobs-scraper').call({
keyword: 'data scientist',
location: 'San Francisco, CA',
timePosted: 'pastWeek',
maxResults: 50,
scrapeJobDetails: true,
proxyConfiguration: {
useApifyProxy: true,
apifyProxyGroups: ['RESIDENTIAL']
}
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(job => {
console.log(`${job.title} at ${job.company}${job.salary || 'Not listed'}`);
});