Post Comments Engagements Scraper Linkedin & Video Transcript avatar

Post Comments Engagements Scraper Linkedin & Video Transcript

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Post Comments Engagements Scraper Linkedin & Video Transcript

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

API Empire

Maintained by Community

Actor 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 TypeKey FieldsJSON Field Names
Commentscomment text, author, timestamp, reactions, permalinktext, author, commentCreatedAt, stats, comment_url
Video postsduration, thumbnail, MP4 file, embed URL, captions, transcriptvideoDurationSeconds, videoContentUrl, videoEmbedUrl, videoCaptionsUrl, videoTranscript
Post engagement contextpost author, publish date, body text, reaction and comment totalspostAuthorName, 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)

  1. 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).
  2. Paste one or more LinkedIn post URLs or activity IDs into postUrls — a full post URL, a urn: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 if postUrls is left empty.
  3. Optionally set postFormatFilter to video to spend only on video posts, or add requireTranscript to keep only the ones that genuinely carry a spoken transcript — both filter before any row is charged.
  4. Click Start. The Actor runs logged out by default; supplying your own liAt cookie only raises the comment ceiling and adds reply threads.
  5. 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.

ParameterRequiredTypeDescriptionExample Value
postUrlsNoarray of stringsOne 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/"]
postFormatFilterNostring (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"
requireTranscriptNobooleanKeeps 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
commentsPerVideoPostNointegerHow 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
sortOrderNostring (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"
liAtNostring (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..."
proxyConfigurationNoobject (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

FieldTypeDescription
comment_idstringLinkedIn's numeric comment ID
textstring | nullComment text, whitespace-normalized
posted_atobject{ timestamp (epoch ms), date, relative } — the raw comment timestamp block
commentCreatedAtstring | nullExact creation time, ISO-8601 UTC, decoded from the comment ID (a LinkedIn ID is a snowflake, so the exact instant is free)
is_editedboolean | nullnull on the logged-out path — the marker is absent from the guest page; a real boolean on the cookie path
is_pinnedboolean | nullSame as above
comment_urlstring | nullPermalink to the comment
authorobject{ name, headline, profile_url, profile_picture }headline and profile_picture are null on the logged-out path (not rendered to guests)
statsobject{ 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
repliesarrayNested reply objects, same shape, cookie path only — LinkedIn renders no reply threads to a guest, so this is always [] logged out
post_inputstring | nullThe activity ID this comment's post resolves to
commentsAvailablenumberComments actually read for this post (post-level, repeated on every comment row)
commentsTotalnumber | nullThe post's real total comment count, when LinkedIn published one
totalCommentsnumber | nullSame value as commentsTotal, kept under the original base actor's field name for backward compatibility
sourceEnginestring"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)

FieldTypeDescription
postUrlstringThe post URL this comment belongs to
postFormatstring"video", "image", "text" or "unknown", classified from the post's own structured node
postContextAvailablebooleanWhether the post's structured data node was readable at all
postAuthorNamestring | nullThe post author's or company's display name
postAuthorUrlstring | nullAuthor profile/page URL — published on non-video (SocialMediaPosting) nodes only, null on a VideoObject node
postAuthorImageUrlstring | nullAuthor avatar or logo URL
postAuthorFollowersnumber | nullFollower count — only published inside a SocialMediaPosting author node; genuinely absent on a VideoObject creator, so it stays null rather than being guessed
postPublishedAtstring | nullThe post's own publish date, ISO-8601
postHeadlinestring | nullPost headline, when the node publishes one
postTextstring | nullThe post's body text
postImageUrlstring | nullPost image, or the video's cover image on a video post
postReactionCountnumber | nullThe post's total reaction count
postCommentCountnumber | nullThe 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)

FieldTypeDescription
videoDurationSecondsnumber | nullVideo length in seconds, parsed from the ISO-8601 duration. Unparseable or zero-length values return null, never a fake 0
videoDurationIsostring | nullThe raw ISO-8601 duration string, e.g. PT3M45S
videoThumbnailUrlstring | nullVideo cover image URL
videoContentUrlstring | nullDirect MP4 file URL
videoEmbedUrlstring | nullLinkedIn's own embeddable player URL
videoCaptionsUrlstring | nullWebVTT subtitle track URL, when LinkedIn published one
videoTranscriptstring | nullThe 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
transcriptWordCountnumber | nullWord count of videoTranscript; null when there is no transcript
transcriptAvailablebooleanHonest 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

FieldTypeDescription
scrapedAtstringRun timestamp, ISO-8601 UTC
isErrorbooleantrue for an uncharged accounting row (filtered, throttled, walled, empty, or an empty comment); false for a real charged comment
errorReasonstring | nullA short machine-readable reason code — see the accounting table below
errorMessagestring | nullA human-readable explanation of errorReason

errorReason values (all pushed as uncharged accounting rows)

ValueWhen it occurs
invalid_inputThe entry is not a recognizable LinkedIn post URL, URN or numeric activity ID
filtered_post_formatSkipped by postFormatFilter
no_transcriptSkipped by requireTranscript — the post is a video with no published transcript
http_999LinkedIn's rate-limit status, after retries on rotated exit IPs
login_requiredThe public page redirected to a LinkedIn login/join wall
no_comment_containerThe page loaded but carried no recognizable comment DOM or JSON-LD node
empty_bodyThe response body was empty
no_commentsLinkedIn served the post but with zero comments
empty_comment_rowA comment arrived with neither text nor an author name
query_id_not_foundCookie path only: LinkedIn's GraphQL query ID could not be discovered; the Actor falls back to the logged-out engine
fetch_failedAn 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?

FeatureThis ActorGeneric alternative
Output shapeOne row per comment, with post and video context attached to every rowVaries — 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 metadataDuration, thumbnail, MP4, embed and captions URLs on video postsNot documented on the three closest competing listings checked
Video transcript extractionSpoken transcript from LinkedIn's own VideoObject node, with an honest transcriptAvailable flagNot documented on any of the three competing listings checked
Post context on video postsAuthor, date, text, reactions and comment count restored via the VideoObject nodeNot addressed — other comment scrapers allow-list only SocialMediaPosting, so this context is typically absent on video posts
Uncharged accounting rowsFiltered, throttled, walled and empty posts are recorded with a typed errorReason and never billedNot 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 ApifyClient
client = 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.

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.