LinkedIn Jobs Scraper: Salaries, Remote & Only-New Jobs avatar

LinkedIn Jobs Scraper: Salaries, Remote & Only-New Jobs

Pricing

from $0.60 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper: Salaries, Remote & Only-New Jobs

LinkedIn Jobs Scraper: Salaries, Remote & Only-New Jobs

Scrape LinkedIn jobs without login: full description, salary, employment type, experience level, applicants, remote/hybrid, skills. Exact filters LinkedIn dropped and only-new mode for daily job alerts. For recruiting, lead generation, job boards and salary research.

Pricing

from $0.60 / 1,000 jobs

Rating

0.0

(0)

Developer

PANIX AI LAB

PANIX AI LAB

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Security

Limited permissions

Share

LinkedIn Jobs Scraper: salaries, remote filter and only-new jobs, no login

Scrape LinkedIn job search results and job pages into clean rows: title, company, location, full description, employment type, experience level, industries, applicants, parsed salary, workplace type (Remote, Hybrid, On-site), Easy Apply, skills and more. It reads LinkedIn's public job pages, so you need no LinkedIn account, no cookies and no login, and nothing can get your account restricted.

You pay only for the jobs you get. Jobs left out by your filters, duplicates, removed jobs and jobs already delivered in earlier runs are free.

What it does

  1. Runs each search term in each location on LinkedIn's public job search (or the search URLs you paste), page by page, up to 1,000 jobs per search, or more with Deep search.
  2. Reads each job's page for the full description and job criteria.
  3. Applies the filters LinkedIn's 2026 AI search no longer applies itself (workplace type, employment type, experience level), plus salary, applicant, title, company and agency filters, exactly.
  4. Delivers one flat row per job to the dataset (JSON, CSV, Excel, Google Sheets, API), with a status line per search and a run summary.

Who uses it

  • Job seekers and job alert tools: a daily schedule with Only new jobs sends just the jobs posted since the last run.
  • Recruiters and staffing firms: see who is hiring for which roles and where, with applicant counts and pay.
  • Sales and lead generation (B2B): companies hiring for a role are buying signals; every row has the company's LinkedIn page and ID.
  • Labor market and salary research: employment type, seniority, industries, yearly pay (hourly and monthly converted), skills and years of experience asked.
  • Job boards and aggregators: fresh listings with descriptions in text, Markdown or HTML.
  • AI agents and RAG pipelines: clean text descriptions and a stable, documented schema, callable from the Apify API or MCP server.

Why this LinkedIn jobs scraper

  • Exact filters that LinkedIn dropped. Since 2026 LinkedIn's public search ignores the remote, job type and experience level filters (f_WT, f_JT, f_E). This Actor reads every job page and keeps only real matches, also for filters inside pasted search URLs. Filtered jobs are free.
  • Salary you can sort by. Pay ranges are parsed into min, max, currency, period, plus annualMin/annualMax (hourly x 2,080, monthly x 12), with salarySource telling you when the employer provided it. Filter by Minimum yearly salary.
  • Only new jobs for schedules. Remembers what it delivered under a monitor name; the next run skips seen jobs before their page is read, so a daily check of a busy search costs cents.
  • Skills and requirements from the text. Skills, years of experience, education level, visa sponsorship and description language.
  • Workplace type on every row where the title, location or description says it, plus isRecruitingAgency and an option to leave agencies out.
  • Past the 1,000-result limit. Deep search runs date and Easy Apply variants of a search and merges them without duplicates.
  • Cheap to run, fast and light. Plain HTTP on datacenter proxy, no browser, 512 MB; the example run (20 jobs with full pages) finishes in about 20 seconds.
  • Clear run reports. SEARCHES says per search how many pages were read, jobs seen, delivered and left out, and why it stopped; SUMMARY counts jobs left out per filter.

Coming from another LinkedIn jobs scraper?

Common problem in this categoryHow this Actor handles it
Remote / job type / experience filters return the same jobs as without themApplied exactly after reading each job page; one chosen value is also added to the search words, as LinkedIn advises
Salary only as a raw stringParsed min, max, currency, period and yearly values; minimum yearly salary filter
Re-running a schedule returns the same jobs and charges againOnly new jobs mode: seen jobs are skipped and free
Duplicates when several searches overlapEach job is delivered once per run; duplicates are free
Charged for empty or failed pagesRemoved jobs, filtered jobs and failed searches are not charged
Needs a LinkedIn login or cookiesPublic guest pages only, nothing to log in
Stops at 1,000 jobs per searchDeep search merges variants of the search
Big browser image, slow startsPlain HTTP, 512 MB, starts in seconds

How to use it

  1. Type one or more Search terms (for example python developer) and Locations (United States, London, England, United Kingdom, Germany).
  2. Or paste LinkedIn search URLs from your browser (open linkedin.com/jobs in a private window, search, copy the address), single job links, or job IDs.
  3. Set Max jobs per search and any filters, then click Start.
  4. Download the dataset or connect it to Google Sheets, Make, n8n, Zapier or your code.

For daily alerts: turn on Only new jobs, set Date posted to Past 24 hours, give the schedule its own Monitor name, and create a schedule in Apify (Schedules -> Create new).

Input examples

Search terms x locations, last week:

{
"searchTerms": ["data engineer", "analytics engineer"],
"locations": ["Germany", "Netherlands"],
"datePosted": "pastWeek",
"maxJobsPerSearch": 100
}

Remote jobs with a salary of at least 120,000 a year, no agencies:

{
"searchTerms": ["software engineer"],
"locations": ["United States"],
"workplaceTypes": ["Remote"],
"minAnnualSalary": 120000,
"excludeRecruitingAgencies": true,
"maxJobsPerSearch": 200
}

Pasted LinkedIn URLs and job links (old filters in the URL are applied exactly):

{
"startUrls": [
"https://www.linkedin.com/jobs/search/?keywords=product%20manager&location=London&f_WT=2&f_E=4",
"https://www.linkedin.com/jobs/view/4432486930"
]
}

Every job at given companies (company IDs come from f_C= in LinkedIn URLs or the companyId field of earlier results):

{ "companyIds": ["1441", "1035"], "locations": ["United States"], "maxJobsPerSearch": 500 }

Daily new-jobs alert:

{
"searchTerms": ["registered nurse"],
"locations": ["California, United States"],
"datePosted": "past24Hours",
"onlyNewJobs": true,
"monitorName": "nurse-california-daily",
"maxJobsPerSearch": 500
}

Cheap list only (search-card fields, no job pages):

{ "searchTerms": ["barista"], "locations": ["Austin, Texas, United States"], "jobDetails": false, "maxJobsPerSearch": 1000 }

Output

One row per job. A real row from a run (description shortened):

{
"jobId": "4465379983",
"url": "https://www.linkedin.com/jobs/view/4465379983",
"title": "Senior Software Engineer - Python",
"company": "Venmo",
"companyUrl": "https://www.linkedin.com/company/venmo",
"companyId": "552278",
"location": "Austin, TX",
"countryCode": "US",
"workplaceType": "On-site",
"postedDate": "2026-10-22",
"postedTimeAgo": "2 weeks ago",
"employmentType": "Full-time",
"experienceLevel": "Not Applicable",
"industries": ["Financial Services"],
"applicants": 200,
"applicantsIsMinimum": true,
"applicantsText": "Over 200 applicants",
"easyApply": false,
"isClosed": false,
"isRecruitingAgency": false,
"salary": null,
"description": "The Company\nPayPal has been revolutionizing commerce globally for more than 25 years...",
"skills": ["Python", "Django", "Flask", "Git", "Distributed Systems", "AWS", "Terraform", "SQL", "Redis", "CI/CD"],
"experienceYears": 3,
"educationLevel": "bachelor",
"visaSponsorship": null,
"descriptionLanguage": "en",
"badges": [],
"detailsMissing": false,
"searchTerm": "python developer",
"searchLocation": "United States",
"rank": 7,
"scrapedAt": "2026-11-05T19:47:54Z"
}

A job with pay shows it like this:

"salary": {"min": 60, "max": 100, "currency": "USD", "period": "hour", "text": "$60.00/hr - $100.00/hr",
"annualMin": 124800, "annualMax": 208000},
"salarySource": "employer"

Main fields

FieldWhat it is
jobId, urlLinkedIn job ID and link
title, company, companyUrl, companyId, companyLogoThe job and the hiring company
location, countryCode, workplaceTypeWhere, and Remote / Hybrid / On-site when the posting says it
postedDate, postedTimeAgo, postedAtEstimateLinkedIn's date, its "2 hours ago" text, and an estimated time for recent jobs
employmentType, experienceLevel, industriesJob criteria from the job page
applicants, applicantsIsMinimum, applicantsTextApplicant count ("Over 200" = 200 and a minimum)
easyApply, isClosed, isRecruitingAgencyApply on LinkedIn, no longer accepting applications, posted by an agency
salary, salarySourceParsed pay and its source
description, descriptionMarkdown, descriptionHtmlIn the format you choose
skills, experienceYears, educationLevel, visaSponsorship, descriptionLanguageRead from the description
badgesLinkedIn badges such as "Actively Hiring" or "Be an early applicant"
searchTerm, searchLocation, searchUrl, rankWhich search found the job and at which position
detailsMissingtrue if LinkedIn refused the job page after retries (the row still has the search-card fields)

The Output tab has views for Jobs, Pay and requirements, Details and Search and rank.

Pricing

Pay per event, no monthly fee:

EventFree planStarter (Bronze)Scale (Silver)Business (Gold) and up
Job with its job page read (per 1,000)$1.00$0.80$0.70$0.60
Job, search card only (Read job pages off, per 1,000)$0.40$0.30$0.25$0.20
Actor start (per run, per GB of memory)$0.001$0.001$0.001$0.001

Free: jobs left out by filters, duplicates, removed jobs, failed searches and jobs already delivered in earlier runs (only-new mode). With the default 512 MB a run pays one start event. Set a spending limit on the run and the Actor stops before it.

Examples: 1,000 jobs with full pages on the Starter plan cost $0.80 plus $0.001; a daily alert that finds 15 new jobs costs about $0.013.

Use it from code, n8n, Make, Zapier and AI agents

Python (apify-client 3.x):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("panix/linkedin-jobs-scraper").call(run_input={
"searchTerms": ["python developer"],
"locations": ["United States"],
"workplaceTypes": ["Remote"],
"maxJobsPerSearch": 100,
})
for job in client.dataset(run.default_dataset_id).iterate_items():
print(job["title"], job["company"], job["location"], (job["salary"] or {}).get("annualMax"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('panix/linkedin-jobs-scraper').call({ searchTerms: ['nurse'], locations: ['United Kingdom'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((j) => [j.title, j.company, j.employmentType]));

One HTTP call that runs the Actor and returns the rows (n8n HTTP Request node, Make HTTP module, any script):

POST https://api.apify.com/v2/acts/panix~linkedin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
Content-Type: application/json
{"searchTerms": ["python developer"], "locations": ["United States"], "maxJobsPerSearch": 20}

n8n, Make and Zapier also have Apify apps: choose Run Actor, pick panix/linkedin-jobs-scraper, paste the input JSON, then read the dataset items. AI agents can call it through the Apify MCP server (https://mcp.apify.com).

FAQ

Do I need a LinkedIn account? No. The Actor reads the job pages LinkedIn shows to everyone who is not logged in. No login, cookies or session tokens.

Why do LinkedIn's own remote or job type filters not work? In 2026 LinkedIn moved its public job search to AI search, which ignores f_WT, f_JT and f_E in search URLs (we tested: the same jobs come back). This Actor applies those filters itself after reading each job page, and adds a chosen value to the search words so more results already match.

How is workplace type found? From "(Remote)" or "Hybrid" in the title or location, then the first part of the description. When nothing says it the field is empty; with a workplace filter such jobs are left out unless you turn on Keep jobs with unknown workplace.

How many jobs can I get? LinkedIn shows up to 1,000 jobs per search. Add more locations or search terms, or turn on Deep search (date and Easy Apply variants, merged without duplicates).

How does Only new jobs work? The Actor stores the job IDs it delivered in a named key-value store in your account (linkedin-jobs-scraper-monitors, one record per monitor name, kept 120 days). The first run delivers everything; later runs with the same monitor name skip jobs already delivered. Seen jobs are free.

Is every job page read? Yes, unless Read job pages is off. If LinkedIn refuses a page after several retries on new IPs, the job is still delivered with its search-card fields and detailsMissing: true.

Why is the salary empty for many jobs? LinkedIn shows pay only when the employer or LinkedIn provides it, mostly in the US, Canada and the UK.

Can I get the recruiter's name or email? No. LinkedIn's public pages do not show the poster, and this Actor never collects emails or phone numbers; contact details inside descriptions are removed.

Limits

  • Public job pages only: no salary insights, applicant demographics or poster names that need a login.
  • LinkedIn's search order and results can differ between visits. Use Only new jobs for monitoring rather than comparing two full runs.
  • Workplace type, skills, years of experience and education are read from the text and can miss or misread unusual wording.
  • Company pages (headcount, followers) are not scraped: LinkedIn blocks them for logged-out visitors from data center IPs.

The Actor collects job postings that employers published for everyone to see. Rows contain company data and no personal contact details. You are responsible for using the data lawfully, including LinkedIn's terms and data protection laws such as the GDPR where they apply.

Support

Open an issue on the Actor's Issues tab with the run ID; it is answered quickly. Feature requests are welcome.