LinkedIn Job Details Scraper: URLs & Job IDs
Pricing
from $1.49 / 1,000 jobs
LinkedIn Job Details Scraper: URLs & Job IDs
LinkedIn job details scraper and LinkedIn job API: paste job URLs or IDs, get LinkedIn job data from each job's full page: description, pay, expiry date, applicants, seniority, apply type, similar jobs and the company's LinkedIn profile, at one price per job. Dead links aren't charged. No login.
Pricing
from $1.49 / 1,000 jobs
Rating
0.0
(0)
Developer
DeepMine
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
3 hours ago
Last modified
Categories
Features
Share
This LinkedIn job details scraper takes LinkedIn job URLs or job IDs and returns each job's full page: the description, seniority, job type, industry, the applicants line, Easy Apply or apply on the company's site, open or closed, similar jobs and related searches, and the pay range when LinkedIn shows it. The company's LinkedIn profile (website, domain, industry, size, followers, headquarters and address) is on every row too, at one price per job.
| ๐ผ Title | ๐ข Company | ๐ Location | ๐ฐ Pay | ๐ฅ Applicants |
|---|---|---|---|---|
| Senior Software Engineer โ Go (Golang) | General Motors | Mountain View, CA | $160,000 - $200,000 per year | Over 200 applicants |
| Senior Software Engineer, Backend (AI Platform) | Affirm | Boise, ID | $173,000 - $233,000 per year | Be among the first 25 applicants |
| Member Experience Software Development Engineer II - III | Cambia Health Solutions | Boise, ID | $93,500 - $126,500 per year | 33 applicants |
$1.99 per 1,000 jobs on the Starter plan ($2.29 Free, $1.79 Scale, $1.49 Business), job details and company data included, no start fee. The prefilled run (50 jobs) costs about $0.10.
Next step: find jobs by keyword and place with LinkedIn Jobs Search, or every opening of the employers you follow (only the new ones on scheduled runs) with LinkedIn Company Jobs Scraper. A closed job whose page LinkedIn now sends to a job search is read from its job card instead (jobState: closed); a job LinkedIn took down is listed in the run's OUTPUT and costs nothing.
No LinkedIn account, login or cookies.
What it's for
- Enrich job lists you already have. Job alerts, a job board's links or a CRM's open roles: paste them and get LinkedIn's full posting, its seniority and job type, and the employer's profile in one row.
- Check which jobs are still open.
jobStatesays open or closed,expiresAtthe date LinkedIn's posting data says the job runs until, and links to jobs LinkedIn took down are listed in the run'sOUTPUTand cost nothing. - Pay research. LinkedIn's own pay box, else the range written in the description, in the currency the posting states;
salarySourcesays which. - Find the jobs first. No job URLs yet? LinkedIn Jobs Search searches by role and place and returns the jobs with their details.
- Recruiting and sales research. Who is hiring, at what level, in which office, with the company's website, size and headquarters on the same row.
How to set it up
- Job URLs or IDs, one per line:
https://www.linkedin.com/jobs/view/4478595713, the long address with the job's title in it, a search URL with a job open (?currentJobId=...), or just4478595713. Each job is read once even if you paste it twice. Entries that aren't LinkedIn jobs are skipped, named in the log and not charged. - Company profile on each row: on by default, same price; off is a little faster.
- Max jobs (optional): a ceiling on the cost. You pay only for the jobs you get.
{"jobUrls": ["https://www.linkedin.com/jobs/view/4478595713", "4472640743"],"includeCompanyDetails": true}
Inputs written for other LinkedIn job details scrapers work as they are: job_url, job_id, searchUrls, startUrls, urls (a list or one value, request-list entries included) and maxItems.
Output
One row per job. Fields, in row order: companyLogo, title, company, location, salary, salaryMin, salaryMax, salaryPeriod, salaryCurrency, salarySource, salaryAppliesTo, salaryRanges, employmentType, seniority, workplaceType, applicants, applicantsText, isEasyApply, applyType, applyUrl, postedAt, postedTimeAgo, isReposted, jobState, detailsStatus, listedAt, expiresAt, jobUrl, companyUrl, companySlug, companyInput, companyWebsite, companyDomain, companyIndustry, companySize, companySizeMin, companySizeMax, companyEmployeesOnLinkedIn, companyFollowers, companyHeadquarters, companyType, companyFounded, companySlogan, companySpecialties, companyDescription, companyStreetAddress, companyCity, companyRegion, companyPostalCode, companyCountry, companyOfficeLocations, companyAffiliatedPages, companyRecentPosts, jobPosterName, jobPosterTitle, jobPosterUrl, jobPosterPhoto, industries, benefits, jobInsights, yearsOfExperience, contactEmail, emails, phones, skills, educationLevel, experienceMonths, descriptionSnippet, description, similarJobs, peopleAlsoViewed, relatedSearches, locationCity, locationState, locationCountry, locationCountryCode, latitude, longitude, jobId, companyId, searchKeywords, searchLocation, searchUrl, scrapedAt. Description as HTML too adds descriptionHtml; Skills to look for adds matchedKeywords, unmatchedKeywords and keywordMatchScore.
listedAt, expiresAt, educationLevel, experienceMonths, skills, latitude, longitude and locationCountryCode come from the posting data LinkedIn puts in most job pages; a job page without it leaves them empty. searchUrl is the link or ID as you gave it.
How often each field was filled, 3 runs on 252 jobs (2026-10-19):
| Field | Filled |
|---|---|
| Description, seniority, job type, industry, applicants line, apply type, open or closed | 100% |
| Company profile (website, size, headquarters) | 100% |
| Similar jobs, people also viewed | 100% |
| Related searches (one run, 49 jobs) | 98% |
| Workplace (remote, hybrid, on-site) | 91% |
| Exact listing time and expiry date | 69% |
| Pay range | 56% |
| Applicant count as a number (LinkedIn shows "Over 200" or "Be among the first 25" otherwise) | 69% |
| Months of experience asked | 52% |
| Education asked | 63% |
| Job poster | 12% |
| Skills the employer listed | 0% |
What logged-out LinkedIn doesn't show, so no row has it: view counts, exact application counts above 200, the employer's own application link, and the job function (LinkedIn no longer shows it on logged-out job pages). Skills appear only when the employer typed them into the posting.
Speed, restarts, failures
- 3 platform runs: 49โ153 jobs in 10โ31 seconds, the first row after a few seconds.
- Links to jobs that are gone and pages that didn't load after retries are not delivered and not charged; the status message counts them and
OUTPUT.jobUrls.notDeliveredlists them. - A run the platform restarts carries on where it stopped: rows already delivered aren't repeated or charged again.
Pricing
| Plan | Per 1,000 jobs |
|---|---|
| Free | $2.29 |
| Starter | $1.99 |
| Scale | $1.79 |
| Business | $1.49 |
One price per job delivered, with its job page, posting data and company profile included. No start fee.
Use it from your stack
Every run is also an API call. Take your API token from the Apify Console (Settings โ API & Integrations) and keep it in an environment variable such as APIFY_TOKEN.
One HTTP call, any language: start a run and get its jobs back as CSV in the same request. The call waits up to 5 minutes; for bigger runs, start the run with /runs and read its dataset when it finishes.
curl -X POST "https://api.apify.com/v2/acts/deepmine~linkedin-job-details-scraper/run-sync-get-dataset-items?format=csv&fields=title,company,location,salary,employmentType,applicantsText,postedAt,jobUrl" \-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \-d '{"jobUrls": ["https://www.linkedin.com/jobs/view/4483260459"]}' \-o jobs.csv
format also takes xlsx, json, jsonl, xml or html; fields picks the columns (leave it out to get all columns).
Python, with the official Apify client (pip install apify-client):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("deepmine/linkedin-job-details-scraper").call(run_input={"jobUrls": ["https://www.linkedin.com/jobs/view/4483260459"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("title"), item.get("company"), item.get("salary"))
JavaScript, with the official Apify client (npm install apify-client):
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor("deepmine/linkedin-job-details-scraper").call({"jobUrls": ["https://www.linkedin.com/jobs/view/4483260459"]});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.title, item.company, item.salary);
| To | How |
|---|---|
| Run it on a schedule | Save your input as a task, then add a schedule (for example every Monday at 7:00). Each scheduled run is billed like any other run. |
| Hear when a run ends | A webhook calls your URL when a run succeeds or fails, with the run's dataset id. |
| Zapier | The Apify app for Zapier starts a run or picks up its rows in a Zap. |
| Make | The Apify app for Make does the same in a Make scenario. |
| n8n | The Apify node for n8n runs the Actor and reads its rows in a workflow. |
| AI agents | The Apify MCP server gives Claude, Cursor or VS Code this Actor as a tool. |
The API tab shows the same calls for the other clients.
Related
- LinkedIn Jobs Search: search LinkedIn jobs by keyword, place and date.
- LinkedIn Company Jobs Scraper: every open job of the companies you name, with an only-new-jobs monitor.