LinkedIn Job Listings with Salary & Company Data Scraper avatar

LinkedIn Job Listings with Salary & Company Data Scraper

Pricing

from $0.49 / 1,000 results

Go to Apify Store
LinkedIn Job Listings with Salary & Company Data Scraper

LinkedIn Job Listings with Salary & Company Data Scraper

Collect LinkedIn job postings by keyword, location, or search URL, with parsed salary ranges, visa-sponsorship signals, and enriched employer profiles. No 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

4 days ago

Last modified

Share

Turn LinkedIn's public job board into a clean spreadsheet. Search by keywords, locations and employers, or paste job links, and get one row per posting with the full description, a yearly salary range with its source, applicant numbers, Easy Apply status, seniority, the recruiter when LinkedIn shows one, and the employer's LinkedIn profile. No LinkedIn account, login or cookies needed.

What this actor does

  • Salary you can sort by. Pay is parsed into minimum, maximum, currency and period, then converted to yearly figures. It comes from LinkedIn's own pay box or, when the employer only wrote it in the description, from that text. salarySource tells you which.
  • Many searches in one run. Several keywords times several locations, company-only searches, pasted LinkedIn search links and individual job links, merged without duplicates.
  • Filters that really narrow the results. Date posted (from the past hour to the past 3 months), distance, Easy Apply, fewer than 10 applicants, companies to include or exclude, experience level, job type, industry, staffing agencies, salary and recruiter.
  • Employer profile included. Industry, size, headquarters, website, founding year, office addresses, follower count, tagline and description, looked up once per company.
  • Empty fields are omitted. Fields LinkedIn doesn't show for a posting are left out instead of filled with blanks or guesses.

Output per job

FieldWhat it contains
id, title, jobUrlLinkedIn job ID, job title and link
companyName, companyUrl, companyId, companyNumericId, companyLogoEmployer name, LinkedIn page, page name, numeric company ID and logo
locationLocation as LinkedIn shows it
postedDate, postedDateText, postedAtDate the job was posted or last reposted, LinkedIn's "2 days ago" text, and the exact UTC posting time when LinkedIn's page shows it (Extended job page depth asks again when it's missing)
expiresAtLinkedIn's own expiry date and time for the posting, when the job page includes structured data (present for many, but not all, postings); omitted otherwise
salary, salaryRange, salarySourcePay as written, parsed {min, max, currency, interval, minYearly, maxYearly}, and employer (LinkedIn's pay box) or description
applicantCount, applicantCountNumeric, applicantCountKind, applicantInsights"Over 200 applicants" as shown, the number, whether it is exact, moreThan or fewerThan, and early-applicant notes
listingBadge, activelyHiringBadge on the search result, such as "Actively Hiring" or "Be an early applicant"
easyApply, applyUrlWhether you can apply on LinkedIn, and the LinkedIn apply page
descriptionText, descriptionHtmlFull job description as plain text and HTML
responsibilities, qualifications, preferredQualificationsBullet lists from the description when it has those sections
seniorityLevel, inferredSeniorityLevel, employmentType, industries, industriesListLinkedIn's job criteria, plus a seniority taken from the title when LinkedIn says "Not Applicable"
experienceYearsMin, experienceYearsMaxYears of experience asked for in the description
visaSponsorshipMentioned, visaSponsorshipPhraseWhether the description offers or rules out visa sponsorship, with the sentence
remoteAllowedtrue when the title or description clearly says the job is fully remote, or when the job page's structured data marks it TELECOMMUTE. It is never set from hybrid or on-site guesses
recruiter{name, title, profileUrl, photoUrl} of the person who posted the job, when LinkedIn shows them
contactEmailsEmail addresses written in the description
atsPlatformHiring system (Workday, Greenhouse, Lever…) when the description links to it
companyIndustry, companySize, companyHeadquarters, companyType, companyWebsite, companyFounded, companySpecialties, companyLocations, companyFollowersCount, companySlogan, companyDescriptionEmployer profile from LinkedIn
companyAffiliatedPages, companySimilarPages{name, url, industry} of the employer's subsidiaries and of similar companies, as listed on its LinkedIn page
companyRecentPostsThe employer's latest public LinkedIn posts: {url, postedAt, text, reactionsCount, commentsCount}
similarJobs, peopleAlsoViewed, similarSearches, industryIds, titleId, titleCategoryLabel, titleCategoryUrlRelated jobs and LinkedIn's own categories (Extended job page depth only)
searchQuery, searchLocation, searchUrlWhich of your searches found the job
scrapedAtWhen the row was collected

The dataset has three ready-made views: Jobs, Salaries (yearly minimum and maximum side by side) and Employers.

Input

FieldTypeDefaultDescription
searchQueriesarray–Keywords to search, one per line. Each one is searched in every location
searchUrlsarray–LinkedIn job search links copied from your browser
jobUrlsarray–Job links or numeric job IDs to scrape directly
locationsarray–Places in English, e.g. Germany, Austin, Texas. Empty means worldwide
geoIdsarray–Numeric LinkedIn location IDs, for exact places
distancestring"" (LinkedIn default)Radius around a city: 0, 5, 10, 25, 50 or 100 miles
timePostedstring"" (any time)Past hour, 24 hours, 3 days, week, 2 weeks, month or 3 months
companiesarray–Employer names, LinkedIn company or university page links, or company IDs
excludeCompaniesarray–Employers to leave out
easyApplybooleanfalseOnly Easy Apply jobs
under10ApplicantsbooleanfalseOnly jobs with fewer than 10 applicants
experienceLevelstring"" (any)Internship, Entry level, Associate, Mid-Senior level, Director or Executive
jobTypestring"" (any)Full-time, Part-time, Contract, Temporary, Volunteer, Internship or Other
industryarray[]LinkedIn industries of the employer
companySizesarray[]Only employers of these sizes (1-10 up to 10,001+ employees)
excludeStaffingAgenciesbooleanfalseSkip staffing and recruiting firms
requireSalarybooleanfalseOnly jobs that state their pay
minYearlySalaryinteger–Skip jobs whose pay range tops out below this yearly amount
salaryCurrencystring"" (any)Only jobs paying in this currency; also the currency of minYearlySalary
requireRecruiterbooleanfalseOnly jobs that name the person who posted them
includeTitleKeywordsarray–Title must contain one of these words
excludeTitleKeywordsarray–Title must not contain any of these words
excludeJobIdsarray–Job IDs from earlier runs to skip
scrapeJobDetailsbooleantrueAdd description, salary, criteria, applicants and recruiter
includeCompanyDetailsbooleantrueAdd the employer's LinkedIn profile
enrichmentDepthstringstandardfull adds similar jobs, related searches and LinkedIn's category IDs, and retries for the exact posting time
languagestringenLanguage of LinkedIn's labels (English, Spanish, French, German, Portuguese)
splitLargeSearchesbooleantrueWhen a search reaches LinkedIn's 1,000-result limit, continue with narrower posting-date windows
maxItemsinteger100Stop after this many jobs (up to 10,000)

Use at least one of searchQueries, searchUrls, jobUrls or companies.

Example: newest data jobs in three countries

{
"searchQueries": ["data engineer", "analytics engineer"],
"locations": ["Germany", "Netherlands", "United Kingdom"],
"timePosted": "r604800",
"maxItems": 300
}

Example: every open role at two employers, with pay only

{
"companies": ["General Motors", "https://www.linkedin.com/company/affirm"],
"requireSalary": true,
"maxItems": 200
}

Example: check a list of postings

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

Use cases

  • Salary benchmarking: compare yearly pay for a title across cities, countries and employers.
  • Recruiting and sourcing: watch fresh postings in your niche, see who is hiring and who posted each role.
  • Sales prospecting: spot companies that are hiring fast in a segment, with their size, website and offices.
  • Job hunting: a daily run with "Past 24 hours", Easy Apply and fewer than 10 applicants, skipping jobs you've already seen.
  • Labour-market research: track demand, seniority mix and pay transparency over time.

FAQ

Do I need a LinkedIn account or cookies? No. The actor reads the job pages LinkedIn shows to signed-out visitors.

Can I filter for remote, hybrid or on-site jobs? Neither the public search nor the job page shows the remote/hybrid/on-site label to signed-out visitors, and the search ignores the workplace filter, so a remote filter can't be offered. remoteAllowed is true when the title or description clearly says the role is fully remote, or when the job page includes LinkedIn's structured data marking it TELECOMMUTE. That structured block only ever marks remote jobs, never hybrid or on-site, so neither is inferred; not every remote job carries it, so the field can be missing for a remote role. Adding "remote" to your keywords narrows results to jobs that mention it. Older saved inputs that still contain the remote filter or the job-function filter keep running; those two settings are ignored and the run's status message says so.

Why do some jobs have no salary? Many employers don't publish pay. The actor reads LinkedIn's pay box and pay ranges written in the description, and never estimates. salarySource shows where each figure came from. Expect most US jobs in pay-transparency states to have a salary, and far fewer elsewhere.

How do I get more than 1,000 jobs? LinkedIn returns at most 1,000 jobs for one search. When a search reaches that limit, the actor automatically continues with the same search restricted to the past month, week, 3 days and 24 hours. Each of those returns its own results, and duplicates are removed, so one keyword and location can yield well over 1,000 jobs. For even more, add locations, keywords or companies. Turn this off with splitLargeSearches if you only want LinkedIn's top 1,000.

Why can't I get the employer's own application link? LinkedIn only shows the external "Apply on company website" link to signed-in members. applyUrl is the LinkedIn page where the application starts, and easyApply tells you whether you can apply on LinkedIn directly.

My location returned the wrong country. LinkedIn quietly searches the whole United States when it doesn't recognise a place. The actor checks every location first: an unrecognised one is matched to LinkedIn's closest suggestion or skipped with a note in the status message. Type places in English ("Germany", not "Deutschland"), or use geoIds.

Which details does LinkedIn hide from signed-out visitors? Remote/hybrid/on-site labels, the employer's own application link, whether a job was reposted, view counts and the job-function category are only shown to signed-in members, so this actor can't return them. Expiry dates are partly available: when the job page carries structured data, expiresAt is LinkedIn's own expiry time. Workarounds: add "remote" to your keywords or use includeTitleKeywords with "remote" or "hybrid"; use remoteAllowed for jobs that clearly state they're fully remote or whose structured data marks them TELECOMMUTE; use postedDate (the latest posting date) for freshness; to track reposts and closures yourself, run on a schedule and compare id values between runs. The exact posting time (postedAt) appears only on some versions of a job page. Extended job page depth asks again to fill it for most jobs, but not all; postedDate is always filled.

How do I get only new jobs on a schedule? Use "Date posted: Past 24 hours", or keep the id values from earlier runs and pass them in excludeJobIds.

Do I need to set up a proxy? No. The actor picks its connection automatically and switches when LinkedIn slows it down.

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