LinkedIn Jobs Scraper — No Login, Export to CSV · Apify
LinkedIn Jobs Scraper - No Login, No Cookies avatar

LinkedIn Jobs Scraper - No Login, No Cookies

Pricing

from $1.05 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper - No Login, No Cookies

LinkedIn Jobs Scraper - No Login, No Cookies

Scrape LinkedIn job listings by keyword and location — no login, no cookies, no API key. Export job title, company, location, salary, posted date, full description, seniority, job type and applicant count to CSV, JSON or Excel. Thousands of jobs per search.

Pricing

from $1.05 / 1,000 results

Rating

5.0

(2)

Developer

Logiover

Logiover

Maintained by Community

Actor stats

1

Bookmarked

71

Total users

7

Monthly active users

2 hours ago

Last modified

Features

Limited permissions

Share

Apify Actor No API key Pay per result Export

Scrape LinkedIn job listings by keyword and location — no login, no cookies, no API key. Export job title, company, location, salary, posted date, full description, seniority, job type and applicant count to CSV, JSON or Excel. Thousands of jobs per search.


What does the LinkedIn Jobs Scraper do?

This Actor turns LinkedIn Jobs into a structured dataset you can actually work with. You give it a search, it walks the result pages, and it writes one clean row per record into your dataset — ready to export as JSON, CSV or Excel, or to pull straight from the Apify API.

It runs on plain HTTP with no browser and no login, which keeps it fast and cheap, and it works the same on a free account as on a paid one. Every field documented below came from a real verification run of this Actor, so what you read here is what you get.

The current build returns 20 populated fields per record, of which 20 are present on virtually every row.

Who is it for?

  • Analysts who need LinkedIn Jobs data as a spreadsheet instead of a browser tab.
  • Operations and research teams tracking how LinkedIn Jobs listings change over time.
  • Developers wiring a live data feed into an internal tool or database.
  • Growth and sales teams building prospect and market lists from public data.
  • AI teams assembling structured training or grounding data.

Use cases

  • Export a full LinkedIn Jobs search into a spreadsheet for analysis.
  • Track how prices, volumes or availability move week over week by scheduling the run.
  • Feed a dashboard or internal database with a repeatable, structured source.
  • Build a market map by running several searches in one job.
  • Enrich an existing list by matching on the identifiers in the output.

Why use this LinkedIn Jobs Scraper?

  • 🔑 No API key and no login — nothing to authenticate, nothing to expire.
  • 📦 20 verified fields — every column below was confirmed against live output.
  • 📄 Real pagination — it walks the result set instead of returning the first screen.
  • 🎯 Bounded runs — caps in the input stop the job exactly where you want, so the bill is predictable.
  • 💸 Tiered pay-per-result — you pay per row, and higher Apify plans pay less per row.
  • 📊 Export anywhere — JSON, CSV, Excel, HTML, the API, or any Apify integration.

What data can you extract?

One row per record. These columns come from a live run, with the share of rows that carried a value:

FieldTypeTypically filledDescription
applicantsstring100%Applicants
applyUrlstring100%Apply url
companyLogostring100%Company logo
companyNamestring100%Company name
companyUrlstring100%Company url
descriptionHtmlstring100%Description html
descriptionTextstring100%Description text
employmentTypestring100%Employment type
industriesstring100%Industries
jobFunctionstring100%Job function
jobIdstring100%Job id
jobUrlstring100%Job url
locationstring100%Location
postedAgostring100%Posted ago
postedDatestring100%Posted date
scrapedAtstring100%Scraped at
searchLocationstring100%Search location
searchTermstring100%Search term
seniorityLevelstring100%Seniority level
titlestring100%Title

How to use

  1. Open the Actor and fill in the search fields — the defaults below are a working example.
  2. Set the result cap so the run stops where you want it.
  3. Click Start, then export from the Output tab or pull the dataset through the API.
{
"searchTerm": "software engineer",
"location": "United States",
"datePosted": "any",
"sortBy": "relevance",
"maxItems": 200,
"fetchDetails": true,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Input parameters

ParameterTypeDefaultDescription
searchTermstringsoftware engineerJob title, skill, or keyword to search for — exactly what you'd type into LinkedIn's job search box (e.g.
locationstringUnited StatesCity, region, or country to search in (e.g.
datePostedstringanyOnly return jobs posted within this time window.
workplaceTypesarray[]Filter by on-site / remote / hybrid.
experienceLevelsarray[]Filter by seniority.
jobTypesarray[]Filter by employment type.
sortBystringrelevanceOrder results by LinkedIn relevance or most recent first.
maxItemsinteger200Maximum number of jobs to save.
fetchDetailsbooleantrueFor every job, also open its page to pull the full description, seniority level, employment type, job function.
proxyConfigurationobject{"useApifyProxy": true}LinkedIn rate-limits aggressively.

Tips for best results

  • Broad searches return the deepest result sets; very narrow ones run out after a page or two.
  • Use the result cap rather than the page cap when you want a predictable bill.
  • Schedule the same input daily or weekly to build a history instead of a one-off snapshot.
  • Lower the concurrency if you see retries — the source rate-limits aggressive crawling.
  • Run several searches in one job instead of one search with a huge page count.
  • Empty optional fields are normal; filter on the columns that matter to you after export.
  • Deduplicate on the identifier column if you merge several runs together.
  • Keep the proxy setting on the default unless the source blocks your region.

Integrations

Push results straight into Google Sheets, Slack, Zapier, Make, Airtable or any Webhook. You can also schedule the Actor and have each run append to the same dataset, which is how you turn a single export into a time series.

API usage

Replace <YOUR_TOKEN> with your Apify API token.

cURL

curl -X POST "https://api.apify.com/v2/acts/logiover~linkedin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"searchTerm": "software engineer", "location": "United States", "datePosted": "any", "sortBy": "relevance", "maxItems": 200, "fetchDetails": true, "proxyConfiguration": {"useApifyProxy": true}}'

Python

from apify_client import ApifyClient
client = ApifyClient('<YOUR_TOKEN>')
run = client.actor('logiover/linkedin-jobs-scraper').call(run_input={"searchTerm": "software engineer", "location": "United States", "datePosted": "any", "sortBy": "relevance", "maxItems": 200, "fetchDetails": true, "proxyConfiguration": {"useApifyProxy": true}})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item)

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('logiover/linkedin-jobs-scraper').call({"searchTerm": "software engineer", "location": "United States", "datePosted": "any", "sortBy": "relevance", "maxItems": 200, "fetchDetails": true, "proxyConfiguration": {"useApifyProxy": true}});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

🤖 AI Agents, MCP & RAG Integration

This Actor is reachable through the Apify MCP server, so an AI agent can call it as a tool. Point the agent at https://mcp.apify.com and ask it something like "pull the first 200 jobs from LinkedIn Jobs and summarise them" — it receives the same structured rows you would get from the UI.

Connect this Actor directly to Apify AI, Claude Desktop, Cursor, VS Code, Windsurf, LangChain, or LlamaIndex via the official Apify MCP Server — no custom wrapper code needed:

{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com?tools=logiover/linkedin-jobs-scraper"
}
}
}
  • Schema-typed inputs & outputs: Clean JSON records with explicit .actor/input_schema.json and .actor/output_schema.json definitions so LLM agents infer parameters and parse fields accurately without HTML noise.
  • Bounded & predictable runs: Built-in volume caps and pay-per-result budget guards prevent runaway agent tool loops.
  • RAG & automation ready: Stream run datasets straight into vector stores, n8n, Make, Zapier, or webhook pipelines.

FAQ

Do I need a LinkedIn Jobs account or API key?

No. The Actor reads publicly available pages only. There is nothing to authenticate and no credentials to rotate.

Does it work on the free plan?

Yes. Every feature is available on a free Apify account — nothing is gated behind a paid tier. Pricing is per result, and higher plans simply pay less per row.

How many jobs can I get in one run?

As many as the search exposes. Raise the page and result caps together; the run stops at whichever limit it reaches first.

Why did I get fewer rows than I asked for?

The search ran out of records. That is normal for narrow queries — broaden the search or add more searches to one run.

Why are some fields empty?

LinkedIn Jobs does not publish every attribute for every record. The table above shows how often each field is filled in practice.

What export formats are supported?

JSON, CSV, Excel, HTML and RSS from the Output tab, plus the Apify API and any integration you connect.

How fast is it?

It is pure HTTP with no browser, so a page of results typically takes a second or two.

Can I schedule it?

Yes. Use the Apify scheduler to run it on any interval and append each run to the same dataset.

Does it use a proxy?

It routes through Apify Proxy by default. You can switch groups or supply your own proxies in the input.

Is the output schema stable?

Yes. Field names and types are fixed, so downstream pipelines will not break between runs.

How often is the data refreshed?

Every run reads the live source. There is no cache, so the data is as current as the website itself.

What if the site changes its layout?

Open an issue on the Issues tab and it gets fixed — the Actor is actively maintained.

💬 Support, Issues & Reviews

  • Bug reports & target-site changes: Hit an unexpected empty result or selector change? Open a ticket in the Issues tab with your Run ID or sample input — we actively monitor issues and ship fixes fast.
  • Feature & field requests: Need an additional data attribute or filter? Request it in the Issues tab.
  • Enjoying this Actor? If it saved you engineering time, please consider leaving an honest review on Apify Store or bookmarking logiover/linkedin-jobs-scraper — organic developer feedback helps others discover reliable tools and keeps maintenance prioritized.

This Actor reads only publicly available pages on LinkedIn Jobs — the same content any visitor sees without logging in. It does not bypass authentication and does not collect private data. You remain responsible for how you use the output: respect the source's terms of service, applicable copyright, and data-protection law such as GDPR where personal data is involved.

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by LinkedIn; LinkedIn and all other trademarks mentioned here are the property of their respective owners.

Output example

One row from a real run of this Actor:

{
"jobId": "4419969671",
"title": "Senior Software Engineer – Go (Golang)",
"companyName": "General Motors",
"companyUrl": "https://www.linkedin.com/company/general-motors",
"companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQEfAZWzerj03w/company-logo_100_100/B4EZdkPGXYGc…",
"location": "Warren, MI",
"salary": null,
"postedDate": "2026-08-22",
"postedAgo": "2 weeks ago",
"jobUrl": "https://www.linkedin.com/jobs/view/4419969671/",
"applyUrl": "https://www.linkedin.com/jobs/view/4419969671/",
"seniorityLevel": "Not Applicable",
"employmentType": "Full-time",
"jobFunction": "Engineering and Information Technology",
"industries": "Motor Vehicle Manufacturing, Appliances, Electrical, and Electronics Manufacturing, and…",
"applicants": 139,
"descriptionText": "Job DescriptionAs a Senior Software Engineer – Go (Golang), you will design, develop, and…",
"descriptionHtml": "<strong>Job Description<br><br></strong>As a Senior Software Engineer &#x2013; Go…",
"searchTerm": "software engineer",
"searchLocation": "United States",
"scrapedAt": "2026-09-11T11:32:35.214Z"
}

Other Actors from the same collection:

How much LinkedIn data can you extract in one run?

A single run returned 360 job ads in 253 seconds on the example input. That example is deliberately narrow; the result limit and the input list are both yours to widen. That is roughly 85 job ads a minute.

There is no hard ceiling built into this Actor. What bounds a run is the result limit you set, the breadth of the input you give it, and how much LinkedIn itself publishes. Because billing is per result, a wider run costs proportionally more and a narrow one costs almost nothing — so it is worth starting small and scaling once the output looks right.

📝 Changelog

2026-11-14

  • Verified live production health run (2026-11-14): extracted 60 structured records in 23.1s with valid schema output.
  • Hardened internal proxy stall fallback and pay-per-event dataset instance budget protection.

2026-11-11

  • Added reliable terminal run status telemetry and structured Apify AI / MCP Server (mcp.apify.com) tool configuration.
  • Added direct Issues & Reviews support links and refreshed live maintenance verification.

2026-11-01

  • Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
  • README refreshed: independence disclaimer added.
  • README refreshed: duplicate "Related scrapers" sections merged.

2026-10-15

  • A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
  • A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
  • Runs with a short timeout (API and AI-agent calls) now finish inside it with what they collected, instead of being cut off.
  • Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.
  • The prefilled example for maxItems is now 128 (was 200).
  • The default used when the field is left out for maxItems is now 1,707 (was 200).

2026-09-23

  • Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
  • Output verified on a live run: 100 row(s) across 21 columns, 95.2% of cells populated.
  • Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
  • Input schema, output schema and pricing configuration reviewed.
  • Noted that 1 column(s) came back empty in this sample (salary); these are under review.

2026-09-01

  • Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
  • Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
  • No change to input, output fields or scraping logic.

2026-08-11

  • Maintenance release: refreshed the build and dependencies.
  • Re-verified live execution, non-empty structured output and dataset field/type integrity.
  • Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

2026-08-01

  • Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
  • Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
  • Declared 21 dataset fields from typed live cloud samples so the output contract is no longer an empty placeholder.
  • Declared 21 nullable dataset fields from typed live cloud samples so the output contract is no longer an empty placeholder or brittle to sparse modes.