⚡ Fast LinkedIn Jobs Scraper
Pricing
$20.00 / 1,000 job listing results
⚡ Fast LinkedIn Jobs Scraper
Fast, login-free LinkedIn job search scraper. Extract enriched job listings, salary estimates, skill demand analytics, and major-matching data into JSON/CSV.
Pricing
$20.00 / 1,000 job listing results
Rating
0.0
(0)
Developer
RD.Galih Rakasiwi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
🔍 LinkedIn Jobs Scraper & Market Intelligence
Production-grade job market data — no login, no cookies, no friction. Extract enriched job listings, salary estimates, skill-demand analytics, and academic-major-matched opportunities from LinkedIn's public endpoints. Purpose-built for AI pipelines, quantitative recruiting, and labor market intelligence at scale.
Why This Actor Wins in a Crowded Market
Most LinkedIn scrapers in the Apify Store are commoditized — they extract basic title/company/location tuples and call it a day. This Actor is different. It was architected from the ground up as a market intelligence engine, not just a scraper.
| Capability | Typical LinkedIn Scrapers | This Actor |
|---|---|---|
| Authentication | Require cookies / session tokens | ✅ 100% login-free — guest endpoint with session orchestration |
| Salary Extraction | No or basic regex | ✅ Multi-currency parser (6 regex patterns + context-aware period detection) |
| Skill Tagging | Manual or none | ✅ 125+ technical & soft skills auto-extracted from job descriptions |
| Analytics Layer | Not available | ✅ Skill demand ranking, salary distribution, workplace-type breakdown |
| Academic Major Matching | Not available | ✅ Curated skill → job-title mapping for 25+ university majors |
| Speed Modes | One speed only | ✅ Fast Mode (5–10× faster, search-card data) vs. Full Enrichment |
| Output Quality | Inconsistent fields | ✅ 25+ typed fields per job, flat schema, CSV/JSON export ready |
| AI/LLM Readiness | Raw HTML or sparse JSON | ✅ Clean structured output, embedding-ready, RAG-pipeline compatible |
| Resilience | Often none | ✅ Token-bucket rate limiter, exponential backoff, proxy integration, circuit-breaker patterns |
The bottom line: If you need raw job listings, any scraper works. If you need enriched, analytics-ready labor market data that feeds directly into an AI pipeline, dashboard, or decision engine — this is the tool.
Key Features
🎯 Multi-Mode Job Scraping
| Mode | What It Does | Best For |
|---|---|---|
search | Single keyword, maximum detail (25+ fields per job) | Targeted job market research |
batch_search | Up to 10 keywords in parallel, results merged & deduplicated | Cross-role market comparison |
major_search | Auto-generates keyword from academic major (e.g., "Teknik Informatika") | University career centers, edtech platforms |
analytics | Runs skill-demand & salary analysis on a keyword — no per-result charge | Labor market intelligence dashboards |
💰 Salary Intelligence
- 6 regex patterns covering USD (
$102,000 – $159,000), IDR (Rp 8.000.000 – Rp 15.000.000), EUR, GBP, JPY, and bare-number formats - Context-aware period detection — monthly vs. hourly vs. annual, inferred from surrounding text and currency
- Structured output —
salary_min,salary_max,salary_currency,salary_period,salary_raw
📊 Skill Demand Analytics
- 125+ technical skills auto-extracted: programming languages, frameworks, databases, cloud platforms, DevOps tools, ML/AI libraries
- 25+ soft skills detected: Communication, Leadership, Agile, Scrum, Project Management
- Aggregated summaries included at no extra charge when
enableAnalytics: true
🎓 Academic Major → Job Matching
Curated skill-to-job-title mapping for 25+ Indonesian university majors. Enter "Teknik Informatika" and the Actor auto-generates an optimized Boolean search query from the most relevant skills, then returns matching job listings.
⚡ Dual Speed Modes
| Mode | Speed | Fields Returned | Cost Implication |
|---|---|---|---|
| Full Enrichment (default) | Normal (~20–35s per query) | 25+ fields: salary, skills, benefits, description, criteria | Same per-result price, richer data |
Fast Mode (fastMode: true) | 5–10× faster | Core fields: id, title, company, location, link | Same per-result price, faster throughput |
Input Schema
{"mode": "search","keyword": "Data Engineer","location": "Indonesia","maxItems": 25,"remoteOnly": false,"experienceLevel": "mid","employmentType": "full-time","datePosted": "week","fastMode": false,"enableAnalytics": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]},"requestTimeoutSecs": 30,"debugMode": false}
Full Parameter Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | enum | "search" | search, batch_search, major_search, or analytics |
keyword | string | — | Job title, skill, or Boolean query. Supports AND, OR, NOT, "exact phrase" |
keywords | string[] | [] | List of queries for batch_search mode (max 10) |
majorName | enum | — | Academic major name for major_search mode (25+ options) |
location | string | — | Country, city, or region filter (leave empty for worldwide) |
maxItems | integer | 10 | Results per query (1–25) |
remoteOnly | boolean | false | Remote positions only |
experienceLevel | enum | — | internship, entry, associate, mid, senior, director, executive |
employmentType | enum | — | full-time, part-time, contract, temporary, internship |
datePosted | enum | "month" | "24h", "week", or "month" |
fastMode | boolean | false | Skip detail fetch — 5–10× faster, returns core fields only |
enableAnalytics | boolean | false | Append a free analytics summary record to the dataset |
proxyConfiguration | object | Residential | Apify proxy settings (highly recommended) |
requestTimeoutSecs | integer | 30 | HTTP request timeout (10–120 seconds) |
debugMode | boolean | false | Enable verbose structured logging |
Enriched Output Sample
Every job listing is pushed to your dataset as a single flat record — no nesting surprises, CSV-export-ready on day one.
{"id": 4435506324,"title": "Data Engineer","company_name": "TechCorp Indonesia","company_industry": "Technology, Information and Internet","company_logo_url": "https://media.licdn.com/dms/image/...","company_linkedin_url": "https://www.linkedin.com/company/techcorp/","location_city": "Jakarta","location_state": "Jakarta","location_country": "Indonesia","location_formatted": "Jakarta, Indonesia","workplace_type": "Hybrid","employment_type": "Full-time","seniority_level": "Mid-Senior level","job_function": "Engineering","industries": ["Technology", "Information Services"],"posted_at": "2026-08-06T00:00:00+00:00","posted_time_ago": "3 days ago","applicant_count": 47,"salary_min": 15000000.0,"salary_max": 25000000.0,"salary_currency": "IDR","salary_period": "monthly","salary_raw": "Rp 15.000.000 - Rp 25.000.000","skills": [{ "name": "Python", "category": "technical" },{ "name": "SQL", "category": "technical" },{ "name": "Apache Airflow", "category": "technical" },{ "name": "Apache Spark", "category": "technical" },{ "name": "AWS", "category": "technical" },{ "name": "Communication", "category": "soft" }],"benefits": ["BPJS Kesehatan", "BPJS Ketenagakerjaan", "Remote Work Flexibility"],"requirements": ["3+ years of experience in data engineering","Strong proficiency in Python and SQL","Experience with Apache Airflow or similar orchestration tools"],"description_snippet": "We are looking for a Data Engineer to build and maintain our data platform. You will design ETL pipelines...","easy_apply": true,"linkedin_url": "https://www.linkedin.com/jobs/view/4435506324","_query_keyword": "Data Engineer","_query_location": "Indonesia","scraped_at": "2026-08-09T06:00:00+00:00"}
Analytics Summary (appended when
enableAnalytics: true— no extra charge):{"type": "summary","query_keyword": "Data Engineer","query_location": "Indonesia","total_jobs_found": 25,"top_skills": "Python, SQL, Apache Spark, AWS, ETL","salary_range": "8000000 – 35000000","workplace_distribution": { "On-site": 12, "Hybrid": 9, "Remote": 4 }}
Quick Integration
Python (Apify SDK)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_API_TOKEN")# Launch the Actor and wait for completionrun = client.actor("galih_rakasiwi/linkedin-job-market-api").call(run_input={"mode": "search","keyword": "Data Engineer","location": "Indonesia","maxItems": 25,"enableAnalytics": True})# Fetch results — flat JSON, ready for pandasjobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())# Load into DataFrame for analysisimport pandas as pddf = pd.DataFrame(jobs)print(f"Extracted {len(df)} jobs | Salary range: {df['salary_min'].min():.0f} – {df['salary_max'].max():.0f} {df['salary_currency'].mode()[0]}")
cURL (REST API)
curl -X POST "https://api.apify.com/v2/acts/galih_rakasiwi~linkedin-job-market-api/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "search","keyword": "Machine Learning Engineer","location": "Singapore","maxItems": 25,"datePosted": "week","enableAnalytics": true}'# Fetch results after run completescurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=YOUR_API_TOKEN&format=json&clean=1"
Node.js (Apify SDK)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_API_TOKEN' });const run = await client.actor('galih_rakasiwi/linkedin-job-market-api').call({mode: 'batch_search',keywords: ['Data Engineer', 'MLOps Engineer', 'Analytics Engineer'],location: 'Indonesia',maxItems: 15,enableAnalytics: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Extracted ${items.length} enriched job listings`);// Filter for high-salary remote rolesconst highValue = items.filter(j => j.workplace_type === 'Remote' && (j.salary_min || 0) >= 20000000);console.log(`${highValue.length} remote roles above 20M IDR`);
Apify CLI
apify call galih_rakasiwi/linkedin-job-market-api \--input '{"mode": "search", "keyword": "Data Engineer", "maxItems": 25}' \--output jobs.json
Pricing & Support
| Item | Price |
|---|---|
| Each job listing pushed to dataset | $0.02 / result |
| Analytics summary record | Free — no charge |
| Failed run / zero results | Free — you pay only for data you receive |
You are never billed for compute time, retries, or empty runs. This is pure Pay-Per-Result — transparent, predictable, and aligned with your data needs.
Cost Estimator
| Scenario | Estimated Results | Estimated Cost |
|---|---|---|
| 1 keyword × 10 jobs | 10 | $0.20 |
| Batch 5 keywords × 10 jobs each | 50 | $1.00 |
| Major search × 25 jobs | 25 | $0.50 |
| Analytics mode (skill + salary insights) | 1 summary record | Free |
How We Handle Stability & Anti-Bot
LinkedIn's public endpoints are rate-limited and subject to HTML structure changes. This Actor includes multiple layers of defense to maximize uptime and data consistency:
| Layer | Mechanism |
|---|---|
| Token-Bucket Rate Limiter | Throttles requests to ~8–10 req/s, preventing burst patterns that trigger IP blocks |
| Exponential Backoff Retry | 3 retries with 1s → 2s → 4s backoff on TimeoutException, ConnectError, RemoteProtocolError |
| Auth Wall Detection | Monitors redirects to /login, /checkpoint, /signup — surfaces clean errors instead of silent data loss |
| HTTP 429 Handler | Respects Retry-After headers when LinkedIn rate-limits, backing off gracefully |
| Session Warmup | Establishes guest cookies via a dedicated warmup request before any data fetch |
| Proxy Integration | First-class Apify Residential Proxy support — rotates IPs to avoid geographic and volumetric blocking |
| Partial Result Resilience | If one job detail fetch fails, the rest of the batch continues — no all-or-nothing failures |
| CSS Selector Constants | All HTML selectors are module-level constants. When LinkedIn changes markup, only selectors update — parsing logic stays intact |
| Circuit Breaker Ready | Detects consecutive failures and can halt requests during cool-down periods (configurable) |
This isn't a naive requests.get() loop. It's a production-grade HTTP client with session orchestration, originally built as a FastAPI microservice with structured logging, type safety (mypy strict mode), and >80% test coverage on parser logic.
Perfect For
| Audience | Use Case |
|---|---|
| Quantitative Researchers | Labor market econometrics, salary trend modeling, skill-demand forecasting |
| Data Scientists & ML Engineers | Build job recommendation engines, train skill-gap classifiers, feed RAG pipelines |
| AI Developers | Power AI Career Agents with real-time structured job data + skill analytics |
| HR Tech & Recruiting Platforms | Backend job feed, competitive hiring intelligence, salary benchmarking |
| Universities & EdTech | Career center job matching, curriculum-to-market alignment analysis |
| Job Boards & Aggregators | Structured job feed with 25+ fields — no parsing needed |
| Government & Policy Research | Labor market analysis, workforce planning, employment policy data |
Tech Stack
FastAPI · httpx (HTTP/2) · BeautifulSoup4 + lxml · Pydantic v2 · Apify SDK (Python) · structlog (structured JSON logging) · MongoDB (optional, for major_search mode)
Development & Self-Hosting
This Actor is built on a standalone FastAPI microservice that can run independently outside Apify:
# Clone and set upgit clone <repo-url> && cd linkedin_apiuv sync# Run as Apify Actor (local simulation)uv run python src/main.py# Run as REST API serveruv run uvicorn app.main:app --reload
Full technical documentation — architecture, data flow pipeline, parser strategy, configuration reference, and testing guide — is available in docs/DOCUMENTATION.md.
Disclaimer
This Actor accesses publicly available data from LinkedIn's guest (non-authenticated) endpoints. It does not bypass authentication, scrape logged-in content, or violate LinkedIn's robots.txt directives.
- Data Rights: All job listing data remains the property of the respective employers and LinkedIn Corporation. Users are responsible for complying with LinkedIn's Terms of Service and applicable data protection laws in their jurisdiction.
- No Affiliation: This Actor is not affiliated with, endorsed by, or connected to LinkedIn Corporation or Microsoft.
- Accuracy: Salary data is extracted from job descriptions using heuristic parsing. Not all listings include salary information — null values indicate the employer did not disclose compensation.
- Rate Limits: LinkedIn's guest API imposes a soft limit of ~50–75 results per query. The Actor respects these limits and surfaces them transparently.
License
MIT — see LICENSE.