LinkedIn Jobs Scraper: Salary, Remote & New-Job Alerts avatar

LinkedIn Jobs Scraper: Salary, Remote & New-Job Alerts

Pricing

from $0.95 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper: Salary, Remote & New-Job Alerts

LinkedIn Jobs Scraper: Salary, Remote & New-Job Alerts

Scrape LinkedIn job listings by keyword, location, company or search URL, signed out, no cookies. Full description, salary, seniority, job type, applicants, Easy Apply vs external. Remote/hybrid and experience filters, only-new-jobs feeds. Unofficial; not affiliated with LinkedIn.

Pricing

from $0.95 / 1,000 jobs

Rating

0.0

(0)

Developer

Michael Costa

Michael Costa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

What does LinkedIn Jobs Scraper do?

LinkedIn Jobs Scraper searches LinkedIn job listings by keyword, location, company or search URL and returns each job with its full description, salary, seniority, job type and applicant count, read live from the pages LinkedIn shows anyone who isn't signed in. No login, no cookies. Workplace and experience filters that actually hold, and an only-new-jobs mode for daily feeds.

It is not affiliated with LinkedIn, and it doesn't collect people: the job poster's or recruiter's name and profile are never read.

Input fields · API · Use it from Claude, ChatGPT or Cursor (MCP)

Jump to: Monitor · Fields · Price · Filters · Switching · Input · Output · AI agents (MCP) · Limits · FAQ

Try it in one click: the input comes pre-filled with "software engineer" in the United States, 20 jobs. That's about $0.04 on the Free plan (20 × $1.90/1,000, plus $0.00005 for the run start), $0.02 on a paid plan. Then replace it with the jobs you actually want.

Monitor LinkedIn jobs: get only new jobs, in Slack, email or a webhook

With Only jobs new since my last run on, each run returns (and charges for) only jobs that search hasn't returned before. Sorted newest first (the default), a run stops reading as soon as it reaches jobs it already returned, so a run with nothing new costs almost nothing beyond the $0.00005 start fee.

  1. Fill in Job titles or keywords and Locations (and any filters), turn on Only jobs new since my last run ("onlyNewJobs": true), and click Start. This first run returns every matching job (up to Max jobs per run) and is the baseline.
  2. Click Save as a new task (top right of the actor page). The memory is kept per search: keywords, location, companies, date posted and filters together, so two tasks never hide each other's jobs.
  3. In Apify Console, open Schedules, click Create new, set how often in Schedule setup (for example every hour, or daily at 07:00), then Add your task.
  4. On the task, open the Integrations tab and pick where the new jobs go:
    • Slack: click Configure, sign in, pick the workspace and channel, and the "run succeeded" event. A useful message: {{resource.statusMessage}} and a link, <https://console.apify.com/storage/datasets/{{resource.defaultDatasetId}}|new jobs>.
    • Gmail: click Connect with Google, set the subject and body, and attach the dataset. It sends after each successful run.
    • HTTP webhook: event ACTOR.RUN.SUCCEEDED, your URL. Apify POSTs {"eventType": ..., "resource": {...}}; resource.defaultDatasetId is the run's dataset, and GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json (with your API token) returns the new jobs.

Apify's integrations fire after every successful run, including quiet ones: a quiet run's dataset is empty.

What data does LinkedIn Jobs Scraper return?

FieldExampleNotes
titleSoftware Engineer, 2027 New GradAs the posting shows it
companyName, companyUrl, companyIdWhatnot, its LinkedIn page, 52160608The id works in Companies
location, countryNew York, NY, United StatesCountry read from LinkedIn's location line; null for areas
statedWorkplacehybridremote, hybrid or onsite when the posting says so; null when it doesn't
seniority, experienceLevelMid-Senior level, mid-seniorThe posting's own "Seniority level" line
employmentTypeFULL_TIMEAlso PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, OTHER
salaryMin, salaryMax, salaryCurrency, salaryPeriod155000, 160000, USD, YEARFrom LinkedIn's pay box, else the description (salarySource says which)
applicants, applicantsCountOver 200 applicants, 200null count for "Be among the first 25"
applyTypeexternalexternal (employer's site) or linkedin (Easy Apply)
postedAt, postedAgo2026-10-14, 6 hours ago
description, descriptionHtmlfull text and HTMLnull with Read each job's full posting off
industriesTechnology, Information and InternetAs LinkedIn writes it
urlhttps://www.linkedin.com/jobs/view/4460205602/The job on LinkedIn

Every job has the same fields; the full list is under Output. The record is the same shape as our company-careers-site job actors (Greenhouse, Lever, Ashby, Workday and remote boards), so results merge into one table.

How much does it cost to scrape LinkedIn jobs?

You pay per job returned: $1.90 per 1,000 jobs on Apify's Free plan, $0.95 per 1,000 on every paid plan (Starter, Scale, Business and up), plus $0.00005 each time a run starts. No minimum per run.

  • The pre-filled example: 20 jobs × $1.90/1,000 = $0.038 (Free) or $0.019 (paid), plus the start fee.
  • A month, for example: a daily new-jobs feed of about 200 jobs a day ≈ 6,000 jobs ≈ $5.70 on a paid plan.
  • Caps: Max jobs per run and Max jobs per search in the input, and Maximum cost per run in the run options. The run stops cleanly at whichever comes first, and stops opening postings as soon as the limit is covered.

Never charged: jobs your workplace, experience or job type filters leave out; postings that fail to load or were taken down; the same job found by two of your searches (returned once); with only-new on, jobs returned before.

How to scrape LinkedIn jobs

  1. Open LinkedIn Jobs Scraper and click Try for free (or Start if you're signed in).
  2. Type what you're looking for in Job titles or keywords (one search per line) and where in Locations.
  3. Optional: Date posted, Companies, Workplace, Experience level, Job type, or paste a LinkedIn search URL into LinkedIn search URLs.
  4. Click Start, then open the Output tab and export as JSON, CSV or Excel.

Remote, hybrid, experience and job type filters

When you aren't signed in, LinkedIn's own search ignores its workplace, experience and job type filters: the same search returns the same jobs with or without them (we checked on 2026-10-14). This actor applies them itself, from each posting:

  • Workplace (remote, hybrid, onsite): what the posting says in plain words: its location line, its title ("Data Engineer (Remote)"), or its description ("this is a hybrid role", "fully remote", "3 days a week in the office", "not a remote position"). Company boilerplate such as "work from home policy" isn't counted. Jobs that don't say are left out.
  • Experience level: the posting's own "Seniority level" line. Postings marked "Not Applicable" are left out.
  • Job type: the posting's own "Employment type" line.

Jobs the filters leave out aren't charged. Filtering means opening postings that may not match, so a narrow filter on a broad search takes longer: a remote filter on "software engineer" kept 30 of 120 postings in our test.

Switching from another LinkedIn jobs actor?

Your inputs map like this:

You hadHere
keywords / title / search termsJob titles or keywords (keywords), one search per line
location (+ geoId, distance)Locations (locations); for a geoId or distance, paste the search URL
date posted (r86400, r604800, r2592000)Date posted (past-24-hours, past-week, past-month)
company names or idsCompanies (companies): exact name, LinkedIn company URL or id
search URLs / start URLsLinkedIn search URLs (searchUrls), read as they are
work type / experience / contract typeWorkplace, Experience level, Job type, applied from the posting
limit / rows / max itemsMax jobs per search and Max jobs per run
a list of job ids to skipOnly jobs new since my last run: kept for you, per search

Common output fields: job link → url, job id → jobId, posted date → postedAt, contract type → employmentType, experience level → seniority / experienceLevel, work type → statedWorkplace, job function → department, sector → industries, applications count → applicants / applicantsCount, salary → salaryText plus the parsed salaryMin / salaryMax / salaryCurrency / salaryPeriod. Not here: the job poster's name, photo and profile, and company logos.

Example: software engineers in the United States

The pre-filled input:

{"keywords": ["software engineer"], "locations": ["United States"], "maxResults": 20}

It returned 20 jobs. One of them (real output from a local run on 2026-10-14; long text shortened):

{
"id": "linkedin:whatnot-inc:4460205602",
"jobId": "4460205602",
"platform": "linkedin",
"source": "LinkedIn",
"company": "whatnot-inc",
"companyName": "Whatnot",
"companyId": "52160608",
"companyUrl": "https://www.linkedin.com/company/whatnot-inc/",
"title": "Software Engineer, 2027 New Grad",
"location": "New York, NY",
"country": "United States",
"statedWorkplace": "hybrid",
"employmentType": "FULL_TIME",
"seniority": "Not Applicable",
"industries": "Technology, Information and Internet",
"postedAt": "2026-10-14",
"postedAgo": "6 hours ago",
"url": "https://www.linkedin.com/jobs/view/4460205602/",
"applyType": "external",
"applicants": "Over 200 applicants",
"applicantsCount": 200,
"salaryMin": 155000.0,
"salaryMax": 160000.0,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": "$155,000.00/yr - $160,000.00/yr",
"salarySource": "linkedin",
"description": "🚀 Join the Future of Commerce with Whatnot!\n\nWhatnot is the largest live shopping platform in North America and Europe to buy, sell, and discover the …",
"search": "software engineer in United States"
}

Input

FieldWhat it does
Job titles or keywords (keywords)One search per line, as typed into LinkedIn. Empty: every job at the Companies.
Locations (locations)One per line; each keyword is searched in each location. Empty: worldwide.
Date posted (datePosted)any, past-hour, past-24-hours, past-week, past-month.
Companies (companies)Exact LinkedIn company name, company page URL or numeric id, one per line.
Workplace (workplaceTypes)remote, hybrid, onsite, read from each posting.
Experience level (experienceLevels)internship, entry, associate, mid-senior, director, executive.
Job type (employmentTypes)FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, OTHER.
LinkedIn search URLs (searchUrls)linkedin.com/jobs/search URLs, each read as its own search.
Sort by (sortBy)recent (default, newest first) or relevant.
Read each job's full posting (includeDetails)Default on. Off: only what the search list shows, faster.
Only jobs new since my last run (onlyNewJobs)Return only jobs this search hasn't returned before.
Max jobs per search (maxResultsPerSearch)Cap each keyword × location search (LinkedIn lists at most ~1,000).
Max jobs per run (maxResults)Cap the total across all searches (default 100).
{
"keywords": ["data engineer", "analytics engineer"],
"locations": ["United States", "Canada"],
"datePosted": "past-24-hours",
"workplaceTypes": ["remote"],
"onlyNewJobs": true,
"maxResults": 500
}

Output

Every job has the same fields. Fields LinkedIn doesn't show for a job are null.

{
"id": "linkedin:whatnot-inc:4460205602",
"jobId": "4460205602",
"platform": "linkedin",
"source": "LinkedIn",
"sourceUrl": "https://www.linkedin.com/jobs/",
"company": "whatnot-inc",
"companyName": "Whatnot",
"companyId": "52160608",
"companyUrl": "https://www.linkedin.com/company/whatnot-inc/",
"title": "Software Engineer, 2027 New Grad",
"department": null,
"team": null,
"location": "New York, NY",
"locations": ["New York, NY"],
"country": "United States",
"remote": null,
"workplaceType": null,
"statedWorkplace": "hybrid",
"employmentType": "FULL_TIME",
"seniority": "Not Applicable",
"experienceLevel": null,
"industries": "Technology, Information and Internet",
"postedAt": "2026-10-14",
"postedAgo": "6 hours ago",
"updatedAt": null,
"url": "https://www.linkedin.com/jobs/view/4460205602/",
"applyUrl": "https://www.linkedin.com/jobs/view/4460205602/",
"applyType": "external",
"acceptingApplications": true,
"applicants": "Over 200 applicants",
"applicantsCount": 200,
"salaryMin": 155000.0,
"salaryMax": 160000.0,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": "$155,000.00/yr - $160,000.00/yr",
"salarySource": "linkedin",
"description": "🚀 Join the Future of Commerce with Whatnot! …",
"descriptionHtml": "<strong><strong>🚀 Join the Future of Commerce with Whatnot!<br><br></s…",
"search": "software engineer in United States",
"searchUrl": "https://www.linkedin.com/jobs/search/?keywords=software+engineer&location=United+States&sortBy=DD",
"scrapedAt": "2026-10-14T22:57:19.865688Z"
}

id and jobId are stable across runs, so you can use them to deduplicate. workplaceType and remote are only set when LinkedIn's location line itself says remote, hybrid or on-site; statedWorkplace also reads the title and description. The run's RUN_STATS record lists every search: jobs listed, returned, left out by filters, already returned before, and any posting that failed, with the reason.

Run it on a schedule, or from your own code

  1. Save your input as a task (Save as a new task, top right of the actor page) and add it to a schedule (Console → Schedules → Create new).
  2. Collect results: download the dataset as JSON, CSV or Excel; fetch the latest run's results from the API (GET https://api.apify.com/v2/actor-tasks/<task id>/runs/last/dataset/items?status=SUCCEEDED&format=csv, with your API token); let a webhook tell your system when a run succeeds; or connect it to Make, Zapier or n8n through Apify's integrations.

Can I use LinkedIn Jobs Scraper from an AI agent (MCP)?

Yes, through Apify's MCP server, from Claude, ChatGPT, Cursor or any other MCP client. Add this to your client's MCP configuration (or let the agent find it with the server's actor search); your client signs you in to Apify:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=humble-echidna/linkedin-jobs"
}
}
}

To use an Apify API token instead of signing in, add "headers": {"Authorization": "Bearer <APIFY_TOKEN>"} next to url.

An agent should pass a small search first, e.g.

{"keywords": ["product manager"], "locations": ["London"], "datePosted": "past-week", "maxResults": 20}
.

Who it's for

Job boards and aggregators refreshing listings every day; recruiters and sales teams watching which companies are hiring, and for what; job seekers and agents running a saved search for new postings; researchers sampling pay and demand across roles and places.

Why this one?

  • Filters that hold. Workplace, experience and job type are applied from each posting, because LinkedIn ignores them for signed-out searches, and the jobs they leave out cost nothing.
  • Only new jobs, built in. A scheduled run returns only what that search hasn't returned before, remembered in your own Apify account; no list of seen job ids to keep yourself.
  • Salary as numbers, from LinkedIn's pay box or the description, with the source named.
  • No duplicates across your keyword and location lines in a run.
  • No personal data. Recruiters' and job posters' names and profiles are never read or stored.
  • Reliable. A posting that fails or was taken down only affects itself; the run log and RUN_STATS say which and why. Requests go through Apify's proxy with a fresh IP each time; you don't configure anything.

Limits

  • About 1,000 jobs per search. LinkedIn stops listing a search's results there. Split a big search into several locations or narrower keywords (each line is its own search).
  • Signed-out data only. No poster or recruiter details, no "who applied", no company headcount or website (company pages aren't read), no LinkedIn salary estimates beyond the pay box the employer published.
  • Workplace is read from the posting's words. Most postings don't say; with the Workplace filter on, those are left out. statedWorkplace can misread unusual wording.
  • Job function (department) is often empty: LinkedIn shows it on few signed-out postings.
  • postedAt is a day, not a time; postedAgo is LinkedIn's own rounded wording.

FAQ

This actor reads only what any visitor who isn't signed in sees on linkedin.com: public job listings and job postings. It never signs in, uses no cookies or accounts, and collects no personal data (the job poster's name and profile on some postings are skipped). Be aware that LinkedIn's robots.txt disallows automated access for every crawler, and LinkedIn's User Agreement forbids scraping its services without LinkedIn's permission. Whether and how you use the data is your responsibility; job postings belong to the employers who wrote them. If you are an employer or rights holder and want something removed or not read, open an issue and we'll act on it promptly.

Why did a search return fewer jobs than LinkedIn shows?

LinkedIn's count on its site is an estimate and includes jobs it only shows signed-in members; signed out it lists up to about 1,000 per search. Your filters, Max jobs per search and Max jobs per run cut it further, and RUN_STATS shows how many were listed, left out and returned for each search.

Why did a company name fail?

The name must match one LinkedIn company exactly ("Stripe", not "Strip"); a near miss is reported in the log with the names LinkedIn offers and their ids. Paste the company's LinkedIn page URL or its numeric id to be sure.

Can I get only new jobs since my last run?

Yes: turn on Only jobs new since my last run, save the input as a task and schedule it (see Monitor). Keep Sort by on recent: the run then stops at the first jobs it already returned. The first run returns up to Max jobs per run; jobs older than those count as already seen.

How is this different from LinkedIn's own job alerts?

Alerts email you a few links; this returns every matching job as data (description, salary, seniority, applicants) for a spreadsheet, a database, a job board or an agent, on your schedule, for several searches at once.

ActorUse it when
Company Career Page Jobs ScraperYou want jobs straight from companies' own career pages (Greenhouse, Lever, Ashby and more)
Remote Jobs ScraperYou want remote job boards (We Work Remotely, Remote OK, Python.org)
Hiring Signals MonitorYou want which companies are hiring, and for what, as sales signals

Feedback and support

Found a bug, or need a field or filter that isn't here? Open an issue on the Issues tab with the input you used.

Versions

Current version: 0.1. See the Changelog tab for what changed in each version.