LinkedIn Jobs Scraper Ultra
Pricing
from $3.00 / 1,000 results
LinkedIn Jobs Scraper Ultra
Search and scrape LinkedIn job listings - title, company, location, salary, seniority level, employment type, job description, and more. No cookies or login required.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Scrape job listings from LinkedIn without login. Get job titles, companies, locations, salaries, full descriptions, seniority levels, employment types, and more. No API key, cookies, or LinkedIn account needed.
What is LinkedIn Jobs Scraper Ultra?
LinkedIn Jobs Scraper Ultra is an Apify actor that extracts job listings from LinkedIn's public job search. Simply enter keywords and a location, apply optional filters, and the scraper returns structured job data ready for analysis, lead generation, or job market research.
Features
- Search by keywords and location — Find jobs matching any title, skill, or company name
- Full job descriptions — Get both HTML and plain text versions for NLP or analysis
- Rich metadata — Seniority level, employment type, job function, industry, salary, applicant count
- Advanced filters — Time posted, experience level, job type, remote/hybrid/on-site, Easy Apply, company, salary band, and more
- Salary normalization — Structured min/max/currency/interval plus a normalized yearly figure, with false-positive sanity-checking
- Inferred seniority & years of experience — Falls back to a title/description heuristic (clearly flagged as inferred) when LinkedIn's own seniority field is missing
- Visa sponsorship & ATS detection — Flags whether a posting mentions visa sponsorship (negation-aware) and which applicant-tracking platform the apply link resolves to
- Incremental-run friendly — Exclude previously-seen job IDs or filter by title keywords without re-scraping everything
- Direct URL support — Paste LinkedIn search URLs with your own custom filters
- Automatic deduplication — No duplicate listings when combining multiple searches
- No login required — Uses LinkedIn's public job search, no account or cookies needed
- No proxy needed by default — Works from standard IPs for most use cases; automatically escalates through Apify's Unblocker proxy if a request is persistently blocked
Use Cases
- Job market research — Analyze hiring trends, salary ranges, and in-demand skills
- Lead generation — Find companies actively hiring in your target industry
- Competitive analysis — Monitor competitor hiring patterns and open roles
- Career monitoring — Track new job postings matching your criteria
- Recruitment intelligence — Identify companies expanding in specific locations or functions
- Salary benchmarking — Compare compensation data across companies and locations
Input
| Field | Type | Default | Description |
|---|---|---|---|
| Search Keywords | String | — | Job title, skills, or company to search (e.g., "software engineer", "data scientist") |
| Location | String | — | City, state, country, or "remote". Always in English — e.g. "Germany", not "Deutschland" — LinkedIn does not resolve non-English place names. Ignored if Locations (plural) is set. |
| Locations (multiple) | Array | — | Run the same Job Keywords against several locations in one go (e.g. ["California", "Texas", "New York"]) and combine the deduplicated results — the way to get more than LinkedIn's ~1,000-result cap for one keyword. Overrides Location. |
| Maximum Jobs | Integer | 100 | Max job listings to scrape (1-1000). LinkedIn limits ~1000 results per query — use Locations to combine multiple queries for more. |
| Scrape Full Job Details | Boolean | true | Fetch full descriptions, seniority, employment type, etc. Disable for faster runs. |
| Detail Enrichment Depth | Select | Standard | Standard is fast and covers everything above. Full also fetches similar jobs, related searches, and cleaner company/industry IDs, but is ~5-7x slower per job and doesn't include the Apply URL. |
| Time Posted | Select | Any time | Filter: Past 24 hours, Past week, Past month. Applied directly by LinkedIn. |
| Experience Level | Select | Any | Filter: Internship, Entry, Associate, Mid-Senior, Director, Executive. Applied by this actor after fetching each job's detail page (LinkedIn no longer filters this server-side) — may increase run time. |
| Job Type | Select | Any | Filter: Full-time, Part-time, Contract, Temporary, Volunteer, Internship. Same as above — applied after detail fetch. |
| Work Type | Select | Any | Filter: On-site, Remote, Hybrid. Best-effort only — LinkedIn no longer exposes a reliable on-site/remote/hybrid signal on public pages, so this rarely narrows results; check the job title/description for the real work arrangement. |
| Job Function | Select | Any | Dropdown covering all 35 of LinkedIn's official job-function categories (Engineering, Sales, Accounting/Auditing, etc). Same as above — applied after detail fetch. |
| Minimum Salary | Integer | 0 | LinkedIn salary band (1=$40k+ ... 9=$200k+). Applied after detail fetch, only for jobs with a posted yearly salary. |
| Industry | Multi-select | — | Dropdown covering all 434 of LinkedIn's official industry categories — select one or more. Applied by this actor after fetching job details and company data (LinkedIn no longer honors this filter server-side) — matched against each job's real company industry, so it genuinely narrows results rather than being decorative. |
| Company IDs | Array | — | Restrict to specific LinkedIn company IDs. Applied directly by LinkedIn. |
| Easy Apply Only | Boolean | false | Only show jobs with LinkedIn Easy Apply. Applied directly by LinkedIn. |
| Under 10 Applicants | Boolean | false | Only show jobs with fewer than 10 applicants. Applied directly by LinkedIn. |
| Language | Select | English | Accept-Language for LinkedIn's response — does not translate the Location field. |
| Exclude Job IDs | Array | — | Skip specific job IDs (e.g. from a previous run) — useful for incremental scraping. |
| Include Title Keywords | Array | — | Only keep jobs whose title contains at least one keyword. |
| Exclude Title Keywords | Array | — | Skip jobs whose title contains any of these keywords. |
| Search URLs | URL List | — | Direct LinkedIn job search URLs with filters pre-applied |
| Proxy Configuration | Object | — | Optional — usually not needed for the public jobs-guest API. |
Note: At least one of Search Keywords or Search URLs must be provided.
Example input — Basic search
{"keywords": "software engineer","location": "United States","maxItems": 50}
Example input — Filtered search
{"keywords": "data scientist","location": "New York","jobType": "F","workType": "2","experienceLevel": "4","timePosted": "r604800","maxItems": 100}
Example input — Direct URL
{"searchUrls": [{ "url": "https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=London&f_JT=F&f_WT=2" }],"maxItems": 50}
Output
Each job listing produces one item in the output dataset. Empty/unavailable fields are omitted rather than returned as null.
| Field | Type | Description |
|---|---|---|
| id | String | LinkedIn's unique job identifier |
| title | String | Job position title |
| companyName | String | Hiring company name |
| companyUrl, companyId, companyLogo | String | Company page, LinkedIn company ID, and logo URL |
| companyIndustry, companyFollowersCount, companySize | String/Number | Company metadata, fetched directly from each unique company's own LinkedIn page (see below) |
| companyWebsite, companyType, companyHeadquarters, companySpecialties, companyDescription | String/Array | Fetched directly from each unique company's own LinkedIn page — see below |
| location, workplaceType, remoteAllowed | String/Boolean | Job location and remote/hybrid/on-site signal |
| salary | String | Raw salary text as shown by LinkedIn (e.g., "$150,000.00/yr - $200,000.00/yr") |
| salaryRange | Object | Structured {min, max, currency, interval, minYearly, maxYearly} parsed from salary, sanity-checked to reject implausible parses |
| postedDate, postedAt, postedDateText | String | Posting date (ISO where available) and relative text (e.g., "3 days ago") |
| applicantCount, applicantInsights | String/Array | Applicant count text and any early-applicant/recent-activity insights |
| easyApply, isReposted | Boolean | Easy Apply and reposted-listing flags |
| jobUrl, applyUrl | String | LinkedIn job page and apply destination. applyUrl is only available with the default Standard enrichment depth. |
| atsPlatform | String | Applicant-tracking platform resolved from applyUrl (Workday, Greenhouse, Lever, etc.), when detectable |
| descriptionHtml, descriptionText | String | Full job description, HTML and plain text |
| seniorityLevel, employmentType, jobFunction(s), industries/industriesList | String/Array | Criteria as LinkedIn presents them |
| inferredSeniorityLevel | String | LinkedIn's own seniority when available, otherwise a title-based inference |
| experienceYearsMin, experienceYearsMax | Number | Years of experience parsed from the description text (e.g., "5+ years"), when stated |
| visaSponsorshipMentioned, visaSponsorshipPhrase | Boolean/String | Whether the description mentions visa sponsorship — true if offered, false if explicitly not offered, omitted if not mentioned |
| responsibilities, qualifications, preferredQualifications | Array | Bulleted description sections, when the posting uses a recognizable "What You'll Do"/"Qualifications"-style heading — best-effort, present on most but not all postings |
| skillsRequired, benefits | Array | Listed skills and benefits, when present |
| recruiter | Object | Recruiter/poster card {name, title, profileUrl}, when shown |
| companyId, industryIds, titleId, similarJobs, peopleAlsoViewed, similarSearches, titleCategoryLabel, titleCategoryUrl | — | Only present with Detail Enrichment Depth = Full — see below |
| scrapedAt | String | ISO timestamp when data was collected |
Full enrichment depth: extra fields
Setting Detail Enrichment Depth to full fetches LinkedIn's richer job page and adds:
similarJobs[]/peopleAlsoViewed[]— related job cards{jobId, title, companyName, location, postedDateText, jobUrl}similarSearches[]— related search terms with live open-job counts{searchTerm, searchUrl, openJobsCount}industryIds,titleId— LinkedIn's own internal taxonomy IDs, cleaner than the URL-derivedcompanyIdtitleCategoryLabel/titleCategoryUrl— LinkedIn's own normalized title-category grouping for this posting
This mode does not include applyUrl (LinkedIn's Apply button there is a client-side action with no static link) and is roughly 5-7x slower per job — use it only when you need the extra fields.
Company page enrichment
Every run fetches each unique company's own LinkedIn page (once per company — jobs from the same employer share one fetch, run concurrently) and adds:
companyWebsite— the company's real external website (unwrapped from LinkedIn's redirect link)companyType— e.g. "Public Company", "Privately Held"companyHeadquarters— the company's stated HQ locationcompanySpecialties[]— the list of specialties LinkedIn shows on the company pagecompanyDescription— the company's tagline- Reliable
companyIndustry,companyFollowersCount,companySize, andcompanyLogo, taken directly from the company page rather than scraped incidentally off the job page
This adds one extra request per unique company in your results, so a run with many different employers takes longer than one dominated by a few large companies.
Sample output
{"id": "3876543210","title": "Senior Software Engineer","companyName": "Google","companyUrl": "https://www.linkedin.com/company/google","companyId": "1441","location": "Mountain View, CA","salary": "$150,000.00/yr - $200,000.00/yr","salaryRange": {"min": 150000,"max": 200000,"currency": "USD","interval": "yearly","minYearly": 150000,"maxYearly": 200000},"postedDate": "2026-03-20","postedDateText": "4 days ago","applicantCount": "Over 200 applicants","jobUrl": "https://www.linkedin.com/jobs/view/3876543210","applyUrl": "https://www.linkedin.com/jobs/view/3876543210","descriptionHtml": "<p>We are looking for a Senior Software Engineer...</p>","descriptionText": "We are looking for a Senior Software Engineer to join our team...","seniorityLevel": "Mid-Senior level","inferredSeniorityLevel": "Mid-Senior level","experienceYearsMin": 5,"employmentType": "Full-time","jobFunction": "Engineering and Information Technology","industries": "Technology, Information and Internet","scrapedAt": "2026-03-24T10:30:00.000000+00:00"}
How to use
Quick start
- Enter a job title or keyword in the Search Keywords field
- Enter a location (city, country, or "remote")
- Set Maximum Jobs to control how many listings to scrape
- Click Start and wait for results
Use filters for targeted results
Apply filters like Job Type (Full-time), Experience Level (Mid-Senior), or Time Posted (Past week) to narrow your search. This mirrors the filters available on LinkedIn's job search page.
Use LinkedIn search URLs
- Go to LinkedIn Jobs in your browser
- Search for jobs and apply any filters you want
- Copy the URL from your browser's address bar
- Paste it into the Search URLs field
Combine both modes
You can provide both keywords and search URLs. The scraper processes all searches and deduplicates results automatically.
How many jobs can I scrape?
LinkedIn limits public search results to approximately 1,000 jobs per unique search query. To get more results:
- Use Locations (multiple) to run the same keywords against several locations in one run (e.g.
["California", "Texas", "New York"]) — results are combined and deduplicated automatically, the single best way to beat the cap - Use different keyword variations (e.g., "software engineer" and "software developer")
- Apply different filters to get distinct result sets
- Use multiple search URLs with different parameters
Tips
- Start small — Use
maxItems: 10for your first run to verify the output format - Disable details for speed — Set
scrapeJobDetails: falsefor a 5-10x faster run when you only need titles, companies, and locations - Use specific keywords — Narrow keywords produce more relevant results
- Combine with location — Adding a location improves result quality significantly
FAQ
Do I need a LinkedIn account? No. The scraper uses LinkedIn's public job search which is accessible without any login.
Do I need a proxy? No. The scraper works without proxy for most use cases. It automatically retries through a standard proxy if a request is blocked, then escalates to Apify's Unblocker proxy if the block persists — no configuration needed.
How fast is the scraper? With job details enabled: approximately 25 jobs per 15-20 seconds. Without details: 25 jobs per 3-5 seconds.
Why are some fields empty?
Fields like salary and applicantCount depend on whether the employer provided that information. LinkedIn only shows salary when the employer explicitly includes a pay range in the listing.
What is "Scrape Full Job Details"? When enabled (default), the scraper visits each job's detail page to get the full description, seniority level, employment type, job function, and industry. Disabling it returns only the data visible in search results (title, company, location, date, salary).
Can I scrape jobs from a specific company?
Yes. Search for the company name as a keyword, or use the Company IDs input with the company's numeric LinkedIn ID (found in its /company/{id}/ URL) — this filter is applied directly by LinkedIn, so it's exact.
Can I run this repeatedly without re-scraping the same jobs?
Yes. Save the id values from a previous run and pass them as Exclude Job IDs on the next run to only fetch newly-posted jobs. Combine with Include/Exclude Title Keywords to narrow further without needing a full LinkedIn filter.
Why did I get fewer jobs than maxItems? LinkedIn may have fewer matching jobs than your limit, or the search may have hit LinkedIn's ~1000 result cap. Try broader keywords or different locations. If you set Experience Level, Job Type, Work Type, Job Function, Industry, or Minimum Salary, this is also expected more often than with other filters — LinkedIn no longer applies these server-side, so this actor fetches extra candidates and filters them itself; if very few jobs match, fewer than your limit may be genuinely available within a reasonable fetch window.
Are companyFollowersCount and companySize reliable?
Yes. Every run fetches each unique company's own LinkedIn page directly (once per company, not per job) and returns the real numbers, plus website, headquarters, company type, and specialties.
How do I get more than 1,000 jobs for one search?
LinkedIn caps any single keyword+location query at roughly 1,000 results. Use Locations (multiple) to run the same Job Keywords against several locations in one run (e.g. ["California", "Texas", "New York"]) — results are combined and deduplicated automatically, the same way multiple LinkedIn Search URLs already work.
Are the salary/experience/seniority/visa fields exact, or inferred?
salary and seniorityLevel (etc.) are LinkedIn's own stated values when the employer provided them. salaryRange is a structured parse of that same text with sanity-checking (implausible values are dropped rather than returned wrong) plus a normalized minYearly/maxYearly for cross-comparison across pay periods. inferredSeniorityLevel uses LinkedIn's own field when available and only falls back to a job-title keyword heuristic when it's missing — compare it against seniorityLevel if you need to know which. experienceYearsMin/Max and visaSponsorshipMentioned are both parsed from the job description text with pattern matching, including explicit negation-handling for visa sponsorship (a posting that says it will not sponsor visas is never reported the same as one that will) — they're omitted, not guessed, when the description doesn't mention either topic.
What does "Detail Enrichment Depth: Full" add, and is it worth the extra time?
It's worth it only if you specifically need related-jobs data, related searches, or the cleanest possible company/industry IDs — otherwise stick with Standard. Full fetches a much larger page per job (roughly 7x the data, 5-7x the time) to add similarJobs, peopleAlsoViewed, similarSearches, and titleCategory fields, and it does not return applyUrl (LinkedIn doesn't expose a static apply link on that page).
Why are salary, benefits, skillsRequired, and visaSponsorshipMentioned empty on most jobs?
Because most employers genuinely don't include that information in the posting — LinkedIn itself only shows salary on a minority of listings outside pay-transparency-mandated regions, and most postings never mention benefits, a skills list, or visa sponsorship at all. This actor never fabricates a value for these — they're omitted rather than guessed, so an empty field means the data wasn't there to extract, not a scraping failure. responsibilities/qualifications/preferredQualifications and inferredSeniorityLevel, by contrast, are actively-extracted fields with retry/fallback logic behind them — genuinely absent far less often.
How does the Industry filter actually work? LinkedIn's own industry search parameter is dead server-side (confirmed live — it no longer narrows results at all), so this actor re-implements it itself: after fetching each job's details and company page, it matches your selected industries against that job's real company industry. This means the Industry filter always requires Scrape Job Details (enabled automatically if you set it) and takes longer than a plain search, but it genuinely narrows results using real company data instead of a non-functional LinkedIn parameter.
Explore the rest of the LinkedIn suite
Need a different LinkedIn surface? Pair this actor with any of the others in the LinkedIn Suite — all published under the same publisher and built to share the same output conventions. Note: this actor and LinkedIn Jobs Scraper are the only two in the suite that run fully cookieless — every other actor below requires a cookie input (plain li_at OR full cookies JSON array).
| Actor | What it scrapes |
|---|---|
| LinkedIn Comments Scraper | All comments + reply threads on a post |
| LinkedIn Company Employees Scraper | Employee list for any company (by URN) |
| LinkedIn Company Info Scraper | Company About page (size, HQ, industry, specialties) |
| LinkedIn Company Posts Scraper | Posts published from a company page |
| LinkedIn Events Scraper | Events by keyword/URL with full event detail |
| LinkedIn Hashtag Posts Scraper | Posts ranked under a #hashtag |
| LinkedIn Jobs Scraper | Job listings via the public jobs-guest API |
| LinkedIn Learning Courses Scraper | LinkedIn Learning course catalog by keyword |
| LinkedIn People Search Scraper | People search with every LinkedIn facet (role, company, school, location, etc.) |
| LinkedIn Post Reactions Scraper | Reactors on a post (name, headline, reaction type) |
| LinkedIn Post Scraper | Full post (text, media, engagement counts, author) |
| LinkedIn Post Search Scraper | Posts matching a keyword (with date/author/network filters) |
| LinkedIn Profile Posts Scraper | All posts/reposts/articles for one profile |
| LinkedIn Profile Scraper | Public profile fields (name, headline, positions, education, skills) |
| LinkedIn Profile Scraper Pro | Profile fields + extras (recommendations, organizations, languages) |
| LinkedIn Profile Scraper Pro Ultra | Pro + premium fields (contact info, followers list when allowed) |
| LinkedIn Profile Scraper Ultra | Profile + the full upstream dash-120 surface |
| LinkedIn Profile Search by Name | Search profiles by person name (great for matching CSVs of names) |
| LinkedIn Schools Alumni Scraper | Alumni list for any LinkedIn school page |
| LinkedIn Top Content Scraper | Trending / top-engagement posts by topic |
| LinkedIn User Activity Scraper | Reactions + comments + posts feed for one profile |
All actors share the same omit-empty output convention; all except this one and LinkedIn Jobs Scraper also share the same cookie input format (plain li_at OR full cookies JSON array).