# LinkedIn Post Scraper Without Cookies: Posts, Search (`vnx0/linkedin-post-scraper-without-cookies`) Actor

Scrape public LinkedIn posts from profiles, companies, post URLs and keyword search. No login, no cookies, no ban risk. Pay per post.

- **URL**: https://apify.com/vnx0/linkedin-post-scraper-without-cookies.md
- **Developed by:** [Vnx0](https://apify.com/vnx0) (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.50 / 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?

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 post scraper without cookies

Scrape public LinkedIn posts from profiles, company pages, exact post URLs and keyword searches. You get clean JSON rows with the text, author, date, engagement counts, images and guest-visible comments. No login, no `li_at` cookie, no LinkedIn account on your side, so there is nothing for LinkedIn to restrict.

Paste a URL, run, and the prefilled example finishes in under a minute.

### What you get

Each run returns one row per post: full text, author name and profile link, publish date (ISO plus timestamp), like / comment / share counts, images, hashtags, and the comments LinkedIn shows to logged-out visitors. Every row carries `_metadata` with the LinkedIn post id, the input URL that produced it, and the extraction time.

Things this actor does not do: it never asks for your cookies, never logs in anywhere, and never returns `null` fields. If LinkedIn exposes a value, it is in the row. If not, the field is left out. Sources that cannot be read (private posts, deleted posts, rate-limited pages) come back as typed error rows such as `blocked_999` or `no_post_json`, and those rows are free.

### How to run it

1. Open the actor page and click Run.
2. Paste LinkedIn URLs into LinkedIn URLs, or use the dedicated fields for profiles, companies, exact posts and keyword searches.
3. Leave Posts per source at 2 for a first try. That costs less than a cent.
4. Click Start and open the Dataset tab. Rows stream in while the run is still going.

```json
{
  "urls": [
    "https://www.linkedin.com/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61",
    "https://www.linkedin.com/company/microsoft"
  ],
  "limitPerSource": 10,
  "numComments": 10
}
```

#### Track a competitor's company page

```json
{
  "companyUrls": ["https://www.linkedin.com/company/openai"],
  "limitPerSource": 20,
  "scrapeUntil": "2026-01-01"
}
```

#### Follow what founders publish

```json
{
  "profileUrls": ["satyanadella", "https://www.linkedin.com/in/williamhgates/"],
  "limitPerSource": 10
}
```

#### Find posts about a topic

```json
{
  "searchQueries": ["artificial intelligence hiring"],
  "limitPerSource": 10
}
```

Put the last recipe on a schedule and you have a basic monitoring feed: new posts land in the dataset on every run, and a webhook can forward them anywhere.

### Input reference

| Field | What it does |
|---|---|
| `urls` | Mixed LinkedIn URLs: posts, profiles, companies, post-search pages. |
| `profileUrls` | Profile pages (`/in/...`) or bare usernames. |
| `companyUrls` | Company pages (`/company/...`) or bare slugs. |
| `postUrls` | Exact post, feed-update or article URLs. |
| `searchQueries` | Keywords resolved to public post-search pages. Works best with residential proxy, see Limits. |
| `limitPerSource` | Max posts per profile, company or search source (default 2, max 100). Direct post URLs always return one row. |
| `scrapeUntil` | ISO date. Older posts are skipped and never billed. |
| `deepScrape` | Adds engagement, media, hashtags and comments. Turn off for text-only rows at full speed. |
| `numComments` / `numLikes` | Comment bodies and liker context where guest-visible. `0` means counts only. |
| `rawData` | Attaches fetch debug data for troubleshooting. |
| `hybridWeights` | Request share per backend, default `{"api": 0.8, "browser": 0.2}`. The API backend is cheap HTTP; the browser backend is a Playwright fallback for rate-limited pages. |
| `proxyConfiguration` | Apify Proxy, RESIDENTIAL recommended. Proxy cost comes out of event revenue, so you only ever see the per-post price. |

### Output example

One row per post, trimmed for readability:

```json
{
  "postId": "7142740845631365120",
  "url": "https://www.linkedin.com/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61",
  "text": "The road ahead reaches a turning point in...",
  "authorName": "Bill Gates",
  "authorType": "Person",
  "authorProfileUrl": "https://www.linkedin.com/in/williamhgates/",
  "postedAtISO": "2024-03-19T12:00:00.000Z",
  "postedAtTimestamp": 1710849600000,
  "numLikes": 4440,
  "numComments": 367,
  "hashtags": [],
  "images": [],
  "comments": [],
  "_metadata": {
    "post_id": "7142740845631365120",
    "source_url": "https://www.linkedin.com/posts/williamhgates_...",
    "extracted_at": "2026-09-09T14:42:44.000Z"
  }
}
```

The dataset schema tab lists all 43 fields with types.

### Pricing

One billed event: a post row in your dataset. Error rows are free. Spending limits stop the run automatically.

| Posts scraped | FREE / BRONZE | SILVER | GOLD and up |
|---|---|---|---|
| 100 | $0.20 | $0.175 | $0.15 |
| 1,000 | $2.00 | $1.75 | $1.50 |
| 10,000 | $20.00 | $17.50 | $15.00 |

That is $0.002 per post on FREE and BRONZE, $0.00175 on SILVER, $0.0015 on GOLD, PLATINUM and DIAMOND, plus a $0.00005 run-start event. The Pricing tab shows the live configuration.

### How it compares

| | This actor | Multi-actor suites | Cookie tools (PhantomBuster etc.) | Official LinkedIn API |
|---|---|---|---|---|
| Login or `li_at` cookie | Never needed | Never needed | Required, your account | Partner approval, OAuth |
| Ban risk | None, no account involved | None | High, your account gets restricted | None |
| Posts, profiles, companies, search in one run | Yes | No, one actor per job | Varies | Only pages you own |
| Price per post | $0.002, single event | $0.002 plus extra events per enrichment | Subscription or rental | Gated |
| Empty or failed sources | Free error rows | Partly billed | Varies | Not applicable |
| Null-free output | Yes | No | Varies | Not applicable |

### Paste this into your AI assistant

ChatGPT, Claude, Cursor or any LLM can call this actor if you give it this block:

```
vnx0/linkedin-post-scraper-without-cookies is an Apify Actor that scrapes
public LinkedIn posts without login or cookies and returns one flat JSON row
per post: text, author, ISO date, like/comment/share counts, images, hashtags,
guest-visible comments, plus _metadata with post_id, source_url and
extracted_at. Run with curl: curl -X POST
"https://api.apify.com/v2/acts/vnx0~linkedin-post-scraper-without-cookies/run-sync-get-dataset-items?token=APIFY_TOKEN"
-H "Content-Type: application/json" -d '{"urls":["<LINKEDIN_URL>"],"limitPerSource":10}'.
Or Python: ApifyClient("APIFY_TOKEN").actor("vnx0/linkedin-post-scraper-without-cookies").call(
run_input={"urls":[...],"limitPerSource":10}) then read the default dataset.
Inputs: urls (mixed), profileUrls, companyUrls, postUrls, searchQueries,
limitPerSource (default 2), scrapeUntil (ISO date), deepScrape, numComments,
numLikes, rawData, hybridWeights, proxyConfiguration. One post row is one
billed event; error rows (blocked_999, no_post_json,
search_requires_login_guest) are free. Full input and output schemas:
GET https://api.apify.com/v2/acts/vnx0~linkedin-post-scraper-without-cookies/build/default
```

### FAQ

#### Do I need a LinkedIn account or cookies to use this?

No. The actor only opens public pages, the same HTML LinkedIn serves to a logged-out visitor. You never paste a session cookie and no account is ever involved.

#### Will LinkedIn ban my account if I scrape posts?

There is no account to ban here. Cookie tools get people banned because every request carries their session. This actor sends no session at all, so a restriction has nothing to attach to. Your personal LinkedIn stays untouched.

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

Scraping publicly visible pages without logging in sits in the safe harbor of the hiQ Labs v. LinkedIn ruling: the US Ninth Circuit held that accessing public LinkedIn pages does not violate the CFAA. That covers the collection side. What you do with the data still has to comply with privacy law (GDPR and CCPA treat names and headlines as personal data) and LinkedIn's terms, so aggregate and analyze rather than republishing full post text verbatim. This actor is independent and not affiliated with LinkedIn.

#### Is there a free way to try it?

Yes. Apify's free tier includes monthly platform credit, and the prefilled example run costs less than a cent. Error rows are never billed, so experimenting with URLs is free in practice.

#### Can I call it from Python, n8n, or my own code?

Yes. It is a normal Apify actor, so anything that can POST JSON works: the Apify Python or JS client, a curl call, n8n's HTTP node, Make, Zapier, or a scheduled run with a webhook pushing results out. The block above has copy-paste snippets for curl and Python.

#### How do I get the results into CSV or Google Sheets?

Open the run's dataset and export CSV or Excel directly, or connect the actor to Sheets through Make, Zapier, or Apify webhooks. Rows are flat, so they drop into a spreadsheet without transformation.

#### Does it work for company pages?

Yes. Put the company URL in `companyUrls` and you get recent posts with text, dates, engagement and media. Company pages render well for guests, so they are the most reliable source type.

#### Can I get comments and the names of people who reacted without logging in?

Counts, always. Comment text and liker details only where LinkedIn shows them to logged-out visitors, which varies by post. Full comment threads and reactor lists are rendered for logged-in users only, so any tool that promises them is using an account (with the ban risk that brings).

#### How much does it cost to scrape 1,000 LinkedIn posts?

$2.00 on the FREE and BRONZE plans, $1.75 on SILVER, $1.50 on GOLD and above. 100 posts cost $0.20. Set a spending limit and the run stops by itself when it reaches it.

#### Why did my run return error rows instead of posts?

Three usual causes: the post is private or deleted, LinkedIn rate-limited the fetch (HTTP 999, common for profiles from datacenter IPs), or guest search hit the login wall. Each case returns a typed `error` code with an explanation instead of failing the run. Retrying later or switching on the residential proxy clears most of them.

#### Can I watch company pages for new posts every few hours?

Yes. Save the company URLs, set a small `limitPerSource`, and put the run on an Apify schedule. Each scheduled run appends fresh posts to a dataset, and a webhook forwards them to Slack, email, or your database. For hundreds of companies, keep the per-source limit low so each sweep stays cheap.

#### How is this different from PhantomBuster or other cookie tools?

Those tools drive your real LinkedIn session, which is exactly what gets accounts restricted, and sessions expire every few days so you end up babysitting cookies. This actor has no session to expire and no account to lose. The tradeoff is honest: it can only read what LinkedIn shows to strangers.

#### Why not just use the official LinkedIn API?

The Posts API sits behind a Marketing Developer Platform partnership and covers pages you own. If you need public posts from arbitrary profiles and company pages without an approval process, a no-cookie scraper is the shorter path.

### Limits

Guest access only, by design. Full comment threads, reactor identity lists, viewer counts and private posts need a logged-in session, which this actor will never use. LinkedIn rate-limits guests in waves (HTTP 999), mostly on profiles; the actor retries, fails over to a browser backend, throttles itself, and degrades to typed error rows rather than failing the run. Keyword search depends on guest search visibility, so residential proxy is strongly recommended for it. Output reflects whatever LinkedIn publicly exposes at run time, which differs by post, region and author.

### Support

Open an issue on the actor page for bugs or field requests. Issues get answered within 24 hours, and real fixes land in the changelog below.

### Disclaimer

Independent tool, not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. Use extracted data in compliance with applicable data protection laws and LinkedIn's terms of service. Do not use it for spam, harassment, or unlawful purposes.

# Actor input Schema

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

Post, profile (/in/), company (/company/) or post-search URLs. Mix all types in one run.

## `profileUrls` (type: `array`):

Profile pages to collect recent posts from. Full URLs or bare usernames (e.g. williamhgates).

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

Company pages to collect recent posts from. Full URLs or bare slugs (e.g. microsoft).

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

Exact post, feed-update or article URLs, fetched with full text and engagement.

## `searchQueries` (type: `array`):

Topics to find public posts about (e.g. artificial intelligence). Needs residential proxy — see README Limits.

## `limitPerSource` (type: `integer`):

Max posts per profile, company or search source. Direct post URLs always return one row.

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

ISO date (e.g. 2025-01-01). Older posts are skipped and never billed. Empty = all dates.

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

Parse engagement counts, images, hashtags and comments. Off = text-only rows at maximum speed.

## `numComments` (type: `integer`):

Guest-visible comment bodies saved per post. 0 = counts only.

## `numLikes` (type: `integer`):

Liker context saved where guest-visible. Totals are always included. 0 = counts only.

## `rawData` (type: `boolean`):

Attach fetch metadata (\_raw) to each row for troubleshooting.

## `hybridWeights` (type: `object`):

Request share per backend, e.g. {"api": 0.8, "browser": 0.2}. API = cheap HTTP; browser = fallback for rate-limited pages.

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

RESIDENTIAL recommended for LinkedIn guest pages. Proxy cost comes from event revenue — you only see the per-post price.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61"
  ],
  "profileUrls": [],
  "companyUrls": [],
  "postUrls": [],
  "searchQueries": [],
  "limitPerSource": 2,
  "deepScrape": true,
  "numComments": 10,
  "numLikes": 10,
  "rawData": false,
  "hybridWeights": {
    "api": 0.8,
    "browser": 0.2
  },
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per LinkedIn post with text, author, date, engagement, media and provenance. Error rows carry a typed error code and are never billed.

# 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/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61"
    ],
    "profileUrls": [],
    "companyUrls": [],
    "postUrls": [],
    "searchQueries": [],
    "limitPerSource": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("vnx0/linkedin-post-scraper-without-cookies").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/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61"],
    "profileUrls": [],
    "companyUrls": [],
    "postUrls": [],
    "searchQueries": [],
    "limitPerSource": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("vnx0/linkedin-post-scraper-without-cookies").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/posts/williamhgates_the-road-ahead-reaches-a-turning-point-in-activity-7142740845631365120-Mx61"
  ],
  "profileUrls": [],
  "companyUrls": [],
  "postUrls": [],
  "searchQueries": [],
  "limitPerSource": 2
}' |
apify call vnx0/linkedin-post-scraper-without-cookies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vnx0/linkedin-post-scraper-without-cookies"
        }
    }
}
```

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/aT0U189LuvSqcjaPH/builds/9PnuZ7IMmoNzrR8bi/openapi.json
