LinkedIn Job Details Scraper: URLs & Job IDs avatar

LinkedIn Job Details Scraper: URLs & Job IDs

Pricing

from $1.49 / 1,000 jobs

Go to Apify Store
LinkedIn Job Details Scraper: URLs & Job IDs

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

DeepMine

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

3 hours ago

Last modified

Features

Limited permissions

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 MotorsMountain View, CA$160,000 - $200,000 per yearOver 200 applicants
Senior Software Engineer, Backend (AI Platform)AffirmBoise, ID$173,000 - $233,000 per yearBe among the first 25 applicants
Member Experience Software Development Engineer II - IIICambia Health SolutionsBoise, ID$93,500 - $126,500 per year33 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. jobState says open or closed, expiresAt the date LinkedIn's posting data says the job runs until, and links to jobs LinkedIn took down are listed in the run's OUTPUT and cost nothing.
  • Pay research. LinkedIn's own pay box, else the range written in the description, in the currency the posting states; salarySource says 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

  1. 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 just 4478595713. 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.
  2. Company profile on each row: on by default, same price; off is a little faster.
  3. 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):

FieldFilled
Description, seniority, job type, industry, applicants line, apply type, open or closed100%
Company profile (website, size, headquarters)100%
Similar jobs, people also viewed100%
Related searches (one run, 49 jobs)98%
Workplace (remote, hybrid, on-site)91%
Exact listing time and expiry date69%
Pay range56%
Applicant count as a number (LinkedIn shows "Over 200" or "Be among the first 25" otherwise)69%
Months of experience asked52%
Education asked63%
Job poster12%
Skills the employer listed0%

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.notDelivered lists them.
  • A run the platform restarts carries on where it stopped: rows already delivered aren't repeated or charged again.

Pricing

PlanPer 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 os
from apify_client import ApifyClient
client = 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);
ToHow
Run it on a scheduleSave 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 endsA webhook calls your URL when a run succeeds or fails, with the run's dataset id.
ZapierThe Apify app for Zapier starts a run or picks up its rows in a Zap.
MakeThe Apify app for Make does the same in a Make scenario.
n8nThe Apify node for n8n runs the Actor and reads its rows in a workflow.
AI agentsThe 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.