LinkedIn Jobs Scraper with Salary & Company Enrichment avatar

LinkedIn Jobs Scraper with Salary & Company Enrichment

Pricing

from $0.49 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper with Salary & Company Enrichment

LinkedIn Jobs Scraper with Salary & Company Enrichment

Search public LinkedIn job listings by keyword, location, salary band, job type and more, with full descriptions, parsed salary ranges, inferred seniority, visa-sponsorship mentions and enriched hiring-company details. No cookies or login required.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

Nimbryxo-studio

Nimbryxo-studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Features

Limited permissions

Share

LinkedIn Hiring Radar: Jobs, Pay & Employer Profiles

Turn public LinkedIn job pages into a research-ready dataset: one row per posting with the full description, a parsed pay range and where that pay came from, applicant volume, Easy Apply status, hiring badges, recruiter details and the employer's own LinkedIn profile. Search by keywords, places, companies or exact job links. No LinkedIn account, cookies or proxy setup is needed.

What this actor does

  • Pay that can be compared. The pay box and pay ranges written in the description are read, normalised to yearly figures and tagged with salarySource so you can tell employer-provided pay from description text.
  • Employer intelligence, not just a name. For every distinct employer, the actor reads the public LinkedIn company page once and attaches industry, headcount band, headquarters, website, founding year, follower count, specialties, offices, tagline, description and numeric company ID.
  • Broad discovery. Combine several keyword searches with several places, search entire companies, paste LinkedIn search links, or feed a list of job links and IDs. Results are merged and de-duplicated by job ID.
  • Filters that narrow the dataset. Date posted from the past hour to three months, search radius, Easy Apply, fewer than ten applicants, companies to include or leave out, experience level, job type, industry, staffing agencies, salary and recruiter presence.
  • Past the 1,000-result wall. When one search reaches LinkedIn's result ceiling, the actor can continue with narrower posting-date windows and merge the unique jobs.
  • Clean rows. Empty fields are omitted at every depth; a field the source does not show for a posting is never filled with blanks, zeroes or guesses.

Output per job

FieldWhat it holds
id, title, jobUrlLinkedIn job ID, title and canonical job link
companyName, companyUrl, companyId, companyNumericId, companyLogoEmployer identity and logo
locationLocation exactly as LinkedIn displays it
postedDate, postedDateText, postedAt, expiresAtPosting date, relative label, exact UTC time when available, and LinkedIn's expiry time when its structured data includes one
salary, salaryRange, salarySourceRaw pay text, parsed {min, max, currency, interval, minYearly, maxYearly} and employer or description
applicantCount, applicantCountNumeric, applicantCountKind, applicantInsightsApplicant text, parsed number, whether it is exact/more/fewer, and early-applicant notes
listingBadge, activelyHiringSearch-card badge such as "Actively Hiring" or "Be an early applicant"
easyApply, applyUrlWhether the job can be applied to on LinkedIn, plus the LinkedIn application page
descriptionText, descriptionHtmlFull posting description in both formats
responsibilities, qualifications, preferredQualificationsBulleted sections when the description uses a recognisable heading and list
seniorityLevel, inferredSeniorityLevel, employmentType, industries, industriesListCriteria as LinkedIn publishes them, plus a title-based seniority fallback
experienceYearsMin, experienceYearsMaxExperience range stated in the description
visaSponsorshipMentioned, visaSponsorshipPhrasePositive or negative sponsorship statement, with the matched phrase
remoteAllowedSet only on explicit fully-remote evidence (title, wording or a TELECOMMUTE structured-data flag); never inferred from hybrid/on-site text
recruiter{name, title, profileUrl, photoUrl} when LinkedIn shows the poster card
contactEmailsEmail addresses written in the description
atsPlatformApplicant-tracking platform named or linked in the posting, when detectable
companyIndustry, companySize, companyHeadquarters, companyType, companyWebsite, companyFounded, companySpecialties, companyLocations, companyFollowersCount, companySlogan, companyDescriptionEmployer profile from the company's public page
companyAffiliatedPages, companySimilarPagesRelated employer pages as listed on the company profile
companyRecentPostsRecent public company posts with reaction and comment counts, when shown
similarJobs, peopleAlsoViewed, similarSearches, industryIds, titleId, titleCategoryLabel, titleCategoryUrlRelated postings and LinkedIn taxonomy hints (full job-page depth only)
searchQuery, searchLocation, searchUrlThe search that surfaced this job
scrapedAtCollection timestamp in UTC

The dataset includes three ready-made views: Jobs, Salaries and Employers.

Input

At least one of searchQueries, searchUrls, jobUrls or companies must be provided. The form is grouped as "What to search", "Where", "Filters", "Data to include" and "Limits".

FieldTypeDefaultMeaning
searchQueriesstring list["Python Developer"] in the prefillJob titles, skills or phrases; each is searched in every place
searchUrlsURL list-LinkedIn job-search links; their keywords, place and filters are kept
jobUrlsstring list-Job links or numeric job IDs to read directly
locationsstring list["United States"] in the prefillPlaces in English; unknown places are reported and skipped, not silently treated as the US
geoIdsstring list-Numeric LinkedIn place IDs for an exact market
distanceselectLinkedIn defaultRadius around a city: 0, 5, 10, 25, 50 or 100 miles
timePostedselectAny timePast hour, 24 hours, 3 days, week, 2 weeks, month or 3 months
companiesstring list-Employer names, company/university links or numeric company IDs
excludeCompaniesstring list-Employers to skip by name or LinkedIn page
easyApplybooleanfalseKeep only jobs applicable on LinkedIn
under10ApplicantsbooleanfalseKeep only jobs with fewer than ten applicants
experienceLevelselectAnyInternship, Entry level, Associate, Mid-Senior level, Director, Executive
jobTypeselectAnyFull-time, Part-time, Contract, Temporary, Internship, Volunteer, Other
industrymulti-select[]LinkedIn industry of the employer (all 434 categories)
companySizesmulti-select[]Employer headcount bands from 1-10 to 10,001+
excludeStaffingAgenciesbooleanfalseRemove staffing and recruiting firms
requireSalarybooleanfalseKeep only postings that state pay
minYearlySalaryinteger-Drop postings whose yearly pay ceiling is below this amount
salaryCurrencyselectAnyKeep only this pay currency; also the currency used by minYearlySalary
requireRecruiterbooleanfalseKeep only postings where LinkedIn names the poster
includeTitleKeywordsstring list-Title must contain one of these words
excludeTitleKeywordsstring list-Title must not contain any of these words
excludeJobIdsstring list-Job IDs seen in an earlier run
scrapeJobDetailsbooleantrueRead each job page for description, pay, criteria, applicants and recruiter
includeCompanyDetailsbooleantrueRead each employer's public profile once
enrichmentDepthselectstandardfull adds related jobs, related searches, taxonomy IDs and extra posting-time retries
languageselectenLanguage of LinkedIn's labels: English, Spanish, French, German or Portuguese
splitLargeSearchesbooleantrueContinue a capped search with narrower posting-date windows
maxItemsinteger100Stop after this many saved jobs (1-10,000)

Example: pay research across markets

{
"searchQueries": ["Python Developer", "Data Engineer"],
"locations": ["United States", "Germany", "United Kingdom"],
"timePosted": "r604800",
"requireSalary": true,
"minYearlySalary": 80000,
"salaryCurrency": "USD",
"maxItems": 300
}

Example: every current role at two employers

{
"companies": ["Microsoft", "https://www.linkedin.com/company/affirm"],
"includeCompanyDetails": true,
"maxItems": 200
}

Example: audit a list of postings

{
"jobUrls": [
"https://www.linkedin.com/jobs/view/4479196690",
"4465604021"
]
}

Choosing the right depth

scrapeJobDetails off returns search-card data only: title, employer, place, posting date, card salary when shown and the job link. It is the cheapest and fastest mode.

scrapeJobDetails on reads the public job page for every posting and adds the full description, pay parsing, criteria, applicants, recruiter and apply signals. includeCompanyDetails then adds the employer profile once per company.

enrichmentDepth: full uses the richer job-page layout and also adds related jobs, related searches and LinkedIn taxonomy IDs. It costs more time per posting and is unnecessary for most salary or hiring research.

How many jobs can I collect?

LinkedIn returns at most about 1,000 jobs for one keyword/place/filter combination. The actor exposes three ways past that wall:

  • locations or geoIds spread one keyword across several markets.
  • searchQueries multiply the number of distinct searches.
  • splitLargeSearches continues a capped search with past-month, past-week, past-3-days and past-24-hours windows, removing overlaps by job ID.

The actor stops on LinkedIn's own end-of-results signals, not on a timer: an empty page, repeated pages with no new job IDs, or the 1,000-result ceiling with no narrower window left.

Use cases

  • Recruiting and sourcing - compare public postings, pay ranges and employer profiles for a role
  • Compensation research - normalise salary data across markets and seniority levels
  • Job-market monitoring - track hiring volume and employer demand over time
  • Sales and account research - identify companies actively hiring in a target segment
  • Competitive intelligence - compare how employers present roles, pay and benefits

FAQ

Do I need a LinkedIn account, cookies or a proxy? No. Every request reads a public page as a signed-out visitor. The actor chooses its own connection automatically and moves to a fresh session when LinkedIn throttles it; no user proxy configuration is required.

Why is salary missing on some rows? Many employers do not publish pay. The actor reads LinkedIn's pay box and explicit pay ranges in the description and never estimates. salarySource tells you which source produced the range. Coverage varies by market and employer.

Can I filter for remote, hybrid or on-site jobs? LinkedIn does not show the workplace label to signed-out visitors, and the public search ignores its workplace parameter. remoteAllowed is therefore only set when the posting itself is explicit about being fully remote (title/wording, or a TELECOMMUTE structured-data flag). Hybrid and on-site are never guessed. Adding "remote" to your keywords is the practical workaround. Older saved inputs that still contain the old workplace filter keep running; that setting is ignored and the status message says so.

Can I get the employer's own apply link? LinkedIn exposes the external apply destination only to signed-in members. applyUrl is the LinkedIn application page and easyApply tells you whether the application can be completed on LinkedIn. atsPlatform is filled only when the posting text itself names or links an applicant-tracking system.

Why does postedAt sometimes differ from postedDate? postedDate is the date shown on the search card. postedAt is the exact UTC timestamp from the job page's structured data or posting-time metadata, and it is omitted when LinkedIn serves a page variant without it. postedDate is always present.

Do all links open? Job links and company logos were checked from a clean client: job pages return 200 and logos return 200 with an image content type. LinkedIn company pages and some employer websites block automated HEAD/script requests with 403 even though they open normally in a browser; those URLs are the real public pages, not broken builders. An employer's own site can also be down or geo-restricted independently of this actor.

Why do I see more jobs than maxItems? You should not: the actor reserves each output slot atomically and never pushes more than maxItems. If a search has fewer matching jobs, the run ends with fewer and explains why in the status message.

How do I get only new postings on a schedule? Use "Past 24 hours", or save the id values from one run and send them through excludeJobIds on the next.

What is intentionally not available? Remote/hybrid/on-site labels for non-remote jobs, the external apply URL, repost history, view counts, job state and the job-function criterion are gated to signed-in LinkedIn members or have been removed from public pages. Skills and benefits are not exposed as structured lists for signed-out visitors; their raw text remains in descriptionText. The actor reports these limits rather than inventing values.

Is this affiliated with LinkedIn? No. It is an independent tool that reads LinkedIn's public job pages.

Data source

Public LinkedIn job-search result cards, public job pages (linkedin.com/jobs/view/...), public company profiles (linkedin.com/company/...) and LinkedIn's public location/company suggestion endpoints. All requests are cookieless.