Linkedin Job Scraper
Pricing
$0.50 / 1,000 results
Linkedin Job Scraper
Fast, reliable LinkedIn job scraper that extracts structured data from public job listings — no LinkedIn account required.
LinkedIn Jobs Scraper - No Login Required
Fast, reliable LinkedIn job scraper that extracts 20+ structured fields from public job listings. No LinkedIn account, cookies, or API key needed.
Why This Actor?
- 20+ fields included — seniority level, industries, job function, skills, and more. Other actors charge $30/month extra for these fields.
- No login, no cookies — scrapes LinkedIn's public job pages. Zero setup, zero risk to your LinkedIn account.
- Skills extraction — automatically extracts skills mentioned in job descriptions. No upsell, no "Advanced" tier.
- Cross-query deduplication — run multiple overlapping queries and get clean, unique results.
- Concurrent fetching — configurable parallelism (1-20 workers). Scrape 1,000 jobs in ~2.5 minutes.
- Reliable — exponential backoff with jitter on rate limits (4 retries). Proxy rotation built in.
- Boolean search — use LinkedIn's native search operators:
"data engineer" AND (Python OR SQL) NOT junior. - Lightweight — runs on 256MB memory, keeping your compute costs low.
Cost
$0.50 per 1,000 results (platform usage included).
| Results | Cost |
|---|---|
| 100 | $0.05 |
| 1,000 | $0.50 |
| 10,000 | $5.00 |
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | ["software engineer"] | Search queries (supports boolean operators) |
location | string | "" | Location name (e.g. "Finland", "New York") |
geo_id | string | "" | LinkedIn GeoID — overrides location if set |
max_results_per_query | integer | 25 | Max results per query (up to 1000) |
date_posted | enum | "" | Filter: "", pastDay, pastWeek, pastMonth |
experience_level | string[] | [] | LinkedIn codes: 1=Internship, 2=Entry, 3=Associate, 4=Mid-Senior, 5=Director, 6=Executive |
concurrency | integer | 5 | Parallel detail requests (1-20) |
min_delay_ms | integer | 300 | Minimum delay between requests (ms) |
max_delay_ms | integer | 800 | Maximum delay between requests (ms) |
proxy | object | Apify proxy | Proxy configuration |
include_description_html | boolean | false | Include raw HTML description in output |
Example Input
{"queries": ["software engineer","\"data scientist\" AND Python NOT junior"],"location": "San Francisco","max_results_per_query": 100,"date_posted": "pastWeek","experience_level": ["4", "5"],"concurrency": 10}
Output
Every result includes 20+ fields. All fields are present in every result — missing data returns null, never errors.
| Field | Type | Description |
|---|---|---|
job_id | string | LinkedIn job ID |
job_url | string | Direct URL to the job posting |
job_title | string | Job title |
company_name | string | Company name |
location | string | Job location |
job_description | string | Plain text description |
seniority_level | string | e.g. "Mid-Senior level", "Director" |
employment_type | string | e.g. "Full-time", "Contract" |
job_function | string | e.g. "Engineering", "Information Technology" |
industries | string | e.g. "Software Development" |
skills | string[] | Skills extracted from the job description |
salary_range | string | Salary info if listed |
posted_date | string | ISO date when posted |
applicant_count | string | e.g. "Over 200 applicants" |
company_url | string | LinkedIn company page URL |
workplace_type | string | "Remote", "On-site", or "Hybrid" |
apply_url | string | External application URL if available |
description_html | string | Raw HTML description (only if include_description_html is true) |
Example Output
{"job_id": "3812345678","job_url": "https://www.linkedin.com/jobs/view/3812345678","job_title": "Senior Software Engineer","company_name": "Acme Corp","location": "San Francisco, CA","job_description": "We are looking for a senior software engineer...","seniority_level": "Mid-Senior level","employment_type": "Full-time","job_function": "Engineering","industries": "Software Development","skills": ["Python", "AWS", "Kubernetes", "React", "PostgreSQL"],"salary_range": "$150,000 - $200,000","posted_date": "2026-03-15","applicant_count": "Over 200 applicants","company_url": "https://www.linkedin.com/company/acme-corp","workplace_type": "Hybrid","apply_url": "https://acme.com/careers/12345"}
Usage Tips
- Start small: Test with 1 query and 5-10 results before scaling up
- Use boolean search: Combine terms with AND, OR, NOT and quotes for exact phrases. Example:
"product manager" AND (B2B OR SaaS) NOT intern - Use date filters:
pastWeekreduces results and speeds up scraping - Tune concurrency: Start at 5, increase to 10-15 with proxy enabled
- Enable proxy for large runs: Scraping 500+ jobs without proxy may hit rate limits
- Combine queries: Use multiple specific queries rather than one broad query for better results
- GeoID vs location: GeoID is more precise — use it if you know the LinkedIn code for your target region
Common Use Cases
- Job boards and aggregators — feed fresh listings into your platform
- Recruitment pipelines — monitor openings at target companies
- Salary benchmarking — collect compensation data across roles and regions
- Market research — track hiring trends, skill demand, and competitive intelligence
- Personal job alerts — monitor 100 jobs/day for just $0.05
Limitations
- LinkedIn public pages show up to ~1000 results per search query
- Salary information is only available if the employer has listed it
- Some fields (applicant count, apply URL) may not be present on all listings
- Rate limits apply even with proxy — the actor handles this with retry and backoff
Disclaimer
This actor scrapes publicly accessible LinkedIn job pages that do not require login. It is your responsibility to ensure your use complies with LinkedIn's Terms of Service and all applicable laws. The author provides this tool as-is and assumes no liability for how it is used.