LinkedIn Jobs Scraper Ultra avatar

LinkedIn Jobs Scraper Ultra

Pricing

from $3.00 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper Ultra

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

Crawler Bros

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

14 hours ago

Last modified

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

FieldTypeDefaultDescription
Search KeywordsString—Job title, skills, or company to search (e.g., "software engineer", "data scientist")
LocationString—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 JobsInteger100Max job listings to scrape (1-1000). LinkedIn limits ~1000 results per query — use Locations to combine multiple queries for more.
Scrape Full Job DetailsBooleantrueFetch full descriptions, seniority, employment type, etc. Disable for faster runs.
Detail Enrichment DepthSelectStandardStandard 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 PostedSelectAny timeFilter: Past 24 hours, Past week, Past month. Applied directly by LinkedIn.
Experience LevelSelectAnyFilter: 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 TypeSelectAnyFilter: Full-time, Part-time, Contract, Temporary, Volunteer, Internship. Same as above — applied after detail fetch.
Work TypeSelectAnyFilter: 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 FunctionSelectAnyDropdown covering all 35 of LinkedIn's official job-function categories (Engineering, Sales, Accounting/Auditing, etc). Same as above — applied after detail fetch.
Minimum SalaryInteger0LinkedIn salary band (1=$40k+ ... 9=$200k+). Applied after detail fetch, only for jobs with a posted yearly salary.
IndustryMulti-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 IDsArray—Restrict to specific LinkedIn company IDs. Applied directly by LinkedIn.
Easy Apply OnlyBooleanfalseOnly show jobs with LinkedIn Easy Apply. Applied directly by LinkedIn.
Under 10 ApplicantsBooleanfalseOnly show jobs with fewer than 10 applicants. Applied directly by LinkedIn.
LanguageSelectEnglishAccept-Language for LinkedIn's response — does not translate the Location field.
Exclude Job IDsArray—Skip specific job IDs (e.g. from a previous run) — useful for incremental scraping.
Include Title KeywordsArray—Only keep jobs whose title contains at least one keyword.
Exclude Title KeywordsArray—Skip jobs whose title contains any of these keywords.
Search URLsURL List—Direct LinkedIn job search URLs with filters pre-applied
Proxy ConfigurationObject—Optional — usually not needed for the public jobs-guest API.

Note: At least one of Search Keywords or Search URLs must be provided.

{
"keywords": "software engineer",
"location": "United States",
"maxItems": 50
}
{
"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.

FieldTypeDescription
idStringLinkedIn's unique job identifier
titleStringJob position title
companyNameStringHiring company name
companyUrl, companyId, companyLogoStringCompany page, LinkedIn company ID, and logo URL
companyIndustry, companyFollowersCount, companySizeString/NumberCompany metadata, fetched directly from each unique company's own LinkedIn page (see below)
companyWebsite, companyType, companyHeadquarters, companySpecialties, companyDescriptionString/ArrayFetched directly from each unique company's own LinkedIn page — see below
location, workplaceType, remoteAllowedString/BooleanJob location and remote/hybrid/on-site signal
salaryStringRaw salary text as shown by LinkedIn (e.g., "$150,000.00/yr - $200,000.00/yr")
salaryRangeObjectStructured {min, max, currency, interval, minYearly, maxYearly} parsed from salary, sanity-checked to reject implausible parses
postedDate, postedAt, postedDateTextStringPosting date (ISO where available) and relative text (e.g., "3 days ago")
applicantCount, applicantInsightsString/ArrayApplicant count text and any early-applicant/recent-activity insights
easyApply, isRepostedBooleanEasy Apply and reposted-listing flags
jobUrl, applyUrlStringLinkedIn job page and apply destination. applyUrl is only available with the default Standard enrichment depth.
atsPlatformStringApplicant-tracking platform resolved from applyUrl (Workday, Greenhouse, Lever, etc.), when detectable
descriptionHtml, descriptionTextStringFull job description, HTML and plain text
seniorityLevel, employmentType, jobFunction(s), industries/industriesListString/ArrayCriteria as LinkedIn presents them
inferredSeniorityLevelStringLinkedIn's own seniority when available, otherwise a title-based inference
experienceYearsMin, experienceYearsMaxNumberYears of experience parsed from the description text (e.g., "5+ years"), when stated
visaSponsorshipMentioned, visaSponsorshipPhraseBoolean/StringWhether the description mentions visa sponsorship — true if offered, false if explicitly not offered, omitted if not mentioned
responsibilities, qualifications, preferredQualificationsArrayBulleted 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, benefitsArrayListed skills and benefits, when present
recruiterObjectRecruiter/poster card {name, title, profileUrl}, when shown
companyId, industryIds, titleId, similarJobs, peopleAlsoViewed, similarSearches, titleCategoryLabel, titleCategoryUrl—Only present with Detail Enrichment Depth = Full — see below
scrapedAtStringISO 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-derived companyId
  • titleCategoryLabel / 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 location
  • companySpecialties[] — the list of specialties LinkedIn shows on the company page
  • companyDescription — the company's tagline
  • Reliable companyIndustry, companyFollowersCount, companySize, and companyLogo, 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

  1. Enter a job title or keyword in the Search Keywords field
  2. Enter a location (city, country, or "remote")
  3. Set Maximum Jobs to control how many listings to scrape
  4. 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

  1. Go to LinkedIn Jobs in your browser
  2. Search for jobs and apply any filters you want
  3. Copy the URL from your browser's address bar
  4. 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: 10 for your first run to verify the output format
  • Disable details for speed — Set scrapeJobDetails: false for 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).

ActorWhat it scrapes
LinkedIn Comments ScraperAll comments + reply threads on a post
LinkedIn Company Employees ScraperEmployee list for any company (by URN)
LinkedIn Company Info ScraperCompany About page (size, HQ, industry, specialties)
LinkedIn Company Posts ScraperPosts published from a company page
LinkedIn Events ScraperEvents by keyword/URL with full event detail
LinkedIn Hashtag Posts ScraperPosts ranked under a #hashtag
LinkedIn Jobs ScraperJob listings via the public jobs-guest API
LinkedIn Learning Courses ScraperLinkedIn Learning course catalog by keyword
LinkedIn People Search ScraperPeople search with every LinkedIn facet (role, company, school, location, etc.)
LinkedIn Post Reactions ScraperReactors on a post (name, headline, reaction type)
LinkedIn Post ScraperFull post (text, media, engagement counts, author)
LinkedIn Post Search ScraperPosts matching a keyword (with date/author/network filters)
LinkedIn Profile Posts ScraperAll posts/reposts/articles for one profile
LinkedIn Profile ScraperPublic profile fields (name, headline, positions, education, skills)
LinkedIn Profile Scraper ProProfile fields + extras (recommendations, organizations, languages)
LinkedIn Profile Scraper Pro UltraPro + premium fields (contact info, followers list when allowed)
LinkedIn Profile Scraper UltraProfile + the full upstream dash-120 surface
LinkedIn Profile Search by NameSearch profiles by person name (great for matching CSVs of names)
LinkedIn Schools Alumni ScraperAlumni list for any LinkedIn school page
LinkedIn Top Content ScraperTrending / top-engagement posts by topic
LinkedIn User Activity ScraperReactions + 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).