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
11
Total users
3
Monthly active users
15 hours ago
Last modified
Categories
Features
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 and applicant count.
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" | Cards always include company plus link; the details mode adds each job's own employment type, seniority, function, industries and applicant count. |
| "I asked for part-time and got full-time jobs" | LinkedIn's public search ignores the job type, experience level and workplace type filters for logged-out visitors. We still send them, and the run tells you in its status record when LinkedIn ignored one; with full details on, it also counts the delivered jobs whose own page does not show the type or level you asked for. |
| "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. To run only your links, clear Keywords, Location and geoId: when both are given, the form search runs first and shares Max jobs with the links. - Pick the date posted. Job type, experience level and workplace type are sent too, but LinkedIn's public search ignores them at present (see the FAQ).
- 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. When LinkedIn ignored a filter you asked for, or a form search and search links were both given, the status item also carries a warnings list that says so.
| 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 (normally null: LinkedIn now shows the external apply link to signed-in visitors only). 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 date filter are sent as they are. If Keywords, Location or geoId are filled in too, that search also runs, first, and shares Max jobs: clear them to run only your links. |
| 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. Sent to LinkedIn, which ignores it for logged-out visitors at present; the status record says so. |
| Job type | fullTime, partTime, contract, temporary, internship, volunteer, other. Sent to LinkedIn, which ignores it for logged-out visitors at present; the status record says so, and with full details on it counts the jobs whose own page does not show the type you asked for. |
| Experience level | internship, entryLevel, associate, midSenior, director, executive. Same as job type, against each job's seniority level. |
| 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',datePosted: 'pastWeek',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 or location 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. - No job type, experience level or workplace type filtering by LinkedIn: its public search ignores those filters for logged-out visitors at present, and the run says so instead of pretending.
- 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 or location 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.
Why does a part-time search return full-time jobs?
Because LinkedIn's public search, the one logged-out visitors see, ignores the job type filter at present: the same search with and without it returns the same jobs (measured November 2026, and the same holds for experience level, workplace type and sort order). The Actor still sends your filter, in case LinkedIn applies it again, and its status record says when LinkedIn ignored it. Turn on Include full job details to get each job's own employmentType and seniorityLevel, and the status record then counts the delivered jobs that do not match.
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 and applicant text. 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.