LinkedIn Company Posts Scraper - Post Text, Dates & Images
Pricing
from $0.87 / 1,000 successful public company posts
LinkedIn Company Posts Scraper - Post Text, Dates & Images
LinkedIn company posts scraper for the recent posts a company page shows to signed-out visitors. Each row holds the full post text, post URL, activity id, publish time and image links. $0.90 per 1,000 posts.
Pricing
from $0.87 / 1,000 successful public company posts
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
5
Monthly active users
18 hours ago
Last modified
Categories
Security
Limited permissionsShare
LinkedIn company posts scraper for company page URLs, one row per post: the full post text, the post URL, the activity id, the publish time and any images. No account, no cookie, no API key.
The honest part first. A signed-out company page carries only its latest posts, about ten, so this is a window on what a company is saying now, not an archive. There is no paging back through last year. And the comment count only comes when you switch on Read each post's own page.
| Input | Public /company/ URLs or page names, or single post links |
| Output | One row per post: full text, post URL, activity id, publish time, images, post type, and reaction and comment counts when the page carries them |
| Ceiling | 200 companies per run, 100 posts per company, 100 post links |
| Account needed | None |
| Price | $0.90 per 1,000 posts on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 5,500 |
🔍 What LinkedIn Company Posts Scraper does
Open a company page signed out and LinkedIn still shows its recent posts in the page itself. This reads them, for each company URL you give it, and writes one row per post.
Two rules decide what becomes a row. The post has to be written by the company you asked for, so a partner's post sitting on the page is left out rather than filed under the wrong name. And it has to carry a real activity id, which is what makes the row joinable to anything else you collect.
The text is the post body as published, not a preview, so long posts arrive whole.
📋 What data you get from each company post
| What you get | Field |
|---|---|
| The company, its page and slug | companyName, companyUrl, companySlug |
| The post link and LinkedIn's own id for it | postUrl, activityId |
| The full post text | text |
| The headline of an attached article | headline |
| When it was published, and last edited | datePublished, dateModified |
| Comment and reaction counts, when the page carries them | commentCount, reactionCount |
| Image links on the post | imageUrls |
| When the row was read | retrievedAt |
| A post or an article | postType |
| Image, video, document, article or text, and a video's cover picture (only with Read each post's own page) | mediaType, videoThumbnailUrl |
▶️ How to scrape LinkedIn company posts
- Open LinkedIn Company Posts Scraper and click Try for free.
- Paste company URLs or page names into Public LinkedIn company URLs, one per line.
- Set Maximum companies to at least the number you pasted. For new posts only, fill in Only posts published on or after.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Run it with nothing in the input and you get one labelled sample row, free.
💰 How much does it cost to scrape LinkedIn company posts?
$0.90 per 1,000 posts on the Free plan. Paid plans pay a little less: $0.89 on Starter, $0.88 on Scale and $0.87 on Business. On the free plan, the $5 Apify gives you each month covers about 5,500 posts.
One charge per post row. Sample and diagnostic rows are never charged, and neither are posts left out by the date filter. Reading each post's own page costs nothing extra. Since a page carries about ten posts, a run over ten companies is usually under a hundred rows.
📥 What you give it
{"companyUrls": ["https://www.linkedin.com/company/openai/","https://www.linkedin.com/company/apify/"],"maxCompanies": 10,"maxPostsPerCompany": 20,"postedAfter": "2026-10-01"}
| Field | Default | What it is |
|---|---|---|
companyUrls | none | Public /company/ URLs, or just the page name (openai). The form opens with one example filled in. |
maxCompanies | 10 | 1 to 200. How many of those URLs the run actually opens. |
maxPostsPerCompany | 20 | 1 to 100. A cap on rows per company, not a target: you get what the page shows, which is usually fewer. |
postedAfter | none | A date like 2026-10-01, or a full time like 2026-10-01T09:00:00Z. Older posts are left out and not charged. A post with no date is kept, and the status line counts them. Anything else stops the run before a page is read. |
includePostDetails | false | Opens each post's own page for its comment count and media type. One more page per post. |
postUrls | none | Single post links, as Copy link to post gives them. Up to 100. Only posts by the company named in the link come back. |
maxConcurrency | 3 | 1 to 5 pages read at once. After a "too many requests" answer the rest go one at a time. |
requestTimeoutSecs | 20 | 5 to 60 seconds per page. |
Set maxCompanies to match your list. A link past it is not read and gets a free
OVER_MAX_COMPANIES row instead. Two hundred is the ceiling for one run, so split a longer list.
The run's default time limit is 180 seconds. In our runs on 17 October 2026, 50 companies took
about a minute, a little over a second each, and with post details on a company took about three
seconds. So the default fits roughly 100 companies without details and 40 with them. For more, give
the run more time. If it runs out, the posts already written stay and a free TIME_LIMIT row says so.
📤 What you get back
A real row from a real run, with one internal field left out:
{"ok": true,"_sample": false,"sourceType": "public_company_post","companyName": "Stripe","companyUrl": "https://www.linkedin.com/company/stripe","companySlug": "stripe","postUrl": "https://www.linkedin.com/posts/stripe_fundraise-directly-into-your-stripe-treasury-activity-7516531847267311616-ltsY","activityId": "7516531847267311616","headline": null,"text": "Fundraise directly into your Stripe Treasury account. Deposits are automatically matched to each SAFE. Access settled funds immediately and earn 2% cash back with your Stripe card. Get started: https://lnkd.in/ehzHMhcv.","datePublished": "2026-10-15T16:14:02.796Z","dateModified": null,"commentCount": null,"reactionCount": 16,"imageUrls": [],"retrievedAt": "2026-10-17T03:39:30.453Z","postType": "post"}
| Field | How to read it |
|---|---|
activityId | Your dedupe key. |
text | The post body as published, whole. |
datePublished | A real timestamp when the page carries one, which on company posts it usually does. |
reactionCount | All reactions together, when the page carries the count. null when it does not, never a guess. |
commentCount | null from the company page alone. Filled when Read each post's own page is on, or for a post link. |
imageUrls | Deduplicated. An empty list for a text-only post. |
headline | null for an ordinary post. |
mediaType | Only with post details on. null means that post's page did not load; its row is still there. |
🧾 Reading the output
Three kinds of row, and only real posts cost anything.
| Row | How to spot it | Billed |
|---|---|---|
| A post | sourceType: "public_company_post" | yes |
| The sample row | _sample: true, only on an empty input | no |
| A diagnostic | ok: false and _diagnostic: true | no |
There is no charged field on these rows. sourceType is what separates a real post from a sample
or a diagnostic, so filter on it.
| Code | What it means |
|---|---|
BAD_INPUT | Not a /company/ URL, page name or post link, or a postedAfter that is not a date. Nothing was requested for it. |
NO_RESULTS | The page loaded and carried no posts by that company, or none on or after postedAfter. A renamed company lands here too, because the posts on the page that answers belong to a different slug. |
OVER_MAX_COMPANIES | This link was past maxCompanies, so it was not read. Raise it to read this one. |
NOT_COMPANY_POST | A post link whose post is not written by the company named in the link. |
NOT_SERVED | This post was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here. |
RATE_LIMITED | Too many pages too close together. Space your runs out. |
SERVER_ERROR | LinkedIn returned an error of its own. |
NETWORK | The page did not arrive inside requestTimeoutSecs, or LinkedIn answered with something unusable. A company page that no longer exists shows up here rather than under a "not found" code. |
TIME_LIMIT | The run reached its time limit and stopped early. The posts already written stay and are charged. Give the run more time, or ask for fewer companies, to get the rest. |
UNEXPECTED_ERROR | The run stopped early on an unexpected error. The results before this row are kept. |
A sample or diagnostic row never fails the run, TIME_LIMIT and BAD_INPUT included: a run the time limit stopped before any post came back still ends as succeeded, with an amber status message.
💡 What people use it for
- Watching what a set of competitors announce, without following them from a personal account.
- Collecting a company's own words about a launch, in full, for a brief or a report.
- Checking on a schedule whether a company page has posted anything new since yesterday, with
postedAfterset so the old posts are not paid for again.
🚧 What it does not do
- No post history. Only what the signed-out page carries, which is the recent few. No paging.
- No list of who reacted or commented, and no comment text. Counts only.
- No reaction breakdown by type and no repost count. The signed-out pages do not carry them.
- No personal posts. Only posts by the company itself. Employee posts and partner posts on the page are left out on purpose, and so are plain reposts.
- No video files. A video gets its type and cover picture, never the file.
- No reshare chain. You get the post as published on the page, not what it quoted.
- It is not an official LinkedIn tool. Dami's Studio is independent and is not affiliated with or endorsed by LinkedIn, or by any other company named on this page.
🧭 Which LinkedIn scraper do you need?
| If you want | Use |
|---|---|
| Recent posts from a company page | This one |
| Size, followers, headquarters and website for company page URLs | LinkedIn Companies Scraper |
| The ads a company runs, from LinkedIn's Ad Library | LinkedIn Ads Scraper |
❓ Questions people ask
Do I need a LinkedIn account to scrape company posts?
No, and there is no cookie field. Nothing to paste, nothing to renew.
Why did I only get five posts from a big company?
Because that is what the public page carries. Raising maxPostsPerCompany does not make LinkedIn
show more of them.
Why is the comment count empty?
The company page carries the reaction count but not the comment count. Switch on Read each post's own page and the comment count comes from each post's page, at no extra charge.
Can I get only new posts?
Yes. Set postedAfter to a date and older posts are left out and not charged. There is no upper
date: the page only carries recent posts anyway.
Can I call it from code or connect it to an AI assistant?
The API tab has code for Python, JavaScript
and the CLI. MCP clients like Claude and ChatGPT use
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/linkedin-company-posts-scraper; coding assistants can
load our skill file.
All three bill your Apify account at the same price.
Is scraping LinkedIn legal?
This reads public company pages only, never anything behind a login. Apify's write-up on the legality of web scraping is a reasonable starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the company URL. The errorCode on
the diagnostic row usually explains it on its own.