Blog/Sales and GTM
5 min read

LinkedIn Post Scraper: Get a Page's Posts With Engagement

Pull a company page's or a person's LinkedIn posts with likes, comments, shares and reactions through one key, and see what each endpoint returns.

LinkedIn Post Scraper: Get a Page's Posts With Engagement

Get a LinkedIn page's recent posts with likes, comments and shares in one prompt. Paste this into your agent:

Set up https://monid.ai/SKILL.md, and then use Monid to pull the latest 50 posts from this LinkedIn company page, drop reposts, and give me a table with post link, date, likes, comments and shares, sorted by likes.

One prompt turns a company page into a table. 1 min setup · 10-20 hrs saved.

You want what a company or a person has been posting on LinkedIn, with the numbers next to each post: for content tracking, competitor watching, or a list of who is active. This guide shows the quickest way to get posts into your agent or a spreadsheet, what each record carries (we ran the endpoints on 2026-10-16), and four traps we hit, from reposts in a company feed to a comments field that comes back empty. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.

What is the easiest way to scrape LinkedIn posts through an API?

Monid. Install it once, add a key, and your agent calls LinkedIn post endpoints with no cookies, no login and no vendor account to set up.

  • Pay per call or pay for what you run. The company-page endpoint we use most bills $0.01 a call and returned 50 posts in that call (Verified 2026-10-16 on the LinkedIn tools page). Other endpoints bill per result. Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
  • One install, every API. The same key and balance call LinkedIn, Instagram, TikTok and the other social platforms, Google Maps and everything else on Monid. Building and wiring those yourself is the 10 to 20 hours this page claims to save.
  • Lives inside your agent. Install the CLI, add your key, run the prompt above, and the endpoints are there whenever your agent needs them, with nothing to keep running. Your agent reads SKILL.md and learns the rest, so setup is about a minute.

How do you pull a company's or a person's LinkedIn posts?

Call a posts endpoint with the page or profile URL, read the page of posts it returns, and follow the pagination token for the rest.

For agents

Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:

set up https://monid.ai/SKILL.md

It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.

For humans

npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main

Read the flags before you run anything

monid discover -q "linkedin posts by a person"
monid inspect -p apify -e /harvestapi/linkedin-profile-posts

Discovery and inspection never bill. The inspect output is the full input schema and the billing shape, which is where the Apify actor tells you it bills per result plus a small flat fee, and that its reactions and comments are separate switches.

Pull a company page

monid run -p ploid -e /linkedin/company-posts \
  --query '{"company":"https://www.linkedin.com/company/stripe"}'

One call returned 50 posts, with a total of 199 and four pages behind it, for $0.01 (Verified 2026-10-16). That is $0.0002 a post. All 199 posts are four calls, about $0.04. The response is large, about 159,000 characters for those 50 posts, so write it to a file and let your agent read the fields it needs rather than printing it.

Pull a person's posts

monid run -p apify -e /harvestapi/linkedin-profile-posts -w -i '{
  "targetUrls": ["https://www.linkedin.com/in/example/"],
  "maxPosts": 20,
  "includeReposts": false
}'

This actor bills $0.0045 a result plus a flat $0.00005 (Verified 2026-10-16), so twenty posts are about $0.09. We inspected it and did not run it today. It accepts profile and company URLs in targetUrls, filters reposts and quote posts, and has a posted-within window.

Or hand the whole job to an agent

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to pull the last 50 posts from each of these 5 linkedin company pages, drop reposts, and give me one table with page, post link, date, likes, comments and shares sorted by likes.

Can you scrape LinkedIn posts yourself with Python?

Yes, people do it with Playwright or a session cookie, and it works until LinkedIn changes its markup or challenges the account. A scraper you write is yours to keep alive: when the page changes your job breaks, and a logged-in script puts a real account at risk. How to scrape LinkedIn without getting your account banned covers that risk in detail.

Rules on collecting LinkedIn data differ by country and by what you do with the result, so check yours before you build anything.

Doing it in Python means a browser or proxy setup, a parser for the post markup, scroll or token paging, repost handling and a repair every time the page shifts. That is hours before the first useful row. A call through Monid returns typed JSON instead, with the company endpoint at $0.01 for 50 posts (Verified 2026-10-16). Set against hours of your own time, pick Monid for anything you will run more than once, because the collection is maintained for you. A script is fine for a one-off look at a single page.

What does a scraped LinkedIn post contain?

Identity, text, time, engagement and media, and the engagement is a count, not a list of people. We ran the company-page endpoint on 2026-10-16 against a large public company page, so the fields below are what came back.

The record

Each of the 50 posts had id, linkedinUrl, content, contentAttributes, author, postedAt, postImages, repostedBy, repostedAt, socialContent, comments, header, entityId, shareUrn, shareLinkedinUrl and engagement. Trimmed to the useful parts:

{ "id": "…",
  "linkedinUrl": "…",
  "content": "…",
  "author": { "type": "company", "name": "…", "universalName": "…", "linkedinUrl": "…" },
  "postedAt": { "date": "2026-10-15T17:27:14.252Z", "timestamp": 1792085234252, "postedAgoText": "1 day ago" },
  "engagement": { "likes": 48, "comments": 5, "shares": 3,
                  "reactions": [ { "type": "LIKE", "count": 36 }, { "type": "PRAISE", "count": 7 } ] } }

postedAt carries an ISO date and a millisecond timestamp, so sorting needs no parsing. engagement carries the three counts plus a breakdown by reaction type; across the 50 posts the types seen were LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION and ENTERTAINMENT. The highest like count in the page was 2,004. author has a type of company or profile, a name, a URL and a slug.

The lighter and the fuller version

The cheaper endpoints return less. anyapi/linkedin.company_posts_thin returned six items with four fields each, createdUtc, id, text and url, at $0.0012 (Verified 2026-10-16). Its own description says it carries no engagement counts and no author. anyapi/linkedin.company_posts returned author, engagement with reaction counts, postImages with width and height, postVideo with a thumbnail and a video URL, shareUrl, and contentAttributes that mark mentions of people and companies with their start position and length. It billed $0.005 for a call with three posts (Verified 2026-10-16).

What you can build with it

  • A content log for a competitor. Pull the page weekly, keep postedAt and engagement, and see which posts landed.
  • A timing signal for outreach. A page that announces a launch or a hire is worth a message that week, and the post gives you the sentence to open with.
  • A format study. Group by whether postImages or a video is present, and compare likes. In our 50, 14 posts carried images.

What goes wrong when you scrape LinkedIn posts?

Four things, all found in one run on 2026-10-16.

Why does a company feed contain posts by other people?

Because reshares by employees and other pages sit in the feed. Of the 50 posts we pulled, 36 had a company as author and 14 had a person. All 14 person-authored posts, plus 3 company-authored ones, carried a repostedBy object, 17 reposts in all. Count 50 and you have counted a third of the feed that is not the page's own output: 33 were original company posts.

Filter on repostedBy before you count. It costs nothing:

const original = posts.filter(p => !p.repostedBy || !Object.keys(p.repostedBy).length);

The anyapi/linkedin.company_posts endpoint exposes the same idea as repostAuthorName and repostCreatedUtc. Its includeReposts switch is where the next trap lives.

Why did a documented parameter return an error?

Because not every upstream source behind an endpoint can serve every option. Sending includeReposts: false to anyapi/linkedin.company_posts on its default route returned HTTP 400 with source_unknown, and the message named the one source that could serve it. The run billed $0. Sent without the switch, the same call returned three posts for $0.005 (Verified 2026-10-16). Filter on the repost fields yourself, or choose the route the error names.

Why is the comments field empty?

Because the posts call returns counts, not comments. The comments array was empty on all 50 posts while engagement.comments held the number. The people behind the counts are a different job, and a different bill. The Apify actor makes that explicit: reactions and comments are separate switches with their own per-post caps, so asking for them multiplies the results you pay for. The TikHub endpoint takes a type of posts, comments or reactions, which returns the posts a person commented on or reacted to. Run the counts first, and fetch people only for the few posts that earned it.

Why is the response so big?

Because a page of 50 posts is about 159,000 characters, around 3,000 characters a post, mostly media links and tracking fields. Save it to disk, read only id, content, postedAt and engagement, and your agent's context stays small.

How do you find LinkedIn posts by keyword?

Use a search endpoint, which takes text and returns posts from anyone. We ran anyapi/linkedin.search_posts for "hiring" posted in the last week on its cheapest route, and it returned 10 posts and a nextCursor.

monid run -p anyapi -e /linkedin.search_posts -i '{
  "query": "hiring",
  "datePosted": "last-week",
  "route": "giraffe"
}'

Each post had authorName, authorUrl, avatarUrl, commentCount, createdUtc, id, reactionCount, text and url. Reaction counts in our ten ran from 5 to 434 and comment counts from 0 to 125. The call billed $0.0012 and took about 12 seconds (Verified 2026-10-16), against 2 to 4 seconds on the company endpoints.

The route is a price and uptime choice: the same endpoint lists three routes at $0.0012, $0.008 and $0.018 a call (Verified 2026-10-16), with different stated uptime. The search returns an author URL, not a profile, so a name and a link is what you have. Qualifying that author is a second call.

Which endpoint should I use for which job?

EndpointWhat it doesInputReturnsBilling
ploid/linkedin/company-postsA company page's posts, 50 a pagePage URL or nameFull records with engagement and reaction breakdownPer call, $0.01
anyapi/linkedin.company_postsA company page's postsPage URL, limit up to 50Engagement, media, mentions, repost fieldsPer call on one route, per result on another
anyapi/linkedin.company_posts_thinText and link onlyPage URLcreatedUtc, id, text, urlPer call, $0.0012 on the default route
anyapi/linkedin.search_postsPosts by keywordQuery, recencyAuthor name and URL, counts, textPer call, $0.0012 to $0.018 by route (Verified 2026-10-16)
apify/harvestapi/linkedin-profile-postsA person's or page's postsTarget URLs, capsPosts, optionally reactions and commentsPer result, $0.0045 plus a flat fee
tikhub get user postsA person's posts, comments or reactionsProfile URL, typePosts, 50 a pagePer call

The Ploid row and the anyapi prices were read from monid inspect and checked with real calls on 2026-10-16; the Apify and TikHub rows were inspected, not run, and carry their billing shape only. Verified 2026-10-16.

The per-call versus per-result split decides how you batch. A per-call endpoint rewards asking for the biggest page it serves, because the page costs the same. A per-result endpoint rewards setting a cap and knowing what it multiplies against. Running the same batch shape against both is how a LinkedIn pipeline gets a bill nobody can account for. For the whole LinkedIn surface, people and jobs included, the LinkedIn scraper API guide is the wider map.

When is another route a better fit?

Your users authorise you. Official LinkedIn APIs exist for applications acting on behalf of members and pages that connect them. If your users link their own accounts, that is the supported route and you do not need a third party.

You manage your own page. Publishing, analytics on your own content and comment management are first-party jobs with first-party tools.

You need history you never collected. An endpoint returns what LinkedIn currently serves for a page. In our 50 the oldest post was from 2026-07-15, three months back, and 199 was the page's total. A deleted post or an older archive does not come back, so start collecting now if you will need it.

You need a contract for every field. If a field changing is a customer incident, a signed agreement with a data vendor is a different product from pay-per-call access.

And the disclosure: you are reading the Monid blog and Monid sells access to these endpoints. If your users authorise you, use LinkedIn's own API.

Conclusion

The quickest way to get a LinkedIn page's posts with engagement is one call through Monid: $0.01 for 50 posts with likes, comments, shares and the reaction breakdown (Verified 2026-10-16), one key for LinkedIn and everything else, about a minute to set up and ready inside your agent whenever you need it. Scraping it yourself works until the page changes, and costs hours of setup.

Two things matter more than the endpoint. Drop reposts before you count, because in our run 17 of 50 posts in a company feed were reshares. And treat people as a separate job: the posts call gives you counts and an empty comments array, so fetch the commenters or reactors only for the posts that earned it.

How we estimated the time saved: building and running your own LinkedIn post collector is roughly 5 to 10 hours each for the fetching and paging, the repost and field handling, and the first month of upkeep, across two jobs (company pages and keyword search). That is 10 to 20 hours. The 1 minute is the install, key and first call once you already have a Monid key.

Free next step: run monid inspect -p ploid -e /linkedin/company-posts, make one call on a page you follow, and print postedAt, engagement.likes and whether repostedBy is set. Start at monid.ai.

FAQ

Is scraping LinkedIn posts allowed?

Rules on collecting LinkedIn data differ by country and by how you use the result, and they differ again for logged-in and logged-out collection, so check the rules that apply to you before you build. The endpoints here read public pages and need no LinkedIn login from you.

Is there a free LinkedIn post scraper?

Not free, but close: a call to the company-page endpoint costs $0.01 for 50 posts (Verified 2026-10-16), with no monthly plan and no minimum, and discovery and inspection cost nothing. A free script works until the page changes or your account is challenged.

Can you export LinkedIn posts to a spreadsheet?

Yes, once you have the rows as JSON. Keep id, linkedinUrl, postedAt.date, content and the three engagement counts, and write them to a CSV with whatever tool you like, or ask your agent to do it in the same prompt.

Can the same endpoint pull company posts and a person's posts?

Not on every provider. The Ploid and anyapi company endpoints take a company page, the Apify actor takes profile and company URLs in one list, and the TikHub endpoint takes a profile. Check which shape you have before you write the loop, because a mixed list against a one-shape endpoint fails row by row.

Does this scrape LinkedIn job posts?

No. This guide covers posts people and companies publish in the feed. Job listings are a different dataset with their own endpoints.

Published August 2026.

linkedin post scraperscrape linkedin postslinkedin company postslinkedin posts apilinkedin post data