Public posts on LinkedIn are where B2B reputations get built, and the platform gives you no sane way to study them at scale. The feed buries history, search is moody, and engagement numbers live behind endless scrolling. I wanted one row per post with the counts attached, which is exactly what the LinkedIn Posts API on Apify returns: public posts as clean, structured JSON, discovered from a profile URL or fetched from specific post URLs.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does LinkedIn have a public posts API?
Effectively no. LinkedIn's official APIs sit behind partner programs with narrow scopes, and none of them exist so an analyst can pull a creator's recent posts with engagement counts. That is the gap a scraper-as-API fills: it collects what a logged-out visitor could see on public post pages and hands it back as data.
What the LinkedIn Posts API returns
The LinkedIn Posts API returns one JSON row per post: the text, hashtags, media, author details, and the engagement counts.
| Field | Example | Notes |
|---|---|---|
postUrl |
https://www.linkedin.com/feed/update/... |
With a stable postId
|
datePosted |
2026-07-02 |
The time axis for cadence analysis |
text |
We just shipped... |
Full post text, with hashtags broken out |
numLikes |
418 |
Reactions count |
numComments |
57 |
With topComments sampled |
numShares |
23 |
Reposts of the post |
Rows also carry authorName, authorHeadline, authorFollowers, images, videos, embeddedLinks, and tagged companies and people, so engagement can be normalized against audience size.
Who this is for
Marketing teams doing social listening on their category, creator and influencer analysts benchmarking what actually earns engagement, and founders quietly studying which competitor posts land.
The manual way, and where it breaks
The DIY version is scrolling a profile with the network tab open, or worse, automating a logged-in browser session. Both fail structurally. The feed renders lazily and inconsistently, markup shifts constantly, and automating your own account crosses lines that can cost you the account. Copy-paste into a sheet caps out at a dozen posts before the will to live runs out.
The faster way: run the LinkedIn Posts API
Apify Console
- Open the LinkedIn Posts API and click Try for free.
- Paste
profileUrlsto discover a person's recent posts, orpostUrlsfor specific posts, and setmaxPostsPerProfile. - Run it and export JSON or CSV.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~linkedin-posts-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "profileUrls": ["https://www.linkedin.com/in/williamhgates"], "maxPostsPerProfile": 20 }'
Endpoint reference: the Apify API docs.
Scrape LinkedIn posts in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/linkedin-posts-api").call(
run_input={
"profileUrls": ["https://www.linkedin.com/in/williamhgates"],
"maxPostsPerProfile": 20,
}
)
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post.get("numLikes"), post.get("numComments"), (post.get("text") or "")[:80])
A runnable version is published as the task LinkedIn posts data API for Python.
Track a profile's posts over time
Track a profile's LinkedIn posts is the recurring-collection setup, the base layer for any posting-cadence or share-of-voice analysis.
Analyze post engagement
Analyze LinkedIn post engagement works the counts: reactions, comments, and shares per post, ready to normalize by follower count.
Fetch specific posts by URL
When you already know the posts, Fetch specific LinkedIn posts by URL fetches them directly, no discovery pass needed.
Collect influencer posts in bulk
Collect influencer posts from LinkedIn batches a list of creators, and the n8n workflow variant drops the same rows into an automation.
Pull posts into Claude via MCP
Over Apify's MCP server the Actor becomes a tool for Claude, Claude Code, and Cursor, so "summarize what this founder posted this quarter and what got traction" runs as a live tool call. The task Get LinkedIn posts in Claude via MCP has the configuration, and you can read more about Claude at claude.ai.
FAQ about scraping LinkedIn posts
What does the LinkedIn posts scraper cost?
Billing is pay per post collected, so twenty posts cost twenty post events and a capped run stays a capped bill. New Apify accounts include free platform credit that covers a first collection.
Does the scraper need my LinkedIn login?
No, and that matters. It collects public posts, the ones visible on public post pages, so you are not lending your own account to automation or exposing it to bans.
Can Claude use this LinkedIn posts scraper over MCP?
Yes. Connected through Apify's MCP server, it is a callable tool, and the MCP example task above is the fastest working setup.
Can I schedule the scraper to follow a profile weekly?
Yes. Save the profile list as a task, attach a weekly Apify schedule, and each run appends the new posts with fresh counts. Start from the LinkedIn Posts API page.
What happens when the scraper hits a post it cannot read?
You get an error row for that post instead of a dead run, so one private or deleted URL never kills a batch. Also remember the counts are snapshots at collection time; engagement keeps moving after you sample it.
More from Truffle Pig Data
LinkedIn data comes in layers, and these sibling Actors cover the rest: the LinkedIn Profile API for the person behind the posts, the LinkedIn Company API for organization pages, and the LinkedIn Jobs API for hiring signals.
Wrapping up
Engagement data beats engagement folklore. Point the LinkedIn Posts API at the profiles you study and get the posts as rows.
Top comments (0)