# LinkedIn Company Posts Scraper — No Login (`glasswing/linkedin-company-posts-scraper`) Actor

Get the latest posts of LinkedIn companies (up to 70 each) from company URLs, page names or names: full text, exact date, post URL, images, video, documents, hashtags, reaction and comment counts. No login or cookies. Company-authored posts only, org reposts flagged. $1.50/1k posts.

- **URL**: https://apify.com/glasswing/linkedin-company-posts-scraper.md
- **Developed by:** [Raffy](https://apify.com/glasswing) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 does LinkedIn Company Posts Scraper do?

LinkedIn Company Posts Scraper returns the **latest posts that LinkedIn companies publish**, one row per post: full text, exact publish date and time, post URL and id, images, video, documents, articles, links, hashtags, company mentions, and **reaction and comment counts**. Give it company URLs, the name from the page address (`stripe`), numeric company ids or company names, and get up to **70 posts per company**, newest first, as JSON, CSV or Excel.

It reads only what LinkedIn shows to visitors who are **not logged in**: no LinkedIn account, no cookies, no login, no browser. Only posts written by the company itself are returned, plus (optionally) its reposts of other organisations, which are flagged. Posts by members and reposts of members' posts are left out.

### Use cases for this LinkedIn company posts scraper

- **Competitor monitoring:** see what your competitors announce, launch and promote every week, with exact dates.
- **Sales and buying signals:** spot hiring pushes, funding news, new offices and product launches in your target accounts' posts.
- **Content research:** find which post formats (video, document carousel, image, article) get the most reactions and comments for a brand.
- **Brand and PR tracking:** keep an archive of a company's public announcements.
- **AI agents and LLM pipelines:** feed a company's recent posts to a model for summaries, topic tagging or sentiment.

### Use with AI agents

- Actor: `glasswing/linkedin-company-posts-scraper`
- README for LLMs: `https://apify.com/glasswing/linkedin-company-posts-scraper.md`
- MCP: `https://mcp.apify.com/?tools=glasswing/linkedin-company-posts-scraper`
- Minimal input: `{"startUrls": ["stripe"], "maxPostsPerCompany": 10}` returns Stripe's 10 latest posts in a few seconds.

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

| Field | Type | Description |
|---|---|---|
| `companyName` | string | Company name as shown on LinkedIn |
| `companySlug` | string | The company name in the page address |
| `companyId` | string | LinkedIn's numeric company id |
| `companyUrl` | string | The company's public LinkedIn page |
| `companyFollowers` | integer | Follower count of the company page |
| `inputName` | string | The company name you typed, when you used `companyNames` |
| `url` | string | Public URL of the post |
| `postId` | string | LinkedIn activity id of the post |
| `shareUrn` | string | LinkedIn share or ugcPost URN |
| `postType` | string | `post` (the company's own post), `quote` (the company shared a post, its own or another organisation's, with new text) or `repost` (plain repost of another organisation's post) |
| `isRepost` | boolean | `true` for plain reposts (`postType` `repost`) |
| `originalAuthorName` | string | For reposts and quotes of another organisation: the organisation that wrote the original post |
| `originalAuthorUrl` | string | For quotes and reposts: that organisation's LinkedIn page |
| `postedAt` | string | Exact publish date and time (ISO 8601, UTC), decoded from the post id |
| `postedAgo` | string | LinkedIn's relative age text, e.g. `3d` |
| `text` | string | Full post text (see the privacy notes below) |
| `originalText` | string | For quotes: the text of the post that was shared |
| `hashtags` | array | Hashtags in the post |
| `companyMentions` | array | Page names of companies the post mentions |
| `links` | array | Outbound web links, with LinkedIn's redirect and tracking removed |
| `mediaType` | string | `text`, `image`, `video`, `document` or `article` |
| `imageUrls` | array | Image URLs of the post |
| `videoUrl` | string | MP4 URL of the post's video |
| `videoThumbnailUrl` | string | Poster image of the video |
| `documentTitle` | string | Title of a PDF / carousel document |
| `documentPageCount` | integer | Page count of the document |
| `articleUrl` | string | Linked article or LinkedIn newsletter URL |
| `articleTitle` | string | Title of the linked article |
| `reactions` | integer | Number of reactions (likes and other reactions) |
| `comments` | integer | Number of comments |
| `status` | string | `ok`, `not_found` (company not found or shows no posts) or `error` |
| `error` | string | Reason for a `not_found` or `error` row |
| `scrapedAt` | string | When the row was collected |

### How to scrape LinkedIn company posts

1. Open the Actor and paste company URLs or page names into **Companies**, or type names into **Company names to look up**.
2. Set **Posts per company** (1-70) and, if you want a date window, **Posted after** / **Posted before**.
3. Click **Start**. Posts appear in the dataset within seconds; download them as JSON, CSV, Excel or HTML, or read them through the API.

### Input

| Field | What it does |
|---|---|
| `startUrls` (Companies) | Company URLs from any LinkedIn country site (`https://www.linkedin.com/company/stripe/`, also `/posts/` and `/about/` sub-pages), showcase pages (`https://www.linkedin.com/showcase/microsoft-azure/`), page names (`stripe`) or numeric ids (`2135371`). |
| `companyNames` | Company names (`Revolut`). Matched with LinkedIn's public company search: an exact name first, otherwise LinkedIn's top suggestion. |
| `maxPostsPerCompany` | Latest posts per company, newest first. Default 20, maximum 70 (LinkedIn's limit for logged-out visitors). |
| `postedAfter` | Only posts on or after this date: `2026-10-01`, or `7 days`, `2 weeks`, `3 months`. Paging stops at the first older post, so short windows are fast. |
| `postedBefore` | Only posts on or before this date (the whole day is included), or a relative age like `30 days`. |
| `includeOrgReposts` | Keep the company's reposts and quotes of other organisations' posts (default `true`). |
| `maxItems` | Stop after this many rows in total. |
| `proxyConfiguration` | Apify Proxy datacenter IPs by default, included in the price. The proxy group and country are pinned in code: a residential group or a country picked in the input is ignored; your own proxy URLs are used as given. |

Example input:

```json
{
    "startUrls": ["https://www.linkedin.com/company/apify/", "stripe", "2135371"],
    "companyNames": ["Revolut"],
    "maxPostsPerCompany": 70,
    "postedAfter": "30 days",
    "includeOrgReposts": true,
    "maxItems": 1000
}
```

### Output

A real row from a run on 2026-10-26:

```json
{
    "status": "ok",
    "companyName": "Apify",
    "companySlug": "apify",
    "companyId": "10608457",
    "companyUrl": "https://www.linkedin.com/company/apify/",
    "companyFollowers": 44630,
    "url": "https://www.linkedin.com/posts/apify_apify-is-hosting-a-one-day-hackathon-in-bengaluru-activity-7520049252677599232-8-Vw",
    "postId": "7520049252677599232",
    "shareUrn": "urn:li:share:7520049251821936640",
    "postType": "post",
    "isRepost": false,
    "postedAt": "2026-10-25T09:10:57.597Z",
    "postedAgo": "1d",
    "text": "Apify is hosting a one-day hackathon in Bengaluru on November 22. The challenge: build a tool someone would pay for.\n\nThirteen of the top Apify creators from India and Nepal will be in the room as mentors and judges - several of them make a living from projects that started exactly like yours.\n\nCash prize pool of $1,500. Free to attend. Spots are limited.\nRegistration link in comments ↓",
    "mediaType": "image",
    "imageUrls": ["https://media.licdn.com/dms/image/v2/D4D10AQEpSpN15mE0yw/image-shrink_1280/B4DaFyU2oaJ4Ac-/0/1792919431903?e=2147483647&v=beta&t=OuSMngiupJfvWb53KSdG_WqdWwPUAjHF1WJVTSmc62Q"],
    "reactions": 10,
    "comments": 1,
    "scrapedAt": "2026-10-26T15:43:37.302Z"
}
```

A repost of another organisation's post has `"postType": "repost"`, `"isRepost": true` and `originalAuthorName` / `originalAuthorUrl` set. A company that does not exist, or shows no posts to logged-out visitors, gets one free row:

```json
{
    "url": "https://www.linkedin.com/company/this-company-does-not-exist-xq7z/",
    "status": "not_found",
    "error": "HTTP 404: page does not exist"
}
```

The dataset has three views: **Overview**, **Media** and **Reposts**.

### Speed and reliability (real runs)

- 30 companies at 70 posts each: **1,383 posts in 86 seconds**, 27 of the 29 existing companies returned posts (2026-10-26).
- Default input (2 companies, 10 posts each): 5-32 seconds.
- Each company costs 1 request for 10 posts and up to 7 requests for 70 posts. Requests go through Apify's datacenter proxy and are retried from another IP if LinkedIn slows one down.

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

Pay per result: **$1.50 per 1,000 posts** (Apify Free plan $1.73, Silver $1.28, Gold and above $1.05), plus a $0.00005 start fee per run. `not_found` and `error` rows are free. 70 posts from one company cost about $0.11; the latest 10 posts of 100 companies cost $1.50. Platform usage is included in the price.

### Limitations

- **70 posts per company at most.** That is all LinkedIn shows to logged-out visitors: about 3 weeks for a company that posts daily, several months for one that posts weekly.
- **No repost/share counts.** LinkedIn's public pages show reaction and comment counts only.
- **No commenters, no reactors, no follower lists.** Only the counts.
- **Posts by members are not returned**, including members' posts that the company reposted. A few company pages show no posts at all to logged-out visitors; they get a free `not_found` row.
- **Name lookups can miss.** When a typed name has no exact match on LinkedIn, the Actor uses LinkedIn's top suggestion and may not find its page. Paste the company URL for a sure match.
- Text is returned as LinkedIn shows it. Linked member mentions are replaced with `[member]`, and e-mail addresses and phone numbers with `[email]` / `[phone]`.

### FAQ

**Do I need a LinkedIn account or cookies?** No. The Actor reads public company pages as a logged-out visitor and sends no cookies.

**How do I get only new posts?** Set `postedAfter` to `1 day` or `7 days` and schedule the Actor. Paging stops at the first older post, so a daily run reads about one page per company.

**Can I get only the company's own posts?** Set `includeOrgReposts` to `false`: reposts and quotes of other organisations are then left out, and quotes of the company's own earlier posts stay.

**Why did a company return fewer posts than I asked for?** It published fewer posts in LinkedIn's public window, or many of its feed items were posts by members (left out by design).

**Can I use the data in my app, spreadsheet or AI tool?** Yes. Use the API, webhooks or the Zapier, Make and n8n integrations, or call it from an AI agent through Apify's MCP server.

### Related Actors

- [LinkedIn Company Scraper](https://apify.com/glasswing/linkedin-company-scraper) - use it for company facts: website, industry, size, headquarters, followers and open jobs.
- [LinkedIn Ad Library Scraper](https://apify.com/glasswing/linkedin-ad-library-scraper) - use it to see which ads a company runs on LinkedIn next to its organic posts.
- [LinkedIn Jobs Scraper](https://apify.com/glasswing/linkedin-jobs-scraper) - use it to see what the companies you track are hiring for.
- [Companies House Scraper](https://apify.com/glasswing/companies-house-scraper) - use it for UK register data on the same companies.

If this Actor saved you time, a rating or a save helps others find it. Found a problem? Open an Issue, we reply within 24 h.

### Legal and data-protection notice

This Actor extracts posts that companies publish on their public LinkedIn pages, as LinkedIn shows them to visitors who are not logged in. It does not log in, send cookies or work around access controls. It leaves out posts written by members, masks linked member mentions, redacts e-mail addresses and phone numbers, and returns engagement as counts only, never the people who reacted or commented. Post text written by a company can still name people, so your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not process personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with LinkedIn's terms and with applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by LinkedIn or any company whose posts you collect. All trademarks belong to their respective owners.

# Changelog

This Actor's version history is a separate document: https://apify.com/glasswing/linkedin-company-posts-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

One company per line: a LinkedIn company URL from any country site (https://www.linkedin.com/company/stripe/, sub-pages like /posts/ or /about/ work too), a showcase page (https://www.linkedin.com/showcase/microsoft-azure/), just the name from the page address (`stripe`, `tata-consultancy-services`), or a numeric LinkedIn company id (`2135371`). Any other text is looked up as a company name. The example is skipped automatically when you fill in company names below.

## `companyNames` (type: `array`):

Company names as you would type them into LinkedIn (`Tata Consultancy Services`, `Revolut`). Each name is matched with LinkedIn's public company search: an exact name match first, otherwise LinkedIn's top suggestion. Every post row's `inputName` shows what you typed, so you can check the match.

## `maxPostsPerCompany` (type: `integer`):

How many of each company's latest posts to return, newest first. LinkedIn shows logged-out visitors at most 70 posts per company (about 3 weeks of history for a company that posts daily, several months for one that posts weekly). 10 reads the company page only (one request per company).

## `postedAfter` (type: `string`):

Only posts published on or after this date: `2026-10-01`, or a relative age such as `7 days`, `2 weeks`, `3 months`. Paging stops at the first older post, so a short window is fast and cheap. Leave empty for no lower limit.

## `postedBefore` (type: `string`):

Only posts published on or before this date (`2026-10-20` includes that whole day), or a relative age such as `30 days`. Leave empty for no upper limit.

## `includeOrgReposts` (type: `boolean`):

Keep the company's reposts and quotes of posts by other organisations (flagged with `postType`, `isRepost` and `originalAuthorName`). Turn off for the company's own posts only. Reposts of members' posts are never returned.

## `maxItems` (type: `integer`):

Stop after this many rows in total (all companies together). Each post row with status `ok` is one billable result; `not_found` and `error` rows are free.

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

Apify Proxy's datacenter group is on by default and included in the price: LinkedIn slows down one IP after about 60 pages a minute, and the Actor spreads requests over datacenter IPs. The proxy group and country are pinned in code (a residential group or a country chosen here is ignored); your own proxy URLs are used as given.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.linkedin.com/company/hubspot/",
    "https://www.linkedin.com/company/stripe/"
  ],
  "maxPostsPerCompany": 10,
  "includeOrgReposts": true,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrls": [
        "https://www.linkedin.com/company/hubspot/",
        "https://www.linkedin.com/company/stripe/"
    ],
    "maxPostsPerCompany": 10,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("glasswing/linkedin-company-posts-scraper").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 = {
    "startUrls": [
        "https://www.linkedin.com/company/hubspot/",
        "https://www.linkedin.com/company/stripe/",
    ],
    "maxPostsPerCompany": 10,
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("glasswing/linkedin-company-posts-scraper").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 '{
  "startUrls": [
    "https://www.linkedin.com/company/hubspot/",
    "https://www.linkedin.com/company/stripe/"
  ],
  "maxPostsPerCompany": 10,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call glasswing/linkedin-company-posts-scraper --silent --output-dataset

```

## MCP server setup

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

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/4zX7Tl3zT53UbsNg7/builds/Ii9pP6JWkU2hI6mnA/openapi.json
