LinkedIn Jobs Scraper - No Login, Real Dates avatar

LinkedIn Jobs Scraper - No Login, Real Dates

Pricing

from $1.60 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper - No Login, Real Dates

LinkedIn Jobs Scraper - No Login, Real Dates

Search LinkedIn's public job listings by keyword and location with no account and no cookies: title, company and company page, location, the real posted date from the listing, and salary when LinkedIn shows one. Full descriptions, seniority and applicant count on request. JSON, CSV, Excel or API.

Pricing

from $1.60 / 1,000 jobs

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

8 hours ago

Last modified

Share

LinkedIn Jobs Scraper - No Login, Real Dates

This LinkedIn jobs scraper reads LinkedIn's public job search, the listings anyone can see without an account, into clean structured data: title, company (with company page link), location, the real posted date from the listing, salary when LinkedIn shows one, and optionally the full job description with seniority, employment type, job function, industries, applicant count and the external apply URL when the company uses one.

No LinkedIn account, no cookies, no session to get banned. Built to fix the complaints that fill this category's reviews.

What makes this one different

Common complaint about LinkedIn job scrapersHow this Actor handles it
"Lots of duplicates, charged 3x for the same job"Jobs are deduplicated by job ID within the run. A duplicate is never charged. The status record even tells you how many were skipped free.
"Irrelevant results, keywords not respected"LinkedIn's public search matches broadly by design, and when nothing matches it substitutes generic jobs with no warning. The strict title filter keeps only jobs whose title contains all your keywords; filtered jobs cost nothing.
"24-hour filter returned 2-week-old jobs with today's date"Date filters are passed to LinkedIn as-is, and every job carries the real postedAt date from the listing markup. Dates are never synthesized.
"Empty output, still charged"Zero results = zero job charges, plus a status record explaining what happened.
"No company name / no job type / no apply URL"Cards always include company plus link; the details mode adds employment type, seniority, function, industries, applicant count and the external apply URL when public.
"Missing most results"LinkedIn itself caps any public search at about 1,000 results. We say so up front and tell you the workaround (slice by date range or location) instead of silently truncating.

30-second start

  1. Enter Keywords and a Location (or a numeric LinkedIn geoId for precision), or paste complete LinkedIn search URLs, whose keywords, location and filters are honored exactly.
  2. Pick filters: date posted, on-site / remote / hybrid, job type, experience level.
  3. Optionally enable Include full job details and the strict title filter.
  4. Set Max jobs, an exact cap, so cost is bounded before you start.
  5. Start. Download JSON, CSV or Excel from the Dataset tab, or read it through the API.

What you get

One item per job (type: "job"), plus one status item at the end of the run reporting how many jobs were delivered, how many duplicates were skipped free and how many were dropped by the strict title filter.

FieldMeaning
jobId, urlLinkedIn's posting id and the public job URL.
title, company, companyUrlThe role, the employer and the employer's LinkedIn company page.
locationLocation text as LinkedIn shows it on the card.
postedAt, postedTextThe real posting date read from the listing markup, plus LinkedIn's own wording ("2 months ago"). Never synthesized.
salarySalary text when LinkedIn shows one, otherwise null. Nothing is estimated.
benefitsBenefits line from the card when present.
detailOnly with Include full job details: descriptionHtml, descriptionText, seniorityLevel, employmentType, jobFunction, industries, applicantsText and externalApplyUrl. null when the detail page could not be read, in which case the detail charge is skipped.

Sample item:

{
"type": "job",
"jobId": "4425881907",
"title": "Data Engineer",
"company": "MegazoneCloud US",
"companyUrl": "https://www.linkedin.com/company/megazonecloud-us",
"location": "Rochester, NY",
"postedAt": "2026-06-09",
"postedText": "2 months ago",
"salary": null,
"url": "https://www.linkedin.com/jobs/view/data-engineer-at-megazonecloud-us-4425881907",
"detail": {
"seniorityLevel": "Not Applicable",
"employmentType": "Full-time",
"jobFunction": "Information Technology",
"industries": "Technology, Information and Internet",
"applicantsText": "Over 200 applicants",
"externalApplyUrl": null,
"descriptionHtml": "<p>...</p>",
"descriptionText": "..."
}
}

How much does it cost to scrape LinkedIn jobs?

Pay per event. Three events are charged:

EventCharged whenPriceSilver (10% off)Gold (20% off)
Actor start (apify-actor-start)Once per run, per GB of memory$0.005$0.005$0.005
Job (job-result)A unique job record is delivered$2.00 per 1,000$1.80 per 1,000$1.60 per 1,000
Job detail (job-detail)That job also arrives with its detail page$3.00 per 1,000$2.70 per 1,000$2.40 per 1,000

The Silver and Gold columns are the Apify Store subscription discounts, applied automatically to both result events. The Actor start event is not discounted.

Worked examples at the base price, at the default 1 GB: 100 jobs = $0.205. 100 jobs with full details = $0.505. Duplicates, filtered-out jobs and empty searches cost nothing beyond the start event.

Input reference

InputWhat it does
KeywordsWhat to search for, e.g. data engineer. LinkedIn matches broadly; use the strict title filter if you only want the words in the title.
LocationFree-text location, e.g. United States, Bengaluru, India, Berlin.
LinkedIn geoIdNumeric LinkedIn geo id (e.g. 103644278 for the US). Overrides ambiguous location text.
LinkedIn search URLsPaste complete linkedin.com/jobs/search?... URLs. Their keywords, location, geoId and filters are honored exactly.
Date postedanytime, pastMonth, pastWeek or past24Hours, passed to LinkedIn as-is. Every job also carries its real posted date so you can verify.
Workplace typeonsite, remote, hybrid.
Job typefullTime, partTime, contract, temporary, internship, volunteer, other.
Experience levelinternship, entryLevel, associate, midSenior, director, executive.
Strict title filterKeeps only jobs whose title contains every word of your keywords. Filtered-out jobs are never charged.
Include full job detailsFetches each job's detail page and adds the detail block. One extra request per job, charged as the Job detail event only when a detail page was actually delivered.
Max jobsExact cap on charged unique job records (up to 1,000, which is also LinkedIn's own public-search ceiling).

Using the API

Same input as the form.

curl -X POST "https://api.apify.com/v2/acts/automation_craft~linkedin-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keywords": "data engineer",
"location": "United States",
"datePosted": "pastWeek",
"strictTitleFilter": true,
"includeDetails": true,
"maxJobs": 100
}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/linkedin-jobs-scraper').call({
keywords: 'product designer',
location: 'Berlin',
workplaceTypes: ['remote'],
maxJobs: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const jobs = items.filter((i) => i.type === 'job');

What this Actor does NOT do

  • No logged-in scraping: no profiles, no recruiter data, no "Easy Apply" internals, no connections. Public job listings only.
  • No bypassing LinkedIn's public search cap of about 1,000 results. Split your search by date range, location or job type to cover more ground.
  • No guessed data: if LinkedIn does not show a salary or an external apply URL, you get null, not an estimate.
  • Applicant counts are the public text ("Over 200 applicants"), not exact numbers.

FAQ

Can you scrape LinkedIn jobs without an account?

Yes. This Actor reads only the public job search that logged-out visitors see, so there is no account, no cookie and no session to get banned.

Why does a LinkedIn search stop at about 1,000 results?

That ceiling is LinkedIn's own: any public job search renders roughly 1,000 results and no more. The Actor says so in the status record instead of truncating silently, and the fix is to slice your search by date range, location or job type and run it several times.

Why are the posted dates on LinkedIn often wrong?

Because many tools stamp the date they scraped the job rather than the date it was posted. Here, postedAt is read from the listing's own datetime markup and postedText keeps LinkedIn's wording, so you can check both. Dates are never synthesized.

Why do I get jobs that do not match my keywords?

LinkedIn's public search matches broadly and, when a query is narrow, substitutes loosely related jobs without saying so. Turn on the strict title filter to keep only jobs whose title contains every one of your keywords; the jobs it drops are never charged.

How do I stop paying for duplicate jobs?

Nothing to configure: jobs are deduplicated by LinkedIn job id within the run and duplicates are skipped free. The status record at the end reports exactly how many were skipped.

How do I get full descriptions and applicant counts?

Tick Include full job details. Each delivered job then carries a detail block with the full description in HTML and text, seniority, employment type, job function, industries, applicant text and the external apply URL when the company uses one. If a detail page fails, the job is still delivered as a card and the detail charge is skipped.

Why does this Actor run with limited permissions?

Least privilege: it only needs to read public LinkedIn job pages and write its own dataset, so it runs with limited permissions and cannot reach the rest of your account. It keeps no cross-run memory and stores nothing outside the run's own storages.

Reliability

Requests run through rotating residential IPs with automatic retry on a fresh session, validated to a 100%-pass live test suite across the US, India, UK, Germany and the Netherlands. Job pages occasionally fail even with retries; those jobs are delivered as cards without the detail block, and the detail charge is skipped.

Fair use and compliance

This Actor accesses only publicly available job listings, the same pages any logged-out visitor sees, at a polite request rate, and collects no personal data. Job seekers, researchers and recruiters use this data every day; you are responsible for complying with applicable laws and terms in your jurisdiction and use case.

Support

Something missing? Open an issue on the Actor's Issues tab. The roadmap is complaint-driven.

More data tools by Automation Craft