LinkedIn Posts Scraper — LinkedIn Profile Posts, LinkedIn Feed
Pricing
from $1.00 / 1,000 posts
LinkedIn Posts Scraper — LinkedIn Profile Posts, LinkedIn Feed
LinkedIn feed of any profile or company URL as rows — post text, a real publish timestamp to the second, likes, comments, shares, the reaction breakdown, images, video and article links, and the author. No login, no cookies. A page with nothing public is never charged.
Pricing
from $1.00 / 1,000 posts
Rating
0.0
(0)
Developer
Steadyfetch Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Paste a LinkedIn company page or a person's profile and get that page's posts as rows: what was written, when it was really published, how many likes, comments and shares it has, the reaction breakdown, the images, video, document and article links attached to it, and the author. No login, no cookies, no proxy to configure. Your limit is exact and it is per page — set 50 and you get up to 50 from each link, never more, and a page holding fewer says so on a row that costs nothing. A post we could not deliver is never charged, and nothing is charged for starting a run. Click Start with nothing set and you get a built-in sample: 3 posts from one public company page, served from a frozen copy rather than fetched from LinkedIn, and nothing is charged for it.
Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/linkedin-posts-scraper
- Actor id:
steadyfetch/linkedin-posts-scraper - Input:
{ "startUrls": ["https://www.linkedin.com/company/microsoft/", "https://www.linkedin.com/in/<public-identifier>/"] }— the one field you have to set. A company page and a person's profile can sit in the same list, each classified by its own path. Add"postsPerTarget": 50for the per-page limit and"maxItems": 1000for the whole run. - Cap the bill: set
maxTotalChargeUsdon the run (a run option, not Actor input), e.g.1.00— the run stops when it reaches it.
Unofficial. Not affiliated with, endorsed by, or sponsored by LinkedIn or Microsoft Corporation, nor with any company or person whose public posts appear in the built-in sample.
The publish time is the real one
Read this first, because it is the one thing that separates these rows from most of the field. Every row carries postedAt — the moment LinkedIn itself stamped on the post, to the millisecond — and not a reading of a "2 weeks ago" label. You can check it yourself: the timestamp is the same epoch LinkedIn encodes inside the post's own activity id. postedAgo carries the label too, as a second column, never as the date.
What you get
One row per post, at one price.
| Column | What it holds |
|---|---|
postId · postUrl · shareUrl · shareUrn | the post's own ids and its permalink |
text | what was written, in full |
postedAt · postedAtTimestamp · postedAgo | the real publish moment, and LinkedIn's own label beside it |
authorType · authorName · authorHandle · authorUrl · authorId | who posted it, and whether that is a person or a company |
authorHeadline · authorFollowers · authorAvatarUrl | the headline on a person, the follower count on a company |
likes · comments · shares · reactions[] | the engagement, with the per-type reaction breakdown |
countsHidden[] | which counts LinkedIn is hiding on this page, so a hidden total never reads as a zero |
imageUrls[] · videoUrl · videoThumbnailUrl · documentUrl | the media attached to the post |
articleTitle · articleLink · articleDescription | the link preview, when the post shares one |
isRepost · repostOfPostId · repostOfPostUrl · repostOfAuthorName · repostOfPostedAt | a repost, with the original underneath it |
newsletterTitle · newsletterUrl | when the post is a newsletter issue |
targetUrl | the page you asked for |
charged · status · statusReason | on every row, so the invoice reconciles from the dataset |
Hidden counts are never zeros
LinkedIn lets a page hide its reaction, comment, repost or view counts. When it does, the number in this dataset is null and countsHidden names which one is hidden — never 0. A zero that means "we could not see it" is the same false precision as a date reconstructed from a label, and this actor does not ship either.
How often the data changes
- A company page posts daily to weekly; a person weekly to monthly. A daily run on a company page and a weekly one on a person is usually the right shape.
- Like and comment counts keep moving for about 72 hours after a post goes up, then settle.
- Image, video, document and avatar links are signed by LinkedIn and expire within days. Re-run for fresh links; do not store them and expect them to keep working.
- Re-runs skip the posts your account already had, so a repeat run pays only for what is new. That memory lives in the key-value store
linkedin-posts-accountin your own Apify account, and posts older than 90 days in it count as new again. - The memory is a key-value store in your own Apify account, so a run started with a scoped API token in restricted-access mode needs key-value store Read, Write and Create permission, or Actor runs set to Full access (Write is what lets the run remember what it delivered; without it every run pays again); without it the run says so on its status line and cannot skip what you already have.
Price
One charged unit is one post delivered. The store card shows this as from $1.00/1,000 posts — the cheapest tier, per 1,000 posts.
| Apify plan | Per post | 1,000 posts |
|---|---|---|
| Free plan | $0.0018 | $1.80 |
| Bronze | $0.0015 | $1.50 |
| Silver | $0.0012 | $1.20 |
| Gold and above | $0.0010 | $1.00 |
No start fee. No fee for a page that returned nothing. No second charge for the media, the article preview, the reaction breakdown or the author — they are columns on the one row you already paid for, and a repost is one post at the same price with the original underneath it.
maxTotalChargeUsd is a run option, not an input field, and it is a hard ceiling: the run stops collecting when it reaches it, writes out everything already in hand, and books the rest as rows that name the cap and cost nothing.
Honest rows
Nothing below is charged, and every one of them arrives as a row you can read rather than as a missing line. The row's status is the first column; statusReason is the sentence.
status | What the row says |
|---|---|
profile_not_found | LinkedIn does not list a public page at this URL, or it cannot be read without a login — nothing was charged for it. |
page_not_found | The same answer on a company or showcase page: LinkedIn does not list one publicly at this URL. |
no_data | This page exists and LinkedIn shows no public posts on it — nothing was charged. |
skipped.page_cap | The walk reached the 200 pages this actor reads for one link and LinkedIn was still serving — that bound is this actor's own, not a verdict about the page, so one link can never spend a whole run. The row says what to change. Nothing was charged for the posts it did not deliver. |
input_error | The link is not a LinkedIn profile or company page. A link to a single post says so and names the fix: paste the author's page URL instead. The row names the field the link arrived in, never what you typed. |
feed_unavailable | LinkedIn did not answer for this page on this run. Please re-run — nothing was charged. If posts had already been delivered before it stopped answering, the row opens with how many and what they cost, and the re-run is for the rest. |
vendor_out_of_credit · vendor_budget | The data feed behind this actor is out of allowance for now; nothing was charged. |
skipped_max_items · skipped_budget · skipped_deadline | One of your own limits or the run clock stopped the run first, and the row names which. |
Posts your account already had are skipped rather than delivered twice, and are never charged either — unless the token that started the run cannot open key-value stores (see the scoped-token note above), and then the run says so on its status line, on a note row and on every row it charged.
A link to one post is not this actor's door
This actor reads a PROFILE or a COMPANY page and returns that page's posts. A link to a single post — /feed/update/… or /posts/…-activity-… — comes back as an uncharged row telling you to paste the author's page instead.
Other scrapers you might want
- Public job postings with their full descriptions: LinkedIn jobs
- The spoken words inside a LinkedIn video ad: LinkedIn ad transcripts
- Career pages on a company's own domain: Career sites by domain
Limits and good manners
Only public pages are returned — a page behind a login is an uncharged row, not a workaround. This actor may stop working if LinkedIn changes how the data is served; if it does, items that fail are never charged.
Support
Something off, or a column you need that is not here? Open an issue on the Issues tab — we usually reply within a couple of hours.
If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.