LinkedIn Company Posts Scraper - Post Text, Dates & Images avatar

LinkedIn Company Posts Scraper - Post Text, Dates & Images

Pricing

from $0.87 / 1,000 successful public company posts

Go to Apify Store
LinkedIn Company Posts Scraper - Post Text, Dates & Images

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

5

Monthly active users

18 hours ago

Last modified

Security

Limited permissions

Share

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.

InputPublic /company/ URLs or page names, or single post links
OutputOne row per post: full text, post URL, activity id, publish time, images, post type, and reaction and comment counts when the page carries them
Ceiling200 companies per run, 100 posts per company, 100 post links
Account neededNone
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 getField
The company, its page and slugcompanyName, companyUrl, companySlug
The post link and LinkedIn's own id for itpostUrl, activityId
The full post texttext
The headline of an attached articleheadline
When it was published, and last editeddatePublished, dateModified
Comment and reaction counts, when the page carries themcommentCount, reactionCount
Image links on the postimageUrls
When the row was readretrievedAt
A post or an articlepostType
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

  1. Open LinkedIn Company Posts Scraper and click Try for free.
  2. Paste company URLs or page names into Public LinkedIn company URLs, one per line.
  3. Set Maximum companies to at least the number you pasted. For new posts only, fill in Only posts published on or after.
  4. Click Start.
  5. 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"
}
FieldDefaultWhat it is
companyUrlsnonePublic /company/ URLs, or just the page name (openai). The form opens with one example filled in.
maxCompanies101 to 200. How many of those URLs the run actually opens.
maxPostsPerCompany201 to 100. A cap on rows per company, not a target: you get what the page shows, which is usually fewer.
postedAfternoneA 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.
includePostDetailsfalseOpens each post's own page for its comment count and media type. One more page per post.
postUrlsnoneSingle post links, as Copy link to post gives them. Up to 100. Only posts by the company named in the link come back.
maxConcurrency31 to 5 pages read at once. After a "too many requests" answer the rest go one at a time.
requestTimeoutSecs205 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"
}
FieldHow to read it
activityIdYour dedupe key.
textThe post body as published, whole.
datePublishedA real timestamp when the page carries one, which on company posts it usually does.
reactionCountAll reactions together, when the page carries the count. null when it does not, never a guess.
commentCountnull from the company page alone. Filled when Read each post's own page is on, or for a post link.
imageUrlsDeduplicated. An empty list for a text-only post.
headlinenull for an ordinary post.
mediaTypeOnly 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.

RowHow to spot itBilled
A postsourceType: "public_company_post"yes
The sample row_sample: true, only on an empty inputno
A diagnosticok: false and _diagnostic: trueno

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.

CodeWhat it means
BAD_INPUTNot a /company/ URL, page name or post link, or a postedAfter that is not a date. Nothing was requested for it.
NO_RESULTSThe 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_COMPANIESThis link was past maxCompanies, so it was not read. Raise it to read this one.
NOT_COMPANY_POSTA post link whose post is not written by the company named in the link.
NOT_SERVEDThis post was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here.
RATE_LIMITEDToo many pages too close together. Space your runs out.
SERVER_ERRORLinkedIn returned an error of its own.
NETWORKThe 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_LIMITThe 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_ERRORThe 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 postedAfter set 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 wantUse
Recent posts from a company pageThis one
Size, followers, headquarters and website for company page URLsLinkedIn Companies Scraper
The ads a company runs, from LinkedIn's Ad LibraryLinkedIn 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.

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.