LinkedIn Jobs Salary Data — Filter by Pay
Pricing
Pay per event
LinkedIn Jobs Salary Data — Filter by Pay
Scrape public LinkedIn jobs and get the salary as structured data — min, max, currency, period — normalized to a yearly figure, so you can filter to jobs paying over a threshold and see the real pay distribution. Honest about the ~60% of jobs that state pay. No login, no cookies.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Northbell
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Scrape public LinkedIn jobs and get the pay as structured data — minimum, maximum, currency, and whether it is hourly or yearly — normalized to a yearly figure so you can filter to jobs paying over a threshold and see the real pay distribution. No login, no cookies.
What every other jobs scraper leaves you to do
The popular LinkedIn job scrapers hand you the description as a wall of text and let you dig the salary out of it. None of them return the pay as numbers you can sort, filter, or average. So "show me jobs paying over $150k" is a thing you cannot ask — you scrape everything and grep by hand.
This Actor does that work, honestly:
- Pay as fields.
$150K – $220Kin the text becomesannualSalaryMin: 150000,annualSalaryMax: 220000,currency: USD,salaryPeriod: year. - Hourly and monthly normalized.
$46 – $50 per hourbecomes a yearly figure (× 2080 hours) so a warehouse job and a director job sit on the same axis. The original is kept too. - Filter by pay. Set a minimum yearly salary and get back only the jobs that reach it.
- The real distribution. Every run reports the median and range of pay across the jobs that stated it.
Honest about what isn't there
About 6 in 10 US jobs state their pay (we measured it live — pay-transparency laws made US postings the most forthcoming; elsewhere it is lower). The rest simply do not write a number down. This Actor does not invent one. Each job is tagged salaryFound: true/false, and the summary tells you the fill rate every run.
And it does not mistake other numbers for salary. Job descriptions are full of dollar figures that are not pay:
| Looks like money | What it really is | Handled by |
|---|---|---|
$20M+ raised from investors | funding | rejected — near "raised/funding/series" |
$800 billion market | market size | rejected — implausible as a yearly wage |
$5,000 signing bonus | one-off bonus | rejected — near "bonus/signing" |
Annual maximum out of pocket $200,000 | insurance benefit | rejected — near "deductible/insurance/out-of-pocket" |
on-target earnings of $175,000 | OTE/commission | skipped in favour of the base salary |
The rule that catches most of them: normalize to a yearly figure first, and if it lands outside $8,000–$2,000,000, it is not a wage. On top of that, a number is only taken as pay when its own label says so ("salary", "pay range", "per hour"), never a bare figure sitting in a sentence.
What you get
Two kinds of row, tagged by type.
job — one per returned job:
| field | meaning |
|---|---|
salaryFound | whether the posting stated pay |
currency | USD, GBP, CAD, … from the symbol used |
salaryPeriod | year / hour / month — how it was originally written |
salaryMin, salaryMax | the range in that original period |
annualSalaryMin, annualSalaryMax | normalized to a yearly figure for comparison |
salaryText | the exact phrase from the posting, so you can check us |
title, company, location, postedOn, seniority, employmentType, jobUrl | the posting |
summary — one per run: how many jobs stated pay (salaryFillRatePct), how many were returned or dropped, and the pay distribution (annualSalaryMedian, min, max) across the jobs that stated it, plus a breakdown by currency and period.
Sizing and cost
maxJobs is how many jobs to examine, not how many come back. Pay lives on the job page, so every job is opened and read. You are charged per job page opened — that is your cost ceiling. With a minimum-salary filter on, fewer jobs match, so raise maxJobs to get more matches.
requests ≈ ceil(maxJobs / 10) + maxJobs
Pay per event, charged only for real work:
| event | when |
|---|---|
| Actor start | once per run |
| Job listed | one job seen in the listing |
| Job examined | one job page opened and read for pay |
A failed fetch is never charged.
No login. Not as a policy — as a property of the code.
This Actor never signs in, never asks for a session cookie, and never sends one. The request headers are a frozen object with no Cookie and no Authorization, and nothing can add one at runtime; a guard rejects any credential header, and the input schema refuses any field that looks like cookie, token or password. Unit tests assert all of it. The line the courts draw is whether you logged in (Meta v. Bright Data, 2024) — this Actor cannot, by construction.
Input
{"keywords": "software engineer","location": "United States","datePosted": "past-week","minSalary": 150000,"maxJobs": 200}
Leave minSalary empty (and onlyWithSalary off) to get every job, each tagged with whether pay was found and, where it was, parsed into fields.
On data and privacy
This Actor collects job postings, not people. It does not read, store or return applicant identities, profiles, names or contact details. It keeps no history between runs — the only stored state is a shared rate-limit budget. Company logos are not redistributed.
Running locally
npm installnpm test # 31 unit tests, no network, including the no-login guarantees and the salary parser's traps
For AI agents
This Actor works well as an agent tool: the input schema is small and fully described, every run returns structured rows, and failures come back as data rather than silent gaps. Use it when you need to:
- scrape LinkedIn jobs with the salary parsed into numbers
- find LinkedIn jobs paying over a yearly salary threshold
- get the salary distribution (median, range) for a job search
More no-login scrapers by northbell
Every one of these reads only public pages — no login, no cookies — and most of them record the numbers that cannot be back-filled if you don't capture them today.
LinkedIn jobs
- LinkedIn Jobs Scraper with Applicant Counts — jobs plus how fast applicants are arriving
- LinkedIn Jobs Scraper — Filters That Actually Work — the experience/workplace filters LinkedIn silently ignores, applied for real
- LinkedIn Jobs Salary Data — Filter by Pay — salary parsed into numbers so you can filter by yearly pay
- Fast LinkedIn Jobs Scraper — bulk job listings, cheap and quick
- LinkedIn Company Jobs Scraper — every open role at a company you name
LinkedIn companies
- LinkedIn Company Scraper with Headcount Growth — the real headcount and how fast it's growing
- LinkedIn Company Posts + Engagement — a company's posts with exact reaction and comment counts
App stores
- App Store Rank & Rating Scraper — iOS keyword rank and rating changes over time
- Shopify App Reviews Scraper — Filter & Sort by Rating — exact per-star review counts, filter and sort
- Google Play Rating & Review Tracker — an Android app's rating tracked day by day