LinkedIn Jobs Scraper — No Login, No Cookies
Pricing
Pay per usage
LinkedIn Jobs Scraper — No Login, No Cookies
Scrape LinkedIn job listings without login or cookies. Filter by keyword, location, remote and posting age, and get clean JSON with title, company, location, salary and apply URL. Ideal for job search automation, market research and recruiting pipelines.
Extract live job postings from LinkedIn's public job search — no account, no cookies, no browser. Filter by keyword, location, remote-only and posting age, and receive one clean JSON record per job.
What LinkedIn jobs data does this scraper extract?
Each result is one flat JSON record per job posting:
| Field | Meaning |
|---|---|
id | Numeric LinkedIn job posting id, extracted from the posting URL (null if it couldn't be parsed) |
title | Job title as posted |
company | Hiring company / organisation |
location | Location / duty station (may include remote hints) |
postedAt | Posting date (YYYY-MM-DD) read from the search card, when LinkedIn includes it (null otherwise) |
url | Direct link to the posting |
source | Always "linkedin" |
description | Full plain-text job description (empty string if includeDescription is off or the fetch failed) |
snippet | Alias of description, same value — kept for compatibility with other scrapers in this collection |
LinkedIn's guest cards never carry salary data, so no salary field is emitted — we don't fabricate one.
How to scrape LinkedIn jobs with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (keyword, filters,
maxItems) or keep the defaults. - Run it and export the dataset as JSON, CSV or Excel, or read it over the API.
Run it from your own code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/linkedin-scraper").call(run_input={"maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["company"], item["url"])
Or a single HTTP call that runs the Actor and returns items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~linkedin-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keyword | string | "" | Job title, skill or role to search for (e.g. "software engineer", "product manager react"). Leave empty to… |
location | string | "" | City, region or country to filter by (e.g. "Spain", "London", "European Union"). Leave empty for worldwide… |
remote | boolean | false | When enabled, restricts results to remote-eligible postings. |
timeFilter | string | "r86400" | Restrict to postings published within the chosen window. |
maxItems | integer | 100 | Maximum number of job postings to return. Set 0 for no limit (up to ~200 per run). |
includeDescription | boolean | true | Fetch and include the full plain-text job description for each posting. Disabling this makes runs faster… |
postedSince | integer | 0 | Drop results whose posting date is older than this many days. Items without a known posting date are not filtered out. Set 0 to disable. |
titleExclude | array of strings | [] | Drop a result if its title contains any of these words or phrases (case-insensitive). |
companyExclude | array of strings | [] | Drop a result if its company name contains any of these words or phrases (case-insensitive). |
cacheTtlSeconds | integer | 1800 | Reuses the last fetch for this many seconds so rapid re-runs don't hit LinkedIn again. Set 0 to always fetch live. |
All three filters default to off/empty, so existing integrations see no behavior change unless you opt in.
Output example
{"id": "4429472960","title": "Senior Frontend Engineer (React)","company": "Acme Software","location": "Berlin, Germany (Remote)","postedAt": "2026-06-30","url": "https://www.linkedin.com/jobs/view/4429472960","source": "linkedin","description": "We are hiring a Senior Frontend Engineer...","snippet": "We are hiring a Senior Frontend Engineer..."}
id and postedAt are null on the rare card where LinkedIn's markup doesn't include them — the rest of the record is unaffected.
Pricing
Pay per event: $0.05 per Actor start and $0.004 per job returned. 100 jobs ≈ $0.45. No subscription, no rental — you pay only for what you fetch.
Integrations
Export results as JSON, CSV or Excel; connect via Make, Zapier or n8n; call directly with run-sync-get-dataset-items; or plug into AI agents through the Apify MCP server.
Use cases
- Job-alert bots and job boards that need fresh LinkedIn postings
- Recruiting and sourcing pipelines tracking who is hiring
- Salary and hiring-market research by role or region
- AI agents that match candidates to live openings
FAQ
Is it legal to scrape LinkedIn jobs? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.
Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.
How fresh is the data?
Every run fetches live listings. Results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live).
How many jobs can I get?
maxItems caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.
Does it work without a LinkedIn account? Yes. The scraper reads LinkedIn's public guest job-search endpoint, so no login, cookies or session tokens are needed.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.