# LinkedIn Posts Scraper - Profiles & Companies (No Login) (`automly/linkedin-posts-scraper`) Actor

Scrape LinkedIn posts from any profile or company page, or by post link: text, date, likes, comments count, first comments, images, videos. No login.

- **URL**: https://apify.com/automly/linkedin-posts-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 posts

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## LinkedIn Posts Scraper - Profiles & Companies (No Login)

### What is LinkedIn Posts Scraper?

**LinkedIn Posts Scraper** is a tool that lets you **scrape the posts of any LinkedIn profile or company page**: the post text, date, likes, number of comments, the first comments, images, videos and who wrote it. Paste a profile, company or post link, click **Start**, and download the posts as Excel, CSV or JSON.

- ⚡ **Speed:** 20 posts from a profile and a company in about 20 seconds, 223 posts from 10 profiles and companies in under 2 minutes (our tests)
- 🗓️ **Newest first, with a date filter:** past 24 hours, week, month, year or any date you pick
- 💬 **Comments included:** the first comments of every post at no extra charge
- 🔓 **No login:** no LinkedIn account or cookies needed, so no account can get restricted

### What can LinkedIn Posts Scraper do?

- **Scrape a person's LinkedIn posts** from their profile link, newest first
- **Scrape a company's LinkedIn posts** from its company page link
- **Scrape a single LinkedIn post** from its link: text, likes, comments, images and video
- **Get only recent posts** with the date filter: the past week, the past month, or everything since a date
- **Include reposts** to see what a person shares from others, flagged as reposts
- **Track many profiles and companies in one run**, each with its own limit
- Export to Excel, CSV, JSON, HTML or XML, or send the posts to Google Sheets, Make, Zapier and more

### What data can you extract from LinkedIn posts?

| | | |
|---|---|---|
| 📝 Post text | 📅 Date posted | 🔗 Post link |
| 👍 Likes (reactions) | 💬 Number of comments | 🗨️ First comments (text, date, author, likes) |
| 🖼️ Images | 🎬 Video link, thumbnail and length | 🔁 Shared post (for quote posts) |
| 👤 Author name and link | 🏢 Person or company | 👥 Author's followers |
| 🆔 Post ID | 🏷️ Post, video or article | ♻️ Repost flag |

### How to scrape LinkedIn posts

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **LinkedIn Posts Scraper**.
3. Paste LinkedIn profile, company or post links, one per line.
4. Set how many posts you want per profile or company, and a date filter if you need one.
5. Click **Start**, then download the posts as Excel, CSV, JSON or HTML.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Profiles, companies or posts** | LinkedIn links, one per line: `https://www.linkedin.com/in/satyanadella/`, `https://www.linkedin.com/company/google/` or a post link |
| **Maximum posts per profile or company** | How many posts to save for each profile or company, newest first (default 10). Set 0 for every post that can be found |
| **Posted within** | Only posts from the past hour, 24 hours, week, month, 3 months, 6 months or year |
| **Posted on or after** | Only posts published on or after a date, e.g. `2026-09-01` |
| **Include reposts** | Also save what a person reposted from others (off by default) |
| **Include comments** | Add the first comments shown on each post (on by default, no extra charge) |

The latest 10 posts of a person and a company:

```json
{
  "targetUrls": [
    "https://www.linkedin.com/in/satyanadella/",
    "https://www.linkedin.com/company/google/"
  ],
  "maxPosts": 10
}
```

A company's posts from the past month, without comments:

```json
{
  "targetUrls": ["https://www.linkedin.com/company/ibm/"],
  "maxPosts": 0,
  "postedLimit": "month",
  "includeComments": false
}
```

Single posts:

```json
{
  "targetUrls": [
    "https://www.linkedin.com/posts/rbranson_since-the-year-2000-the-uns-drug-policy-activity-7504213608235438080-PvRU",
    "https://www.linkedin.com/feed/update/urn:li:activity:7508551662240886784/"
  ]
}
```

### ⬆️ Output

Every post is one row (comments and image links shortened):

```json
{
  "url": "https://www.linkedin.com/posts/google_the-best-way-to-understand-a-clients-business-activity-7509276800687140865-X5MF",
  "id": "7509276800687140865",
  "type": "post",
  "text": "The best way to understand a client’s business? Think like their customer. As a Field Sales Representative on our Google Cloud team, Cori has found some unexpected ways to do just that. ...",
  "postedAt": "2026-09-25T15:45:04.899Z",
  "author": {
    "name": "Google",
    "url": "https://www.linkedin.com/company/google/",
    "type": "company",
    "followers": 42412926,
    "image": "https://media.licdn.com/dms/image/v2/D4E0BAQGv3cqOuUMY7g/company-logo_100_100/..."
  },
  "likes": 382,
  "commentsCount": 48,
  "comments": [
    {
      "text": "Love this perspective. The best sales conversations usually start with genuine curiosity about the customer’s business, not the pitch",
      "postedAt": "2026-09-27T07:29:00.517Z",
      "authorName": "(the commenter's name)",
      "likes": 0
    }
  ],
  "video": null,
  "images": [
    "https://media.licdn.com/dms/image/v2/D5610AQHhd07mCK1mAw/image-shrink_1280/...",
    "https://media.licdn.com/dms/image/v2/D5610AQHSVpKgvrtgvQ/image-shrink_1280/..."
  ],
  "sharedPost": null,
  "isRepost": false,
  "sourceUrl": "https://www.linkedin.com/company/google/"
}
```

Video posts also have `"video": {"url": "...", "thumbnail": "...", "duration": "PT3M21S"}`. A post that shares another post with a comment has `"sharedPost": {"text": "...", "url": "...", "authorName": "...", "authorUrl": "..."}`.

The **Posts** tab shows the posts as a table, the **Authors** tab who wrote them and their followers. The run report lists any input or post that could not be read, and why.

### How can I use LinkedIn posts data?

- **Social listening:** follow what industry leaders and competitors post and how their audience reacts
- **Competitor analysis:** compare how often companies post, which topics get likes and comments, and which formats (video, images) work
- **Content research:** find the best-performing posts of top creators in your niche to learn what resonates
- **Lead generation and sales signals:** see what prospects and target accounts are talking about before you reach out
- **Brand monitoring and PR:** keep an archive of a company's announcements with dates and engagement
- **AI and research datasets:** collect post texts and comments for sentiment analysis and trend studies

### How many posts can I get?

For every profile and company you get its **latest posts** (the newest 10 or so) plus **older posts found on the public web**. For active creators and large brands that is often dozens to a few hundred posts going back years; for people who rarely post, it may be only a few. The newest posts found are picked first (sort by the `postedAt` column for a strict date order), but some older posts can be missing, especially from the last few weeks before the newest 10, so this scraper is best for "recent posts" and "a sample of the archive" rather than a complete history. Long-form LinkedIn articles (linkedin.com/pulse/) are not included.

Set **Maximum posts** to 0 to get every post that can be found. Posts that were deleted or are shown only to logged-in members are skipped and listed in the run report.

### Use it from your own code

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("automly/linkedin-posts-scraper").call(run_input={
    "targetUrls": ["https://www.linkedin.com/company/google/"],
    "maxPosts": 20,
    "postedLimit": "month",
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["postedAt"], post["likes"], post["commentsCount"], post["url"])
```

You can also run it on a schedule, for example every morning for your competitors' pages with **Posted within** set to the past 24 hours, and send new posts to Google Sheets, Slack or your CRM.

### ❓FAQ

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

You pay only for the posts you get; comments come with each post at no extra charge. See the **Pricing** tab for the current price. Every Apify account gets $5 of free usage each month, so you can try it at no cost.

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

No. The scraper uses only what LinkedIn shows to visitors who are not logged in, so it never touches your LinkedIn account and nothing can get restricted.

#### Why did I get fewer posts than I asked for?

The profile or company may have posted fewer public posts than that, some older posts may not be found on the web, or some posts were deleted or shown to logged-in members only. With a date filter, only posts from that period count. The run report lists the posts that could not be read.

#### Can I get all the comments or the list of people who reacted?

You get the number of comments and reactions for every post, plus the first comments LinkedIn shows (up to 10) with their text, date, author and likes. LinkedIn shows the full comment list and the people who reacted only to logged-in members.

#### What are reposts?

A repost is a post someone else wrote that the person shared on their profile. With **Include reposts** on, these posts are saved too, with `isRepost: true` and the original author in `author`. Reposts appear only among a person's latest activity.

#### Can it scrape private profiles or posts?

No. It only reads what is public. If a person shows their profile only to logged-in members, their public posts can still be found and saved; the profile page itself is skipped.

#### Is it legal to scrape LinkedIn posts?

This scraper collects only public data that LinkedIn shows to anyone without logging in. Posts and comments can still contain personal data, which is protected by laws such as the GDPR in Europe and the CCPA in California, and messages you send to the people you find are covered by rules such as CAN-SPAM. You are responsible for having a legitimate reason to collect and use the data and for using it lawfully. If you are unsure, check with a lawyer. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

This scraper is not affiliated with, endorsed by or connected to LinkedIn or Microsoft.

#### What happens if a link fails?

The other links carry on and their posts are saved as they come. The run report lists every link and post that could not be read and why: not a LinkedIn link, not public, deleted, or not reachable.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the input you used.

### Scrape more LinkedIn data

| Scraper | What it gets |
|---|---|
| LinkedIn Profile Scraper + Email Finder | Profiles from links or names, with work emails |
| LinkedIn People Search Scraper | People by job title, company, location or name |
| LinkedIn Company Employees Scraper + Emails | People who work at a company |
| LinkedIn Post Search Scraper | Posts about any topic |

# Actor input Schema

## `targetUrls` (type: `array`):

LinkedIn links, one per line: a profile (https://www.linkedin.com/in/satyanadella/), a company page (https://www.linkedin.com/company/google/) or a single post (https://www.linkedin.com/posts/... or https://www.linkedin.com/feed/update/urn:li:activity:...).

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

How many posts to save for each profile or company, newest first. Set 0 for every post that can be found.

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

Only posts published in this period.

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

Only posts published on or after this date, e.g. 2026-09-01 (UTC if no time zone), or a timestamp in milliseconds. With 'Posted within' too, the later of the two applies.

## `includeReposts` (type: `boolean`):

Also save the posts a person reposted from others among their recent activity. These rows have isRepost: true and count toward the maximum.

## `includeComments` (type: `boolean`):

Add the first comments shown on each post (up to 10) with their text, date, author name and likes. No extra charge.

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

Proxy settings. The default works for most runs.

## Actor input object example

```json
{
  "targetUrls": [
    "https://www.linkedin.com/in/satyanadella/",
    "https://www.linkedin.com/company/google/"
  ],
  "maxPosts": 10,
  "postedLimit": "any",
  "includeReposts": false,
  "includeComments": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

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

No description

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

No description

## `report` (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 = {
    "targetUrls": [
        "https://www.linkedin.com/in/satyanadella/",
        "https://www.linkedin.com/company/google/"
    ],
    "maxPosts": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/linkedin-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 = {
    "targetUrls": [
        "https://www.linkedin.com/in/satyanadella/",
        "https://www.linkedin.com/company/google/",
    ],
    "maxPosts": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/linkedin-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 '{
  "targetUrls": [
    "https://www.linkedin.com/in/satyanadella/",
    "https://www.linkedin.com/company/google/"
  ],
  "maxPosts": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/linkedin-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/linkedin-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/Qip6hL4aRqhX4vA6M/builds/5LBsuF9GrYNIey5Nb/openapi.json
