# LinkedIn Company Posts Scraper (No Cookies) (`insights_data/linkedin-company-posts-scraper-no-cookies`) Actor

Get the latest public posts of any LinkedIn company, newest first, from a company link or name. Each post has text, exact date, author, reactions, comments, top comments, images, video and links as clean JSON. Date filter, live results, no login needed.

- **URL**: https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📰 What is LinkedIn Company Posts Scraper (No Cookies)?

**LinkedIn Company Posts Scraper (No Cookies)** helps you track competitor posts and follow any brand on LinkedIn by collecting the recent publicly discoverable posts of a company page, with the text, exact date, reactions, comment count, public comments and media of each post. It is built for marketing, social media, research and recruiting teams who need LinkedIn competitor analysis and LinkedIn brand monitoring without logging in or sharing cookies. Paste a company link or name and click **Start**; you can try it with the $5 monthly credit of the Apify Free plan.

This LinkedIn company post scraper also reads single posts from a post link or post ID, so you can mix companies and posts in one run. Each post is saved to your results as soon as it is read, newest first for every company. Very new posts may be missing; paste their links to read them directly.

- 🔭 **Track competitor posts:** see what rival companies publish, how often they post, and which posts get the most reactions and comments.
- 📊 **Measure LinkedIn post engagement:** compare reaction counts, comment counts and total engagement per post, post type and company.
- 📣 **Run LinkedIn brand monitoring:** keep a dated record of your own or a client's company posts and the public comments under them.
- 👂 **Do LinkedIn social listening:** read what people write in the public comments under company posts.
- 🤝 **Research LinkedIn employer branding:** follow the hiring, culture and event posts of the employers you compete with for talent.
- 🧭 **Support LinkedIn market research and content strategy:** collect announcements, launches, hashtags and shared links across a market, then plan your own LinkedIn content strategy from what works.

#### What can LinkedIn Company Posts Scraper do?

- 🎯 **Read posts from four kinds of input:** a company page link, a company name, a post link or a 19-digit post ID, one per line
- 📅 **Filter by date:** keep only posts from the last 24 hours, week, month, 90 days or year, or posts on or after an exact date
- 💬 **Collect public comments:** text, commenter name when it is public, likes and time, at no extra charge
- 🖼️ **Get media:** image links, the direct video file link with duration, thumbnail and size, and shared-article cards
- 🗂️ **Get four extra tables:** authors, comments, links and tags, and media, plus a run summary
- 📦 **Export and automate:** download JSON, CSV, Excel, XML or HTML, run it through the API, schedule it, or connect it to Google Sheets, Slack, Make, Zapier or n8n

Unlike a general LinkedIn posts scraper that searches by keyword, this Actor starts from the company pages you choose, so every row belongs to a company you want to follow.

***

### 📋 LinkedIn Company Posts Scraper data: what you can extract

Every post becomes one row in the main **All posts** table. As a LinkedIn post data scraper, it returns these fields (names as in the dataset):

| Field group | Fields |
|---|---|
| 🆔 Post identity | `type` (text, image, video or article), `id`, `urn` (LinkedIn's full ID string for the post, `urn:li:activity:<id>`), `linkedinUrl` |
| 📝 Text | `content` (full post text) |
| 🏷️ Tags | `hashtags`, `mentions` |
| 🔗 Links | `links` (short links replaced by their destination when readable), `linksRaw` (the original short links) |
| 🏢 Author company | `author.name`, `author.publicIdentifier`, `author.linkedinUrl`, `author.type`, `author.avatar` (logo) |
| 📅 Date | `postedAt.timestamp` (epoch milliseconds: the time as a number of milliseconds since 1 January 1970, handy for sorting), `postedAt.date` (ISO date and time) |
| 👍 Engagement | `engagement.reactions`, `engagement.comments`, `engagement.totalEngagement` (reactions + comments), `engagement.shares`, `engagement.impressions` |
| 💬 Comments | `comments` with `text`, `authorName`, `likes`, `date` |
| 🖼️ Media | `media.type`, `media.images`, `media.video` (`url`, `duration` in seconds, `thumbnail`, `width`, `height`), `media.article` (`title`, `image`), `media.document` |
| 🕒 Run info | `scrapedFrom` (`discovered` = found from a company, `direct` = a post link you pasted), `scrapedAt` (UTC) |

This LinkedIn post data gives you the content and the counts in one place. The tool also works as a LinkedIn post comments scraper and a LinkedIn post engagement scraper for the companies you choose.

> **Note:** `engagement.shares` and `engagement.impressions` are always `null`, because LinkedIn shows them only to logged-in viewers. `media.document` is always `null`. `linksRaw` appears only when a post has short links. `postedAt.date`, `postedAt.timestamp` and `authorName` can be `null` when LinkedIn doesn't show them publicly for a post.

#### What data can't LinkedIn Company Posts Scraper extract?

- Share counts, impressions or views
- The reaction breakdown by type and the list of people who reacted
- Replies to comments, and comments beyond the ones LinkedIn shows to logged-out visitors
- Members-only, private or deleted posts
- Follower counts and other company page details (you get the company name, page name, link and logo)
- Posts of employees' personal profiles

For posts found by keyword, author or company, use [LinkedIn Post Search Scraper (No Cookies)](https://apify.com/insights_data/linkedin-post-search-scraper-no-cookies). For the people who work at a company, use [LinkedIn Company Employees Scraper](https://apify.com/insights_data/linkedin-company-employees-scraper).

***

### 🚀 How to scrape LinkedIn posts from a company page

LinkedIn Company Posts Scraper is designed for an easy start, even if you've never extracted data from the web before. You can scrape LinkedIn posts from several companies in one run.

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [LinkedIn Company Posts Scraper (No Cookies)](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies).
3. Add one company link per line in **Company links or post links**. To get a valid link, open the company's page on LinkedIn and copy the address from your browser: it looks like `https://www.linkedin.com/company/stripe`. You can also paste post links.
4. Click **Start** and watch the posts appear in the **Output** tab while the run is going.
5. Download your data from **Storage → Datasets → Export** in JSON, CSV, Excel, XML or HTML.

> 💡 **First run checklist**
>
> - Keep the prefilled company (`https://www.linkedin.com/company/stripe`) or paste your own company link.
> - Leave **Max posts per company** at 10. On the Free plan, 10 posts cost at most $0.0401 (each post is $0.004 plus a $0.00001 row fee), plus a $0.00005 start fee per run and platform usage. A small test run like this shows the full cost on the run page.
> - Optional: set a maximum charge limit in the run options below the input form.
> - Click **Start**, then open the **Output** tab.

***

### 💲 How much does it cost to scrape LinkedIn company posts?

LinkedIn Company Posts Scraper uses **pay-per-event** pricing, which means you pay for the events of a run (here: saved posts and the start) instead of a monthly rental. Your bill has three parts:

1. **Results:** you pay for each post saved to the main **All posts** table. The price depends on your Apify plan (table below). Each saved post also has a flat row fee of $0.00001 (a small fee for storing the row in the main results table), the same on every plan ($0.01 per 1,000 posts).
2. **Start fee:** $0.00005 per run (the Actor runs with 1 GB of memory by default).
3. **Platform usage:** the compute and traffic the run uses, billed at your Apify plan's own rates.

| 💲 Apify plan | Price per post | Price per 1,000 posts | With the $0.00001 row fee, per 1,000 posts |
|---|---|---|---|
| 💲 Free | $0.004 | $4.00 | $4.01 |
| 💲 Starter | $0.0035 | $3.50 | $3.51 |
| 💲 Scale | $0.0032 | $3.20 | $3.21 |
| 💲 Business and higher | $0.0028 | $2.80 | $2.81 |

The plan discount applies to the result price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

**Example:** the default input (one company, 10 posts) costs 10 × $0.004 = $0.04 in post charges on the Free plan, plus $0.0001 in row fees, the $0.00005 start fee and platform usage. A weekly check of 5 competitors with 10 posts each saves at most 50 posts: 50 × $0.00401 = $0.2005 per run on the Free plan, plus the start fee and platform usage. 1,000 posts cost $4.01 on the Free plan ($2.81 on Business), plus the start fee and platform usage. Platform usage depends on the run, so the best way to know your full cost is a small test run: the run page shows the exact cost when it finishes.

**What is not billed:** posts that could not be read, posts outside your date filter, the comments, the rows in the four extra tables, and the run summary.

See the [pricing tab](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/pricing) for the current prices.

#### Is scraping LinkedIn company posts free?

You can start for free. The [Apify Free plan](https://apify.com/pricing) gives you $5 in monthly credit, which pays for result charges and platform usage. Free-plan runs work the same as paid runs: there is no extra cap on posts per run.

#### How do I cap the cost of a run?

Set a **maximum charge limit** in the run options below the input form before you click **Start** (through the API, the same limit is the `maxTotalChargeUsd` parameter). It caps the post and row charges of that run; platform usage comes on top. When the limit is reached, the Actor stops and keeps every post it already saved.

***

### ⬇️ LinkedIn Company Posts Scraper input

The only required field is **Company links or post links**. Everything else is optional and has a default.

#### Settings most people change

- **Company links or post links** (`urls`): one entry per line. A company page link (`https://www.linkedin.com/company/stripe`) or its page name (`stripe`, the last part of the link) returns that company's recent publicly discoverable posts. A post link or a post ID returns that single post. Duplicates are removed.
- **Max posts per company** (`maxPosts`): the maximum posts for **each** company, newest first. The default is 10. `0` means all publicly discoverable posts. It does not limit post links you paste.
- **Posted within** (`postedLimit`): the form shows Any time, Last 24 hours, Last week, Last month, Last 90 days and Last year (API values `any`, `24h`, `week`, `month`, `90d`, `year`). The default is Any time.
- **Posted on or after** (`postedLimitDate`): an exact date in `YYYY-MM-DD` format. It takes priority over **Posted within**.
- **Collect comments** (`scrapeComments`) and **Max comments per post** (`maxComments`): comments are on by default, with up to 5 per post. You can raise it to 100, but only the comments LinkedIn shows publicly can be saved.

Here's an example that reads the 10 newest posts of Stripe with up to 5 comments each:

```json
{
  "urls": ["https://www.linkedin.com/company/stripe"],
  "maxPosts": 10,
  "postedLimit": "any",
  "scrapeComments": true,
  "maxComments": 5
}
```

| Setting | Field | Default | What it does |
|---|---|---|---|
| 🎯 Company links or post links | `urls` | Stripe company page (prefill) | Required. Company links, company page names, post links or post IDs, one per line |
| 🔢 Max posts per company | `maxPosts` | `10` | Posts per company, newest first. `0` = all publicly discoverable posts |
| ⏰ Posted within | `postedLimit` | `any` (Any time) | Any time, Last 24 hours, Last week, Last month, Last 90 days, Last year |
| 📅 Posted on or after | `postedLimitDate` | empty | `YYYY-MM-DD`. Wins over **Posted within** |
| 💬 Collect comments | `scrapeComments` | `true` | Saves the public comments of each post |
| 🔢 Max comments per post | `maxComments` | `5` | Up to 100 of the comments LinkedIn shows publicly. `0` = all comments shown. Values above 100 are lowered to 100 |
| 🌍 Context country | `contextCountry` | Default | Asks LinkedIn for pages in that country's language setting. Safe to leave on Default. It does not translate posts or dates |
| 🌐 Proxy configuration | `proxyConfiguration` | no proxy | Optional. Choose Apify Proxy or your own proxy URLs, or leave it off. If LinkedIn refuses requests, the Actor switches to a proxy automatically; that proxy traffic counts as platform usage |

See the [input tab](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/input-schema) for the full field descriptions.

#### Company links or post links

Use the company page link when you can. A company name only works when it matches the company's LinkedIn page name: the Actor turns it into lowercase and replaces spaces with hyphens.

- ✅ Good: `https://www.linkedin.com/company/stripe`, `stripe`, `https://www.linkedin.com/posts/stripe_...-activity-7519107159457038336-81L5`, `7519107159457038336`
- ❌ Bad: `Stripe Inc.` (a display name instead of the page name), a personal profile link

> ⚠️ Entries that are not a company link, company name, post link or post ID are skipped with a warning in the log. If no entry is valid, the run stops with "Nothing to scrape".

#### Max posts per company

The limit counts per company, not per run. Five companies with **Max posts per company** at 10 can save up to 50 posts. Post links you paste are read regardless of this number.

- ✅ Good: `10` for a regular check of each company
- ❌ Bad: `0` in a scheduled run, because the cost then grows with every publicly discoverable post

#### Posted within and Posted on or after

For companies, posts older than your filter are skipped before they are read. Pasted post links outside the window are read but not saved, so they are not charged. Posts whose date can't be read are kept, so you don't lose them silently.

#### Max comments per post

Only the comments LinkedIn shows to logged-out visitors can be saved, which is the first page of comments under a post. A higher number does not unlock more: you get up to 100 of the comments shown publicly, and the default is 5. The Actor lowers any value above 100 to 100.

***

### ⬆️ LinkedIn Company Posts Scraper output

Results are stored in a dataset (a results table on the Apify platform). Open the **Output** tab of a run to see **All posts** as a table or JSON, with views for **Posts overview**, **Engagement**, **Text, tags and links** and **All details**. The same tab links the four extra tables and the run summary. To download, go to **Storage → Datasets → Export** and pick JSON, CSV, Excel, XML or HTML, so you can export LinkedIn posts to a spreadsheet or turn LinkedIn posts to CSV for your own tools.

#### JSON example

An example row for the input above (shortened; the `media.video` values are example values):

```json
{
  "type": "video",
  "id": "7519107159457038336",
  "urn": "urn:li:activity:7519107159457038336",
  "linkedinUrl": "https://www.linkedin.com/posts/stripe_toto-wolff-activity-7519107159457038336-81L5",
  "content": "Toto Wolff of the Mercedes-AMG PETRONAS Formula One Team joins John Collison...",
  "hashtags": ["Stripe"],
  "mentions": [],
  "links": ["https://stripe.com"],
  "author": {
    "name": "Stripe",
    "publicIdentifier": "stripe",
    "linkedinUrl": "https://www.linkedin.com/company/stripe",
    "type": "COMPANY",
    "avatar": "https://media.licdn.com/..."
  },
  "postedAt": { "timestamp": 1792694845068, "date": "2026-10-22T18:47:25.068Z" },
  "media": {
    "type": "video",
    "images": [],
    "video": { "url": "https://dms.licdn.com/...", "duration": 55, "thumbnail": "https://media.licdn.com/...", "width": 720, "height": 720 },
    "article": null,
    "document": null
  },
  "engagement": { "reactions": 372, "comments": 15, "shares": null, "impressions": null, "totalEngagement": 387 },
  "comments": [
    { "text": "Great talk", "authorName": null, "likes": 0, "date": "2026-10-23T05:02:43.599Z" }
  ],
  "scrapedFrom": "discovered",
  "scrapedAt": "2026-10-30T10:00:00Z"
}
```

#### Extra tables and run summary

Each post is also split into flat tables, so you get a clean LinkedIn posts dataset for every angle:

| Table | One row per | Main fields |
|---|---|---|
| 🏢 Authors | post | `author_name`, `author_id`, `author_type`, `author_url`, `author_avatar`, `post_type`, `posted_at`, `reactions`, `comments`, `total_engagement` |
| 💬 Comments | public comment | `text`, `comment_author`, `likes`, `commented_at` |
| 🔗 Links and tags | link, short link, hashtag or mention | `kind`, `value`, `short_url` |
| 🖼️ Media | image, video or article card | `kind`, `url`, `thumbnail_url`, `duration_seconds`, `width`, `height`, `title` |

Every extra row also has `post_id`, `post_url`, `post_author` and `scraped_at`, so you can join it back to the main table.

🧮 The **Run summary** is saved in the run's key-value store (a small file store attached to each run; open the run's **Storage** tab, then **Key-value store**) as `RUN_SUMMARY`. It is also linked in the **Output** tab. It counts `companies_requested`, `post_links_requested`, `posts_saved`, `rows_charged`, `posts_not_readable` and `posts_outside_date_filter`, and lists up to 100 `problems` (the input and post ID that could not be read), plus `duration_seconds` and `spend_limit_reached`.

***

### 💡 Tips and advanced usage

#### How many posts can you scrape with LinkedIn Company Posts Scraper?

There is no fixed cap per run. For each company, the run stops at **Max posts per company**. It reads the recent publicly discoverable posts of each company, so very large post histories may not be complete. Very new posts may be missing; paste their links to read them directly. The best way to know for your companies is a small test run.

#### How to keep costs low

- Use **Posted within** or **Posted on or after**: for companies, older posts are skipped before they are read and are never charged.
- Keep **Max posts per company** small for regular checks, for example 10.
- Turn off **Collect comments** if you only need the counts. Comments are free, so this only keeps your tables smaller.

#### Run it on a schedule

A weekly competitor report takes four steps:

1. Fill in your competitors' company links, set **Max posts per company** to `10` and **Posted within** to `week`.
2. Save the input as a task (a saved input you can run again with one click) from the Actor page.
3. In the task, add an Apify schedule, for example every Monday at 08:00.
4. Each run creates a new dataset. The Actor doesn't compare runs itself, so remove duplicates by `id` (the post ID) or `linkedinUrl`: for example, append each run's posts to one Google Sheet and use **Data → Data cleanup → Remove duplicates** on the `id` column. A post ID that wasn't there last week is a new post.

Cost for this schedule: 5 competitors × 10 posts = at most 50 posts, which is at most $0.2005 per weekly run on the Free plan (50 × $0.00401), plus the start fee and platform usage.

#### If something goes wrong

| What you see | What is charged | What to do |
|---|---|---|
| ⚠️ "Nothing to scrape" and the run stops | Start fee and platform usage only | Add at least one company link, company name, post link or post ID. Copy the company link from your browser |
| ⚠️ "No posts were collected" | Start fee and platform usage only | Check the company link, or paste post links directly, then run again later |
| ⚠️ A post is listed in `problems` in the run summary | Nothing for that post | It may be deleted, private or members-only |
| ⚠️ "LinkedIn is refusing too many requests right now" | Posts saved before the stop, plus the start fee and usage so far | Try again later. If LinkedIn refuses requests, the Actor switches to a proxy automatically; that proxy traffic counts as platform usage |
| ⚠️ "The maximum charge limit was reached" | Posts saved up to the limit | Raising the limit and running again saves and charges the posts you already have again. To avoid paying twice, also set **Posted on or after** to a date after your newest saved post, or paste only the post links you still need |

A new run never knows what earlier runs saved, so every run charges the posts it saves.

***

### 🔌 Integrations and API

#### Can I use LinkedIn Company Posts Scraper as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) lets you start runs, schedule them and fetch results, so you can use this Actor as a LinkedIn company posts API for the public posts of any company page. Use the `apify-client` [NPM package](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/api/python) for Python. The [API tab](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/api) has ready-to-use code.

#### How to scrape LinkedIn posts with Python

Here is a minimal script to scrape LinkedIn posts Python-first, using the `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/linkedin-company-posts-scraper-no-cookies").call(run_input={
    "urls": ["https://www.linkedin.com/company/stripe"],
    "maxPosts": 10,
    "postedLimit": "any",
    "scrapeComments": True,
    "maxComments": 5,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["postedAt"]["date"], item["engagement"]["reactions"], item["linkedinUrl"])
```

#### Can I integrate LinkedIn Company Posts Scraper with other apps?

Yes. Connect it with [Apify integrations](https://apify.com/integrations) such as **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub and LangChain**. A [webhook](https://docs.apify.com/integrations/webhooks) (an automatic message Apify sends to another app's web address) fires on run events, for example when a run succeeds, not on each new post.

Two workflows that fit this Actor:

- **Shared sheet:** schedule a weekly run for your competitors and add the Google Sheets integration to the task, so every run adds its rows to one LinkedIn posts Google Sheets file that your team can sort by `engagement.totalEngagement`.
- **Slack digest through n8n or Make:** add a webhook for "run succeeded" that calls an n8n or Make scenario. It reads the finished run's dataset and posts a digest of that run's posts with their links to a Slack channel. To post only posts you haven't seen, keep a list of `id` or `linkedinUrl` values (for example in a Google Sheet) and let the scenario skip the ones already on it. Your LinkedIn post scraper n8n flow then needs only three steps: a webhook trigger, a dataset read and a Slack message.

#### Can I use LinkedIn Company Posts Scraper with AI agents (MCP)?

Yes. MCP (Model Context Protocol) is a standard way for AI assistants such as Claude to call outside tools. Add it through the Apify MCP server as a LinkedIn scraper MCP tool, and the assistant runs it and reads the posts for LinkedIn content analysis or summaries. Open the [MCP tab](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/api/mcp) for setup steps.

***

### 🧩 Other LinkedIn scrapers

These Actors cover other LinkedIn data, so you can pick the right LinkedIn scraper for each job:

| Actor | What it adds |
|---|---|
| 🔎 [LinkedIn Post Search Scraper (No Cookies)](https://apify.com/insights_data/linkedin-post-search-scraper-no-cookies) | Find public posts by keyword, author or company, with author followers and an exact date filter |
| 🔎 [LinkedIn Posts Search Scraper](https://apify.com/insights_data/posts-search-scraper-for-linkedin-no-cookies) | Search public posts by keyword, phrase or hashtag, or paste post, profile and company links; finds emails in the text |
| 👥 [LinkedIn Company Employees Scraper](https://apify.com/insights_data/linkedin-company-employees-scraper) | Public employees of a company with title, seniority, department and location, plus work emails as an option |
| 📇 [LinkedIn Profile Extractor & Enricher (No Login Required)](https://apify.com/insights_data/linkedin-profile-extractor-enricher) | Public profiles from URLs or IDs: headline, experience, education, skills and more |
| 💼 [Advanced LinkedIn Job Search API](https://apify.com/insights_data/advanced-linkedin-job-search-api) | Public LinkedIn jobs with salary, seniority, applicants and the full description |

***

### ❓ FAQ

#### Is it legal to scrape LinkedIn?

Scraping publicly available data is generally legal, but you are responsible for how you use it. This Actor reads only posts that anyone can see without logging in. Company posts are public business content, but comments can contain personal data, so collect and store them only with a legitimate reason and in line with privacy laws such as GDPR. Take LinkedIn's [User Agreement](https://www.linkedin.com/legal/user-agreement) into account. This is not legal advice.

#### How does LinkedIn Company Posts Scraper work?

It works like a person reading LinkedIn without an account, only automated. For each company, it finds the company's publicly discoverable posts, orders them newest first and skips the ones outside your date filter. It then reads each public post page and saves the text, date, counts, comments and media. Post links you paste are read directly. At the end, it writes the run summary.

#### Do I need a LinkedIn account or cookies?

No. With this LinkedIn scraper no cookies or passwords are shared, and you don't need a LinkedIn account. You can read LinkedIn posts without login because the Actor only reads what any visitor can see.

#### How is it different from LinkedIn Post Search Scraper (No Cookies)?

Both read public LinkedIn posts without an account. The difference is where they start:

| | LinkedIn Company Posts Scraper (No Cookies) | LinkedIn Post Search Scraper (No Cookies) |
|---|---|---|
| Starts from | Company links or names, post links, post IDs | Keyword, author or company search |
| Date filter | Time window or exact on-or-after date | Exact date filter |
| Comments | Public comments shown on the post (default 5, up to 100) | Comments |
| Author followers | No | Yes |

Choose this Actor to follow specific company pages. Choose the search scraper to find posts about a topic.

#### Is this a LinkedIn post scraper for any post?

Yes, for public posts. Paste a post link or a post ID and it reads that post, even if it comes from a company you didn't add. Through the API, developers can use it as a LinkedIn post scraper API for lists of post links, and as a LinkedIn posts API for company feeds. Members-only, private and deleted posts can't be read.

#### Can I scrape LinkedIn company page details with it?

Partly. Each post includes the company name, page name, page link and logo. It is not a full LinkedIn company page scraper: follower counts, employee numbers and the About section are not included. For people at a company, use [LinkedIn Company Employees Scraper](https://apify.com/insights_data/linkedin-company-employees-scraper).

#### Does it give LinkedIn post analytics such as impressions?

It gives the public part of LinkedIn post analytics: reactions, comments and total engagement per post, plus the post type and exact time. Impressions, views and shares are only visible to logged-in viewers or the page owner, so they are `null`. That is still enough for competitor content analysis, such as which post types and topics get the most engagement.

#### How do I download LinkedIn posts to Excel or CSV?

Run the Actor, then go to **Storage → Datasets → Export** and choose Excel or CSV. You can download LinkedIn posts from all your companies in one file, or export the comments, links and media tables separately.

#### Why am I getting fewer posts than expected?

- The Actor reads the recent publicly discoverable posts of a company. Very new posts may be missing; paste their links to read them directly.
- Your date filter may skip older posts. The log shows how many older posts were skipped for each company. `posts_outside_date_filter` in the run summary counts only posts that were read and then fell outside the filter (for example pasted post links).
- Some posts are members-only, private or deleted. They are listed in `problems` in the run summary.
- A company name that doesn't match the LinkedIn page name finds nothing. Use the company link.
- The maximum charge limit may have stopped the run. Check `spend_limit_reached` in the run summary.

#### Which LinkedIn data scraper should I use for people, jobs or keyword searches?

Use this Actor for the posts of company pages. For other data, use the sibling Actors listed in the Other LinkedIn scrapers section above: employees, profiles, jobs, or posts found by keyword.

#### Can I use it for LinkedIn content analysis with AI?

Yes. The full post text, hashtags and links come as clean JSON, so you can send them to a language model, a spreadsheet or a BI tool. You can use it as a LinkedIn company posts extractor for LinkedIn content analysis and LinkedIn market research.

***

### 📧 Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/linkedin-company-posts-scraper-no-cookies/issues/open) and include the input you used.

Need a **custom solution** or more data? Contact us at hello.insights.data@gmail.com.

Built and maintained by [insights_data](https://apify.com/insights_data).

# Actor input Schema

## `urls` (type: `array`):

One per line. A company page link (linkedin.com/company/stripe) or just its name (stripe) returns the company's latest posts. A post link (linkedin.com/posts/... or linkedin.com/feed/update/urn:li:activity:...) or a post ID returns that single post. You can mix both.

## `maxPosts` (type: `integer`):

Stop after this many posts for each company, newest first. Use 0 for every post that can be found. Does not apply to post links you paste yourself.

## `postedLimit` (type: `string`):

Only keep posts published within this time window. Ignored when an exact date is set below.

## `postedLimitDate` (type: `string`):

Only keep posts published on or after this date (YYYY-MM-DD). Takes priority over the time window above.

## `scrapeComments` (type: `boolean`):

Save the public comments shown under each post: text, commenter, likes and time. Included at no extra charge.

## `maxComments` (type: `integer`):

Cap on saved comments for each post. Use 0 to save every comment that is shown. Only used when comments are switched on.

## `contextCountry` (type: `string`):

Optional country. It changes the language of relative dates such as 'x days ago'. Leave on Default for the standard behavior.

## `proxyConfiguration` (type: `object`):

By default no proxy is used. If LinkedIn refuses the request, the Actor switches to a stronger proxy automatically and keeps using it.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/company/stripe"
  ],
  "maxPosts": 10,
  "postedLimit": "any",
  "scrapeComments": true,
  "maxComments": 5,
  "contextCountry": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per post with author, date, engagement, media, links and comments.

## `authors` (type: `string`):

One row per post with the company that published it.

## `comments` (type: `string`):

One row per public comment.

## `links` (type: `string`):

One row per link, hashtag or mention.

## `media` (type: `string`):

One row per image, video or article card.

## `summary` (type: `string`):

Counts and timing of the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.linkedin.com/company/stripe"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/linkedin-company-posts-scraper-no-cookies").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.linkedin.com/company/stripe"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/linkedin-company-posts-scraper-no-cookies").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.linkedin.com/company/stripe"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/linkedin-company-posts-scraper-no-cookies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/linkedin-company-posts-scraper-no-cookies"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Hio1dafN3JeLCFURo/builds/Np65o2hCqncoKAKQo/openapi.json
