LinkedIn Job Details Scraper - By URL or Job ID avatar

LinkedIn Job Details Scraper - By URL or Job ID

Pricing

from $0.16 / 1,000 jobs

Go to Apify Store
LinkedIn Job Details Scraper - By URL or Job ID

LinkedIn Job Details Scraper - By URL or Job ID

Scrape LinkedIn job details from job URLs or job IDs, no login: one row per input in your order. Get title, company, exact posted date, full description as text, HTML and Markdown, salary, applicants, Easy Apply, closed status, optional job poster. Not found is free. Pay per job, JSON or CSV.

Pricing

from $0.16 / 1,000 jobs

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

5

Monthly active users

4 days ago

Last modified

Share

LinkedIn Job Details Scraper - By URL or Job ID

LinkedIn Job Details Scraper turns a list of LinkedIn job URLs or job IDs into complete public job records, with no LinkedIn login, no cookies and no API key. Paste 1 or 20,000 jobs: every value gets exactly one row, in the order you gave, and anything LinkedIn cannot serve gets a free status row that says why. You pay only for jobs delivered.

Each job row carries the title, company (with LinkedIn company ID), location, the exact posted date read from LinkedIn's own search card, the full description as plain text, HTML and Markdown, seniority, employment type, job function, industries, the employer's pay range when shown, applicant count, Easy Apply or company site apply, open or closed state, and on request (two switches, off by default) the job poster card and any e-mail addresses written in the description; URLs in the description are always listed. Company details (website, size, employees on LinkedIn, headquarters, founded, specialties, followers) are one switch away.

Why this one

  • Every input gets a row, in order. Not found, invalid, duplicate and blocked values get a free status row in their place. Nothing is dropped silently and nothing missing is billed.
  • Real posted dates. LinkedIn's job page only says "2 days ago". This Actor reads the posting's date from LinkedIn's public search card, matched on the job ID, instead of guessing it from the relative text.
  • Closed jobs are marked. Postings that show "No longer accepting applications" come back with jobState: "closed", or can be skipped for free.
  • Pay once per job across runs with an optional memory name, ideal for scheduled runs over a growing list.

Quick start

  1. Paste job URLs or IDs into LinkedIn job URLs or job IDs (one per line). Any of these work: https://www.linkedin.com/jobs/view/4454862094, a URL with the title slug and tracking, a regional URL such as uk.linkedin.com, a search URL with currentJobId=..., urn:li:jobPosting:4454862094, or the bare number.
  2. Leave Exact posted date on. Turn on Company details if you want the company block.
  3. Click Start. Rows appear in the Dataset tab in input order; export JSON, CSV or Excel, or read them through the API.

What you get

Measured on 320 live open postings across 16 countries on 2026-09-29 (fill rates are what LinkedIn publishes, not what the Actor chooses to return):

FieldWhat it isFilled
jobId, jobUrl, jobSlugUrlLinkedIn job ID and canonical URLs100%
title, companyName, locationAs shown on the posting100%
companyId, companySlug, companyUrl, companyLogoUrlLinkedIn's company identity99.7%
postedDateExact posting date, YYYY-MM-DD, from LinkedIn's search card, postedDateSource says how97% of open jobs
postedTimeAgo, postedWindowStart, postedWindowEndThe relative text and the time window it implies100%
jobState, isClosedopen or closed (No longer accepting applications)100%
applicantsText, applicantsMin, applicantsMax"Over 200 applicants" and the bounds that text states100%
applyMethod, isEasyApply, applyButtoneasy_apply or external, from LinkedIn's own Apply button100% of open jobs
seniorityLevel, employmentType, industries, industriesListLinkedIn job criteria100%
jobFunction, jobFunctionsJob function, also split into a list93%
descriptionText, descriptionHtml, descriptionMarkdown, descriptionLengthFull description in three formats100%
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salarySourceEmployer provided pay range, parsed9% (shown only when the employer provides it)
jobPoster (opt in, includeJobPoster)Name, headline and profile URL from "Direct message the job poster"16%
descriptionUrls, descriptionEmails (e-mails opt in, includeContactEmails)URLs and e-mail addresses written in the description11% each
company (option)website, industry, companySize, employeesOnLinkedIn, headquarters, organizationType, foundedYear, specialties, followers, description, tagline95% of jobs (school pages are not public)

A status row (type: "status") carries position, input, status (not_found, invalid, duplicate, already_known, filtered, blocked, failed, skipped) and a message. The last row of every run is a free summary with counters: delivered, charged, not found, exact dates, company details, requests and retries.

Example job row (shortened):

{
"type": "job",
"status": "ok",
"position": 0,
"jobId": "4451937327",
"jobUrl": "https://www.linkedin.com/jobs/view/4451937327",
"title": "Sales Associate - Northland Volkswagen",
"companyName": "AutoCanada",
"companyId": "1869302",
"location": "Calgary, Alberta, Canada",
"jobState": "open",
"postedDate": "2026-09-23",
"postedDateSource": "search_card",
"postedTimeAgo": "5 days ago",
"applicantsText": "36 applicants",
"applicantsMin": 36,
"applicantsMax": 36,
"applyMethod": "external",
"isEasyApply": false,
"salaryText": "CA$90,000.00/yr - CA$170,000.00/yr",
"salaryMin": 90000,
"salaryMax": 170000,
"salaryCurrency": "CAD",
"salaryPeriod": "YEAR",
"salarySource": "employer",
"seniorityLevel": "Associate",
"employmentType": "Full-time",
"jobFunctions": ["Sales", "Business Development"],
"industries": "Motor Vehicle Manufacturing",
"descriptionMarkdown": "**Join the ride!**\n\n**Position**: Sales Associate ..."
}

How much does it cost to scrape LinkedIn job details?

You pay per delivered job. Status rows (not found, invalid, duplicate, blocked, skipped) and the run summary are free.

EventFREEBRONZESILVERGOLD
Job$0.20 / 1,000$0.20 / 1,000$0.18 / 1,000$0.16 / 1,000
Company (option, once per company per run)$0.50 / 1,000$0.50 / 1,000$0.45 / 1,000$0.40 / 1,000
Actor start (per GB of memory, once per run)$0.001$0.001$0.001$0.001

Worked example on the FREE tier: 1,000 job URLs with company details for 300 distinct employers cost $0.20 + $0.15 + $0.001 start (the default 512 MB run counts as one start event) = about $0.35. The exact posted date is included in the job price. The Store pricing card shows the same prices per 1,000 events.

Input

FieldDefaultWhat it does
jobUrls(sample jobs)Job URLs, URNs or IDs, one per line. jobIds, job_id, jobUrlsOrIds, startUrls and urls are accepted too.
maxJobs0 (no limit)Stop after this many delivered jobs; later values get a free skipped row.
exactPostedDatetrueOne public search per open job to read the posting date.
includeCompanyDetailsfalseCompany block from the public company page, billed once per company per run.
includeJobPosterfalseThe job poster card when the page shows one (personal data, off by default).
includeContactEmailsfalseE-mail addresses written in the description (off by default).
includeDescriptionHtml, includeDescriptionMarkdowntrueKeep the HTML and Markdown versions of the description.
skipClosedJobsfalseClosed postings become free filtered rows.
memoryName, resetMemoryemptyPay once per job across runs that share the name.
maxConcurrency5Jobs fetched in parallel (1 to 10).
proxyConfigurationApify ProxyThe datacenter pool is included in the price.

API example:

curl -X POST "https://api.apify.com/v2/acts/automation_craft~linkedin-job-details-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jobUrls":["https://www.linkedin.com/jobs/view/4454862094","4011051212"],"includeCompanyDetails":true}'

FAQ

Do I need a LinkedIn account, cookies or an API key?

No. The Actor reads the public job pages that LinkedIn serves to signed out visitors. Nothing in the input asks for a credential, and it never touches personal profiles beyond the job poster card the job page itself shows.

How do I get the job description from a LinkedIn job URL?

Paste the URL (or just the number in it) and run. descriptionText holds the full description with line breaks, descriptionHtml the markup LinkedIn serves and descriptionMarkdown a clean Markdown version for LLM prompts and CMS imports.

Does it return closed or expired jobs?

Yes. A posting that shows "No longer accepting applications" is still a complete public record with its description, returned with jobState: "closed". Turn on Skip closed jobs to get a free filtered row for those instead.

Why is postedDate empty for some jobs?

LinkedIn's job page shows only relative time. The exact date comes from the posting's own card in LinkedIn's public search, which exists for open postings that LinkedIn still lists (97 percent in our measurements). Closed postings have no card, so postedDate is null and postedDateSource says not_available_closed; the relative time and its window are always there.

Does it return the external apply URL?

No. LinkedIn shows the company site apply link only to signed in members. The row says whether the job uses Easy Apply or the company site (applyMethod), and descriptionUrls lists any application or careers URL the employer wrote into the description.

Can I run it on a schedule and only pay for new jobs?

Yes. Set Memory name (for example weekly-alerts) and schedule the run: jobs delivered under that name come back as free already_known rows on later runs. Do not start two runs with the same memory name at the same time; each run saves the memory as it goes, and two runs writing one memory at once can each bill a job the other already delivered.

Why does this Actor run with limited permissions?

It runs with Apify's limited permissions, the least privilege level: it can only read its input and write to its own dataset and key value stores. The optional cross run memory is a named key value store the Actor creates for itself under your account.

What this Actor does NOT do

  • It does not search LinkedIn by keyword: it reads the jobs you give it. To find job IDs first, use a LinkedIn jobs search actor and pass its IDs here.
  • It does not log in, so it cannot return views, the number of applies, the external apply URL, workplace type or recruiter contact details beyond the public poster card.
  • It does not follow lnkd.in short links; paste the full job URL.
  • It does not read LinkedIn school pages for company details (LinkedIn does not show them to signed out visitors).

More data tools by Automation Craft

This Actor is an independent tool and is not affiliated with or endorsed by LinkedIn. It reads only publicly available job postings.