Post Comments Engagements Scraper Linkedin & Video Transcript
Pricing
from $4.99 / 1,000 results
Post Comments Engagements Scraper Linkedin & Video Transcript
LinkedIn Post Comments & Engagement Scraper extracts post comments, reactions, engagement metrics, author details, and video transcripts. Ideal for LinkedIn audience research, content analysis, engagement tracking, sentiment analysis, and competitive intelligence.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
19
Total users
3
Monthly active users
a day ago
Last modified
Share
LinkedIn Post Comments Scraper — Video, Transcript & Engagement Data
Extract LinkedIn post comments, native video metadata and the spoken video transcript LinkedIn publishes on its own posts — one structured JSON row per comment, with the post's author, publish date, text, reaction count and comment total attached to every row. On native video posts the same row also carries the video's duration, thumbnail, MP4 file, embed URL, WebVTT captions URL and — when LinkedIn published one — the full spoken transcript. No HTML, no selectors, no login required. Paste a post URL or activity ID and get typed data back.
What is Post Comments Engagements Scraper Linkedin & Video Transcript?
It is an Apify Actor that scrapes comments from LinkedIn posts and, on native video posts, restores the video and post-context data that generic comment scrapers lose. LinkedIn ships a video post's structured page data as a VideoObject node instead of the SocialMediaPosting node that comment scrapers normally read — so on a video post, the post's author, date, text, reaction count and comment count silently disappear for every other scraper on this. This Actor reads VideoObject on the same page fetch the comment engine already performs, at no extra request cost, and exposes what that node ships: duration, thumbnail, MP4 URL, embed URL, captions URL and the spoken transcript. No LinkedIn account or login is required — the default engine reads LinkedIn's public post page as an anonymous visitor.
- Scrape LinkedIn post comments — text, author, timestamp, reactions, permalink
- Scrape native video metadata — duration, thumbnail, MP4, embed URL, WebVTT captions
- Scrape the spoken video transcript LinkedIn publishes inside the post, when one exists
- Restore post context on video posts — author, publish date, text, reaction and comment totals
- Export to JSON, CSV, Excel or XML directly from the Apify dataset — no parsing step
What data does Post Comments Engagements Scraper Linkedin & Video Transcript collect?
Every dataset row is a comment, but each row is enriched with two other data types read off the same post page: the video block (native video posts only) and the post's own engagement context.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Comments | comment text, author, timestamp, reactions, permalink | text, author, commentCreatedAt, stats, comment_url |
| Video posts | duration, thumbnail, MP4 file, embed URL, captions, transcript | videoDurationSeconds, videoContentUrl, videoEmbedUrl, videoCaptionsUrl, videoTranscript |
| Post engagement context | post author, publish date, body text, reaction and comment totals | postAuthorName, postPublishedAt, postText, postReactionCount, postCommentCount |
Need more LinkedIn data?
If you also need the commenters' own profile details — headline, current role, location — pair this Actor with LinkedIn Post Comments Scraper With Commenter Profile Details from API Empire, which enriches each commenter's public profile URL. For the posting company's other public data, LinkedIn Company URL - Mass Profile Finder resolves company pages in bulk, and LinkedIn Jobs Scraper By Multiple Keywords & Locations covers the jobs side of the same platform.
Why not build this yourself?
LinkedIn does not expose a public API that returns comments, engagement counts or video metadata for an arbitrary public post to a third-party application — the official Marketing and Community Management APIs are partner-gated and scoped to a developer's own owned pages, not to reading any post on the platform. Building this yourself means reverse-engineering LinkedIn's authenticated Voyager GraphQL API (its query ID is not documented and has to be discovered from LinkedIn's own served JavaScript bundles, which this Actor does at runtime — see find_query_id_sync in the source), maintaining an HTML/regex parser for the logged-out guest page, handling LinkedIn's HTTP 999 rate-limit status (not a standard 4xx/5xx code), and rotating exit IPs across a datacenter-then-residential proxy ladder when a guest wall is served with a plain HTTP 200. None of that is a one-time build — LinkedIn's markup, query IDs and anti-bot posture change without notice, and a DIY scraper silently breaks until someone notices the dataset went empty. This Actor absorbs that maintenance burden and keeps the output schema stable.
Why do developers and teams scrape LinkedIn comments and video posts?
For AI engineers and agent builders
A native video post's spoken transcript — videoTranscript, with transcriptWordCount — is text an LLM can index or reason over without touching the video file. Pull a competitor's video posts, feed the transcript plus the comment thread into a RAG pipeline, and an agent can answer "what did this company say about X, and how did the audience respond" from typed JSON alone. transcriptAvailable tells the pipeline which rows actually carry transcript text before it wastes a token budget on a null field.
For marketers and brand teams
Video is the majority format on LinkedIn feeds today, and this Actor is the only one of its comparison set that reads the video node at all. A brand team can pull a competitor's or its own video posts, read what was actually said via videoTranscript, and cross-reference it against postReactionCount and the comment thread to see which messages landed — without watching every video manually.
For researchers and analysts
postContextAvailable, commentsAvailable vs commentsTotal, and transcriptAvailable are honest coverage flags, not silent gaps — a dataset built from this Actor's output can be filtered to only the rows where a claim is fully verifiable, which matters for academic or market research built on public LinkedIn activity. Only publicly visible posts and comments are in scope; nothing behind a login wall is accessed.
For sales and social-selling teams
Every comment row carries the commenter's public name and profile URL (author.name, author.profile_url). Pulling the comment section of a relevant industry post turns into a list of people who are already engaging with that topic — a warmer starting point for outreach than a cold list, and one built entirely from public engagement.
How to scrape LinkedIn post comments and video transcripts (step by step)
- Open Post Comments Engagements Scraper Linkedin & Video Transcript on its Apify Store listing and click Try for free (or Start, if you've used it before).
- Paste one or more LinkedIn post URLs or activity IDs into
postUrls— a full post URL, aurn:li:activity:/urn:li:ugcPost:URN, or a bare numeric ID all work. No field is required by the schema, but the Actor logs a warning and exits with no output ifpostUrlsis left empty. - Optionally set
postFormatFiltertovideoto spend only on video posts, or addrequireTranscriptto keep only the ones that genuinely carry a spoken transcript — both filter before any row is charged. - Click Start. The Actor runs logged out by default; supplying your own
liAtcookie only raises the comment ceiling and adds reply threads. - Download the results from the Output tab as JSON, CSV, Excel or XML, or pull them programmatically with the Apify API /
apify-client.
What to do when LinkedIn changes its structure
The Actor is maintained, and its output field names and types are kept stable across LinkedIn markup or API changes, so a downstream integration built against this schema keeps working without code changes on your end. No specific turnaround time is promised for any given break.
⬇️ Input
All seven input parameters are optional — nothing is required in the schema. postUrls is functionally necessary: an empty run logs a warning and produces no output.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
postUrls | No | array of strings | One LinkedIn post per line — a full post URL, a urn:li:activity: / urn:li:ugcPost: URN, or a bare numeric activity ID. Default []. The base actor's startUrls key is still accepted for backward compatibility. | ["https://www.linkedin.com/feed/update/urn:li:activity:7483582759836336130/"] |
postFormatFilter | No | string (enum) | Narrows the run by post format, read from the post's own page. video drops text and image posts before any row is charged; nonVideo is the inverse. Skipped posts still appear as an uncharged accounting row with errorReason: "filtered_post_format". Default "all". Enum: all, video, nonVideo. | "video" |
requireTranscript | No | boolean | Keeps only posts that genuinely carry a spoken transcript (roughly half of video posts, per the Actor's own measured sample). Posts without one are recorded as an uncharged row with errorReason: "no_transcript" instead of being billed. Default false. | true |
commentsPerVideoPost | No | integer | How many comments to return per post. Minimum 1, maximum 500, default 100, and hard-capped at 500 in code regardless of input. Logged out, LinkedIn itself caps a guest to roughly the first 9–10 top-level comments, so a higher value only changes the outcome on the cookie path. The base actor's resultLimitPerPost key is still accepted. | 100 |
sortOrder | No | string (enum) | Applies only on the authenticated (cookie) path. REVERSE_CHRONOLOGICAL returns newest comments first; RELEVANCE returns LinkedIn's relevance order. Logged out, LinkedIn serves a fixed guest slice and ignores this value entirely. Default "REVERSE_CHRONOLOGICAL". | "REVERSE_CHRONOLOGICAL" |
liAt | No | string (secret) | Your own LinkedIn li_at session cookie. Leave empty — the video, transcript and post-context columns need no cookie at all. Supplying one only raises the comment ceiling past LinkedIn's guest slice and adds reply threads, per-reaction-type breakdowns and the edited/pinned markers. Stored as a secret in the Apify input and used only for the requests that need it. No credential is baked into the Actor. | "AQEDATU..." |
proxyConfiguration | No | object (proxy editor) | Apify Proxy configuration. Default {"useApifyProxy": false} — direct, no proxy. By default the Actor escalates on its own (datacenter, then residential with a fresh exit IP) whenever LinkedIn returns HTTP 999 or a guest wall. Set a proxy here to start higher up the ladder. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example JSON input
{"postUrls": ["https://www.linkedin.com/feed/update/urn:li:activity:7483582759836336130/","7483582759836336130"],"postFormatFilter": "all","requireTranscript": false,"commentsPerVideoPost": 100,"sortOrder": "REVERSE_CHRONOLOGICAL","liAt": "","proxyConfiguration": { "useApifyProxy": false }}
The most common input mistake is pasting a company/profile URL instead of a post URL — the parser only recognizes a numeric activity ID, a urn:li:activity: / urn:li:ugcPost: URN, or a URL that contains one; anything else is pushed as an uncharged errorReason: "invalid_input" row rather than silently skipped.
⬆️ Output
One dataset row per comment. Every row also carries the post it came from, and — on native video posts — the video block. Export as JSON, CSV, Excel or XML from the Apify dataset. The default dataset view shows 27 columns; the row the Actor actually pushes carries more — every key is documented below, read from the row-building functions in main.py, video.py and extractor.py.
Comment fields
| Field | Type | Description |
|---|---|---|
comment_id | string | LinkedIn's numeric comment ID |
text | string | null | Comment text, whitespace-normalized |
posted_at | object | { timestamp (epoch ms), date, relative } — the raw comment timestamp block |
commentCreatedAt | string | null | Exact creation time, ISO-8601 UTC, decoded from the comment ID (a LinkedIn ID is a snowflake, so the exact instant is free) |
is_edited | boolean | null | null on the logged-out path — the marker is absent from the guest page; a real boolean on the cookie path |
is_pinned | boolean | null | Same as above |
comment_url | string | null | Permalink to the comment |
author | object | { name, headline, profile_url, profile_picture } — headline and profile_picture are null on the logged-out path (not rendered to guests) |
stats | object | { total_reactions, reactions, comments } — reactions is a per-reaction-type breakdown (like, appreciation, empathy, interest, praise) and is only populated on the cookie path; {} logged out |
replies | array | Nested reply objects, same shape, cookie path only — LinkedIn renders no reply threads to a guest, so this is always [] logged out |
post_input | string | null | The activity ID this comment's post resolves to |
commentsAvailable | number | Comments actually read for this post (post-level, repeated on every comment row) |
commentsTotal | number | null | The post's real total comment count, when LinkedIn published one |
totalComments | number | null | Same value as commentsTotal, kept under the original base actor's field name for backward compatibility |
sourceEngine | string | "public_page" (logged-out guest engine) or "voyager" (authenticated engine) |
Post context fields (present on every row; restored on video posts by reading the VideoObject node)
| Field | Type | Description |
|---|---|---|
postUrl | string | The post URL this comment belongs to |
postFormat | string | "video", "image", "text" or "unknown", classified from the post's own structured node |
postContextAvailable | boolean | Whether the post's structured data node was readable at all |
postAuthorName | string | null | The post author's or company's display name |
postAuthorUrl | string | null | Author profile/page URL — published on non-video (SocialMediaPosting) nodes only, null on a VideoObject node |
postAuthorImageUrl | string | null | Author avatar or logo URL |
postAuthorFollowers | number | null | Follower count — only published inside a SocialMediaPosting author node; genuinely absent on a VideoObject creator, so it stays null rather than being guessed |
postPublishedAt | string | null | The post's own publish date, ISO-8601 |
postHeadline | string | null | Post headline, when the node publishes one |
postText | string | null | The post's body text |
postImageUrl | string | null | Post image, or the video's cover image on a video post |
postReactionCount | number | null | The post's total reaction count |
postCommentCount | number | null | The post's real comment total (separate read from commentsTotal, same underlying source) |
Video and transcript fields (video posts only — all null / false when the post is not a native video)
| Field | Type | Description |
|---|---|---|
videoDurationSeconds | number | null | Video length in seconds, parsed from the ISO-8601 duration. Unparseable or zero-length values return null, never a fake 0 |
videoDurationIso | string | null | The raw ISO-8601 duration string, e.g. PT3M45S |
videoThumbnailUrl | string | null | Video cover image URL |
videoContentUrl | string | null | Direct MP4 file URL |
videoEmbedUrl | string | null | LinkedIn's own embeddable player URL |
videoCaptionsUrl | string | null | WebVTT subtitle track URL, when LinkedIn published one |
videoTranscript | string | null | The spoken transcript, sourced directly from LinkedIn's own published transcript field inside the post's VideoObject structured-data node — not generated by speech-to-text. Whitespace-normalized. null when LinkedIn published no transcript for that video |
transcriptWordCount | number | null | Word count of videoTranscript; null when there is no transcript |
transcriptAvailable | boolean | Honest flag for whether videoTranscript is populated. A video with no published transcript never gets an empty string passed off as one — it gets transcriptAvailable: false and videoTranscript: null |
Run and accounting fields
| Field | Type | Description |
|---|---|---|
scrapedAt | string | Run timestamp, ISO-8601 UTC |
isError | boolean | true for an uncharged accounting row (filtered, throttled, walled, empty, or an empty comment); false for a real charged comment |
errorReason | string | null | A short machine-readable reason code — see the accounting table below |
errorMessage | string | null | A human-readable explanation of errorReason |
errorReason values (all pushed as uncharged accounting rows)
| Value | When it occurs |
|---|---|
invalid_input | The entry is not a recognizable LinkedIn post URL, URN or numeric activity ID |
filtered_post_format | Skipped by postFormatFilter |
no_transcript | Skipped by requireTranscript — the post is a video with no published transcript |
http_999 | LinkedIn's rate-limit status, after retries on rotated exit IPs |
login_required | The public page redirected to a LinkedIn login/join wall |
no_comment_container | The page loaded but carried no recognizable comment DOM or JSON-LD node |
empty_body | The response body was empty |
no_comments | LinkedIn served the post but with zero comments |
empty_comment_row | A comment arrived with neither text nor an author name |
query_id_not_found | Cookie path only: LinkedIn's GraphQL query ID could not be discovered; the Actor falls back to the logged-out engine |
fetch_failed | An unclassified network or parsing failure |
Scraped comment — video post, transcript available
{"comment_id": "7483665243447840769","text": "Proud to be part of this and to stand alongside nonprofits around the world.","posted_at": { "timestamp": 1752452578000, "date": "2026-07-14 00:22:58", "relative": "2d" },"commentCreatedAt": "2026-07-14T00:22:58Z","is_edited": null,"is_pinned": null,"comment_url": "https://www.linkedin.com/feed/update/urn:li:activity:7483582759836336130/?commentUrn=urn:li:comment:(activity:7483582759836336130,7483665243447840769)","author": {"name": "Britt Peemoller","headline": null,"profile_url": "https://www.linkedin.com/in/brittpeemoller","profile_picture": null},"stats": { "total_reactions": 4, "reactions": {}, "comments": null },"replies": [],"post_input": "7483582759836336130","postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7483582759836336130/","postFormat": "video","postContextAvailable": true,"postAuthorName": "Microsoft","postAuthorUrl": null,"postAuthorImageUrl": "https://media.licdn.com/dms/image/…","postAuthorFollowers": null,"postPublishedAt": "2026-07-16T18:06:08.174Z","postHeadline": null,"postText": "Here in Cincinnati, overlooking the banks of the Ohio River…","postImageUrl": "https://media.licdn.com/dms/image/…/videocover-high/…","postReactionCount": 362,"postCommentCount": 34,"videoDurationSeconds": 225,"videoDurationIso": "PT3M45S","videoThumbnailUrl": "https://media.licdn.com/dms/image/…/videocover-high/…","videoContentUrl": "https://dms.licdn.com/playlist/vid/v2/…/mp4-640p-30fp-crf28/…","videoEmbedUrl": "https://www.linkedin.com/embed/feed/update/urn:li:activity:7483582759836336130?compact=true","videoCaptionsUrl": "https://dms.licdn.com/playlist/vid/v2/…/video-captions-webvtt/…","videoTranscript": "Here in Cincinnati, overlooking the banks of the Ohio River, almost two centuries ago, a visitor captured an important insight that continues to define America to this day…","transcriptWordCount": 487,"transcriptAvailable": true,"commentsAvailable": 10,"commentsTotal": 34,"totalComments": 34,"sourceEngine": "public_page","scrapedAt": "2026-07-18T14:02:11Z","isError": false,"errorReason": null,"errorMessage": null}
Scraped comment — text post (no video, no transcript)
{"comment_id": "7483112948832219137","text": "This resonates a lot with what we're seeing in enterprise hiring right now.","commentCreatedAt": "2026-07-12T09:41:03Z","author": {"name": "Daniel Achebe","headline": null,"profile_url": "https://www.linkedin.com/in/danielachebe","profile_picture": null},"postFormat": "text","postContextAvailable": true,"postAuthorName": "Josh Bersin","postPublishedAt": "2026-07-11T15:20:04.000Z","postText": "The skills-based hiring shift is accelerating faster than most HR teams are ready for.","postReactionCount": 891,"postCommentCount": 112,"videoDurationSeconds": null,"videoContentUrl": null,"videoTranscript": null,"transcriptWordCount": null,"transcriptAvailable": false,"commentsAvailable": 9,"commentsTotal": 112,"sourceEngine": "public_page","scrapedAt": "2026-07-18T14:03:40Z","isError": false,"errorReason": null}
Accounting row — filtered post (uncharged)
{"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7481902234871111680/","comment_id": null,"text": null,"postFormat": "text","postContextAvailable": true,"commentsAvailable": 0,"commentsTotal": null,"sourceEngine": "public_page","scrapedAt": "2026-07-18T14:04:12Z","isError": true,"errorReason": "filtered_post_format","errorMessage": "Skipped by postFormatFilter=video (this post is 'text'). Not charged."}
How does Post Comments Engagements Scraper Linkedin & Video Transcript compare to other LinkedIn scrapers?
| Feature | This Actor | Generic alternative |
|---|---|---|
| Output shape | One row per comment, with post and video context attached to every row | Varies — one competitor's listing (simpleapi/post-comments-engagements-scraper-linkedin, checked on the Apify Store 2026-07-25) returns one row per post, with comments nested inside a comments array |
| Native video metadata | Duration, thumbnail, MP4, embed and captions URLs on video posts | Not documented on the three closest competing listings checked |
| Video transcript extraction | Spoken transcript from LinkedIn's own VideoObject node, with an honest transcriptAvailable flag | Not documented on any of the three competing listings checked |
| Post context on video posts | Author, date, text, reactions and comment count restored via the VideoObject node | Not addressed — other comment scrapers allow-list only SocialMediaPosting, so this context is typically absent on video posts |
| Uncharged accounting rows | Filtered, throttled, walled and empty posts are recorded with a typed errorReason and never billed | Not documented on the three competing listings checked |
apimaestro/linkedin-post-comments-replies-engagements-scraper-no-cookies (checked on the Apify Store 2026-07-25) advertises 4,336 users and a 4.85 rating on its own listing — figures from their listing, not measured here. Its documented output is comments and replies with author, reaction and timestamp data; it does not document video metadata or transcript fields. Its own README states that its "most recent" sort option "may not always work for all posts."
If you're building an AI agent or RAG pipeline, the output format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature.
⚠️ How many comments can you scrape with Post Comments Engagements Scraper Linkedin & Video Transcript?
commentsPerVideoPost accepts 1–500 per post and is hard-capped at 500 in code (MAX_COMMENTS_PER_POST = 500 in main.py) regardless of what's supplied. There is no cap on how many post URLs you can put in postUrls — the Actor processes them sequentially with a randomized 1–2 second delay between posts. The real ceiling on comment depth is platform-imposed, not Actor-imposed: logged out, LinkedIn serves an anonymous visitor roughly the first 9–10 top-level comments per post regardless of how high commentsPerVideoPost is set — every row reports commentsAvailable against commentsTotal so the real coverage is visible rather than silently truncated. Supplying your own liAt cookie switches the run to LinkedIn's authenticated Voyager API, which paginates in batches of 10 until commentsPerVideoPost is reached or LinkedIn stops returning new comments. No benchmark run time is published here — none has been measured for this documentation.
Integrate Post Comments Engagements Scraper Linkedin & Video Transcript and automate your workflow
Post Comments Engagements Scraper Linkedin & Video Transcript works with any language or tool that can send an HTTP request to the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/post-comments-engagements-scraper-linkedin-video-transcript").call(run_input={"postUrls": ["https://www.linkedin.com/feed/update/urn:li:activity:7483582759836336130/"],"postFormatFilter": "video","requireTranscript": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if not item.get("isError"):print(item["text"], "->", item.get("videoTranscript"))
Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your token.
Automation platforms (n8n, Make, LangChain)
In n8n, the official Apify node calls this Actor by its ID and returns dataset items directly into your workflow — no custom HTTP node needed. In Make, the Apify app's "Run an Actor and get dataset items" module does the same, letting you branch a scenario on isError or transcriptAvailable. In LangChain (or any agent framework), the Apify Python or JavaScript client can be wrapped as a tool: call the Actor, wait for the run, and pass the returned JSON straight into the agent's context — no HTML parsing step in the loop.
Is it legal to scrape LinkedIn comments?
Scraping publicly accessible LinkedIn posts and comments is generally lawful; the legal exposure comes from what is done with the personal data collected, not from the act of reading a public page. Post Comments Engagements Scraper Linkedin & Video Transcript returns only publicly available data — no login-gated or private content is accessed, and the default engine never authenticates. Comment author names, headlines and profile URLs are personal data under GDPR and CCPA, so storing, enriching or reusing them at scale requires a lawful basis (typically legitimate interest for B2B outreach) and a defined retention and deletion practice. Scraping may also intersect with LinkedIn's own Terms of Service, which is a separate contractual question from data-protection law. Consult legal counsel for commercial use cases involving bulk personal data.
❓ Frequently asked questions
Does Post Comments Engagements Scraper Linkedin & Video Transcript work without a LinkedIn account?
Yes. The default engine reads LinkedIn's public post page as an anonymous visitor — comment text, author name, profile URL, exact UTC timestamp, and the full video/transcript/post-context block all work with no cookie. Supplying your own liAt cookie is optional and only raises the comment ceiling past LinkedIn's guest slice.
How often is the scraped data updated?
Every run performs a live fetch of the current LinkedIn post page — nothing is served from a cache. Data reflects what LinkedIn shows at the moment the Actor runs, including whatever comments and reaction counts are visible then.
What happens if a post has no comments, is private, or LinkedIn blocks the request?
Each of these produces a distinct, uncharged accounting row rather than a silent gap: a post with zero comments gets errorReason: "no_comments"; a login-gated or private post gets errorReason: "login_required"; a post throttled by LinkedIn's HTTP 999 rate limit (after retries on rotated exit IPs) gets errorReason: "http_999". All three are labelled with isError: true and cost nothing.
Can I scrape private or restricted LinkedIn content?
No. Only publicly accessible posts and comments are returned. A private post, or a post behind LinkedIn's login/join wall, is recorded as an uncharged login_required row rather than being fabricated or bypassed.
What does it cost to run this Actor?
It runs on Apify's pay-per-event pricing — you are charged only for the row_result event, one per real comment returned. Accounting rows (filtered, throttled, walled, empty, or an empty comment) are pushed without a charge. Check the Actor's Pricing tab on its Apify Store listing for the current per-event rate.
Does this Actor work for AI agent workflows and LLM pipelines?
Yes. It's callable as a standard HTTP endpoint through the Apify API from any agent framework — every response is typed, normalized JSON with stable field names, so there's no HTML-parsing step between the scrape and the LLM context window.
How does it handle LinkedIn's anti-bot system?
LinkedIn returns HTTP 999 as a rate-limit signal (not a standard 4xx code) and serves guest walls with a plain HTTP 200 rather than an error status. The Actor never keys usability on status alone — it checks for the actual comment container in the response and treats a login/join redirect or a missing container as a wall. On either signal it retries on a fresh proxy tier: direct, then Apify datacenter proxy, then Apify residential proxy with a newly rotated exit IP, backing off between attempts.
How does it compare to other LinkedIn comment scrapers?
apimaestro/linkedin-post-comments-replies-engagements-scraper-no-cookies (checked on the Apify Store 2026-07-25, 4,336 users on its own listing) returns comments and nested replies with author, reaction and timestamp fields, but its documented output does not include video metadata or a transcript field. api-empire/post-comments-engagements-scraper-linkedin and simpleapi/post-comments-engagements-scraper-linkedin (both checked 2026-07-25) return one dataset row per post with comments nested inside, rather than one row per comment, and neither documents video or transcript extraction.
Does this Actor return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names — pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool without a parsing step.
Can I use this Actor without managing proxies?
Yes. By default it runs direct and escalates itself through Apify's datacenter and residential proxy tiers only when LinkedIn throttles or walls a request. You can also supply your own proxyConfiguration to start higher up that ladder.
Why is videoDurationSeconds sometimes null on a video post?
The Actor parses LinkedIn's own ISO-8601 duration string (e.g. PT3M45S). If that value is unparseable or resolves to zero, videoDurationSeconds is returned as null rather than a fake 0 — the raw string is still available in videoDurationIso.
What happens when LinkedIn changes its structure or blocks the scraper?
The Actor is maintained, and its output schema is kept stable — field names and types don't change on your end even when LinkedIn's underlying markup or API does. No specific turnaround time is promised for any individual fix.
💬 Your feedback
Found a bug, or a field that isn't populating the way this README says it should? We want to know — message API Empire through the Contact developer button on this Actor's Apify Store listing, or open an issue against the Actor via Apify Console support. Feedback on missing fields, edge cases and broken posts is what keeps this Actor's maintenance current.