# LinkedIn Company Posts Scraper - $0.90/1k, No Login (`dami_studio/linkedin-company-posts-scraper`) Actor

$0.90 per 1,000 posts, against the $0.30 to $1.20 charged by other LinkedIn company-post scrapers with an active user base. Pull public posts from any company page with text, reactions, comments and post URL. No LinkedIn login, no cookies, no API key.

- **URL**: https://apify.com/dami\_studio/linkedin-company-posts-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (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 $0.90 / 1,000 successful public company posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Company Posts Scraper

Extract only LinkedIn company posts that are publicly exposed as structured data on supplied company pages. This actor does not request a login, cookies, private APIs, employee/contact data, post reactions from hidden endpoints, or residential proxy traffic.

**$0.90 per 1,000 posts** ($0.0009 each), plus $0.001 each time a run starts. Flat rate — no volume tiers, no plan gates — and you are charged only for posts actually returned. For context, the other LinkedIn company-post scrapers on the Apify Store with an active user base run from $0.30 to $1.20 per 1,000, resolved live on 2026-08-10 at each one's *lowest* volume tier.

### Input

```json
{
  "companyUrls": ["https://www.linkedin.com/company/openai/"],
  "maxCompanies": 1,
  "maxPostsPerCompany": 20,
  "requestTimeoutSecs": 20
}
```

| Field | Default | Range | What it does |
|---|---|---|---|
| `companyUrls` | `[]` | up to 100 | Public URLs in the form `https://www.linkedin.com/company/<company-slug>/`. The optional `/posts/` suffix is accepted. |
| `maxCompanies` | `10` | 1–50 | How many valid company URLs to actually request. Invalid, blocked and postless pages return free diagnostic rows and do not count against your bill. |
| `maxPostsPerCompany` | `20` | 1–100 | Cap on matching public posts returned from one company page. |
| `requestTimeoutSecs` | `20` | 5–60 | Timeout for a single company-page request. |

The actor reads one returned company page per input URL. It does not paginate and does not call undocumented LinkedIn endpoints, so the ceiling per run is `maxCompanies × maxPostsPerCompany`.

### Output

Every genuine row is backed by a public company-author JSON-LD record found in the page and a LinkedIn activity ID — if either is missing, the row is not emitted and not billed.

| Field | Notes |
|---|---|
| `companyName`, `companyUrl` | The company the post belongs to, as LinkedIn publishes it. |
| `postUrl`, `activityId` | Direct link to the post, plus LinkedIn's stable activity identifier for de-duplication across runs. |
| `headline` | The post's short headline, where LinkedIn exposes one. |
| `text` | The post body. |
| `datePublished`, `dateModified` | ISO timestamps from the structured-data record. |
| `commentCount`, `reactionCount` | Public engagement counts as shown on the page. |
| `imageUrls` | Image URLs attached to the post. |

Missing public fields come back `null` or empty rather than guessed. Personal posts, content not authored by the requested company, malformed structured data, and pages without matching public post records are never billed.

### Pricing

| Event | When | Price |
|---|---|---|
| Actor start | Once per run, per GB of run memory | $0.001 |
| Public company post | Each genuine post row written to the dataset | $0.0009 ($0.90 / 1,000) |

The row is written to the dataset *before* the charge call, so you can always see what you paid for. 20 posts costs $0.019; the largest run this actor allows — 50 companies × 100 posts — tops out at $4.501.

### Transport, blocks and diagnostics

Direct HTTP only. The actor never starts residential or SERP proxy traffic, so there is no bandwidth surcharge hiding in your run cost.

Failures come back as labelled, uncharged diagnostic rows carrying `ok: false`, `_diagnostic: true` and an `errorCode`:

| Code | Meaning |
|---|---|
| `BAD_INPUT` | The URL was not a public `linkedin.com/company/<slug>/` address. |
| `NO_RESULTS` | The page loaded but carried no matching public company-post records. |
| `BLOCKED` | LinkedIn returned HTTP 999/403 or a security-verification interstitial. |
| `RATE_LIMITED` | HTTP 429. |
| `SERVER_ERROR` | HTTP 5xx from LinkedIn. |
| `NETWORK` | Timeout or transport failure. |

### Empty input

Empty input returns exactly one clearly labeled `_sample: true` row without making a LinkedIn request. It is always uncharged, so you can inspect the output shape before spending anything.

### What this does not do

- **No login and no cookies.** Only what LinkedIn publishes to logged-out visitors is returned.
- **No pagination.** You get what the company page itself exposes, up to `maxPostsPerCompany`.
- **No employee, contact or lead data**, and no reactions pulled from private endpoints.
- **No personal-profile posts.** Company pages only.

# Actor input Schema

## `companyUrls` (type: `array`):

Public URLs in the form https://www.linkedin.com/company/company-slug/. This actor reads only public post records embedded in the returned company page. Empty input returns one clearly labeled, uncharged sample row.

## `maxCompanies` (type: `integer`):

Maximum valid public company URLs to request. Invalid, blocked, or postless pages return free diagnostic rows.

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

Maximum matching public company posts returned from one supplied company page. This actor does not paginate or call LinkedIn private APIs.

## `requestTimeoutSecs` (type: `integer`):

Timeout for one public company page request.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/openai/",
    "https://www.linkedin.com/company/apify/"
  ],
  "maxCompanies": 10,
  "maxPostsPerCompany": 20,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

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

One normalized row for each matching public company post. Sample and diagnostic rows are clearly labeled and never charged.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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 '{}' |
apify call dami_studio/linkedin-company-posts-scraper --silent --output-dataset

```

## MCP server setup

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