Back to guides
/Linked API

LinkedIn Post Scraper: How to Extract Posts, Reactions, and Comments via API (2026)

A LinkedIn post scraper pulls the content and engagement of a post – its text, media, and reaction, comment, and repost counts – and, most usefully, the list of people who reacted and commented, each with their name, headline, and profile URL. There is no official LinkedIn API to read arbitrary post data, so every option is a scraper, and they differ a lot in reliability and account risk. This guide shows exactly what fields you can get, a real sample response, how to scrape one post and a person's or company's recent posts in code (Node and Python), and the part most guides skip: turning post engagers into a warm-lead list.

The short version. A post's content and its engager list – who reacted and who commented, with name, headline, and profile URL – are both extractable. Personal emails are not. Linked API reads known post URLs and a person's or company's recent posts (bounded by a limit and an optional since date), not an arbitrary keyword search of LinkedIn, and on big posts it samples engagement rather than dumping it whole. Chrome extensions and scripts run on your own account at machine speed and get it restricted; an API paces like a human and returns clean JSON.

What data is in a LinkedIn post

A post is really three records: the post itself, the reactions on it, and the comments on it. Here is what you get from each.

GroupFields
Posturl, time, type (original / repost), repostText, text
Mediaimages, hasVideo, hasPoll
CountsreactionsCount, commentsCount, repostsCount
Reaction (per engager)engagerUrl, engagerName, engagerHeadline, engagerType (person / company), type (like / celebrate / support / love / insightful / funny)
Comment (per commenter)commenterUrl, commenterName, commenterHeadline, text, time, isReply, reactionsCount, repliesCount

The reaction and comment records are the valuable part: each one carries the engager's profile URL – a durable key you can enrich or act on later. Note what is not here: no email, no phone. Post data is public-facing profile data, not contact data.

A real scraped post

The reactions and comments sections are opt-in – you ask for them, and you get typed JSON back instead of HTML to parse.

json
{
  "url": "https://www.linkedin.com/posts/jane-doe_growth-activity-7440011668937568257",
  "time": "2026-07-08T14:20:00Z",
  "type": "original",
  "repostText": null,
  "text": "We cut our onboarding drop-off by 40% this quarter. Three things that worked...",
  "images": ["https://media.linkedin.com/…/chart.png"],
  "hasVideo": false,
  "hasPoll": false,
  "reactionsCount": 214,
  "commentsCount": 37,
  "repostsCount": 9,
  "reactions": [
    {
      "engagerUrl": "https://www.linkedin.com/in/mark-lee",
      "engagerName": "Mark Lee",
      "engagerHeadline": "VP Sales at Northwind",
      "engagerType": "person",
      "type": "insightful"
    },
    {
      "engagerUrl": "https://www.linkedin.com/in/sara-kim",
      "engagerName": "Sara Kim",
      "engagerHeadline": "Head of RevOps at Acme",
      "engagerType": "person",
      "type": "celebrate"
    }
  ],
  "comments": [
    {
      "commenterUrl": "https://www.linkedin.com/in/david-ross",
      "commenterName": "David Ross",
      "commenterHeadline": "Growth Lead at Beacon",
      "text": "Which onboarding step moved the needle most?",
      "time": "2026-07-08T15:02:00Z",
      "isReply": false,
      "reactionsCount": 4,
      "repliesCount": 1
    }
  ]
}

Four ways to scrape LinkedIn posts, compared

There is no official post API, so the real choice is between four methods that trade off scale, output, and the risk to your account.

MethodScaleOutputMaintenanceAccount-ban risk
Manual copy-pasteA few a dayYou retype itNoneNone
Chrome extensionTens/dayA spreadsheetBreaks on layout changesHigh – acts on your account at machine speed
DIY Python scraperHigh, until blockedRaw HTML you parseYou own selectors and proxiesHigh – headless on your account
API on your own accountSteady, pacedStructured JSON (post + engagers)Handled for youLower – paced like a human

One scope note before the code: this account-based approach reads known posts – a specific post URL, or a person's or company's own timeline. It does not do an arbitrary post keyword search ("every post mentioning X"). For that job, a dedicated post-search scraper (Apify, Bright Data, as of 2026) is the better fit, with the usual scraping-risk and stale-versus-live tradeoffs. For the account-based model across all entities, see the LinkedIn scraper API guide; for vacancies rather than content posts, the LinkedIn jobs scraper. What follows is the live, account-based path for posts you can point to.

Scrape a single post and its engagers

Install the SDK:

bash
# Node.js
npm install -S @linkedapi/node

# Python
pip install linkedapi

Then fetch a post by URL, asking for its reactions and comments:

typescript
import LinkedApi from '@linkedapi/node';

const linkedapi = new LinkedApi({
  linkedApiToken: process.env.LINKED_API_TOKEN,
  identificationToken: process.env.IDENTIFICATION_TOKEN,
});

const workflow = await linkedapi.fetchPost.execute({
  postUrl: 'https://www.linkedin.com/posts/jane-doe_growth-activity-7440011668937568257',
  retrieveReactions: true,
  retrieveComments: true,
  reactionsRetrievalConfig: { limit: 50 },
  commentsRetrievalConfig: { limit: 50, sort: 'mostRecent' },
});

const { data } = await linkedapi.fetchPost.result(workflow.workflowId);
console.log(data?.text, data?.reactionsCount, data?.reactions?.length);
// each reaction: { engagerUrl, engagerName, engagerHeadline, engagerType, type }

The limit in each config is what keeps this honest on a viral post: you pull a bounded, recent slice of the engagement, not a guaranteed copy of every one of thousands of reactions.

Scrape a person's or company's recent posts

To watch what someone publishes, fetch the person (or company) with retrievePosts and a postsRetrievalConfig. The since date is the key to monitoring – pass your last run's timestamp and you get only what is new:

typescript
const workflow = await linkedapi.fetchPerson.execute({
  personUrl: 'https://www.linkedin.com/in/jane-doe',
  retrievePosts: true,
  postsRetrievalConfig: { limit: 20, since: '2026-06-01T00:00:00Z' },
});

const { data } = await linkedapi.fetchPerson.result(workflow.workflowId);
for (const post of data?.posts ?? []) {
  console.log(post.time, post.reactionsCount, post.url);
}
// swap fetchPerson for fetchCompany with a companyUrl to track a company's posts

This returns a recent, bounded set of posts, not a full archive. Run it on a schedule (a nightly cron with since set to yesterday) and you have a monitor for a person's or company's new activity – the foundation for the use case below.

Turn post engagers into warm leads

Here is the part worth building for. A person who reacted to or commented on a relevant post has raised their hand. You already have their profile URL from the post – so the pipeline is short: read the post's engagers, optionally enrich each live, and act.

typescript
// You already fetched the post with retrieveReactions + retrieveComments above.
const leads = [
  ...(data?.reactions ?? []).map((r) => ({
    url: r.engagerUrl, name: r.engagerName, headline: r.engagerHeadline, signal: r.type,
  })),
  ...(data?.comments ?? []).map((c) => ({
    url: c.commenterUrl, name: c.commenterName, headline: c.commenterHeadline, signal: 'commented',
  })),
];

// From here: enrich one live with fetchPerson(url), or act with
// sendConnectionRequest / sendMessage - all on your own account.
Pipeline diagram: a monitored LinkedIn post feeds into pulling its reactions and comments, which give each engager's profile URL, name, and headline; those flow into optional live enrichment via fetchPerson and then into outreach with a connection request or message. A note marks that you get profile URLs, not emails.

Two honest limits keep this grounded. You get profile URLs and public headlines, not emails – so this builds a targeted list and a warm-intent signal, not a contact database. And it runs on your own account at a human pace, so it is built for steady, relevant lists, not for scraping every reactor on a 10,000-like post. For what to do with the list next, see our cold outreach guide; if your source list lives in Sales Navigator, see the Sales Navigator guide.

Can you get an engager's email?

No, and it is the same story as any profile scraper: emails and phone numbers are not shown on posts or profiles, so a scraper reading LinkedIn cannot return them. What you get is the engager's profile URL and headline. To attach a verified email, match that person against a separate, consented B2B enrichment provider – a different product from post scraping, and the data does not come off LinkedIn.

Post content and public engagement are largely visible data, and courts have treated scraping genuinely public data more leniently than accessing private data – but public is not a free pass. LinkedIn's User Agreement restricts automated access to the platform, and personal data still falls under GDPR and CCPA. We break down the full four-layer legal picture in our guide to scraping LinkedIn.

The ban risk is highest exactly where most people start: a Chrome extension or headless script driving your own account too fast. Linked API takes the account-based path – it runs on your own authenticated account through a human-paced cloud browser, within built-in workflow limits – and returns maintained, structured JSON, so you are not rewriting selectors every time the feed changes. Pace like a human, stop on any warning, and keep contact data to consented sources. Read our safety model before you scale.

Frequently Asked Questions (FAQ)

The post's content (text, media flags), its reaction, comment, and repost counts, and the list of people who reacted and commented – each with name, headline, and profile URL, plus the reaction type or comment text. Personal emails and phone numbers are not available.

Yes. Requesting reactions returns each reactor's profile URL, name, headline, and reaction type (like, celebrate, support, love, insightful, funny); requesting comments returns each commenter's URL, name, headline, and comment text. This is what makes a post a lead source.

No. LinkedIn does not expose personal emails on posts or profiles, so you get profile URLs, not contacts. Match those profiles against a consented enrichment provider if you need verified emails.

Yes – fetch the person with retrievePosts and a postsRetrievalConfig (limit, optional since). It returns a bounded recent set of their posts, not a guaranteed full archive; the same works for a company via fetchCompany.

Yes. Pass a since date in postsRetrievalConfig to pull only posts published after your last run, and schedule the call (for example, a nightly cron job). That turns the fetch into a monitor for new posts.

No. It reads known post URLs and a person's or company's recent timeline; there is no arbitrary post keyword search. For "find every post mentioning X," a dedicated post-search scraper is the better fit.

No. LinkedIn's official APIs cover your own content and approved partner use cases; there is no public API to read arbitrary posts and their engagement. Every "post scraper" you see is a scraping or account-based product.

There is no universal number – it depends on your account's age and history and on staying within a safe daily pace. An account-based API paces the work like a human rather than bursting; treat volume as bounded, not a firehose.


Need LinkedIn post data and the people behind the engagement, without running an extension or a fragile script? Start with Linked API – read posts, reactions, and comments from your own account and get structured JSON back, through the API and SDKs, CLI, MCP, and skills.