# LinkedIn Post Scraper with Comments & Reactions (No Login) (`superxcoder/linkedin-post-scraper-no-login`) Actor

Scrape LinkedIn posts without login or cookies: full text, date, reactions, comment count, media, repost info, and the first 10 comments with commenter name, headline and profile URL. From post URLs, company pages or profile URLs. $1.50 per 1,000 posts, comments included, misses free.

- **URL**: https://apify.com/superxcoder/linkedin-post-scraper-no-login.md
- **Developed by:** [Deependra Singh](https://apify.com/superxcoder) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00005 / actor start

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

### LinkedIn Post Scraper with Comments & Reactions (No Login): $1.50 per 1,000 posts

Scrape public LinkedIn posts without login, cookies or a browser. Paste post URLs, company pages or profile URLs and get one clean row per post: full text, exact publish time, author, reactions, comment count, the first 10 comments with commenter name, headline and profile URL, images, video, shared links, hashtags, mentions, and repost attribution.

**$1.50 per 1,000 posts, down to $1.00 on Gold plans. Comments, reactions and media are included in the post price.** Posts that can't be found are free. No subscription, no monthly minimum, no LinkedIn account.

### Why use this scraper?

- 💸 **One price, every field.** Other LinkedIn post scrapers bill the post, each comment and each reaction as separate $2 per 1,000 events, plus a start fee. Here a post with its 10 comments, reaction count, media and links is one $0.0015 charge.
- 🔓 **No LinkedIn account, ever.** The Actor reads only the pages LinkedIn shows to logged-out visitors. Your account is never at risk, and autonomous agents and n8n or Make workflows can run it without supplying cookies.
- 🎯 **Any post link works.** `/posts/...-activity-7514069962865500160-CDii`, `/feed/update/urn:li:activity:...`, `/embed/feed/update/urn:li:share:...`, a bare `urn:li:activity:` or the 19-digit ID. Pulse article URLs too.
- 🏢 **Company and profile pages as input.** Paste `https://www.linkedin.com/company/stripe/` (or just `stripe`) to get the latest posts on the company's public page, or a profile URL for a person's latest public posts.
- 💬 **Commenters as leads.** Every comment comes with the commenter's name, headline, profile URL, text, time, reaction count and whether they are the post's author. Comment IDs let you dedupe across runs.
- 🔁 **Honest repost attribution.** For reposts, `author*` fields are the original author and `repostedBy*` is who reposted. Quote reposts carry the embedded original in `quotedPost`.
- 📏 **Honest limits.** LinkedIn shows logged-out visitors at most 10 comments per post and about 10 posts per company or profile page. Every row says how many comments were returned (`commentsReturned`) and whether more exist (`commentsTruncated`).
- ✅ **Every input is accounted for, misses are free.** Each line you send ends in a row. Deleted or private posts, invalid lines, duplicates and inputs beyond your limits get a **free** row that says why. You pay only for `status: ok` rows.
- 🚨 **No fake "success".** If LinkedIn blocks every request, the run is marked **Failed** and nothing is charged, so your schedule or integration notices instead of getting an empty sheet. A `RUN-SUMMARY` record lists requests by outcome.
- 📅 **Date filters that work.** `postedAfter` / `postedBefore` accept dates or "7 days ago"; posts outside the range are never fetched and never charged.
- 🔔 **Monitoring mode.** Give `seenPostsStoreName` a name and each run returns only posts it has not delivered before. Companies with nothing new get a free `no_new_posts` row, so a daily schedule costs only what it finds.
- 🧱 **Stable output.** Every row carries `schemaVersion`; within a version fields are only added, never renamed or removed, so your n8n, Make and Sheets integrations keep working.
- ⚡ **Fast and light.** Pure HTTP at 512 MB of memory, about 50 posts a minute at the default concurrency of 6 on datacenter proxies (88 of 88 requests succeeded in the platform test).

### What data do you get?

| Field                                                                                              | Example                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `postUrl`, `activityId`, `activityUrn`, `attributedUrn`                                            | Canonical post URL, `7514069962865500160`, `urn:li:activity:...`, `urn:li:ugcPost:...`                                                                                                               |
| `postType`                                                                                         | `text`, `image`, `video`, `article` (shared link), `document`, `quote` (repost with commentary), `pulse_article`                                                                                     |
| `publishedAt`, `isEdited`                                                                          | `2026-10-08T21:11:23.815Z`, `false`                                                                                                                                                                  |
| `text`, `headline`                                                                                 | Full post text with line breaks; LinkedIn's one-line summary                                                                                                                                         |
| `authorName`, `authorUrl`, `authorType`, `authorHeadline`, `authorFollowerCount`, `authorImageUrl` | Bill Gates, `https://www.linkedin.com/in/williamhgates`, `person`, Chair, Gates Foundation..., `40719640`, avatar URL                                                                                |
| `isRepost`, `repostedByName`, `repostedByUrl`                                                      | `true`, Stripe, `https://www.linkedin.com/company/stripe`                                                                                                                                            |
| `isGated`                                                                                          | `true` when LinkedIn served only the logged-out teaser of the post (about 1 in 150 company posts): text, author, date and counts are present, media and most comments are not.                       |
| `quotedPost`                                                                                       | `{ activityUrn, url, author { name, url, type, followerCount }, text, publishedAt }` for quote reposts                                                                                               |
| `reactionCount`, `commentCount`, `topReactionTypes[]`                                              | `3189`, `422`, `["LIKE", "INTEREST", "EMPATHY"]`                                                                                                                                                     |
| `images[]`, `video`, `article`                                                                     | Image URLs; `{ url, thumbnailUrl, captionsUrl, duration, durationSeconds }`; `{ url, title, source }` with LinkedIn's redirect unwrapped                                                             |
| `links[]`, `hashtags[]`, `mentions[]`                                                              | External URLs in the text (unwrapped), hashtags without `#`, tagged people and companies with `name`, `url`, `type`                                                                                  |
| `comments[]`                                                                                       | Up to 10: `commentId`, `commentUrn`, `author { name, url, headline, type }`, `text`, `publishedAt`, `relativeTime`, `reactionCount`, `isPostAuthor`                                                  |
| `commentsReturned`, `commentsTruncated`                                                            | `10`, `true` when the post has more comments than LinkedIn shows logged out                                                                                                                          |
| `input`, `sourceType`, `status`, `error`, `scrapedAt`                                              | Which input the row answers; `post` / `article` / `company` / `profile`; `ok` (charged) or a free `not_found` / `invalid_input` / `duplicate` / `skipped` / `no_posts` / `error` row with the reason |

### How to use it

1. Open the Actor and paste your post, company or profile URLs into **Posts, companies or profiles**, one per line.
2. Click **Start**.
3. Download the results as JSON, CSV or Excel, or fetch them with the Apify API. The **Posts** view is one row per post; the **Engagement** view is the metrics only.

#### Input example

```json
{
    "startUrls": [
        "https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
        "https://www.linkedin.com/feed/update/urn:li:activity:7513299438086332416",
        "https://www.linkedin.com/company/stripe/",
        "https://www.linkedin.com/in/williamhgates"
    ],
    "includeComments": true,
    "maxPostsPerSource": 0,
    "maxPosts": 0
}
```

| Field                         | Default          | Notes                                                                                                                                                                                                                                                |
| ----------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`                   | required         | Post URLs or IDs, Pulse article URLs, company URLs or slugs, profile URLs. Several URLs on one line are split.                                                                                                                                       |
| `includeComments`             | `true`           | Up to 10 comments per post with commenter details. Turn off if you only need the post.                                                                                                                                                               |
| `includeArticles`             | `false`          | For profile inputs, also return the person's Pulse articles.                                                                                                                                                                                         |
| `maxPostsPerSource`           | `0` (all shown)  | Cap per company or profile page.                                                                                                                                                                                                                     |
| `maxPosts`                    | `0` (no limit)   | Cap across the whole run. Explicit post links are processed first.                                                                                                                                                                                   |
| `postedAfter`, `postedBefore` | empty            | Date (`2026-10-01`), ISO timestamp, or relative (`7 days ago`, `24 hours ago`). Out-of-range posts are skipped before they are fetched.                                                                                                              |
| `seenPostsStoreName`          | empty            | Monitoring mode: a key-value store name; posts delivered by earlier runs with the same name are skipped for free. The Actor creates the store on its first run; a store created elsewhere is not writable (the Actor runs with limited permissions). |
| `summaryStoreName`            | empty            | Also write the run summary as `latest` into a key-value store of this name, for scheduled health checks. Same rule: let the first run create it.                                                                                                     |
| `maxConcurrency`              | `6`              | Parallel requests.                                                                                                                                                                                                                                   |
| `failIfEmpty`                 | `true`           | Mark the run Failed when nothing was scraped.                                                                                                                                                                                                        |
| `minPosts`                    | `0` (off)        | Health checks: mark the run FAILED when fewer posts than this were delivered, so a partial result raises an alert.                                                                                                                                   |
| `proxyConfiguration`          | Apify datacenter | Posts and company pages: datacenter, 100% in testing. Profile pages: residential only (datacenter loaded 0 of 12); set `maxConcurrency` to 1 or 2.                                                                                                   |

#### Output example (shortened)

```json
{
    "input": "https://www.linkedin.com/company/stripe/",
    "sourceType": "company",
    "status": "ok",
    "postUrl": "https://www.linkedin.com/posts/stripe_introducing-personal-agent-protocol-activity-7513299438086332416-zrLF",
    "activityId": "7513299438086332416",
    "postType": "article",
    "publishedAt": "2026-10-06T18:09:36.392Z",
    "text": "We're working with Meta, Sierra, Genesys, Instinct, Rocket, Shopify, and Walmart as founding partners for the Personal Agent Protocol: an open standard defining how personal agents interact with businesses. https://lnkd.in/g9sym-J9",
    "authorName": "Stripe",
    "authorUrl": "https://www.linkedin.com/company/stripe",
    "authorType": "company",
    "authorFollowerCount": 1761293,
    "isRepost": false,
    "reactionCount": 438,
    "commentCount": 48,
    "topReactionTypes": ["LIKE", "INTEREST", "EMPATHY"],
    "article": {
        "url": "https://sierra.ai/blog/introducing-personal-agent-protocol",
        "title": "Introducing Personal Agent Protocol",
        "source": "sierra.ai"
    },
    "links": ["https://lnkd.in/g9sym-J9"],
    "comments": [
        {
            "commentId": "7513302595306835968",
            "author": {
                "name": "Jules Nsenda",
                "url": "https://www.linkedin.com/in/jules-nsenda",
                "headline": null,
                "type": "person"
            },
            "text": "The third route is the one to watch: a personal agent working through the company's own agent...",
            "publishedAt": "2026-10-06T18:22:09.134Z",
            "reactionCount": 6,
            "isPostAuthor": false
        }
    ],
    "commentsReturned": 10,
    "commentsTruncated": true,
    "scrapedAt": "2026-10-11T15:48:01.112Z"
}
```

### Where can you run it?

- **Apify Console**: paste inputs, click Start, download CSV or Excel.
- **API**: `POST https://api.apify.com/v2/acts/superxcoder~linkedin-post-scraper-no-login/run-sync-get-dataset-items?token=...` with the input JSON; one post URL per call works well for Clay, n8n and Make enrichment columns.
- **Schedules**: run a list of competitor company pages every morning and diff `activityId` against yesterday's dataset to get only new posts.
- **MCP**: the Actor is available to AI agents through the Apify MCP server; it needs no cookies, so agents can call it unattended.
- **Chaining**: feed the `companyUrl` column of the LinkedIn Company Scraper's dataset in as `startUrls`, and feed this Actor's `comments[].author.url` into your enrichment step.

### What are the limits? (read this first)

LinkedIn shows logged-out visitors a fixed window. This Actor works inside it and tells you when you hit it, instead of letting you find out in the Issues tab.

| Limit                               | Value                                                                                                                                                                                                                                                              | How the output tells you                                                                      |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
| Comments per post                   | up to 10 (LinkedIn's public page shows the most relevant ones)                                                                                                                                                                                                     | `commentCount` is the real total; `commentsTruncated: true` when more exist                   |
| Replies to comments                 | not shown logged out                                                                                                                                                                                                                                               | `comments[]` holds top-level comments only                                                    |
| Posts per company or profile page   | the latest shown on the public page, about 10                                                                                                                                                                                                                      | `RUN-SUMMARY.sources[input].postsFound`                                                       |
| Older posts, full post history      | behind the login wall                                                                                                                                                                                                                                              | use a schedule plus `seenPostsStoreName` to build history forward                             |
| Who reacted (reactor list)          | not shown logged out                                                                                                                                                                                                                                               | `reactionCount` plus `topReactionTypes` (up to 3 kinds)                                       |
| Keyword or hashtag search of posts  | login only                                                                                                                                                                                                                                                         | not offered                                                                                   |
| Very large runs on datacenter proxy | LinkedIn throttles a datacenter IP pool as one run grows: measured under 1% of page loads blocked up to about 500 loads, about 4% at 1,000 loads in one run. A block is retried on a fresh IP (8 tries); the rare post that still fails becomes a free `error` row | split runs above about 1,000 posts, or rerun the `error` rows (free)                          |
| Profile pages                       | LinkedIn answers HTTP 999 to most `/in/` requests; datacenter IPs never get through, residential about 2 in 3 per attempt                                                                                                                                          | residential proxy, `maxConcurrency` 1 to 2, rerun the `error` rows (free), or paste post URLs |

The `RUN-SUMMARY` record in every run's key-value store repeats these limits and shows requests by outcome, posts skipped by date, posts skipped as already seen, and why the run stopped.

### Is it working right now?

Three layers tell you, so a LinkedIn markup change never goes unnoticed for long:

1. **Fail-loud runs.** A run where nothing could be scraped ends `FAILED`, not `SUCCEEDED` with an empty dataset. Set `minPosts` to make a partial result fail too.
2. **The maintainer's health check.** A schedule runs this Actor every 6 hours on three company pages and two posts with `minPosts: 10`, and writes the run summary as `latest` into the `linkedin-post-scraper-health` store. Failures email the maintainer. The changelog below records every LinkedIn-side change and the day it was handled.
3. **Your own monitor.** Schedule the Actor on your inputs with `summaryStoreName` set, and read `latest` from that store from anywhere: `outcome`, `finishedAt`, `requests.blocked` and `rows.ok` are all there. `scripts/health-status.mjs` in the repository is a 40-line example that exits non-zero when the last run failed or is older than 7 hours, ready for cron or CI.

### How does it compare?

Store prices checked on 2026-10-11; they change often, so check the live listings. We read 153 reviews and 233 issue threads of the ten biggest LinkedIn post scrapers before building this one. The most frequent complaints were undocumented caps (58 threads), outages (58), date filters ignored (50), wrong-locale results (45), empty results (44) and billing surprises (39: "860 'No posts found' markers were each billed as a post", "I set the cap at 100 posts and it ran to 7k+" because comments and reactions were separate billable events). This Actor's design answers the caps, date-filter, billing, repost-attribution and schema-stability complaints directly; the limits table above is the honest answer to the rest.

|                                                                         | This Actor                                              | Market leaders (harvestapi, apimaestro, supreme_coder)                                                                                               |
| ----------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Price per 1,000 posts                                                   | **$1.50**, $1.00 on Gold                                | $2.00 to $5.00                                                                                                                                       |
| Comments                                                                | **Included** (first 10 per post with commenter details) | $2.00 per 1,000 comments as a separate event or separate Actor                                                                                       |
| Reaction count and top reaction types                                   | **Included**                                            | Reaction lists sold as a separate $2 per 1,000 event                                                                                                 |
| Start fee per run                                                       | Platform default only ($0.00005 per GB)                 | $0.01 to $0.02 on several                                                                                                                            |
| Login or cookies                                                        | **Never**                                               | "No cookies" for you, but people search, full comment lists and 2,500-result queries are only possible with a logged-in session on the vendor's side |
| Full comment history, reactor lists, post search by keyword             | ❌ Not available logged out, and we say so              | ✅ via logged-in sessions                                                                                                                            |
| Posts per company or profile                                            | Latest ~10 shown on the public page                     | Hundreds, via logged-in sessions                                                                                                                     |
| Free rows for misses, invalid lines, duplicates, with reason            | ✅                                                      | Some                                                                                                                                                 |
| Run fails when LinkedIn blocks everything                               | ✅ no charge                                            | ❌ (empty "succeeded" runs reported in Issues)                                                                                                       |
| Repost attribution (original author vs reposter), quote posts           | ✅                                                      | Partial (17 threads and reviews report mixed-up author fields)                                                                                       |
| `postedAfter` / `postedBefore` honoured, out-of-range posts not charged | ✅                                                      | 50 threads report date filters ignored or missing                                                                                                    |
| Only-new-posts monitoring with free "nothing new" rows                  | ✅                                                      | ❌ (empty profiles billed as posts)                                                                                                                  |
| `schemaVersion`, additive-only output changes                           | ✅                                                      | ❌ (schema changes broke integrations, 17 reports)                                                                                                   |

If you need thousands of posts per profile or every comment on a viral post, you need a logged-in tool and should weigh the account and legal risk that comes with it. If you need reliable, cheap, cookie-free engagement data for lists of posts and companies, this Actor is built for that.

### How much does it cost?

Pay per result, no subscription:

| Plan              | Per post | Per 1,000 |
| ----------------- | -------- | --------- |
| Free and Starter  | $0.0015  | $1.50     |
| Bronze (Scale)    | $0.0013  | $1.30     |
| Silver (Business) | $0.0012  | $1.20     |
| Gold (Enterprise) | $0.0010  | $1.00     |

- Comments, reactions, media, links and repost info are part of the post price
- Rows for posts that couldn't be found, invalid lines, duplicates and skipped inputs are **free**
- Nothing is charged when the run ends Failed
- Apify's standard **$0.00005 run-start fee** per GB of memory (about 5 cents per 1,000 runs)
- No platform usage charges: the per-post price is the whole bill

1,000 posts with their comments cost **$1.50**. Test it on the Apify Free plan before you pay anything.

### FAQ

**Do I need a LinkedIn account or cookies?** No. The Actor reads only pages LinkedIn shows to logged-out visitors, never logs in and never bypasses a login wall.

**How many comments do I get?** The ones LinkedIn shows on the public post page, up to 10, usually the most relevant ones. `commentCount` is the real total and `commentsTruncated` tells you when more exist. Loading more requires a logged-in session, which this Actor does not use.

**How many posts per company or profile?** The latest posts LinkedIn shows on the public page, about 10. Older posts are behind the login wall. To build history, schedule the Actor and keep the dataset.

**Why do profile inputs sometimes fail?** LinkedIn answers HTTP 999 to most `/in/` page requests, far more aggressively than for post and company pages. Measured on 2026-10-11: datacenter proxy loaded 0 of 12 profiles; residential loaded 13 of 20 across two attempts, with 3 more resolved as not public. Use residential proxy, set `maxConcurrency` to 1 or 2, and rerun the `error` rows: failed profiles cost nothing. Post pages reached from a profile are not affected (44 of 44 loaded).

**A post came back `not_found`.** The post was deleted, is visible only to logged-in members (some authors restrict visibility), or the ID is wrong. LinkedIn redirects such URLs to a sign-up page, which the Actor recognises and reports as a free row.

**Is `publishedAt` exact?** Yes. It comes from LinkedIn's structured data on the post page; when missing it is decoded from the activity ID, which encodes the creation time to the millisecond.

**Results in the wrong language or country?** Post pages are the same for everyone, so this Actor has no locale problem on post inputs. If you still want a specific exit country, set it in the proxy settings (Apify Proxy country).

**How do I get only new posts every day?** Schedule the Actor with your company list and set `seenPostsStoreName` to any name, for example `competitor-posts`. The first run delivers the current posts; every later run delivers only posts not seen before and gives each company with nothing new a free `no_new_posts` row.

**Does it return who reacted?** No. Reactor lists are only visible logged in. You get the total and the up-to-three reaction kinds LinkedIn shows.

**Is scraping LinkedIn legal?** This Actor reads only pages LinkedIn shows to logged-out visitors, never logs in, never creates accounts and never bypasses a login wall. US courts have held that scraping publicly available pages is not unauthorized access (hiQ v. LinkedIn) and that logged-out scraping does not breach a platform's terms (Meta v. Bright Data, 2024); the cases LinkedIn has won (Proxycurl 2025, ProAPIs 2026) involved fake logged-in accounts. Post text and reaction counts are content about a public post; commenter names and headlines are personal data, so `includeComments` should be used with a lawful basis (for example a GDPR legitimate-interest assessment) and the output handled accordingly. LinkedIn's User Agreement prohibits automated access, and you are responsible for how you use the output, including GDPR and CCPA where they apply. This Actor is not affiliated with or endorsed by LinkedIn.

### Tested

Every build runs 83 unit tests on saved LinkedIn pages. The deployed Actor is also put through a 15-case stress and
load suite on the platform (3,151 page loads in the last pass): 50 and 111 company pages at concurrency 10 to 20,
200 post URLs at concurrency 20, monitoring mode twice in a row, 100 mixed and broken input lines, run-wide caps,
date filters, comments off, only-missing inputs, `minPosts`, residential profiles. Results and the bugs each pass
found are in `STRESS-REPORT.md` in the repository.

### Support

Open an issue in the **Issues** tab with the input that failed and the run ID; issues are answered within one business day. Every run writes a `RUN-SUMMARY` record to its key-value store with request counts by outcome, which helps diagnose blocks.

# Actor input Schema

## `startUrls` (type: `array`):

One per line. A post URL (https://www.linkedin.com/posts/...-activity-7514069962865500160-CDii or https://www.linkedin.com/feed/update/urn:li:activity:7514069962865500160), an activity URN or bare ID, a Pulse article URL (/pulse/...), a company URL or slug (https://www.linkedin.com/company/stripe/ or stripe) for its latest public posts, or a profile URL (https://www.linkedin.com/in/williamhgates) for that person's latest public posts. Several URLs on one line are split automatically.

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

Add the comments LinkedIn shows on the public post page (up to 10 per post) with commenter name, headline, profile URL, text, date and reaction count. Included in the post price. Commenter fields are personal data; turn this off if you only need the post.

## `includeArticles` (type: `boolean`):

When a profile URL is given, also scrape the long-form Pulse articles LinkedIn lists on the public profile (as rows with postType "pulse_article").

## `maxPostsPerSource` (type: `integer`):

For company and profile inputs, scrape at most this many of the posts shown on the public page (LinkedIn shows about 10). 0 = all shown.

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

Stop after this many posts across all inputs. 0 = no limit. The maximum cost per run setting is also honoured.

## `postedAfter` (type: `string`):

Only posts published on or after this date. A date (2026-10-01), an ISO timestamp, or a relative value such as "7 days ago" / "24 hours ago". Posts outside the range are not fetched and not charged.

## `postedBefore` (type: `string`):

Only posts published on or before this date (same formats as Posted after).

## `seenPostsStoreName` (type: `string`):

Monitoring mode. Give a name (for example "competitor-posts-seen") and every run records the posts it delivered in a key-value store of that name; later runs with the same name skip those posts for free and return only new ones. Inputs with nothing new get a free no_new_posts row. Let the first run create the store: a store created elsewhere is not writable because the Actor runs with limited permissions.

## `maxConcurrency` (type: `integer`):

How many requests run in parallel. 6 keeps LinkedIn's rate limits quiet on datacenter proxies; lower it if you see retries, raise it on residential proxies.

## `failIfEmpty` (type: `boolean`):

When every input ends without a post (blocked, not found or invalid), mark the run FAILED instead of SUCCEEDED so schedules and integrations notice. Nothing is charged either way.

## `minPosts` (type: `integer`):

For scheduled health checks and monitors: mark the run FAILED when fewer than this many posts were delivered, so a partial result (LinkedIn markup change, blocks) raises an alert. 0 disables. Delivered posts stay in the dataset and are charged as usual.

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

Apify datacenter proxy (default) handles post and company pages (100% in testing). Profile pages need residential proxy: datacenter IPs get HTTP 999 from LinkedIn on every profile request. With profile inputs also set Concurrency to 1 or 2. The per-post price is the same either way.

## `summaryStoreName` (type: `string`):

Also write the RUN-SUMMARY record to this named key-value store as "latest". Used for scheduled health checks; leave empty otherwise. Let the first run create the store: a store created elsewhere is not writable because the Actor runs with limited permissions.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
    "https://www.linkedin.com/company/stripe/"
  ],
  "includeComments": true,
  "includeArticles": false,
  "maxPostsPerSource": 0,
  "maxPosts": 0,
  "postedAfter": "",
  "postedBefore": "",
  "seenPostsStoreName": "",
  "maxConcurrency": 6,
  "failIfEmpty": true,
  "minPosts": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "summaryStoreName": ""
}
```

# Actor output Schema

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

No description

## `comments` (type: `string`):

No description

## `summary` (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 = {
    "startUrls": [
        "https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
        "https://www.linkedin.com/company/stripe/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("superxcoder/linkedin-post-scraper-no-login").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 = {
    "startUrls": [
        "https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
        "https://www.linkedin.com/company/stripe/",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("superxcoder/linkedin-post-scraper-no-login").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 '{
  "startUrls": [
    "https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
    "https://www.linkedin.com/company/stripe/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call superxcoder/linkedin-post-scraper-no-login --silent --output-dataset

```

## MCP server setup

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

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/hrHUqDuXZu4q7IaQU/builds/WPvq7e6bKM3bmDKA7/openapi.json
