LinkedIn Jobs Scraper - No Cookies, Salary + Dedup, AI Ready
Pricing
from $0.90 / 1,000 job scrapeds
LinkedIn Jobs Scraper - No Cookies, Salary + Dedup, AI Ready
Scrapes publicly accessible LinkedIn job listings via guest endpoints - no login, no cookies. Dedup/delta mode, normalized salary + posted date, GDPR-safe defaults, MCP/AI-agent ready.
Pricing
from $0.90 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
AIDevs
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
LinkedIn Jobs Scraper — No Cookies, Dedup + Salary Normalization, AI/MCP Ready
Collect publicly available LinkedIn job listings at scale — no login, no cookies, no credentials, ever. This Actor reads only the same public guest pages anyone can see logged-out, then cleans the data into structured records with normalized salary, ISO posting dates, cross-run deduplication, and an AI/MCP-friendly output mode.
This Actor is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. "LinkedIn" is used descriptively to indicate the public source of the data.
What it does
- Scrapes public LinkedIn job listings by search URL (paste from linkedin.com/jobs/search) or by structured filters (keywords, location, remote type, experience level, contract type, date posted, company).
- Returns full job fields plus a normalized salary object, an ISO posting date, optional public company enrichment, and optional delta mode that emits only jobs you haven't seen before.
- Never asks for your LinkedIn password or session cookies, so your account is never put at risk.
Why this one is different
| Capability | This Actor | Typical LinkedIn jobs scrapers |
|---|---|---|
| Login / cookies required | Never — public guest data only | "Advanced" tiers require your session cookies |
| Machine-readable salary | Yes — {min, max, currency, period} | Raw text only, if at all |
| ISO posting date | Yes — "2 weeks ago" → ISO + confidence flag | Raw relative text |
| Pay only for new jobs | Yes — delta mode with per-user memory | Re-charges for the same jobs each run |
| Recruiter PII default | Off (GDPR-safe gate) | Often scraped silently |
| AI / MCP output mode | Yes — concise, token-friendly records | Not optimized |
| Run transparency | Yes — _stats telemetry per run | Silent partial results |
| Beat the 1,000-cap | Yes — split-by-country expansion + dedup | Sometimes |
Quick start
Apify Console (UI)
- Open the Actor, paste a LinkedIn job search URL into Search URLs, or fill in Keywords + Location.
- Set Max items and click Start.
API
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-jobs-scraper-pro/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": "python developer","location": "Berlin","remoteTypes": ["remote","hybrid"],"maxItems": 100}'
n8n / Make / Zapier
Use the generic Apify connector, pick this Actor, and map the input fields above. Schedule it to run daily with onlyNewJobs: true to receive only fresh postings.
MCP (AI agents)
This Actor exposes a clean, richly described input schema and supports standby mode, so it works well when called from Apify's MCP server. For agent use, set "outputFormat": "concise" to get compact, token-friendly records:
{ "keywords": "data scientist", "location": "Remote", "maxItems": 25, "outputFormat": "concise" }
Input reference
| Field | Type | Default | Notes |
|---|---|---|---|
searchUrls | string[] | [] | Paste from linkedin.com/jobs/search. Takes precedence over filters. |
keywords | string | — | Supports quoted phrases and OR / AND / NOT. |
location | string | — | City, region, or country. |
remoteTypes | string[] | [] | remote, hybrid, onsite. |
experienceLevels | string[] | [] | internship…executive. |
contractTypes | string[] | [] | full-time…volunteer. |
datePosted | string | any | 24h, week, month, any. |
companyNames / companyIds | string[] | [] | Restrict to specific companies. |
maxItems | integer | 100 | 1–100000, after dedup. |
splitByCountry | string | — | e.g. US; expands per-city to beat the 1,000-cap. |
scrapeJobDetails | boolean | true | Off = faster/cheaper cards-only. |
companyEnrichment | boolean | false | Attach public company page data. |
includePosterInfo | boolean | false | GDPR gate — recruiter PII, off by default. |
onlyNewJobs | boolean | false | Delta mode; only jobs unseen in prior runs. |
outputFormat | string | full | full or concise (AI/MCP). |
Output reference (sample)
{"id": "3812345678","url": "https://www.linkedin.com/jobs/view/3812345678/","title": "Senior Python Developer","companyName": "Acme Corp","companyUrl": "https://www.linkedin.com/company/acme","companyLogo": "https://media.licdn.com/logo1.png","location": "Berlin, Germany","salaryText": "€70,000 - €90,000/year","salaryNormalized": { "min": 70000, "max": 90000, "currency": "EUR", "period": "year", "source": "€70,000 - €90,000/year" },"postedText": "1 week ago","postedAtISO": "2026-06-28T00:00:00.000Z","postedAtResolved": true,"seniority": "Mid-Senior level","employmentType": "Full-time","jobFunction": "Engineering and Information Technology","industries": "Software Development","descriptionText": "We are looking for a Senior Python Developer…","applicantsCount": 200,"applyUrl": "https://acme.example.com/careers/apply/123","applyType": "external","isNew": true,"scrapedAt": "2026-07-05T12:00:00.000Z"}
Every run also pushes a final _stats record and sets it as the run status message:
{ "_stats": { "requested": 100, "scraped": 98, "duplicates": 2, "failed": 0, "blockRate": 0.0, "companiesEnriched": 0, "durationSeconds": 74, "stoppedReason": null } }
Pricing — pay per event
You pay only for what you get. No monthly rental, no subscription.
| Event | Price |
|---|---|
| Actor start | $0.00 |
| Each job scraped | $0.0009 — that's $0.90 per 1,000 jobs (only unique, successfully scraped jobs; never duplicates or failures) |
| Each company enriched | $0.0015 ($1.50 per 1,000) |
At $0.90 / 1,000 jobs, this Actor undercuts the most widely used LinkedIn jobs scrapers while adding normalized salary, ISO dates, delta mode, and GDPR-safe defaults on top.
Intro offer: the first 200 jobs per user are free.
Cost examples (jobs only, after the free tier):
- 100 jobs → $0.09
- 1,000 jobs → $0.90
- 10,000 jobs → $9.00
With onlyNewJobs: true, a daily scheduled run charges only for genuinely new postings — often a handful of cents per day.
Legality & compliance
- Public data only. This Actor fetches only pages reachable while logged out. It never logs in, never sends cookies or credentials, and never attempts to bypass an authwall or CAPTCHA. In hiQ v. LinkedIn, scraping public data was held not to violate the CFAA; hiQ's loss turned on the User Agreement it had accepted through accounts — an agreement this Actor never accepts or uses.
- No circumvention. This Actor collects publicly available listings. It does not bypass LinkedIn security or limits.
- Personal data (GDPR). Job postings are largely non-personal. Recruiter / job-poster fields are personal data and are off by default. If you enable
includePosterInfo, you become the data controller responsible for a lawful basis (e.g. Art. 6(1)(f) legitimate interest for recruitment research) and for honoring erasure requests. - Your data stays yours. Results are written only to your own Apify storage. This Actor does not build or redistribute a central database of job descriptions.
- Trademark. "LinkedIn" is used only descriptively; no LinkedIn logo is used as the Actor icon.
Data removal requests
To request removal of personal data that may appear in results, please open a request on this Actor's Issues tab on Apify Store. We respond within 24 hours.
FAQ
Why do big searches stop around 1,000 results? That's LinkedIn's own per-search cap on public results. Set splitByCountry (e.g. US) and the Actor expands the search into per-city queries and de-duplicates across them.
How do I get only new jobs each day? Schedule the Actor (free platform feature) and set onlyNewJobs: true. It remembers job IDs it has already returned for you and emits only new ones — so you also pay only for new items.
Can I export to CSV / Excel / JSON? Yes — every run's dataset can be exported as JSON, CSV, or XLSX, and accessed via the API. Scheduling and webhooks are supported (all free platform features).
Does it need my LinkedIn login? No — and it never will. That's the point.
Support
Found a problem or a markup change? Open an issue on the Actor's Issues tab. We aim to respond within 24 hours and to fix selector breakages within 48 hours.