LinkedIn Jobs Scraper (Public Data)
Pricing
Pay per usage
LinkedIn Jobs Scraper (Public Data)
Scrapes publicly accessible LinkedIn job listings without login. Extracts job title, company, location, salary, description, and more from public job search pages.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
abdulrahman alrashid
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
LinkedIn Jobs Scraper (Public Data Only)
Scrape publicly accessible LinkedIn job listings without any login or authentication. Extract job titles, company names, locations, salaries, descriptions, and more from LinkedIn's public job search pages.
Legal Disclaimer
This Actor only scrapes publicly accessible data from LinkedIn. No login credentials are used, no authentication is bypassed, and no private or gated data is accessed. All data collected is visible to any visitor of linkedin.com without signing in.
Users are responsible for ensuring their use of this tool and the data collected complies with:
- LinkedIn's Terms of Service
- All applicable local, state, and federal laws (including GDPR, CCPA, and other data protection regulations)
- The hiQ Labs v. LinkedIn ruling establishes that scraping publicly available data is not a violation of the CFAA, but legal interpretations vary by jurisdiction
This tool is provided "as is" without warranties. The authors are not responsible for any misuse.
Features
- Search jobs by keyword, location, and multiple filters
- Filter by job type (full-time, contract, etc.), experience level, date posted, and workplace type (remote/hybrid/on-site)
- Extract full job details: title, company, location, salary, description, seniority level, employment type, job function, industry, applicant count
- Scrape company info (optional): name, industry, size, headquarters, website, description
- Direct URL scraping: provide specific job URLs to scrape
- Pagination support: automatically follows search result pages
- Anti-bot handling: session rotation, randomized delays, browser-like headers
- Playwright fallback: if Cheerio fails (JavaScript-rendered content), Playwright takes over
- Pay-per-event pricing: $1.50 per 1,000 results
Input Configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
searchKeywords | string | "" | Job search keywords (e.g., "software engineer") |
location | string | "" | Location filter (e.g., "United States", "New York") |
jobType | array | [] | Filter: full-time, part-time, contract, temporary, internship, volunteer, other |
experienceLevel | array | [] | Filter: internship, entry-level, associate, mid-senior, director, executive |
datePosted | string | "any" | Filter: any, past-24h, past-week, past-month |
workplaceType | array | [] | Filter: on-site, remote, hybrid |
maxResults | integer | 50 | Maximum number of job listings to scrape (1-1000) |
scrapeCompanyInfo | boolean | false | Also scrape basic public company information |
directJobUrls | array | [] | Direct LinkedIn job URLs to scrape (bypasses search) |
proxyConfiguration | object | Apify Residential | Proxy settings (residential proxies recommended) |
maxRequestRetries | integer | 3 | Max retries per failed request |
minDelayMs | integer | 2000 | Minimum delay between requests (ms) |
maxDelayMs | integer | 5000 | Maximum delay between requests (ms) |
Example Input
{"searchKeywords": "data engineer","location": "Remote","jobType": ["full-time"],"experienceLevel": ["mid-senior"],"datePosted": "past-week","workplaceType": ["remote"],"maxResults": 100,"scrapeCompanyInfo": true}
Direct URL Scraping
{"directJobUrls": ["https://www.linkedin.com/jobs/view/1234567890","https://www.linkedin.com/jobs/view/9876543210"]}
Output Format
Job Listing
{"jobId": "3812345678","title": "Senior Data Engineer","companyName": "Example Corp","companySlug": "example-corp","companyUrl": "https://www.linkedin.com/company/example-corp","location": "San Francisco, CA (Remote)","postedDate": "2025-03-15","postedDateRaw": "2 days ago","applicantCount": "Over 100 applicants","salary": "$150,000 - $200,000/yr","workplaceType": "Remote","seniorityLevel": "Mid-Senior level","employmentType": "Full-time","jobFunction": "Engineering and Information Technology","industries": "Technology, Information and Internet","descriptionText": "We are looking for a Senior Data Engineer to join our team...","descriptionHtml": "<p>We are looking for a Senior Data Engineer...</p>","jobUrl": "https://www.linkedin.com/jobs/view/3812345678","scrapedAt": "2025-03-17T10:30:00.000Z"}
Company Info (when scrapeCompanyInfo is enabled)
{"type": "company","companySlug": "example-corp","name": "Example Corp","tagline": "Building the future of data","industry": "Technology, Information and Internet","companySize": "1,001-5,000 employees","headquarters": "San Francisco, California","website": "https://example.com","companyType": "Public Company","founded": "2010","specialties": "Cloud Computing, Data Engineering, AI","description": "Example Corp is a leading technology company...","companyUrl": "https://www.linkedin.com/company/example-corp","scrapedAt": "2025-03-17T10:30:00.000Z"}
Pricing
This Actor uses Pay-Per-Event pricing at $1.50 per 1,000 results ($0.0015 per job listing).
You are only charged for successfully scraped job listings that appear in your dataset. Failed requests, retries, and search page fetches are not charged.
Technical Details
Architecture
- CheerioCrawler (primary): Fast, lightweight HTML parser for LinkedIn's server-rendered job pages. Uses minimal resources and handles most pages.
- PlaywrightCrawler (fallback): Full browser automation for pages that require JavaScript rendering. Activates automatically if CheerioCrawler returns zero results.
Anti-Bot Measures
- Session pool rotation: Sessions are rotated after a few uses to distribute requests
- Randomized delays: Configurable minimum and maximum delays between requests
- Browser-like headers: Randomized User-Agent strings and standard browser headers
- Residential proxies: Recommended for best success rates (Apify residential proxy group)
- Conservative concurrency: Max 3 concurrent requests to avoid triggering rate limits
LinkedIn Public URLs Used
- Job search:
https://www.linkedin.com/jobs/search/?keywords=... - Job detail:
https://www.linkedin.com/jobs/view/{jobId}/ - Company page:
https://www.linkedin.com/company/{slug}/ - Pagination API:
https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?...
All of these URLs serve content to unauthenticated visitors.
Tips for Best Results
- Use residential proxies for the highest success rate. Datacenter IPs are more likely to be blocked.
- Keep delays reasonable (2-5 seconds). Going faster risks temporary IP blocks.
- Limit concurrency to 1-3 for sustained scraping.
- Start small with
maxResults: 10to verify your filters work, then scale up. - Use direct URLs when you know the exact job listings you want — avoids search pagination entirely.
Local Development
# Install dependenciesnpm install# Create local inputecho '{"searchKeywords": "software engineer", "location": "New York", "maxResults": 5}' > storage/key_value_stores/default/INPUT.json# Run locallynpm start
Changelog
1.0.0
- Initial release
- CheerioCrawler with Playwright fallback
- Full search filter support
- Company info scraping
- Pay-per-event pricing