LinkedIn Jobs Scraper - Professional Job Listings
Pricing
from $3.00 / 1,000 results
LinkedIn Jobs Scraper - Professional Job Listings
Scrapes public job listings from LinkedIn's job board. Filter by location, job type, experience level, and remote options. Extract company info, job descriptions, and application links. No login required.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer

Alessandro Santamaria
Actor stats
0
Bookmarked
49
Total users
13
Monthly active users
4 days ago
Last modified
Categories
Share
LinkedIn Job Scraper
Scrapes job listings from LinkedIn Jobs - the world's largest professional network with 1B+ members and millions of job postings worldwide.
HTTP-only, ultra-lightweight - No browser needed. Runs on just 128-512 MB of memory for extremely low compute costs.
Three Scraping Modes
| Mode | Input | Output | Use Case |
|---|---|---|---|
| SEARCH MODE | Search query + filters | Basic job data from SERP | Fast discovery of new jobs |
| SEARCH + DETAILS MODE | includeJobDetails: true | Full job data with descriptions | Complete data collection in one run |
| DIRECT URLS MODE | directUrls: [...] | Full job data + job_status | Still-alive checks, re-scraping specific jobs |
Features
- Global coverage - Search jobs in any country or location worldwide
- Advanced filters - Filter by date posted, job type, experience level, and remote options
- No login required - Uses LinkedIn's public guest API for job search and detail pages
- Job status checks - Verify if jobs are still online, expired, or removed
- Rich data extraction - Title, company, location, description, seniority level, industry, applicant count, and more
- Ultra-low resource usage - HTTP-only, no Chrome browser needed (128-512 MB)
- Swiss canton detection - Automatically detects Swiss canton codes from location
- Standardized output - Consistent
JobListingschema across all job scrapers - Pay-per-result pricing - Only pay for results you get
- Rate-limited - Respectful delays between requests
- Proxy support - Built-in proxy rotation for reliability
Pricing
This actor uses pay-per-result pricing. You only pay for the data you receive.
| Event | Price | Description |
|---|---|---|
| SERP result | $0.008 | Each job from search results (search-only mode) |
| Detail result | $0.020 | Each job with full details (detail mode or direct URLs) |
Examples:
- 100 search results = $0.80
- 50 jobs with full details = $1.00
- 200 search results + 50 detailed = $2.60
No monthly fees. No minimum spend. Compute costs are minimal (~$0.002/run).
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | array | Direct job URLs to scrape (skips search mode) | [] |
searchQuery | string | Job title, skills, or keywords to search for | "" |
location | string | City, country, or region (e.g., "Zurich", "Switzerland", "Germany") | "" |
datePosted | string | Filter by posting date: any, past-24h, past-week, past-month | any |
jobType | string | Filter by job type: full-time, part-time, contract, temporary, internship | "" |
experienceLevel | string | Filter by experience: entry, associate, mid-senior, director, executive | "" |
remoteFilter | string | Filter by workplace: remote, on-site, hybrid | "" |
maxResults | integer | Maximum number of job listings to scrape (1-1000) | 100 |
includeJobDetails | boolean | Fetch full job descriptions from detail pages (slower but richer data) | false |
proxyConfiguration | object | Apify proxy settings | Residential |
Mode 1: SEARCH MODE (Fast)
Search for jobs using keywords and filters:
- Use case: Discover new jobs, market analysis, broad searches
- Speed: Very fast - pure HTTP requests
- Output: Basic job data from search results + company URL
- Cost: $0.008 per result
{"searchQuery": "Software Engineer","location": "Switzerland","datePosted": "past-week","jobType": "full-time","maxResults": 100}
Mode 2: SEARCH + DETAILS MODE (Complete Data)
Search with includeJobDetails: true to fetch full descriptions:
- Use case: Complete data collection in one run
- Speed: Moderate - fetches detail page for each job via HTTP
- Output: Full descriptions, seniority level, industry, applicant count, company info
- Cost: $0.020 per result
{"searchQuery": "Data Scientist","location": "Zurich","maxResults": 50,"includeJobDetails": true}
Mode 3: DIRECT URLS MODE (Still Alive Checks)
When directUrls is provided, the scraper operates in direct mode:
- Skips search phase - Goes directly to provided job URLs
- Job status detection - Returns
online,offline,expired, orunknown - Full data extraction - Same as detail page scraping
- Use case: Periodic "still alive" checks, re-scraping specific jobs after deduplication
- Cost: $0.020 per result
{"directUrls": ["https://www.linkedin.com/jobs/view/3812345678","https://www.linkedin.com/jobs/view/3823456789","https://www.linkedin.com/jobs/view/senior-software-engineer-at-google-3834567890"]}
Filter Options
Date Posted
| Value | Description |
|---|---|
any | All jobs (default) |
past-24h | Posted in last 24 hours |
past-week | Posted in last 7 days |
past-month | Posted in last 30 days |
Job Type
| Value | Description |
|---|---|
full-time | Full-time positions |
part-time | Part-time positions |
contract | Contract/freelance work |
temporary | Temporary positions |
internship | Internships |
Experience Level
| Value | Description |
|---|---|
entry | Entry level / Junior |
associate | Associate level |
mid-senior | Mid-Senior level |
director | Director level |
executive | Executive / C-level |
Remote/On-site
| Value | Description |
|---|---|
remote | Fully remote positions |
on-site | On-site only |
hybrid | Hybrid work arrangements |
Example Input
Basic Search (IT Jobs in Switzerland)
{"searchQuery": "Software Engineer","location": "Switzerland","maxResults": 100}
Recent Remote Jobs
{"searchQuery": "Developer","remoteFilter": "remote","datePosted": "past-week","maxResults": 200}
Senior Positions in Zurich
{"searchQuery": "Manager","location": "Zurich","experienceLevel": "mid-senior","jobType": "full-time","maxResults": 50}
Full Data Collection
{"searchQuery": "Data Engineer","location": "Germany","maxResults": 100,"includeJobDetails": true}
Direct URLs - Still Alive Check
{"directUrls": ["https://www.linkedin.com/jobs/view/3812345678","https://www.linkedin.com/jobs/view/3823456789"]}
Output
Each job listing follows the standardized JobListing schema:
Search Mode Output
{"id": "4371481846","title": "Senior Software Engineer, Checkout","company": "GetYourGuide","location": "Zurich, Zurich, Switzerland","canton": "ZH","country": "CH","job_status": "online","top_listing": false,"actively_hiring": true,"employment_type": null,"salary_text": null,"posted_at": "2026-03-05T00:00:00.000Z","source_url": "https://www.linkedin.com/jobs/view/4371481846","source_platform": "linkedin","company_url": "https://de.linkedin.com/company/getyourguide-ag","scraped_at": "2026-03-09T08:30:00.000Z"}
Detail Mode Output (additional fields)
{"id": "4371481846","title": "Senior Software Engineer, Checkout (Backend Focused)","company": "GetYourGuide","location": "Zurich, Zurich, Switzerland","canton": "ZH","country": "CH","job_status": "online","employment_type": "full-time","description_snippet": "Get ready for an exciting career with GetYourGuide...","description_full": "Full job description with all details...","company_url": "https://de.linkedin.com/company/getyourguide-ag","company_industry": "Technology, Information and Internet","seniority_level": "Mid-Senior level","job_function": "Engineering and Information Technology","applicants": "<25","posted_at": "2026-03-05T00:00:00.000Z","source_url": "https://www.linkedin.com/jobs/view/4371481846","source_platform": "linkedin","scraped_at": "2026-03-09T08:30:00.000Z"}
Output Fields
Core Fields (always available)
| Field | Description |
|---|---|
id | LinkedIn job ID |
title | Job title |
company | Company name |
location | City/location as displayed |
country | Country code (AT, CH, DE) |
canton | Swiss canton code (ZH, BE, etc.) - only for Swiss jobs |
job_status | Job availability: online, offline, expired, unknown |
top_listing | Whether job is promoted/sponsored |
actively_hiring | Whether company shows "Actively Hiring" badge |
posted_at | Publication date (ISO 8601) |
source_url | Link to job posting on LinkedIn |
source_platform | Always linkedin |
company_url | LinkedIn company page URL (tracking params stripped) |
scraped_at | Timestamp when job was scraped |
Detail Fields (with includeJobDetails: true or Direct URLs mode)
| Field | Description |
|---|---|
employment_type | full-time, part-time, contract, temporary, internship |
description_snippet | First 500 characters of description |
description_full | Complete job description (cleaned text) |
company_industry | Company industry/sector (e.g., "IT Services and IT Consulting") |
seniority_level | Seniority level (e.g., "Entry level", "Mid-Senior level", "Director") |
job_function | Job function (e.g., "Engineering and Information Technology") |
applicants | Applicant count: <25, 95, 200+ etc. |
salary_text | Salary as displayed (if available) |
apply_url | External application URL |
remote_option | remote, hybrid, onsite |
Additional Fields
| Field | Description |
|---|---|
workload_min / workload_max | Workload percentage (usually null for LinkedIn) |
requirements | Array of requirements (usually empty) |
company_employee_count | Company size range |
company_website | External company website URL |
contact_* | Contact person fields (usually null for LinkedIn) |
Applicants Field Format
The applicants field normalizes LinkedIn's various applicant display formats:
| LinkedIn shows | Output |
|---|---|
| "Be among the first 25 applicants" | <25 |
| "95 applicants" | 95 |
| "Over 200 applicants" | 200+ |
Usage
Via Apify Console
- Go to the actor page
- Configure input parameters
- Click "Start"
- Download results from the Dataset tab (JSON, CSV, Excel)
Via API
curl -X POST "https://api.apify.com/v2/acts/santamaria~linkedin-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "Software Engineer","location": "Switzerland","maxResults": 100}'
Via Apify SDK (Node.js)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('santamaria-automations/linkedin-scraper').call({searchQuery: 'Data Scientist',location: 'Zurich',datePosted: 'past-week',maxResults: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} jobs`);
Still Alive Checks via API
// Check if previously scraped jobs are still onlineconst run = await client.actor('santamaria-automations/linkedin-scraper').call({directUrls: ['https://www.linkedin.com/jobs/view/3812345678','https://www.linkedin.com/jobs/view/3823456789',]});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(job => {console.log(`Job ${job.id}: ${job.job_status}`);// Output: "Job 3812345678: online" or "Job 3823456789: expired"});
Performance
| Metric | Search Mode | Detail Mode |
|---|---|---|
| Speed | ~50-100 jobs/min | ~30-40 jobs/min |
| Memory | 128-256 MB | 256-512 MB |
| Compute cost | ~$0.002/run | ~$0.003/run |
- Rate limiting: 2 seconds between search pages, 1 second between detail pages
- Retry logic: Automatic retries with exponential backoff
- Zero browser overhead: Pure HTTP requests with TLS fingerprinting
Proxy Recommendations
LinkedIn has anti-bot protection. For best results:
- Use Residential proxies for large-scale scraping (500+ results)
- No proxy needed for small runs (<100 results) in many regions
- Avoid Datacenter proxies (may be blocked)
- Keep
maxResultsreasonable (<500 per run)
{"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Common Use Cases
- Job market analysis - Track hiring trends across industries and locations
- Competitive intelligence - Monitor which companies are hiring for specific roles
- Job aggregation - Build job search platforms with LinkedIn data
- Still-alive monitoring - Check if previously scraped jobs are still active
- Lead generation - Find companies that are actively hiring (use
actively_hiringfield) - Recruitment analytics - Analyze seniority levels, industries, and applicant competition
- Salary research - Analyze compensation ranges when displayed
How It Works
Technical Architecture
This actor is 100% HTTP-only - no browser automation needed. It uses:
- LinkedIn Guest API - Public API endpoints that don't require authentication
- got-scraping - HTTP client with TLS fingerprinting for browser-like requests
- Cheerio - Fast HTML parser for extracting structured data
Search Mode (Modes 1 & 2)
- Queries LinkedIn's guest search API with your filters
- Parses job cards from HTML response (using
data-entity-urnfor reliable ID extraction) - Optionally fetches each job's detail page via the guest detail API
- Validates each job against the schema before saving
- Paginates automatically until
maxResultsis reached
Direct URLs Mode (Mode 3)
- Extracts job ID from each provided URL
- Fetches job data via the guest detail API
- Detects job status (online, expired, offline)
- Returns full job data with status field
Limitations
- Some job details (salary, requirements) may not always be available on LinkedIn
- LinkedIn's page structure changes occasionally; we update selectors regularly
- Rate limiting applies - very large runs (1000+) may take several minutes
- No login required - only publicly accessible job data is scraped
- Swiss canton codes are automatically detected but depend on location text quality
Legal Notice
This actor scrapes publicly available job listings from LinkedIn's public job search (no login required). It does not access any data behind LinkedIn's authentication wall.
Users are responsible for ensuring their use complies with LinkedIn's Terms of Service and applicable laws in their jurisdiction.
Feedback & Support
Have a feature request, found a bug, or need help? Open an issue — we actively monitor and respond.
Part of the Santamaria Job Scrapers Suite - Professional-grade job data for the DACH region and beyond.
Need help with integration, aggregation, or custom scraping solutions? Contact us at contact@alessandrosantamaria.com