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

27

Total users

9

Monthly active users

3 days ago

Last modified

Share

💼 LinkedIn Jobs Scraper: No Login, No Browser · $1.50/1k

What does LinkedIn Jobs Scraper do?

It turns a keyword and a location into a structured feed of public LinkedIn job listings. Give it software engineer in United States or product manager in Remote and you get clean JSON rows for every listing: title, company, location, posting date, employment type, seniority level, applicant count, the full job description, and the apply URL. No login, no cookies, no browser, no account of yours anywhere near it.

It reads the same public jobs surface LinkedIn keeps open for search engines, over plain HTTP, so a 25 job run usually finishes in well under a minute and costs under 4 cents.

✅ No login required | ✅ No browser | ✅ Pay only for jobs delivered | ✅ MCP-ready for AI agents

Guide and FAQs: LinkedIn Jobs Scraper on themineworks.com. Tutorial: LinkedIn Jobs Scraper: Listings by Keyword, No Login.

Who is it for?

Recruiters and sourcers who want to see which companies are hiring for which roles right now. Sales teams using open roles as a buying signal: a company hiring three data engineers probably needs data tooling. Job board and aggregator builders who need a fresh public feed. Analysts tracking demand for a skill across cities. Anyone feeding an AI agent that needs live job data and cannot use a seat-licensed recruiting tool.

How much does it cost to scrape LinkedIn jobs?

You pay per job actually delivered. Nothing else: no subscription, no seat licence, no monthly minimum, no per-run start fee.

EventPriceYou pay when
Job listing delivered$0.0015 per jobA listing lands in your dataset

That is $1.50 per 1,000 jobs, and the price is the same on every Apify plan, Free through Diamond. There is no tier table to read because there are no tiers. The Pricing tab on this page is the single source of truth; if this section and the Pricing tab ever disagree, the Pricing tab is right.

What a real job costs. Apify's Free plan includes $5 of usage credit every month. That is roughly 3,300 LinkedIn jobs a month at no cost to you. The default 25 job run costs under 4 cents. A full 400 job sweep of one search costs $0.60. A 5,000 job pull across a dozen searches costs $7.50, and a 100 job daily check comes to about $4.50 a month.

How it compares. $1.50 per 1,000 is below the ~$2.20/1k jobs-category median even though LinkedIn is the most actively defended source in the category. If your target companies' own ATS boards cover your need, our ATS Jobs Scraper does the same job from the primary source at $1/1k, which is cheaper still.

What is never charged. Empty searches, rate-limited pages, transport errors and duplicate listings cost nothing. The charge event fires only after a job record is in your dataset. A run that delivers nothing bills nothing.

How does it work without a browser or a LinkedIn login?

LinkedIn deliberately keeps its jobs surface open to logged-out visitors so that Google can index it, and it serves that surface through two plain HTTP endpoints. This actor calls them directly.

  1. Search. For each page of results it requests LinkedIn's guest jobs search endpoint with your keywords, location and a start offset. Each call returns ten job cards as server-rendered HTML. The actor parses the job ID, URL, title, company, company page URL, location and posting date out of each card. No JavaScript is executed and no page is rendered.
  2. Detail. When includeDescription is on (the default), it makes one more request per job to LinkedIn's guest job posting endpoint and parses the full description, employment type, seniority level and applicant count from it. It pauses briefly between detail fetches so the traffic looks like a person reading.
  3. Deliver, then charge. Each record is written to your dataset first and the charge event fires only after that write succeeds. Duplicate job IDs seen earlier in the same run are skipped and never billed.

Requests carry realistic desktop browser headers and go through Apify's datacenter proxy by default, with a fresh proxy session for every results page. Residential proxy is not needed for this public endpoint; you can set it explicitly if you want to.

The run stops on the first of: maxResults reached, an empty results page, two consecutive pages that contain no new job IDs (LinkedIn's guest search starts repeating on broad queries), three consecutive blocked or failed requests, or the run's time budget getting short. Because there is no login, there is no login wall to hit and nothing of yours to ban.

🧾 What input does it take?

{
"keywords": "software engineer",
"location": "United States",
"maxResults": 25,
"includeDescription": true
}
InputRequiredWhat it does
keywordsYesJob title, skill or keyword, for example software engineer, SDR, Kubernetes
locationNoCity, country or Remote. Leave empty to search without a location filter
maxResultsNoCaps how many listings are returned, which is how you cap cost. Default 25, up to 500; see the limitations on the per-search ceiling
includeDescriptionNoDefault true. Fetches description, seniority, employment type and applicant count for each job. Set false for a faster run that returns the search card fields only
proxyNoApify proxy settings. Defaults to datacenter, which is all this public endpoint needs

📤 What data do you get back?

Three records from a single live run against keywords: "software engineer", location: "United States". Descriptions are shortened here for display; the dataset carries the full text. The third record was delivered in the run's final seconds after the actor stopped fetching details to stay inside its time budget, which is why it has the search card fields only:

[
{
"job_id": "4455931376",
"job_url": "https://www.linkedin.com/jobs/view/4455931376",
"title": "Software Development Engineer, AWS IAM Distributed Database System",
"company": "Amazon Web Services (AWS)",
"company_url": "https://www.linkedin.com/company/amazon-web-services",
"location": "Seattle, WA",
"posted_at": "2026-08-19",
"job_type": "Full-time",
"seniority_level": "Mid-Senior level",
"applicant_count": "Be among the first 25 applicants",
"description": "Description The Amazon Web Services (AWS) Identity team builds, operates, and innovates the identity, authentication, and authorization stack for the AWS cloud. Our mission is to push the technical boundaries to enable AWS customers to run their business workloads confidently and securely. As part of this mission, we ...",
"scraped_at": "2026-09-09T09:02:17.955Z"
},
{
"job_id": "4462571137",
"job_url": "https://www.linkedin.com/jobs/view/4462571137",
"title": "Software Developer 2",
"company": "Oracle",
"company_url": "https://www.linkedin.com/company/oracle",
"location": "Austin, TX",
"posted_at": "2026-09-08",
"job_type": "Full-time",
"seniority_level": "Mid-Senior level",
"applicant_count": "79 applicants",
"description": "Job Description Entity: Oracle America, Inc. Job Duties: Design, develop, troubleshoot and/or test/QA software. As a member of the software engineering division, apply knowledge of software architecture to perform tasks associated with developing, debugging, or designing software applications or operating systems according to provided design specifications. Build enhancements within an existing software architecture and/or ...",
"scraped_at": "2026-09-09T09:02:37.691Z"
},
{
"job_id": "4463727965",
"job_url": "https://www.linkedin.com/jobs/view/4463727965",
"title": "Software Developer",
"company": "Haystack",
"company_url": "https://uk.linkedin.com/company/wearehaystack",
"location": "Austin, TX",
"posted_at": "2026-09-05",
"scraped_at": "2026-09-09T09:04:10.590Z"
}
]

Every job record can contain these fields:

FieldDescription
🆔 job_idLinkedIn numeric job ID, stable across reposts
🔗 job_urlCanonical URL of the posting (https://www.linkedin.com/jobs/view/<id>)
📌 titleJob title as posted
🏢 companyCompany name
🔗 company_urlLinkedIn company page URL
📍 locationJob location as listed on the card
📅 posted_atPosting date the card currently shows, ISO format (YYYY-MM-DD)
job_typeEmployment type the employer selected: Full-time, Part-time, Contract, Internship and so on
🎚️ seniority_levelSeniority the employer selected: Entry level, Associate, Mid-Senior level, Director and so on
👥 applicant_countApplicant count as LinkedIn phrases it, for example 39 applicants, Over 200 applicants, Be among the first 25 applicants
📝 descriptionThe full job description as plain text, tags stripped and whitespace collapsed. Typically 2,000 to 6,000 characters
🕒 scraped_atISO timestamp when the record was captured

A field LinkedIn does not expose for a given posting is left out of that record rather than sent as null, so check for presence rather than for null.

Every run also ends with two unbilled rows: a _type: "summary" record with jobs_scraped, charged_for, charge_failures, ended_on_deadline and descriptions_skipped_for_time, followed by a _type: "info" record with scheduling and review tips. Filter on _type if you pipe the dataset straight into another system.

What are the limitations?

Worth knowing before you buy, so there are no surprises:

  • About 400 listings per search. The actor walks at most 40 pages of ten cards, and on broad queries LinkedIn's guest search begins repeating results before that, at which point the actor stops. Asking for 500 will not get you 500 from one search. For more, run several narrower searches by location or keyword.
  • Details cost time. With descriptions on, every job is one extra request plus a short pause. A 25 job run usually finishes in under a minute; when LinkedIn is slow it can take a couple of minutes. The default run timeout is five minutes. When under 30 seconds remain the actor stops fetching details and delivers the remaining rows with card fields only, and when under 45 seconds remain it stops paginating, so you keep what was found instead of losing the run. The summary row tells you how many rows were affected. For large pulls, raise the run timeout in the Apify Console or split the search.
  • Fields are what the public page shows. There is no salary field (compensation often appears inside the description text), no recruiter or poster name, and no company size. For firmographics, chain the LinkedIn Company Scraper onto company_url.
  • Employer-selected labels are hints. job_type and seniority_level are whatever the employer picked when posting, and employers mislabel. A backend engineer role tagged Volunteer has come through. Treat them as signals, not truth.
  • Reposts move the date. When an employer reposts a listing, posted_at moves to the new date while job_id stays the same. Deduplicate on job_id, not on date.
  • Relevance is LinkedIn's. Keyword search returns what LinkedIn's guest search ranks for your terms, not exact title matches. Specific keywords give tighter results.
  • Rate limits stop the run early. After three consecutive blocked or failed requests the actor stops rather than walk every page against a dead IP. Those pages are never charged. Wait and retry, or set the proxy input to a residential group.

💼 What can you use it for?

Hiring signals for sales. Companies hiring for a function usually need tools and services for that function. Turn open roles in your ICP into a warm outbound list, then find the people with LinkedIn Employees Scraper.

Recruiting intelligence. See which companies are hiring for which roles, at which seniority, refreshed on demand. Spot hiring surges at competitors.

Job board ingestion. Pull fresh public listings into your own aggregator or vertical job product. Deduplicate against your existing feed using job_id.

Labour market research. Analyse seniority mix, employment type and applicant counts across cities and roles. Track how demand for a skill shifts across markets over time.

🚀 How do I get started?

  1. Open the actor and enter keywords, for example software engineer.
  2. Optionally enter a location, a city, country or Remote.
  3. Set maxResults to control cost. The default 25 is a good first run.
  4. Leave includeDescription on unless you only need titles and companies.
  5. Click Start. Download as JSON, CSV or Excel, or pull the dataset via API or MCP.

🔁 Can I run it on a schedule?

Yes, with Apify's built-in Schedules. No code and no cron server of your own. Daily runs with a modest maxResults are the reliable pattern for LinkedIn: small frequent runs finish quickly and give you fresher postings than rare deep ones, at the same per-job price.

  1. Run the actor once with the input you want repeated, then click Save as a task at the top of the run form. This keeps your exact input attached for every future run.
  2. In the Apify Console, go to Schedules in the left sidebar, then Create new.
  3. Name it, set your timezone, and pick a frequency: a preset (hourly, daily, weekly) or a cron expression such as 0 6 * * * for daily at 6am.
  4. Under Actors or tasks to run, add the task you saved in step 1.
  5. Save. It then runs unattended, billed the same pay-per-job way as a manual run. Nothing is charged just for the schedule existing.

Prefer to automate the setup itself? Same thing via the API:

curl -X POST "https://api.apify.com/v2/schedules?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "linkedin-jobs-daily",
"cronExpression": "0 6 * * *",
"isEnabled": true,
"actions": [{ "type": "RUN_ACTOR", "actorId": "themineworks/linkedin-jobs-scraper" }]
}'

Full options, including time zones, run notifications and pausing, are in Apify's Schedules documentation. Wire the dataset to Google Sheets, Slack or a webhook from the actor's Integrations tab so new rows reach you automatically.

This actor reads only job listings that LinkedIn serves to logged-out visitors and that search engines already index. It does not log in, does not use cookies, and does not access anything behind an authentication wall.

Courts in the United States have addressed public data scraping on LinkedIn directly. In hiQ Labs v. LinkedIn, the Ninth Circuit held that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act. That said, this is general information and not legal advice. Job listings are mostly company data, but a description can name a hiring manager or recruiter, and you remain responsible for how you use the output, including your obligations under GDPR, CCPA and similar laws whenever it contains personal data.

FAQ

Do I need a LinkedIn account? No. The actor reads only the public jobs surface, the same results anyone can view logged out. Your credentials and cookies are never involved.

Will this get my LinkedIn account banned? No. Because the actor never logs in as you, there is no account identity to ban. It behaves like an anonymous public visitor.

Am I charged for a run that finds nothing? No. Empty searches, blocked pages, transport errors and duplicates are never charged. The charge event fires only once a job record is actually in your dataset.

Do I get the full job description? Yes, when includeDescription is on (the default). It is the complete posting text as plain text, typically 2,000 to 6,000 characters, not a snippet.

Why is my result count lower than maxResults? Either the search ran out of listings, LinkedIn's guest search started repeating results and the actor stopped, or the run reached its time budget and stopped paginating. maxResults is a ceiling, not a promise, and one search tops out around 400 listings.

Why do a few rows have no description, seniority or applicant count? Two possibilities. LinkedIn did not expose those fields for that posting, or the run was close to its time limit and the actor stopped fetching details to deliver the remaining rows instead of losing them. The summary row's descriptions_skipped_for_time tells you which. Raise the run timeout or lower maxResults if it happens often.

Which proxy should I use? The default datacenter proxy. The guest jobs endpoint is public and indexed, so it does not need residential. If you see repeated rate limits, set the proxy input to a residential group.

I saw older runs of this actor time out. What changed? The actor was rebuilt in July 2026. The old version drove a full browser against LinkedIn's sign-in wall; the current version calls the public guest API that LinkedIn serves to search engines over plain HTTP, and each call returns in about a second. Timeouts in older stats predate the rebuild.

Can I use it in an AI agent? Yes. It is exposed as an MCP tool. See the section below.

Can I use LinkedIn Jobs Scraper through an MCP server? Yes. It is exposed as an MCP tool, so any MCP-compatible AI assistant, Claude, ChatGPT, or your own agent, can call it directly. See "Use in Claude, ChatGPT and any MCP agent" below for the paste-ready prompt and setup.

🤖 Use in Claude, ChatGPT and any MCP agent

Add it to Claude Code in one line:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=themineworks/linkedin-jobs-scraper"

Or point any MCP client at:

https://mcp.apify.com/?tools=themineworks/linkedin-jobs-scraper

Things an agent can ask for once connected:

  • "Find 50 remote data engineering roles posted this week and rank them by company."
  • "Which companies in Austin are hiring SDRs right now? Give me a table with applicant counts."
  • "Pull every product manager listing in Berlin and summarise the seniority mix."

Copy this into your AI assistant

Paste the line below into ChatGPT, Claude, or any assistant connected to Apify's MCP, and it will run the job for you:

Use the Apify actor themineworks/linkedin-jobs-scraper to find 25 software engineer jobs in the United States and return the title, company, location, seniority level, applicant count and job URL. Return the results as a table.

For the full recruiting stack in one connection (ATS boards, LinkedIn jobs, profiles and company data), use our Recruiting & Jobs MCP server, seven tools behind one endpoint.

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/linkedin-jobs-scraper').call({
keywords: 'software engineer',
location: 'United States',
maxResults: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((row) => !row._type));

Job listings are the signal. Turn them into companies, people and outreach:

Typical flow: this actor flags hiring accounts, the company and employees scrapers add firmographics and people, the profile scraper enriches individuals, and B2B Leads Finder adds emails.

Disclaimer: This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. LinkedIn is a registered trademark of LinkedIn Corporation. All trademarks are the property of their respective owners. Use scraped public data in line with GDPR, CCPA and your local laws.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page.