LinkedIn Jobs Scraper | 12 Fields, No Login, No Browser avatar

LinkedIn Jobs Scraper | 12 Fields, No Login, No Browser

Pricing

$1.50 / 1,000 job listings

Go to Apify Store
LinkedIn Jobs Scraper | 12 Fields, No Login, No Browser

LinkedIn Jobs Scraper | 12 Fields, No Login, No Browser

Scrape public LinkedIn job listings by keyword and location: title, company, seniority, type, applicants, apply URL. No login. $1.50/1k. MCP ready.

Pricing

$1.50 / 1,000 job listings

Rating

5.0

(1)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

34

Total users

6

Monthly active users

a day ago

Last modified

Share

275 LinkedIn jobs in 103 seconds: a recorded search for data engineer jobs in the United States returned 275 listings in 103.1 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

This actor turns a keyword and a location into clean rows of public LinkedIn job listings: title, company, company page, location, posting date, employment type, seniority, applicant count, the full description and the job link. It reads the job pages LinkedIn shows to logged-out visitors, so no LinkedIn account, cookie or browser is involved.

Why choose this actor?

  • 275 jobs from one search in 103 seconds. On 1 Oct 2026 a search for "data engineer" in the United States, with descriptions off, returned 275 listings before LinkedIn ran out of results. With full details on, our daily check on Apify delivers 25 jobs in about 30 seconds.
  • Full descriptions, not snippets. In a 100 job test with details on, all 100 rows carried all 12 fields, and the median description was 5,428 characters.
  • $1.50 per 1,000 jobs on every Apify plan, with no start fee. You pay per job saved to your dataset and nothing else. Empty searches, rate-limited pages and duplicate listings are never charged.

Run it on Apify

Part of The Mine Works Jobs and hiring family: Foundit Monster India Jobs, Hirist Jobs Scraper, India Jobs MCP, Naukri Jobs Scraper, Shine.com Jobs Scraper, Internshala Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start. It returns 10 jobs with full details in well under a minute on Apify.

{
"keywords": "product manager",
"location": "London",
"maxResults": 10
}

The actor takes a search, not LinkedIn links. Put a job title, skill or phrase in keywords (such as SDR, Kubernetes or nurse practitioner) and, optionally, a city, region, country or Remote in location. Run one search per run; for several searches, start several runs or save several tasks.

Apify's free plan includes $5 of credit every month, which covers about 3,330 results at this actor's price.

Copy to your AI assistant

themineworks/linkedin-jobs-scraper on Apify. It searches public LinkedIn job listings by keyword and location, with no login, and returns one row per job with job ID, job link, title, company, company page link, location, posting date, employment type, seniority level, applicant count and the full description. Call ApifyClient("TOKEN").actor("themineworks/linkedin-jobs-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: keywords (string). Optional: location (string such as "United States", "London" or "Remote"; empty means no location filter), maxResults (integer, default 25, maximum 500, but one run reads at most about 400), includeDescription (default true; false is faster and returns card fields only), proxy (default Apify datacenter proxy). Rows with a _type field are run summaries, not jobs. Full spec: GET https://api.apify.com/v2/acts/themineworks~linkedin-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • 12 fields per job: 7 from the search card on every row, and employment type, seniority level, applicant count and the full description when includeDescription is on.
  • Up to about 400 jobs per search: 40 pages of 10 cards, de-duplicated by LinkedIn's job ID within the run. The search stops early when LinkedIn has no more results or starts repeating itself.
  • Plain HTTP, no browser. It calls the two public endpoints LinkedIn serves to logged-out visitors, one for search pages and one for each job's details, through Apify's datacenter proxy.
  • Finishes inside the default 5 minute timeout. With under 45 seconds left it stops opening new search pages, and with under 30 seconds left it stops fetching details and delivers the remaining jobs with card fields, so you keep what was found.
  • Stops on blocks, not your budget. After 3 rate-limited or failed search requests in a row, the run ends instead of walking every page.
  • A summary row at the end of every run with jobs delivered, jobs charged and how many descriptions were skipped for time. It is never charged.

How to use it

Basic: one role in one country

{
"keywords": "software engineer",
"location": "United States",
"maxResults": 25
}

This is the input of our own daily check. On 1 Oct 2026 it delivered 25 jobs with full details in 28.7 seconds on Apify.

A fast, wide sweep without descriptions

{
"keywords": "data engineer",
"location": "United States",
"maxResults": 400,
"includeDescription": false
}

With details off, each job costs no extra request, so a search runs at the speed of its result pages. This is our proof run: 275 jobs in 103 seconds, after which LinkedIn had no more results for it.

Hiring signals for sales

{
"keywords": "data engineer",
"location": "Austin",
"maxResults": 100
}

Companies hiring for a function usually buy tools and services for it. Count open roles per company, then follow company_url to the company page. Save it as a task and schedule it weekly, for example with the cron 0 7 * * 1, and turn on monitorMode so each run brings only the jobs that are new since the last one.

Remote roles for a job board feed

{
"keywords": "react developer",
"location": "Remote",
"maxResults": 200
}

Schedule it daily with monitorMode on, so each run delivers only jobs you do not have yet. Small daily runs finish quickly and stay inside the default timeout; for 200 jobs with full details, raise the run timeout to 10 minutes in Run options.

Several cities or roles

Run one search per run and save each as a task, such as "product manager / London" and "product manager / Berlin". Splitting also gets around the 400 job ceiling of a single search.

Input parameters

ParameterTypeDefaultWhat it does
keywordsstringnone (required)Job title, skill or phrase to search for, such as software engineer or SDR.
locationstringnone (no location filter)City, region, country or Remote, such as United States, London or Austin.
maxResultsinteger, up to 50025Cap on jobs delivered, which is how you cap cost. One search reads at most 40 pages, so expect at most about 400.
includeDescriptionbooleantrueFetch each job's own page for employment type, seniority, applicant count and full description. One extra request per job. Set false for a faster run with card fields only.
proxyobjectApify proxy (datacenter)Proxy settings. The default datacenter proxy returned every page in our tests. You can choose another group if you see repeated rate limits.

The input form in the Apify Console starts with software engineer and United States filled in. Runs started through the API or an AI assistant get only what you send, plus the defaults above.

What data do you get?

One row per job. A field LinkedIn does not show for a job is left out of that row rather than sent as null, so check for presence, not for null.

From the search card (every run): job_id, job_url, title, company, company_url (the company's LinkedIn page), location as listed and posted_at, the date the card shows, as YYYY-MM-DD.

From the job's own page (with includeDescription on): job_type, such as Full-time, Contract or Internship; seniority_level, such as Entry level, Mid-Senior level, Director or Not Applicable; applicant_count as LinkedIn phrases it, such as 115 applicants, Over 200 applicants or Be among the first 25 applicants; and description, the full posting as plain text with tags removed.

Timing: scraped_at, when the row was collected.

Run rows: every run ends with a _type: "summary" row (jobs_scraped, charged_for, charge_failures, ended_on_deadline, descriptions_skipped_for_time) and, when at least one job was delivered, a _type: "info" row with tips. Neither is charged. Filter on _type to keep only jobs.

What we saw in our 1 Oct 2026 runs, so you can plan for it:

  • company_url was missing on 4 of 275 cards, for employers without a LinkedIn company page link on the card, such as two universities.
  • seniority_level read Not Applicable on 64 of 100 London product manager jobs. Both job_type and seniority_level are whatever the employer picked when posting, so treat them as hints.
  • Descriptions ran from 1,048 to 12,682 characters, with a median of 5,428.
  • There is no salary field. Pay, when published, sits inside the description text. There is also no recruiter name and no company size; for company data, feed company_url into a company scraper.
  • posted_at is the date the card shows on the day you run it, and most jobs in a search are recent: 258 of 275 cards were posted in September or October. De-duplicate on job_id, not on date.
  • If a job's own page cannot be read, the job is still delivered with its card fields and charged like any other. In our runs every detail page loaded.

Stable fields for automations

These 7 fields were present in every one of the 375 job rows from our two 1 Oct 2026 test runs. Their names will not change, so a Sheet, Zap, Make scenario or n8n flow can map to them safely. With includeDescription on, job_type, seniority_level, applicant_count, description and company_url were also present on all 100 rows.

FieldWhat it is
job_idLinkedIn's job ID. Use it as the unique key.
job_urlLink to the job, https://www.linkedin.com/jobs/view/<id>
titleJob title as posted
companyCompany name
locationLocation as listed on the card
posted_atPosting date shown on the card, YYYY-MM-DD
scraped_atWhen the row was collected, ISO 8601 in UTC

Output examples

Real rows from our 1 Oct 2026 test runs. Descriptions are cut to their first words; the dataset carries the full text.

A London product manager job with full details

{
"job_id": "4463254080",
"job_url": "https://www.linkedin.com/jobs/view/4463254080",
"title": "Senior Product Manager, Exchange",
"company": "Cint",
"company_url": "https://se.linkedin.com/company/cint",
"location": "London, England, United Kingdom",
"posted_at": "2026-09-29",
"job_type": "Full-time",
"seniority_level": "Mid-Senior level",
"applicant_count": "115 applicants",
"description": "Company Description Who We Are Cint is a pioneer in research technology (ResTech). Our customers use the Cint platform to post questions and get answers from real people to build business strategies, confidently publish research, accurately measure the impact ...",
"scraped_at": "2026-10-01T14:02:07.142Z"
}

A new posting with few applicants and seniority marked Not Applicable

{
"job_id": "4471911299",
"job_url": "https://www.linkedin.com/jobs/view/4471911299",
"title": "Product Mgr II",
"company": "RELX",
"company_url": "https://uk.linkedin.com/company/relx-group",
"location": "London, England, United Kingdom",
"posted_at": "2026-09-29",
"job_type": "Full-time",
"seniority_level": "Not Applicable",
"applicant_count": "Be among the first 25 applicants",
"description": "Do you want to shape the future of customer-focused products? Can you turn customer insight into product innovation? Location: UK (London Wall) About Our Team Our team owns Identity and Access Managem...",
"scraped_at": "2026-10-01T14:07:01.794Z"
}

A card only row from the fast sweep (includeDescription: false)

{
"job_id": "4455908865",
"job_url": "https://www.linkedin.com/jobs/view/4455908865",
"title": "Data Engineer, Amazon Fuse",
"company": "Amazon",
"company_url": "https://www.linkedin.com/company/amazon",
"location": "Seattle, WA",
"posted_at": "2026-09-09",
"scraped_at": "2026-10-01T14:00:14.483Z"
}

The summary row from that sweep

{
"_type": "summary",
"jobs_scraped": 275,
"charged_for": 275,
"charge_failures": 0,
"scraped_at": "2026-10-01T14:01:54.349Z",
"ended_on_deadline": false,
"descriptions_skipped_for_time": 0
}

Pricing

Pay per event: you are charged for each job saved to your dataset. The price is the same on every Apify plan.

EventFree planBronze (Starter)Silver (Scale)Gold and above (Business)
job-scraped, per job$0.0015$0.0015$0.0015$0.0015
Per 1,000 jobs$1.50$1.50$1.50$1.50
  • Start fee: none. This actor has no per-run or per-memory start charge, and you pay nothing for platform compute on top of the job price.
  • Never charged: empty searches, rate-limited or failed search pages, jobs repeated within the same run, and the summary and info rows.
  • Charged at the normal price: a job delivered with card fields only, because its own page failed or the run was short of time. The summary row counts those skipped for time.
  • Spending cap: if you set a maximum cost per run in Apify, the actor stops adding jobs once that budget is used, so you never receive rows you were not charged for and never pay past your cap.
  • No price change is scheduled. The current price has applied since 12 Aug 2026.

Worked examples: the default 25 job run costs about $0.04, a 275 job sweep costs about $0.41, and a daily 100 job check comes to about $4.50 a month.

Run it on a schedule

Turn on monitorMode and each run delivers only the jobs you have not received before, so a daily run costs you only for what is new.

  1. Enter your input, switch on Monitor mode and click Save as a task.
  2. In Apify Console open Schedules, click Add schedule and pick Daily (or any time and timezone you like).
  3. Under Actors or tasks to run, add the task you saved and save the schedule.
{
"keywords": "data engineer",
"location": "Bengaluru",
"maxResults": 50,
"includeDescription": true,
"monitorMode": true
}

The first run delivers everything it finds. After that, each run delivers only jobs that were not in an earlier run with the same input, and jobs it skips are never charged. The summary row at the end shows new_this_run and skipped_duplicates. Changing the input starts a fresh history; changing only the result limit does not. When nothing new turns up, the run stops after five pages in a row of jobs you already have, and no job is charged.

FAQ

What does this actor read on LinkedIn? The job search results and job pages LinkedIn shows to logged-out visitors and search engines. It requests them over plain HTTP: 10 job cards per search page, plus one request per job for its details.

How many jobs can I get from one search? Up to about 400: the actor reads at most 40 pages of 10. Many searches end sooner, when LinkedIn stops returning new results; "data engineer" in the United States ended at 275 on 1 Oct 2026. maxResults accepts up to 500, but it is a ceiling, not a promise. For more, split the search by location or keyword.

How fresh is the data? Each run reads LinkedIn live when it starts. There is no cache. posted_at shows the date on each card.

Do I need a LinkedIn account or cookies? Can my account be banned? No account and no cookies. The actor never logs in, so there is no account of yours for LinkedIn to restrict.

Do I need a proxy? No setup is needed. The actor uses Apify's datacenter proxy by default, with a new proxy session for each search page, and our tests saw no blocks. If LinkedIn rate limits a run, it stops after 3 failed search requests in a row and charges nothing for them; try again later or choose another proxy group in proxy.

Why is my result count lower than maxResults? The search ran out of results, LinkedIn started repeating results (the actor stops after 2 pages with nothing new), the run was rate limited, or the run reached its time budget. The summary row shows ended_on_deadline for the last case.

Why do some rows have no description, seniority or applicant count? Either LinkedIn does not show that field for the job, its page failed to load, or the run was close to its time limit and stopped fetching details. descriptions_skipped_for_time in the summary row counts the last case. Raise the run timeout or lower maxResults if it happens often.

How long does a run take? With details on, our daily 25 job runs on Apify took 25 to 37 seconds. Each job adds one request and a short pause, so plan on roughly one to three seconds per job, and raise the timeout above the default 5 minutes for runs of a few hundred jobs with details. With details off, 275 jobs took 103 seconds.

Did older runs of this actor time out? Some did. Before 21 Jul 2026 the actor drove a full browser; it was then rebuilt to use LinkedIn's public job endpoints over plain HTTP. Large runs with details still timed out in August, which is why the time budget handling described above was added on 19 Aug 2026. Across all users in the last 30 days, 257 of 260 runs succeeded and 3 were aborted, with none failed or timed out.

Which formats can I export? JSON, CSV, Excel, XML, RSS or HTML from the run's Storage tab, or through the Apify API.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/linkedin-jobs-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http linkedin-jobs-scraper "https://mcp.apify.com/?tools=themineworks/linkedin-jobs-scraper".

Is it legal to scrape LinkedIn job listings? The actor reads only job listings LinkedIn shows to logged-out visitors, the same pages search engines index. It does not log in and collects nothing behind a login. Listings are mostly company data, but a description can name a recruiter or hiring manager. You are responsible for how you use the data, including LinkedIn's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration.
  • Make, Zapier and n8n: start a run and read the jobs with the official Apify modules and nodes.
  • Webhooks: have Apify call your URL when a run finishes, then fetch the dataset.
  • API: start runs and read results over HTTP, or with the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through https://mcp.apify.com.

More from The Mine Works

Jobs and hiring

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field we do not return? Open an issue in the Issues tab. Want a job board or data source we do not cover yet? Email dmineworks@gmail.com. A guide for this actor also lives at themineworks.com.

This actor is an independent tool and is not affiliated with, endorsed by or sponsored by LinkedIn Corporation. LinkedIn is a trademark of LinkedIn Corporation.

LinkedIn Jobs Scraper turns any public LinkedIn job search into clean rows with full descriptions, no login and no browser, for $1.50 per 1,000 jobs on every plan.