LinkedIn Scraper API - Jobs, Companies, Posts, Articles avatar

LinkedIn Scraper API - Jobs, Companies, Posts, Articles

Pricing

from $1.50 / 1,000 job (full posting)s

Go to Apify Store
LinkedIn Scraper API - Jobs, Companies, Posts, Articles

LinkedIn Scraper API - Jobs, Companies, Posts, Articles

LinkedIn jobs, company pages, public posts with their top comments, and Pulse articles in one typed dataset, read from LinkedIn's public pages. Exact employee, follower and reaction counts. Job filters you can trust, change-only re-runs for schedules. No login, no cookies. Failures are free.

Pricing

from $1.50 / 1,000 job (full posting)s

Rating

0.0

(0)

Developer

Blackcube

Blackcube

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

9 hours ago

Last modified

Share

The LinkedIn suite

LinkedIn jobs, company pages, public posts with their top comments, and Pulse articles in one typed dataset. No login, no cookies, no proxy to configure — it reads the pages LinkedIn shows to anyone. Failures are free: a closed job, a missing page or a page only members can see costs nothing and returns a row saying which.

Exact numbers, not display numbers. LinkedIn's page says "3M followers" or "10,001+ employees"; the rows carry 2,789,187 and 232,762.

Quick start

  1. Press Start — the defaults are a working run.
  2. Replace them with your own mix: company slugs, post share links, job links, article links, and keywords with locations.
  3. Take the dataset as JSON, CSV or Excel, or via the API. Every row has a type; the free coverage row says what was asked for and what arrived.

What people use it for

  • Hiring-market intelligence. Which companies are hiring for which roles, where, at what seniority, and since when — with the full posting text for a keyword or an LLM pipeline.
  • Lead lists from job postings. A company hiring three data engineers is a company buying data tooling this quarter. Turn searches into a list of companies, then add their company pages in the same run.
  • Job-board and alert products. Put searches on a schedule with Monitor on and receive only postings you have not seen, with the exact posted date.
  • Account research and TAM sizing. Exact member and follower counts, every office, industry, size band and founding year for a list of company slugs.
  • CRM enrichment. Feed in the LinkedIn URLs you already hold and get back the numeric company id, website, headquarters and specialties.
  • Brand and competitor monitoring. What a company page is posting and how each post performs, with exact reaction and comment counts, on a schedule.
  • Engagement analysis. Who is commenting on a post and what they say, from the comments LinkedIn shows publicly.
  • Thought-leadership tracking. The full text and engagement of Pulse articles by the people and newsletters you follow.
  • Feeding an AI agent or workflow. One flat schema for jobs, companies, posts and articles, a type on every row, and a free coverage row that says what was asked for and what arrived.

What the rows look like

A job row

{
"type": "job",
"id": "4370823981",
"url": "https://www.linkedin.com/jobs/view/sr-data-engineer-at-accenture-federal-services-4370823981",
"title": "Sr. Data Engineer",
"companyName": "Accenture Federal Services",
"company": { "name": "Accenture Federal Services", "url": "https://www.linkedin.com/company/accenturefederalservices", "slug": "accenturefederalservices" },
"location": "Washington, DC",
"postedAt": "2026-08-26",
"applicants": { "count": 200, "text": "Over 200 applicants", "isEarly": false },
"salary": { "text": "$116,900—$243,100", "min": 116900, "max": 243100, "currency": "USD", "period": null, "source": "description" },
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Information Technology",
"industries": ["IT Services and IT Consulting"],
"description": { "text": "At Accenture Federal Services, nothing matters more than ...", "html": "<p>At Accenture Federal Services, ...</p>" },
"searchQuery": "data engineer | United States"
}

postedAt is the exact date from LinkedIn's listing, not a "1 week ago" estimate. salary is filled only when the posting states one (source says whether it came from a salary element or the description text). applicants.count is null when LinkedIn only says "Be among the first 25 applicants".

A company row

{
"type": "company",
"id": "microsoft",
"numericId": 1035,
"name": "Microsoft",
"industry": "Software Development",
"companySize": "10,001+ employees",
"employeesOnLinkedIn": 232762,
"followers": 29007369,
"headquarters": "Redmond, Washington",
"organizationType": "Public Company",
"website": "https://news.microsoft.com/",
"specialties": ["Business Software", "Developer Tools", "Home & Educational Software", "..."],
"address": { "street": "1 Microsoft Way", "locality": "Redmond", "region": "Washington", "postalCode": "98052", "country": "US" },
"locations": [{ "primary": true, "street": "1 Microsoft Way", "cityLine": "Redmond, Washington 98052, US" }, "... 44 more"],
"affiliatedPages": [{ "name": "GitHub", "industry": "Software Development", "location": "San Francisco, CA", "url": "https://www.linkedin.com/company/github" }, "..."],
"recentPosts": [{ "activityId": "7500677397822775296", "url": "https://www.linkedin.com/posts/microsoft_..." }, "..."]
}

employeesOnLinkedIn is the exact number of members who list the company, which is what LinkedIn actually counts; companySize is the band the company chose. Both are given so you are never guessing which one you are looking at.

A post row

{
"type": "post",
"activityId": "7498030724533522432",
"url": "https://www.linkedin.com/posts/microsoft_august-2026-ai-powered-discovery-activity-7498030724533522432-IzKE",
"author": { "name": "Microsoft", "url": "https://www.linkedin.com/company/microsoft", "type": "company", "followers": 29006766 },
"text": "Curiosity drives discovery, sparking questions about how we can better understand our world ...",
"publishedAt": "2026-08-25T14:57:11.372Z",
"reactions": 745,
"comments": 98,
"mediaType": "article",
"article": { "title": "August 2026: AI-powered discovery", "url": "https://www.linkedin.com/pulse/..." },
"commentsShownCount": 10
}

reactions and comments are exact. With comments on, each comment LinkedIn shows on the page (about ten) is its own comment row with the commenter, their profile URL, the text, the date and its like count.

An article row

{
"type": "article",
"title": "The turbulent AI era is here. The choices we make now are critical.",
"author": { "name": "Bill Gates", "url": "https://www.linkedin.com/in/williamhgates", "followers": 40617215 },
"publishedAt": "2026-08-26T07:03:26.000Z",
"likes": 9984,
"comments": 1990,
"readingTimeMinutes": 25,
"text": "We need a plan to ensure that the good outweighs the bad ...",
"newsletter": { "name": "Gates Notes", "subscribers": 6552252 }
}

What it costs

You pay forPrice
Each job found by a search, delivered with its full posting$1.50 per 1,000 jobs
Each job you name by URL or id, delivered with its full posting (one request per row)$4.00 per 1,000 jobs
Each job delivered as a listing card only ("Read the full posting" off)$0.50 per 1,000 jobs
Each keyword-and-location search that delivered something (never more than 250 a run)$2.00 per 1,000 searches
Each company page delivered (once per company, never per job)$4.00 per 1,000 companies
Each post delivered$3.00 per 1,000 posts
Add-on: each comment shown on a post$2.00 per 1,000 comments
Each Pulse article delivered$3.00 per 1,000 articles

Free, always: a job that has closed, a company, post or article that does not exist, a page LinkedIn only shows to signed-in members, a malformed URL, every error row, the coverage row and the run summary, a job skipped by your title filters or id list, and a posting whose stated seniority or job type does not match the filter you set. A run that reads nothing costs nothing.

On a one-off run a search is billed only when it delivered at least one job. With Monitor on, every search LinkedIn answered is billed, because that check is the work you scheduled — so a day with no new postings costs $2.00 per 1,000 searches and nothing else. A query LinkedIn cannot match (it returns unrelated "similar" jobs) is detected, delivers nothing and costs nothing. Searches never count against your result cap.

Set Cost ceiling (USD) to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.

FAQ

Do I need a LinkedIn login, cookies or a proxy?

No. This Actor reads the pages LinkedIn shows to anyone without an account, and it never signs in, never sends a cookie and never uses a session. Everything is handled for you and there is nothing to buy on top. Measured 2026-09-02: a full default run read 25 pages from an ordinary IP with no proxy traffic at all.

Do the job filters actually work?

The date window, job type, Easy Apply, under-10-applicants and company filters change LinkedIn's results reliably (each was checked on three queries on 2026-09-02). Since LinkedIn's August 2026 search change, its experience-level and workplace filters are applied on some queries and ignored on others. So seniority and job type are re-checked against what the posting itself states, and a posting that does not match is neither delivered nor billed. Workplace (remote / hybrid / on-site) is passed to LinkedIn as its own filter and is not re-checked, because the public posting carries no structured workplace field.

How many jobs can one search return?

LinkedIn's public search stops at about 1,000 results per query. To go deeper, add locations, split keywords, or use a shorter date window — each combination is its own search with its own 1,000.

Why did I get jobs that do not match my keyword?

LinkedIn returns "similar" postings when a query has few exact matches and does not mark them. Use Title must contain and Title must not contain: they are applied before a posting is opened, and skipped jobs are never billed.

Can I get every comment and every reaction on a post?

No, and it says so rather than pretending. The public post page carries the exact totals and about ten comments; the list of everyone who reacted is only shown to signed-in members. You get the exact counts, the comments shown, and the native video and image URLs.

How many posts does a company page give me?

The newest posts LinkedIn shows on the public page, about ten, each with exact reaction and comment counts. For a company's full history you would need a signed-in session, which this Actor does not use.

Which post URL should I paste?

The share link: open the post, Share > Copy link. It looks like linkedin.com/posts/<author>_...-activity-<id>-<code>. Links of the /feed/update/urn:li:activity:... form are only served to signed-in members and come back as a free row telling you that.

Which employee number is right?

Both are given. employeesOnLinkedIn is the exact number of LinkedIn members who list the company as their employer; companySize is the band the company set on its page ("10,001+ employees"). Neither is the payroll headcount, and the row says which is which.

What happens to a job that closed or a page that does not exist?

It costs nothing. You get a free error row that says which (closed, not found, or only visible to members), and the run keeps going.

Does a run fail if everything I asked for is gone?

No. "All of these have closed" is a correct answer, not a failure, so the run succeeds and returns free rows explaining each one. Only LinkedIn actually refusing us fails a run.

Can I put this on a schedule without paying twice for the same data?

Yes. Turn Monitor on. Job ids delivered for each search are remembered for 60 days and never billed again; a day with no new postings bills only the search itself. A company, post or article whose numbers have not moved is a free row marked unchanged.

Will I be charged twice if the same thing appears twice in my input?

No. A post reached through a share link and again from a company page, or a job returned by two searches, is one row and one charge.

Limits, stated plainly

LinkedIn shows its search results (people, companies, content), employee lists, reaction lists and Sales Navigator only to signed-in members, and serves member profiles to visitors only at its own discretion (measured 2026-09-02 from Apify's own exits: 35 of 50 ordinary profiles, and the refused ones stay refused). This Actor reads public pages only and never signs in, so it sells none of those — and says so here rather than on your invoice.

A public post page shows about ten comments and no repost count; the exact reaction and comment totals are always there.

LinkedIn's public job search stops at about 1,000 results per query and applies its experience-level and workplace filters inconsistently; seniority and job type are re-checked on the posting, workplace is not.

The external "Apply" link and the hiring team are behind LinkedIn's sign-in and are not sold. Salary is delivered when the posting states it.

Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is vonsensey/linkedin-scraper-api; every snippet below sends {}, which runs the defaults shown on the form — replace it with your own input.

n8n

Install the Apify community node (@apify/n8n-nodes-apify under Settings → Community Nodes, or search "Apify" on n8n Cloud). Add Apify → Run Actor with Actor vonsensey/linkedin-scraper-api and your input JSON, then Apify → Get Dataset Items on the run's defaultDatasetId and pipe the rows anywhere. For scheduled runs, the On new Apify Event trigger fires when a run of this Actor finishes.

MCP (Claude, Cursor, VS Code, any MCP client)

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=vonsensey/linkedin-scraper-api",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}

Your agent then calls vonsensey/linkedin-scraper-api as a tool with the same input the form takes and reads the dataset back.

REST API (one call, rows in the response)

curl -X POST "https://api.apify.com/v2/acts/vonsensey~linkedin-scraper-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{}'

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/linkedin-scraper-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/linkedin-scraper-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Make, Zapier, LangChain, CrewAI

The Apify app in Make and Zapier has a Run an Actor module: pick vonsensey/linkedin-scraper-api. In LangChain and CrewAI the Apify tool wrappers take the same Actor id. A daily schedule needs nothing but the Console: Schedules → Create → this Actor → cron, and the dataset fills on its own.