Linkedin Jobs Search
Pricing
$1.00 / 1,000 results
Pricing
$1.00 / 1,000 results
Rating
0.0
(0)
Developer
Benjar Scraping API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
LinkedIn Jobs Scraper – Extract Job Postings, Salaries & Recruiters
Scrape LinkedIn jobs at scale — no login or account required. This LinkedIn Jobs Scraper returns structured job postings enriched with full job descriptions, salary ranges, applicant counts, hiring recruiter details, and company data. Search by keywords + filters or simply paste a LinkedIn jobs search URL, and export clean JSON, CSV, or Excel.
Perfect for recruiters, sourcers, job boards, ATS integrations, market and salary research, lead generation, and labor-market analytics.
🔓 No LinkedIn login required — there's no account risk and no cookies to manage.
✨ Why use this LinkedIn job scraper?
- ⚡ Fast — listing and enrichment are pipelined in parallel over rotating proxy IPs, and company pages use an early-abort stream that downloads only the ~5% holding the data (typically a few seconds per ~10 jobs).
- 🔑 No login / no cookies — zero account risk.
- 🔗 Paste-a-URL or build-a-search — drop in any
linkedin.com/jobs/search/?...URL, or use keyword + filter inputs. - 💰 Salary extraction — parses salary into
salaryMin,salaryMax,salaryCurrency, andsalaryPeriod. - 📄 Full job descriptions — both
descriptionTextanddescriptionHtml. - 🧑💼 Recruiter / job poster — name, title, photo, and profile URL of the person who posted the job.
- 🏢 Company enrichment — website, description, employee count, and address.
- 🎯 Rich filters — date posted, job type, experience level, remote/hybrid/on-site, company, distance, and sort order.
- 🧹 Auto-deduplication — duplicate jobs are removed automatically.
- 📦 Export anywhere — JSON, CSV, Excel, or push to your own API/webhook.
🚀 Quick start
- Enter Search keywords (e.g.
Software Engineer) and a Location (e.g.United States) — or paste a full LinkedIn jobs search URL. - Set Maximum jobs to collect (e.g.
50). - Click Start and download your results as JSON, CSV, or Excel.
That's it — no LinkedIn credentials needed.
📥 Input
Provide either keywords or a searchUrl. Everything else is optional.
| Field | Type | Description |
|---|---|---|
keywords | String | Search terms, e.g. Software Engineer, Product Manager. Ignored when searchUrl is set. |
searchUrl | String | A full https://www.linkedin.com/jobs/search/?... URL. When provided, keywords, location, and all filters are taken from it, overriding the manual inputs. |
location | String | Location name, e.g. United States, Berlin, Germany. Use this or geoId. |
geoId | String | Numeric LinkedIn geo id (e.g. 103644278 = United States). Takes precedence over location. Found in the geoId parameter of a LinkedIn jobs search URL. |
maxJobs | Integer | Maximum jobs to collect (default 50). See Limitations for the per-search cap. |
scrapeDetails | Boolean | Default true. Enriches each job with full description, criteria (seniority, employment type, function, industries), applicant count, apply type, company URL, and recruiter. |
scrapeCompany | Boolean | Default true. Adds each company's website, description, slogan, employee count, and address. Requires scrapeDetails. |
maxConcurrency | Integer | Parallel requests, 1–20 (default 10). Higher is faster. |
maxTimeoutMs | Integer | Per-request timeout in ms (default 12000, min 3000). A hung request aborts and retries on a fresh proxy IP; lower it to fail bad IPs faster, raise it for slow proxies. |
datePosted | Enum (String) | Restrict by recency. One of "" (any time), r86400 (past 24h), r604800 (past week), r2592000 (past month). |
jobType | Array of Enums | One or more of F (Full-time), P (Part-time), C (Contract), T (Temporary), I (Internship), V (Volunteer), O (Other). |
experienceLevel | Array of Enums | One or more of 1 (Internship), 2 (Entry level), 3 (Associate), 4 (Mid-Senior level), 5 (Director), 6 (Executive). |
workplaceType | Array of Enums | One or more of 1 (On-site), 2 (Remote), 3 (Hybrid). |
companyId | Array of Strings | Restrict to specific numeric LinkedIn company id(s). |
sortBy | Enum (String) | "" / R (Relevance) or DD (Most recent). |
distance | Integer | Search radius in miles around the location. |
proxyConfiguration | Proxy | Residential proxies strongly recommended. Defaults to Apify residential proxies. |
Example input — keyword search
{"keywords": "Software Engineer","location": "United States","maxJobs": 50,"datePosted": "r604800","jobType": ["F"],"experienceLevel": ["3", "4"],"workplaceType": ["2"],"scrapeDetails": true,"scrapeCompany": true,"maxConcurrency": 10,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Example input — paste a LinkedIn jobs search URL
{"searchUrl": "https://www.linkedin.com/jobs/search/?keywords=Product%20Manager&location=Berlin%2C%20Germany&f_WT=2&f_TPR=r86400","maxJobs": 100,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
📤 Output
Each result is one job posting. Results stream to the dataset and export as JSON, CSV, Excel, HTML, or XML, or to a webhook/API.
Fields
| Field | Type | When | Description |
|---|---|---|---|
id | String | Always | LinkedIn job id. |
title | String | Always | Job title. |
companyName | String | Always | Hiring company name. |
companyUrl | String | Always | LinkedIn company page URL. |
companyLogo | String | Always | Company logo image URL. |
location | String | Always | Job location. |
jobUrl | String | Always | LinkedIn job posting URL. |
postedAt | String (ISO) | Always | Posting date/time, ISO 8601. |
postedDate | String | Always | Posting date, YYYY-MM-DD. |
postedTimestamp | Number | Always | Posting time, epoch milliseconds. |
salary | String | Always | Raw salary text (when shown). |
salaryMin / salaryMax | Number | Always | Parsed salary bounds (when shown). |
salaryCurrency | String | Always | Salary currency, e.g. USD. |
salaryPeriod | String | Always | Salary period, e.g. yr, hr. |
benefits | Array | Always | Listed benefits (when shown). |
seniority | String | scrapeDetails | Seniority level. |
employmentType | String | scrapeDetails | e.g. Full-time, Contract. |
jobFunction | String | scrapeDetails | Job function. |
industries | String | scrapeDetails | Industry. |
applicantsCount | Number | scrapeDetails | Number of applicants. |
applicantsText | String | scrapeDetails | Raw applicants text. |
applyType | String | scrapeDetails | offsite or easy_apply. |
descriptionText | String | scrapeDetails | Full description, plain text. |
descriptionHtml | String | scrapeDetails | Full description, HTML. |
jobPosterName | String | scrapeDetails | Recruiter / job poster name. |
jobPosterTitle | String | scrapeDetails | Recruiter title. |
jobPosterPhoto | String | scrapeDetails | Recruiter photo URL. |
jobPosterProfileUrl | String | scrapeDetails | Recruiter LinkedIn profile URL. |
companyWebsite | String | scrapeCompany | Company website. |
companyDescription | String | scrapeCompany | Company description. |
companySlogan | String | scrapeCompany | Company slogan/tagline. |
companyEmployeesCount | Number | scrapeCompany | Approximate employee count. |
companyAddress | Object | scrapeCompany | { locality, region, country }. |
applyUrl | null | Always | External apply link (see Limitations). |
scrapedAt | String (ISO) | Always | When the job was scraped. |
Example output
{"id": "3801234567","title": "Senior Software Engineer","companyName": "Acme Corp","companyUrl": "https://www.linkedin.com/company/acme-corp","companyLogo": "https://media.licdn.com/dms/image/...","location": "San Francisco, CA","jobUrl": "https://www.linkedin.com/jobs/view/3801234567","postedAt": "2026-06-18T12:00:00.000Z","postedDate": "2026-06-18","postedTimestamp": 1750248000000,"salary": "$160,000 - $210,000/yr","salaryMin": 160000,"salaryMax": 210000,"salaryCurrency": "USD","salaryPeriod": "yr","benefits": ["401(k)", "Medical insurance"],"seniority": "Mid-Senior level","employmentType": "Full-time","jobFunction": "Engineering and Information Technology","industries": "Software Development","applicantsCount": 87,"applicantsText": "Over 80 applicants","applyType": "offsite","descriptionText": "We are looking for a Senior Software Engineer...","descriptionHtml": "<p>We are looking for a Senior Software Engineer...</p>","jobPosterName": "Jane Recruiter","jobPosterTitle": "Technical Recruiter at Acme Corp","jobPosterPhoto": "https://media.licdn.com/dms/image/...","jobPosterProfileUrl": "https://www.linkedin.com/in/jane-recruiter","companyWebsite": "https://acme.com","companyDescription": "Acme Corp builds...","companySlogan": "Build the future","companyEmployeesCount": 5200,"companyAddress": { "locality": "San Francisco", "region": "CA", "country": "US" },"applyUrl": null,"scrapedAt": "2026-06-19T09:30:00.000Z"}
💡 Common use cases
- Recruiting & sourcing — build talent pipelines and reach hiring managers via the job-poster fields.
- Job boards & aggregators — keep a fresh, deduplicated feed of postings.
- Salary & compensation research — analyze
salaryMin/salaryMaxacross roles, regions, and seniority. - Lead generation — find companies that are hiring, plus their websites and recruiters.
- Labor-market & hiring-trend analytics — track demand by skill, location, remote vs on-site, and experience level.
- ATS / CRM enrichment — feed structured job + company data into your own systems.
⚠️ Limitations
- ~1000 results per search. A single search query returns at most ~1000 jobs. To collect more, slice the query (by date, location, job type, etc.) and combine the runs.
- No apply URL. The external apply link isn't available, so
applyUrlis alwaysnull. The apply type (offsitevseasy_apply) is still reported. UsejobUrlto open the posting. - Public data only. Fields reflect what LinkedIn publicly exposes; not every posting includes salary, applicants, or a job poster.
- Use residential proxies and keep
maxConcurrencyreasonable (≤10) for the most reliable runs. If you see many timeouts on otherwise healthy runs, lowermaxTimeoutMs; raise it only if your proxy is slow but reliable.
❓ FAQ
Do I need a LinkedIn account or login? No. There are no credentials, cookies, or account risk involved.
How many jobs can I scrape per run? Up to ~1000 per individual search query. Split broad searches into narrower ones (by date window, location, or filters) and combine the results to collect more.
Can I scrape remote-only jobs?
Yes — set workplaceType to 2 (Remote), or add f_WT=2 to your search URL.
Does it return salaries?
When LinkedIn shows a salary, it's returned as raw text plus parsed salaryMin, salaryMax, salaryCurrency, and salaryPeriod. Not every posting includes salary data.
Can I get the recruiter / job poster?
Yes — with scrapeDetails enabled you get the poster's name, title, photo, and LinkedIn profile URL when available.
Why is applyUrl null?
The external apply link requires a logged-in session, which this actor avoids. Use jobUrl to open the posting on LinkedIn.
Which proxies should I use? Residential proxies are strongly recommended. The default configuration already requests Apify residential proxies.
What output formats are supported? JSON, CSV, Excel, HTML, and XML, plus webhook/API integrations.
⚖️ Legal & ethical use
This actor collects publicly available job data only. You are responsible for using it in compliance with LinkedIn's terms, applicable laws (including GDPR/CCPA where relevant), and a valid legal basis for any personal data you process. Do not use scraped data for spam or any unlawful purpose.