# LinkedIn Post Scraper — Live, No Cookies (`meka.im/linkedin-public-post-scraper`) Actor

Turn LinkedIn post URLs or activity IDs into fresh structured data: text, authors, media, documents, job cards, reposts, and public engagement. No login or cookies. $1 per 1,000 successfully delivered posts; invalid or restricted inputs are free.

- **URL**: https://apify.com/meka.im/linkedin-public-post-scraper.md
- **Developed by:** [Meka.im](https://apify.com/meka.im) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 delivered 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/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

Turn LinkedIn post URLs or activity IDs into fresh structured records for monitoring, research, enrichment, and AI workflows. No LinkedIn account, cookies, or browser required. The price is **$1 per 1,000 successfully delivered posts**.

### Quick start

Paste one or more public LinkedIn post URLs or numeric activity IDs into `postUrls`, then start the Actor:

```json
{
  "postUrls": [
    "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk"
  ]
}
```

The Actor writes one auditable Dataset record for every physical input position. A successful record contains the public post data. Invalid, restricted, and duplicate positions contain an explicit error record instead of silently disappearing.

### What the result includes

- Post ID, canonical URL, text, observed type, and publication time when publicly exposed
- Public author name, headline, profile URL, picture, followers, and company ID when its public company page exposes one
- Images, native video metadata, documents, and article cards
- Attached public job cards
- Repost author, text, media, and publication time when the original public page is accessible
- Public total reactions and comment count
- `fetchedAt` and an explicit live-source declaration

### Common use cases

- Post monitoring and scheduled snapshots
- Content and competitor research
- Image, video, and document extraction
- AI enrichment and analysis pipelines

### Input

The Actor accepts 1–1,000 URLs or activity IDs. It fetches a repeated post identity only once. Later duplicate positions receive an explicit, non-billable `duplicate_input` record so physical input order remains auditable.

Invalid, deleted, restricted, and anonymous-authwall inputs produce explicit non-billable error records.

### Output example

Unavailable values are omitted rather than represented by a guessed zero or null. This shortened example comes from a validated live Dataset record; the expiring signed media URLs are abbreviated:

```json
{
  "ok": true,
  "input": "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk",
  "postId": "7506056712026529793",
  "postUrl": "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk",
  "text": "Having the right tools can change how you manage your time...",
  "postType": "document",
  "author": {
    "name": "Google",
    "profileUrl": "https://www.linkedin.com/company/google/posts",
    "followers": 42373212,
    "companyId": "1441"
  },
  "media": [
    {
      "type": "document",
      "url": "https://media.licdn.com/dms/document/...",
      "thumbnail": "https://media.licdn.com/dms/image/...",
      "title": "7 ways Google Workspace can help this school year"
    }
  ],
  "engagement": {
    "totalReactions": 291,
    "comments": 28
  },
  "source": {
    "type": "linkedin_public_page",
    "fetchedLive": true
  },
  "fetchedAt": "2026-09-18T06:59:30.336Z",
  "limitations": [
    "reaction_breakdown_not_public",
    "share_count_not_public"
  ]
}
```

Media fields vary by the page content. Video records can include the public video URL, thumbnail, duration, dimensions, MIME type, and bitrate. Article, document, job, and repost objects are included only when their corresponding public card is present.

### Validation

Validated September 18, 2026: 100/100 physical inputs produced ordered Dataset records, and all 78 anonymously accessible unique posts were delivered across eight observed post types. Two independent cold runs produced identical delivery results. Restricted, invalid, and duplicate inputs remained explicit non-billable records; this is not a claim that every LinkedIn post is anonymously accessible.

### API and automation

Use the standard Apify Actor API, JavaScript client, Python client, CLI, schedules, or webhooks. Send the same JSON object shown in Quick start as the run input. Dataset order follows the physical input order, so downstream automations can safely associate each record with its original position.

Only successful post records use the `post-delivered` charging event. Invalid, restricted, and duplicate records remain explicit but non-billable.

### Pricing

The price is **$1 per 1,000 successfully delivered posts** (`$0.001` per `post-delivered` event). Platform usage is included. Invalid, restricted, and duplicate records are not charged as delivered posts.

### Public-data limits

LinkedIn's anonymous page does not expose a trustworthy reaction-category breakdown, share count, complete poll details, logged-in comment pagination, or reaction-user lists. These fields are not guessed and zero is not used as a substitute for unavailable data. The `limitations` array states applicable public-source boundaries.

Signed LinkedIn media URLs can rotate between requests. Use post and media identity, not the complete signed URL, when comparing runs.

### FAQ and troubleshooting

**Why did I receive `restricted_or_unavailable`?** The post is deleted, invalid, behind LinkedIn's anonymous authwall, or does not expose a parseable public post body. The Actor does not use an account or Cookie to bypass that boundary.

**Why are reaction categories or share counts missing?** The anonymous page does not expose trustworthy values for them. Only publicly observed aggregate reactions and comments are returned.

**Why is a repeated URL an error record?** Repeated identities are fetched once. Later positions use `duplicate_input` with `duplicateOf`, which preserves physical order without delivering or charging the same post twice.

**Does the Actor cache posts?** No. Every successful post record is fetched from the public page during the run. Static company identity and document supporting resources may be cached without caching the post body.

This Actor is an independent tool and is not affiliated with or endorsed by LinkedIn.

# Actor input Schema

## `postUrls` (type: `array`):

One to 1,000 public LinkedIn post URLs or numeric activity IDs. Duplicate identities are fetched once and reported explicitly at their later input positions.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk"
  ]
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "postUrls": [
        "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("meka.im/linkedin-public-post-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 = { "postUrls": ["https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk"] }

# Run the Actor and wait for it to finish
run = client.actor("meka.im/linkedin-public-post-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 '{
  "postUrls": [
    "https://www.linkedin.com/posts/google_7-ways-google-workspace-can-help-this-school-activity-7506056712026529793-gctk"
  ]
}' |
apify call meka.im/linkedin-public-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,meka.im/linkedin-public-post-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/1eQ6XG3rsXYNbRkfo/builds/qb3i5RpB9rL8tJbCm/openapi.json
