LinkedIn Jobs Scraper - No Login, Real Dates
Pricing
from $1.60 / 1,000 jobs
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
8 hours ago
Last modified
Categories
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 scrapers | How 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
- Enter Keywords and a Location (or a numeric LinkedIn
geoIdfor precision), or paste complete LinkedIn search URLs, whose keywords, location and filters are honored exactly. - Pick filters: date posted, on-site / remote / hybrid, job type, experience level.
- Optionally enable Include full job details and the strict title filter.
- Set Max jobs, an exact cap, so cost is bounded before you start.
- 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.
| Field | Meaning |
|---|---|
jobId, url | LinkedIn's posting id and the public job URL. |
title, company, companyUrl | The role, the employer and the employer's LinkedIn company page. |
location | Location text as LinkedIn shows it on the card. |
postedAt, postedText | The real posting date read from the listing markup, plus LinkedIn's own wording ("2 months ago"). Never synthesized. |
salary | Salary text when LinkedIn shows one, otherwise null. Nothing is estimated. |
benefits | Benefits line from the card when present. |
detail | Only 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:
| Event | Charged when | Price | Silver (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
| Input | What it does |
|---|---|
| Keywords | What to search for, e.g. data engineer. LinkedIn matches broadly; use the strict title filter if you only want the words in the title. |
| Location | Free-text location, e.g. United States, Bengaluru, India, Berlin. |
| LinkedIn geoId | Numeric LinkedIn geo id (e.g. 103644278 for the US). Overrides ambiguous location text. |
| LinkedIn search URLs | Paste complete linkedin.com/jobs/search?... URLs. Their keywords, location, geoId and filters are honored exactly. |
| Date posted | anytime, pastMonth, pastWeek or past24Hours, passed to LinkedIn as-is. Every job also carries its real posted date so you can verify. |
| Workplace type | onsite, remote, hybrid. |
| Job type | fullTime, partTime, contract, temporary, internship, volunteer, other. |
| Experience level | internship, entryLevel, associate, midSenior, director, executive. |
| Strict title filter | Keeps only jobs whose title contains every word of your keywords. Filtered-out jobs are never charged. |
| Include full job details | Fetches 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 jobs | Exact 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
- ATS Jobs Scraper & API - Greenhouse, Lever, Ashby: jobs straight from Greenhouse, Lever, Ashby, Workable and SmartRecruiters career boards, one unified schema.
- Greenhouse Jobs Scraper & API - Pay Once Per Job: every open role on a Greenhouse board, no API key.
- SEEK Job Scraper: Australia & New Zealand Jobs: SEEK listings, deduplicated, pay once per job.
- JobStreet Job Scraper: Malaysia, Singapore, PH, ID: JobStreet jobs across South East Asia.
- JobsDB Job Scraper: Hong Kong & Thailand Jobs: JobsDB listings for Hong Kong and Thailand.
- Substack Scraper: Posts, Notes and Profiles: posts, Notes, profiles and leaderboards.
- US Building Permits Scraper - 38 City Sources: contractor lead feeds from official city data.