LinkedIn Jobs Scraper (Public Data) avatar

LinkedIn Jobs Scraper (Public Data)

Pricing

Pay per usage

Go to Apify Store
LinkedIn Jobs Scraper (Public Data)

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

abdulrahman alrashid

Maintained by Community

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.

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

ParameterTypeDefaultDescription
searchKeywordsstring""Job search keywords (e.g., "software engineer")
locationstring""Location filter (e.g., "United States", "New York")
jobTypearray[]Filter: full-time, part-time, contract, temporary, internship, volunteer, other
experienceLevelarray[]Filter: internship, entry-level, associate, mid-senior, director, executive
datePostedstring"any"Filter: any, past-24h, past-week, past-month
workplaceTypearray[]Filter: on-site, remote, hybrid
maxResultsinteger50Maximum number of job listings to scrape (1-1000)
scrapeCompanyInfobooleanfalseAlso scrape basic public company information
directJobUrlsarray[]Direct LinkedIn job URLs to scrape (bypasses search)
proxyConfigurationobjectApify ResidentialProxy settings (residential proxies recommended)
maxRequestRetriesinteger3Max retries per failed request
minDelayMsinteger2000Minimum delay between requests (ms)
maxDelayMsinteger5000Maximum 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

  1. CheerioCrawler (primary): Fast, lightweight HTML parser for LinkedIn's server-rendered job pages. Uses minimal resources and handles most pages.
  2. 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

  1. Use residential proxies for the highest success rate. Datacenter IPs are more likely to be blocked.
  2. Keep delays reasonable (2-5 seconds). Going faster risks temporary IP blocks.
  3. Limit concurrency to 1-3 for sustained scraping.
  4. Start small with maxResults: 10 to verify your filters work, then scale up.
  5. Use direct URLs when you know the exact job listings you want — avoids search pagination entirely.

Local Development

# Install dependencies
npm install
# Create local input
echo '{"searchKeywords": "software engineer", "location": "New York", "maxResults": 5}' > storage/key_value_stores/default/INPUT.json
# Run locally
npm start

Changelog

1.0.0

  • Initial release
  • CheerioCrawler with Playwright fallback
  • Full search filter support
  • Company info scraping
  • Pay-per-event pricing