# LinkedIn Profile & Company Posts Scraper (`socialdataapi/linkedin-profile-and-company-posts-scraper`) Actor

LinkedIn Profile & Company Posts Scraper — Extract posts from LinkedIn profiles and company pages, including post text, authors, timestamps, likes, comments, shares, media, hashtags, and post URLs. Useful for content research, lead generation, competitor analysis, and social media insights.

- **URL**: https://apify.com/socialdataapi/linkedin-profile-and-company-posts-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.

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 Profile & Company Posts Scraper — Text, Likes and Comments

LinkedIn Profile & Company Posts Scraper extracts public posts from LinkedIn company, school, showcase and personal profile pages, or a single post by its URL. Each post comes with its full text, publish date, media links, like and comment counts, mentions, public comments and the author's name, headline and photo. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a social listening pipeline. **No LinkedIn account or cookies needed.** Start with one company page, then add your competitors.

***

### What data can I extract with LinkedIn Profile & Company Posts Scraper?

Using this LinkedIn Post API, you will be able to extract the following LinkedIn post data:

| 📝 Post text | 🔗 Post link | 📅 Publish date and time | ⏳ Time since posted |
|---|---|---|---|
| 👍 Like count | 💬 Comment count | 🗨️ Public comments (full detail) | 🏷️ Mentioned people and companies |
| 🖼️ Images and video posters | 🎞️ Media type (text, image, video, article, document, poll) | 🔁 Repost flag | 🌱 Original post flag |
| 👤 Author name | 💼 Author headline or description | 🆔 Author LinkedIn ID | 📷 Author photo and cover image |
| 🏢 Author type (person or company) | 🌐 Scraped page URL | 🔖 Post URN | 📌 Pinned comment flag |

***

### How to use LinkedIn Profile & Company Posts Scraper

Marketing, sales and research teams use it as a LinkedIn profile posts scraper and a reader of LinkedIn company page posts, and get one clean JSON item per post from a single run.

**Copy to your AI assistant:**

```text
LinkedIn Profile & Company Posts Scraper is an Apify Actor that returns public posts from LinkedIn company, school, showcase and personal profile pages, or single posts by URL, as structured JSON: post text, post link, publish date, media type and images, like count, comment count, mentioned people and companies, public comments, and the author's name, headline, ID and photo. Use it whenever someone needs LinkedIn posts without cookies, a login, or a browser - tracking competitor company pages, following what industry voices post, collecting post text for content research. Inputs: urls (array of LinkedIn company, school, showcase, profile or post URLs, required), limit (integer, maximum posts for each URL; a single post URL returns one post; default 20, 1-2000), deepScrape (boolean, full post detail with comments and exact counts, default true), scrapeUntil (string YYYY-MM-DD, only posts on or after this date; not applied to single post URLs), proxyConfiguration (object, your own proxy URLs are used from the start; Apify Proxy is the automatic fallback when blocked). Every item is one post; there are no summary or error rows, and only saved posts are billed (one row_result event each). LinkedIn does not show the list of people who reacted, the share count or permission flags to logged-out visitors, so those fields are always empty or null; comments are the ones the public post page shows, and the comments-truncated flag tells when more exist.
```

#### LinkedIn Profile & Company Posts Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at the Apify MCP server and it can find, add and call this Actor on its own through the server's search, add and call tools. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open this Actor in the Apify Store.
3. Paste the LinkedIn company, school, showcase, profile or post URLs, one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale LinkedIn Profile & Company Posts Scraper to bulk

Put every URL you follow in the URL list of one run, including LinkedIn school and showcase posts pages next to company pages and profiles. The post limit you set applies to each URL, so 3 pages with a limit of 100 can return up to 300 posts; a page with fewer public posts simply returns what it has. To track competitor LinkedIn posts every week, save the input as a task and run it on an Apify schedule, adding a date filter so each run only returns new posts. You can also start runs from your own code through the Apify API and collect the dataset when the run finishes.

***

### ✨ Features

LinkedIn Profile & Company Posts Scraper fetches clean, structured posts from LinkedIn ⚡. It's ideal for watching competitor company pages, running a LinkedIn influencer posts scraper over the voices you follow, the moment you need to scrape LinkedIn company updates for a newsletter, and building post datasets for AI agents.

It extracts, per post:

- **Post text** – the full text with its line breaks
- **Publish date** – exact date and time, plus LinkedIn's relative age
- **Like and comment counts** – the numbers shown on the post
- **Comments** – the public comments with commenter name, text, time and mentions, so it doubles as a LinkedIn post comments scraper
- **Mentions** – people and companies tagged in the post text
- **Media** – media type and every image or video poster link
- **Author** – name, headline or description, LinkedIn ID, photo and cover image

⚡ Every post is checked on its own public page before it is saved, so you only get real posts by the page you asked for.

***

### Use cases 💡

- **Marketing manager** — track competitor LinkedIn posts and compare likes and comment counts weekly.
- **Sales rep** — read a prospect company's recent posts before an outreach call.
- **Recruiter** — follow school and showcase pages for employer-brand and hiring posts.
- **Analyst** — collect a year of company updates with the date filter for trend reports.
- **AI engineer** — feed post text and comments into a RAG index for a market-research agent.

Building an AI agent? [Connect LinkedIn Profile & Company Posts Scraper over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

- **Company and personal pages in one run.** A recorded run took one company page and one personal profile and saved 10 posts with full detail, 5 from each page, in 41 seconds.
- **The full conversation behind each post.** A recorded company post came back with 7,284 likes, 299 comments and 10 public comments with each commenter's name and text.
- **34 fields, 5 kinds of LinkedIn URL.** Company, school, showcase, profile and single post URLs all work in the same list, with a per-URL post limit, a date filter and a light mode for quicker runs.

***

### ⬇️ Input

The actor accepts a list of LinkedIn URLs; the URL list is the only required field. Accepted formats:

- Company pages: `https://www.linkedin.com/company/google/`
- School pages: links that contain `linkedin.com/school/`
- Showcase pages: links that contain `linkedin.com/showcase/`
- Personal profiles: `https://www.linkedin.com/in/ajjames`
- Single posts: `https://www.linkedin.com/posts/...` or `https://www.linkedin.com/feed/update/urn:li:activity:...`

| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
| `urls` | Yes | array | LinkedIn company, school, showcase, profile or post URLs, one per line. An unsupported URL stops the run with a message naming it. | `["https://www.linkedin.com/company/google/"]` |
| `limit` | No | integer | Maximum posts for each URL; a single post URL returns one post. Default 20, allowed 1–2000. | `10` |
| `deepScrape` | No | boolean | Read each post's own page for full text, exact counts and public comments, and add details for commenters and mentioned people. Default `true`. | `true` |
| `scrapeUntil` | No | string | Only posts published on or after this date (YYYY-MM-DD). Not applied to single post URLs. No default. | `"2026-09-01"` |
| `proxyConfiguration` | No | object | Your own proxy URLs are used from the start; otherwise the run starts direct and switches to Apify Proxy when blocked. | `{"useApifyProxy": true}` |

#### Example input

```json
{
  "urls": [
    "https://www.linkedin.com/company/google/",
    "https://www.linkedin.com/in/ajjames"
  ],
  "limit": 10,
  "deepScrape": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

***

### ⬆️ Output

Every post is one typed, normalized JSON item with the same schema on every run; a count LinkedIn does not show comes back as null. Export it as JSON (default), CSV or Excel. The example below is a real item from the recorded run, with its comment and mention lists shortened.

#### Example output

```json
{
  "urn": "urn:li:activity:7423612752902111232",
  "text": "Three people I think are worth following right now... Who are your 3?\n1. Tariq H.\n2. Calvin McDonald\n3. Allie K. Miller",
  "url": "https://www.linkedin.com/posts/ajjames_three-people-i-think-are-worth-following-activity-7423612752902111232-YQFC",
  "postedAtTimestamp": 1769927204320,
  "postedAtISO": "2026-02-01T06:26:44.320000Z",
  "timeSincePosted": "8mo",
  "isRepost": false,
  "authorType": "Person",
  "authorProfileUrl": "https://www.linkedin.com/in/ajjames",
  "authorProfileId": "4444590",
  "authorHeadline": null,
  "authorFullName": "Anthony J James",
  "image": "https://media.licdn.com/dms/image/v2/D4D22AQHV40QtRE_dsQ/feedshare-shrink_1280/B4DZwX4dbpJYAc-/0/1769927202872?e=2147483647&v=beta&t=pDpaj6F9kKTEWYhxreUsbAABoeE56cZQ_ofeixGoWs4",
  "type": "image",
  "images": [
    "https://media.licdn.com/dms/image/v2/D4D22AQHV40QtRE_dsQ/feedshare-shrink_1280/B4DZwX4dbpJYAc-/0/1769927202872?e=2147483647&v=beta&t=pDpaj6F9kKTEWYhxreUsbAABoeE56cZQ_ofeixGoWs4"
  ],
  "author": {
    "firstName": "Anthony",
    "lastName": "J James",
    "occupation": null,
    "id": "4444590",
    "publicId": "ajjames",
    "trackingId": null,
    "profileId": "4444590",
    "picture": "https://media.licdn.com/dms/image/v2/D4D03AQHDupY3VfUK1w/profile-displayphoto-scale_200_200/B4DZt9ct3mG8AY-/0/1767336239298?e=2147483647&v=beta&t=b1CBdITFeUxMLsSieq18kcU6dnf2yvUSrhGKqGryuDM",
    "backgroundImage": "https://media.licdn.com/dms/image/v2/D4D16AQF34_sPS3-NGA/profile-displaybackgroundimage-shrink_200_800/B4DZt9Z1wxI4AY-/0/1767335485349?e=2147483647&v=beta&t=lrOXK9eb1SLJEcxDgEDF7d3-Sj4Cau08mj1TiJr8rVM"
  },
  "authorName": "Anthony J James",
  "authorTitle": null,
  "attributes": [
    {
      "start": 73,
      "length": 8,
      "type": "PROFILE_MENTION",
      "profile": {
        "firstName": "Tariq",
        "lastName": "H.",
        "occupation": null,
        "id": null,
        "publicId": "tariqhassan1",
        "trackingId": null,
        "profileId": null,
        "picture": null,
        "backgroundImage": null
      }
    }
  ],
  "comments": [
    {
      "time": 1769959079853,
      "link": "https://www.linkedin.com/feed/update/urn:li:share:7423612751710666752?commentUrn=urn%3Ali%3Acomment%3A%28urn%3Ali%3Aactivity%3A7423612752902111232%2C7423746448464269312%29",
      "text": "Here are my three people that everyone should follow: Cory Warfield Madeline Mann Maria Malik",
      "entities": [
        {
          "start": 54,
          "length": 13,
          "type": "PROFILE_MENTION",
          "profile": {
            "firstName": "Cory",
            "lastName": "Warfield",
            "occupation": null,
            "id": null,
            "publicId": "corywarfield",
            "trackingId": null,
            "profileId": null,
            "picture": null,
            "backgroundImage": null
          }
        },
        {
          "start": 68,
          "length": 13,
          "type": "PROFILE_MENTION",
          "profile": {
            "firstName": "Madeline",
            "lastName": "Mann",
            "occupation": null,
            "id": null,
            "publicId": "madelinemann",
            "trackingId": null,
            "profileId": null,
            "picture": null,
            "backgroundImage": null
          }
        }
      ],
      "pinned": false,
      "originalLanguage": null,
      "author": {
        "firstName": "David",
        "lastName": "Alto",
        "occupation": null,
        "id": null,
        "publicId": "davidalto",
        "trackingId": null,
        "profileId": null,
        "picture": "https://media.licdn.com/dms/image/v2/D5603AQFH3NKp6VeuiQ/profile-displayphoto-scale_400_400/B56aBiv0qbGcAg-/0/1788363101282?e=2147483647&v=beta&t=8N0jRaPB4b3YKPetWkZXI5a9mFkEQqDrrpRMqXM5uVQ",
        "backgroundImage": null,
        "distance": null
      }
    }
  ],
  "reactions": [],
  "numShares": null,
  "numLikes": 44,
  "numComments": 5,
  "commentsTruncated": false,
  "commentsComplete": true,
  "reactionsTruncated": true,
  "canReact": null,
  "canPostComments": null,
  "canShare": null,
  "commentingDisabled": null,
  "allowedCommentersScope": null,
  "rootShare": true,
  "shareAudience": "PUBLIC"
}
```

***

### How does it work?

The actor reads LinkedIn the way a logged-out visitor does, using plain HTTP requests with no browser. It opens each company, school, showcase or profile page you give it, collects the posts shown there, and keeps looking for older public posts by the same author until your limit is reached. Every post is checked on its own public page before it is saved, so posts by other people are left out. When LinkedIn slows down or blocks requests, the actor retries on a fresh session and switches to a proxy on its own. It returns only publicly visible data: what any visitor sees without signing in. Hidden fields stay empty instead of being guessed, and the schema stays the same from run to run. Each post is saved the moment it is ready, so a stopped run keeps everything collected so far.

***

### How do you integrate LinkedIn Profile & Company Posts Scraper into your stack?

It works with what you already use: the REST API from any language, MCP for AI agents, and no-code tools.

#### MCP integration for AI agents

Add the Apify MCP server to your agent with one command:

```bash
claude mcp add --transport http apify "https://mcp.apify.com"
```

This registers LinkedIn Profile & Company Posts Scraper as a tool your agent can call directly: the agent finds it with the server's search tool, adds it, and calls it with a list of LinkedIn URLs. It works in Claude Code, Cursor and Windsurf, and any MCP-compatible client can use the same server address.

#### No-code tools (n8n, Make, LangChain)

- **n8n** — use the Apify node's "Run an Actor" operation, then read the run's dataset items in the next node. You can also call the Apify API's run-sync endpoint from an HTTP Request node with your token.
- **Make** — add the Apify app's "Run an Actor" module, then "Get Dataset Items" to send each post to a sheet, Slack or your CRM.
- **LangChain** — install `langchain-apify` and load the run's dataset with `ApifyDatasetLoader`, mapping each post's text and comments to a document for your agent or vector store.

***

### Is it legal to scrape LinkedIn data?

Collecting publicly available LinkedIn data is generally legal, but how you store and use it is regulated. LinkedIn Profile & Company Posts Scraper returns only publicly available data — what any user sees without logging in — and never signs in to an account. Posts, comments and author details can include personal data, so under GDPR and similar laws scraping public data is generally permissible, but storing and using it must comply with local data-protection law. Keep only what you need and respect people's rights over their data. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does LinkedIn Profile & Company Posts Scraper return?

It returns each post's text, publish date, like and comment counts, media links and the author's name and headline, plus mentions and public comments. See [the data fields section](#what-data-can-i-extract-with-linkedin-profile--company-posts-scraper) for the full list.

#### Does LinkedIn Profile & Company Posts Scraper require a LinkedIn account or login?

No. Only public post data is extracted. No credentials, cookies or LinkedIn account are needed.

#### How fast does LinkedIn Profile & Company Posts Scraper run?

A recorded run with one company page and one personal profile saved 10 posts with full detail, 5 from each page, in 41 seconds. Data is read live on every run, not from a cache; turning full post detail off makes runs lighter.

#### What happens if a page is private or doesn't exist?

A page that does not exist or stays blocked is skipped and named in the run log, and the other URLs keep going. Posts that are deleted or not public are skipped. Skipped items produce no dataset item and no charge, so in code simply count the items you receive per page URL. Used as a LinkedIn person posts scraper it works the same way: only public posts can be returned.

#### Can I scrape multiple LinkedIn pages at once?

Yes. Put all the URLs in one list, so one run works as a LinkedIn profile activity scraper for a whole list of people and companies; the post limit applies to each URL, so every page or profile in the list can return up to that many posts.

#### Does LinkedIn Profile & Company Posts Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — LinkedIn Profile & Company Posts Scraper is available as an MCP tool through the Apify MCP server. Register it in Claude Code, Cursor or Windsurf with `claude mcp add --transport http apify "https://mcp.apify.com"`. Any agent that can call an HTTP endpoint can use the REST API directly.

#### Does LinkedIn Profile & Company Posts Scraper return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with consistent field names. No HTML parsing, no selectors. Pass it straight to an LLM, index it into a vector store, or feed it to an agent tool — no transformation step.

#### What happens when LinkedIn changes its layout or updates its anti-bot system?

The actor is actively maintained. When LinkedIn changes, the actor is updated — your calls keep returning the same JSON schema with no changes on your end.

#### Can I use LinkedIn Profile & Company Posts Scraper without managing proxies or browser infrastructure?

Yes. Retries and the switch to a proxy when LinkedIn blocks requests run on the actor's side. You send one request and get structured JSON back. No proxy accounts, no headless browser setup, no maintenance.

#### Which LinkedIn post fields work best for AI training data and RAG indexing?

For RAG, use the text-rich fields: the post text, the comment texts and the author headline. For training data, use the numeric and true/false fields: like count, comment count, publish timestamp, media type and the repost flag. All fields are typed primitives — strings, integers, booleans — no normalization needed.

***

### Your feedback

Found a bug or missing a field? Let us know through the Issues tab on this Actor's page. Every report is read, and fixes ship as updates to the actor.

# Actor input Schema

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

One or more LinkedIn URLs, one per line. Accepted: company pages (linkedin.com/company/...), school pages (/school/...), showcase pages (/showcase/...), personal profiles (/in/...) and single posts (/posts/... or /feed/update/...). Every URL must be one of these kinds; otherwise the run stops with a message naming the URL.

## `limit` (type: `integer`):

Maximum number of posts to return for each URL. Every company, school, showcase or profile URL can return up to this many posts, so 3 URLs with 100 can return up to 300 posts; a single post URL always returns one post. A URL can return fewer when not enough public posts can be found. Free plan: up to 20 posts per URL per run and 200 posts per month; paid plans have no limit.

## `deepScrape` (type: `boolean`):

When on, each post's own page is read for the full text, exact like and comment counts, and the comments shown publicly, and commenters and mentioned people or companies get their public headline, ID and photos. When off, the lighter public view is used: faster, with fewer details and no comments.

## `scrapeUntil` (type: `string`):

Only return posts published on or after this date (YYYY-MM-DD). Applies to company, school, showcase and profile URLs; a single post URL is always returned. Leave empty for no date filter.

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

If you add your own proxy URLs, the run starts on them. Otherwise it starts with a direct connection. If LinkedIn keeps blocking requests, the actor switches to the Apify datacenter proxy and then to the Apify residential proxy (your chosen country is kept). Apify Proxy group choices made here are not used for those fallbacks.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/company/google/",
    "https://www.linkedin.com/in/ajjames"
  ],
  "limit": 20,
  "deepScrape": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `posts` (type: `string`):

All scraped posts, in the default table view.

# 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/google/",
        "https://www.linkedin.com/in/ajjames"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialdataapi/linkedin-profile-and-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/vpeNA3I8WPhLEervA/builds/3du9wv9appjArMzAT/openapi.json
