LinkedIn Profile Feed Scraper with Likers & Commenters
Pull posts from a LinkedIn profile's activity feed or a direct post URL, with engagement counts, hashtags, media, and optionally the people who liked or commented on each post. Requires a LinkedIn session cookie.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | What to scrape. "Auto" uses the URLs you provide; the actor picks the right pipeline automatically. |
profileUrl | string | optional | (mode=profilePosts or auto) LinkedIn profile URL, e.g. https://www.linkedin.com/in/williamhgates, or just the username. |
postUrl | string | optional | (mode=postUrls or auto) A LinkedIn post link, feed-update link, activity URN or bare activity ID. No login needed. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | What to scrape. "Auto" uses the URLs you provide; the actor picks the right pipeline automatically. |
profileUrl | string | optional | (mode=profilePosts or auto) LinkedIn profile URL, e.g. https://www.linkedin.com/in/williamhgates, or just the username. |
postUrl | string | optional | (mode=postUrls or auto) A LinkedIn post link, feed-update link, activity URN or bare activity ID. No login needed. |
postUrls | array | optional | (mode=postUrls) A list of LinkedIn post links, feed-update links, activity URNs or bare activity IDs. Combined with Post URL if both are set. |
maxPosts | integer | optional | Maximum number of posts to return. Cookieless profile feeds are capped by LinkedIn at the newest ~8 public posts; with the optional cookie the feed paginates up to this limit. |
postedLimit | string | optional | Keep only posts published within this window. "Any time" keeps everything. |
postedAfter | string | optional | Optional. Keep posts published on or after this date. Format: 2026-01-31 or full ISO 8601. |
postedBefore | string | optional | Optional. Keep posts published on or before this date. Format: 2026-01-31 or full ISO 8601. |
maxComments | integer | optional | How many top comments to include per post. LinkedIn shows ~10 comments to logged-out visitors and the cookie path adds commenter profile URLs to those same first ~10 - a documented source ceiling either way. |
includeVideoTranscript | boolean | optional | When on, video posts include the full spoken transcript (can make rows large). |
scrapeInteractors | boolean | optional | Optional extra. Requires the LinkedIn Cookie field and adds the first page of commenters with profile URLs/headlines. Cookieless runs always include engagement counts and the top comments. |
scrapeReactions | boolean | optional | With Scrape Likers & Commenters on, also include the first page of likers (name/headline/profile URL). Requires the optional cookie. LinkedIn's liker pagination endpoint is not available to visitors, so this is the visible first page only. |
maxInteractors | integer | optional | Cap applied separately to the likers list and the commenters list of each post when interactor scraping is enabled. |
cookie | string | optional | Optional and never required - the actor works without any login. If supplied, it unlocks extra data: profile feeds paginate past the ~10-post cookieless ceiling up to Max Posts, and every post gains reaction-type breakdowns, reposts/views counts and the first page of likers/commenters. Accepts the li_at value, a raw cookie header, or a full cookies JSON array. |
cookies | array | optional | Full browser cookie export for linkedin.com as a JSON array of {name, value} objects (Cookie-Editor extension -> Export -> JSON). Same effect as the Cookie field - merged with it when both are set. Optional and never required. |
language | string | optional | Language hint sent to LinkedIn. Affects localized content where available. |
includeReposts | boolean | optional | When off, reposts/reshared posts are excluded from the output. |
minReactions | integer | optional | Skip posts that received fewer than this many reactions. 0 keeps everything. |
minComments | integer | optional | Skip posts that received fewer than this many comments. 0 keeps everything. |
mediaTypes | array | optional | Restrict output to specific post media types. Leave empty to keep all. Cookieless runs detect text, image, video and repost posts. |
Download the published input schema
View complete JSON
{
"description": "Scrape public LinkedIn posts, a profile's recent posts, comments and video metadata - no login or cookie needed.",
"properties": {
"cookie": {
"description": "Optional and never required - the actor works without any login. If supplied, it unlocks extra data: profile feeds paginate past the ~10-post cookieless ceiling up to Max Posts, and every post gains reaction-type breakdowns, reposts/views counts and the first page of likers/commenters. Accepts the li_at value, a raw cookie header, or a full cookies JSON array.",
"editor": "textfield",
"isSecret": true,
"title": "LinkedIn Cookie (optional)",
"type": "string"
},
"cookies": {
"description": "Full browser cookie export for linkedin.com as a JSON array of {name, value} objects (Cookie-Editor extension -> Export -> JSON). Same effect as the Cookie field - merged with it when both are set. Optional and never required.",
"editor": "json",
"isSecret": true,
"title": "LinkedIn Cookies (JSON array, optional)",
"type": "array"
},
"includeReposts": {
"default": true,
"description": "When off, reposts/reshared posts are excluded from the output.",
"prefill": true,
"title": "Include Reposts",
"type": "boolean"
},
"includeVideoTranscript": {
"default": false,
"description": "When on, video posts include the full spoken transcript (can make rows large).",
"prefill": false,
"title": "Include Video Transcript",
"type": "boolean"
},
"language": {
"default": "en",
"description": "Language hint sent to LinkedIn. Affects localized content where available.",
"editor": "select",
"enum": [
"en",
"es",
"fr",
"de",
"pt",
"it",
"nl",
"pl",
"tr",
"ar",
"zh",
"ja",
"ko",
"ru",
"sv",
"da",
"no",
"fi",
"cs",
"ro",
"hu",
"el",
"he",
"hi",
"id",
"ms",
"th",
"vi",
"uk"
],
"enumTitles": [
"English",
"Spanish",
"French",
"German",
"Portuguese",
"Italian",
"Dutch",
"Polish",
"Turkish",
"Arabic",
"Chinese",
"Japanese",
"Korean",
"Russian",
"Swedish",
"Danish",
"Norwegian",
"Finnish",
"Czech",
"Romanian",
"Hungarian",
"Greek",
"Hebrew",
"Hindi",
"Indonesian",
"Malay",
"Thai",
"Vietnamese",
"Ukrainian"
],
"prefill": "en",
"title": "Language",
"type": "string"
},
"maxComments": {
"default": 10,
"description": "How many top comments to include per post. LinkedIn shows ~10 comments to logged-out visitors and the cookie path adds commenter profile URLs to those same first ~10 - a documented source ceiling either way.",
"editor": "number",
"maximum": 10,
"minimum": 1,
"prefill": 10,
"title": "Max Comments per Post",
"type": "integer"
},
"maxInteractors": {
"default": 50,
"description": "Cap applied separately to the likers list and the commenters list of each post when interactor scraping is enabled.",
"editor": "number",
"maximum": 600,
"minimum": 1,
"prefill": 50,
"title": "Max Likers + Commenters per Post",
"type": "integer"
},
"maxPosts": {
"default": 10,
"description": "Maximum number of posts to return. Cookieless profile feeds are capped by LinkedIn at the newest ~8 public posts; with the optional cookie the feed paginates up to this limit.",
"editor": "number",
"maximum": 200,
"minimum": 1,
"prefill": 1,
"title": "Max Posts",
"type": "integer"
},
"mediaTypes": {
"default": [],
"description": "Restrict output to specific post media types. Leave empty to keep all. Cookieless runs detect text, image, video and repost posts.",
"editor": "select",
"items": {
"enum": [
"text",
"image",
"video",
"article",
"document",
"carousel",
"poll",
"event",
"repost"
],
"enumTitles": [
"Text",
"Image",
"Video",
"Article",
"Document",
"Carousel",
"Poll",
"Event",
"Repost"
],
"type": "string"
},
"title": "Media Types",
"type": "array",
"uniqueItems": true
},
"minComments": {
"default": 0,
"description": "Skip posts that received fewer than this many comments. 0 keeps everything.",
"editor": "number",
"minimum": 0,
"prefill": 0,
"title": "Minimum Comments",
"type": "integer"
},
"minReactions": {
"default": 0,
"description": "Skip posts that received fewer than this many reactions. 0 keeps everything.",
"editor": "number",
"minimum": 0,
"prefill": 0,
"title": "Minimum Reactions",
"type": "integer"
},
"mode": {
"default": "auto",
"description": "What to scrape. \"Auto\" uses the URLs you provide; the actor picks the right pipeline automatically.",
"editor": "select",
"enum": [
"auto",
"postUrls",
"profilePosts"
],
"enumTitles": [
"Auto (from the URLs you provide)",
"Scrape specific post URLs",
"Scrape a profile's recent posts"
],
"prefill": "postUrls",
"title": "Mode",
"type": "string"
},
"postUrl": {
"description": "(mode=postUrls or auto) A LinkedIn post link, feed-update link, activity URN or bare activity ID. No login needed.",
"editor": "textfield",
"prefill": "https://www.linkedin.com/posts/nvidia_ai-is-technology-that-is-built-and-improved-activity-7508569677040893954-sffp",
"title": "Post URL",
"type": "string"
},
"postUrls": {
"description": "(mode=postUrls) A list of LinkedIn post links, feed-update links, activity URNs or bare activity IDs. Combined with Post URL if both are set.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Post URLs",
"type": "array"
},
"postedAfter": {
"description": "Optional. Keep posts published on or after this date. Format: 2026-01-31 or full ISO 8601.",
"editor": "textfield",
"title": "Posted After (date)",
"type": "string"
},
"postedBefore": {
"description": "Optional. Keep posts published on or before this date. Format: 2026-01-31 or full ISO 8601.",
"editor": "textfield",
"title": "Posted Before (date)",
"type": "string"
},
"postedLimit": {
"default": "",
"description": "Keep only posts published within this window. \"Any time\" keeps everything.",
"editor": "select",
"enum": [
"",
"1h",
"24h",
"week",
"month",
"3months",
"6months",
"year"
],
"enumTitles": [
"Any time",
"Past hour",
"Past 24 hours",
"Past week",
"Past month",
"Past 3 months",
"Past 6 months",
"Past year"
],
"prefill": "",
"title": "Posted Within",
"type": "string"
},
"profileUrl": {
"description": "(mode=profilePosts or auto) LinkedIn profile URL, e.g. https://www.linkedin.com/in/williamhgates, or just the username.",
"editor": "textfield",
"prefill": "https://www.linkedin.com/in/satyanadella",
"title": "Profile URL",
"type": "string"
},
"scrapeInteractors": {
"default": false,
"description": "Optional extra. Requires the LinkedIn Cookie field and adds the first page of commenters with profile URLs/headlines. Cookieless runs always include engagement counts and the top comments.",
"prefill": false,
"title": "Scrape Likers & Commenters (needs cookie)",
"type": "boolean"
},
"scrapeReactions": {
"default": false,
"description": "With Scrape Likers & Commenters on, also include the first page of likers (name/headline/profile URL). Requires the optional cookie. LinkedIn's liker pagination endpoint is not available to visitors, so this is the visible first page only.",
"prefill": false,
"title": "Include Likers List (needs cookie)",
"type": "boolean"
}
},
"required": [],
"schemaVersion": 1,
"title": "LinkedIn Post Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | Dataset with scraped LinkedIn posts |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per public LinkedIn post: text, author and follower count, engagement counts, top comments, media and video metadata, hashed from logged-out pages.",
"properties": {
"results": {
"description": "Dataset with scraped LinkedIn posts",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"type": "string"
}
},
"title": "LinkedIn Post Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"detailed": {
"display": {
"component": "table",
"properties": {
"authorFollowers": {
"format": "number",
"label": "Author Followers"
},
"authorHeadline": {
"format": "text",
"label": "Headline"
},
"authorName": {
"format": "text",
"label": "Author"
},
"authorProfileUrl": {
"format": "link",
"label": "Author URL"
},
"comments": {
"format": "text",
"label": "Top Comments"
},
"commentsCount": {
"format": "number",
"label": "Comments"
},
"content": {
"format": "text",
"label": "Post Content"
},
"inputUrl": {
"format": "text",
"label": "Input URL"
},
"mediaType": {
"format": "text",
"label": "Media Type"
},
"postId": {
"format": "text",
"label": "Post ID"
},
"postUrl": {
"format": "link",
"label": "Post URL"
},
"postedAt": {
"format": "text",
"label": "Posted At"
},
"reactionsCount": {
"format": "number",
"label": "Reactions"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
},
"videoDuration": {
"format": "text",
"label": "Video Duration"
}
}
},
"title": "Detailed",
"transformation": {
"fields": [
"postId",
"authorName",
"authorFollowers",
"authorHeadline",
"authorProfileUrl",
"postedAt",
"content",
"mediaType",
"reactionsCount",
"commentsCount",
"comments",
"videoDuration",
"postUrl",
"inputUrl",
"scrapedAt"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"authorName": {
"format": "text",
"label": "Author"
},
"commentsCount": {
"format": "number",
"label": "Comments"
},
"mediaType": {
"format": "text",
"label": "Media Type"
},
"postUrl": {
"format": "link",
"label": "Post URL"
},
"postedAt": {
"format": "text",
"label": "Posted At"
},
"reactionsCount": {
"format": "number",
"label": "Reactions"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
}
}
},
"title": "Overview",
"transformation": {
"fields": [
"authorName",
"postedAt",
"mediaType",
"reactionsCount",
"commentsCount",
"postUrl",
"scrapedAt"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
LinkedIn Public Post Scraper — Profile Feeds, Comments & Video
Collect public LinkedIn posts without logging in. Give the actor one or more post links, or a profile URL, and it returns the post text, the author and their follower count, reaction and comment totals, the comments LinkedIn shows to logged-out visitors, images, videos with duration and (optionally) the full video transcript. No account, no cookie, no browser session.
Ways to use it
- Specific posts — paste any LinkedIn post link (
linkedin.com/posts/...), a feed-update link (/feed/update/urn:li:activity:..., alsougcPost), or just the numeric activity ID. Country subdomains (uk.linkedin.com/...) work too. - A profile's recent posts — provide a profile URL and the actor reads the profile's public activity feed, then opens each post it finds for the full record.
Set mode to force one pipeline, or leave it on Auto and the actor figures it out from the URLs you supply.
What each row contains
postId,postUrl,postedAt(ISO 8601),inputUrl,scrapedAtauthorName,authorProfileUrl,authorAvatar,authorFollowerscontent— the full post text, exactly as publishedhashtags— pulled out of the textreactionsCount,commentsCountcomments— the newest comments visible to logged-out visitors:authorName,text,postedAt, andreactionsCountwhen the comment has likesmediaType—text,image,videoorrepostmediaUrls/mediaItems— image links, or the MP4 link plus its poster frame for videosvideoDuration(e.g.PT1M14S),videoTranscriptwhen you turn it onisRepostandrepostOf(original author and reshared text) for reshares
Optional extras with a session cookie for people who still want them: likers (first visible page), commenters (with profile URLs), reactionBreakdown, repostsCount and viewsCount — plus profile feeds that paginate past the logged-out ceiling. See the cookie note below.
Examples
A single post:
{
"mode": "postUrls",
"postUrl": "https://www.linkedin.com/posts/nvidia_ai-is-technology-that-is-built-and-improved-activity-7508569677040893954-sffp",
"maxPosts": 1
}
A batch of posts with quality filters:
{
"mode": "postUrls",
"postUrls": [
"https://www.linkedin.com/posts/nvidia_ai-is-technology-that-is-built-and-improved-activity-7508569677040893954-sffp",
"urn:li:activity:7469496437156925441"
],
"minReactions": 25,
"includeReposts": false,
"postedLimit": "month"
}
A profile's latest posts with their top comments:
{
"mode": "profilePosts",
"profileUrl": "https://www.linkedin.com/in/mohamed-rhioui",
"maxPosts": 10,
"maxComments": 10
}
Input reference
| Field | What it does | Default |
|---|---|---|
mode |
auto, postUrls, or profilePosts |
auto |
profileUrl |
Profile URL or bare username (profile-feed mode) | – |
postUrl / postUrls |
One or many post links, feed-update links, URNs, or activity IDs | – |
maxPosts |
Upper bound on returned posts | 10 (max 200) |
postedLimit |
Any time / past hour / 24h / week / month / 3 / 6 months / year | Any time |
postedAfter, postedBefore |
Exact date window (2026-01-31 or ISO 8601) |
– |
maxComments |
Top comments kept per post (LinkedIn caps this at 10) | 10 |
includeVideoTranscript |
Add the spoken transcript of video posts | false |
includeReposts |
Keep or drop reshares | true |
minReactions, minComments |
Skip low-engagement posts | 0 |
mediaTypes |
Restrict to text / image / video / repost (and other legacy categories) | all |
language |
Language hint for localized content | en |
scrapeInteractors |
Optional cookie-only extra: add commenters (with profile URLs/headlines) |
false |
scrapeReactions |
With scrapeInteractors, also add the first page of likers |
false |
maxInteractors |
Cap per likers list and per commenters list | 50 |
cookie |
Optional. Unlocks feed pagination + reaction breakdowns/likers/commenters | empty |
cookies |
Optional. Same as cookie, as a browser cookie-export JSON array |
– |
Comments and limits, honestly
- Public posts only. Posts that LinkedIn reserves for signed-in members, or that were deleted, are skipped and the run still finishes with the posts it could read.
- Profile feeds show a preview, not an archive — unless you bring a cookie. Without one, LinkedIn's logged-out activity page lists only the newest few public posts (usually 8). There is no pagination for visitors who are not signed in. With your own session cookie the actor paginates the profile feed up to
maxPosts. - Comments are the visible pageful. Logged-out post pages embed roughly the ten most recent comments, and the cookie path adds commenter profile URLs to those same first ~10. LinkedIn's "more comments" pagination is not available to visitors.
- Likers and reaction-type breakdowns are account-scoped. LinkedIn shows those lists only to signed-in members. If you paste a session cookie from your own browser, the actor adds the first visible page of likers, the reaction-type breakdown, reposts/views counts and commenter profiles. LinkedIn often rejects sessions coming from a server IP, so treat cookie extras as best-effort. Everything in the output still works with no cookie at all.
- Repost flags survive both page versions. Reshares are detected from the full-page
sharedContentblock or from the lighter page's "reposted this" header, whichever LinkedIn serves.
FAQ
Do I need a LinkedIn account or cookie? No. The actor reads the same public pages a logged-out visitor sees.
How current is the data? Every run fetches the pages live. scrapedAt tells you when each row was captured.
Which post link formats are accepted? linkedin.com/posts/... share links, /feed/update/urn:li:activity:... and urn:li:ugcPost:... links, bare activity IDs, and country subdomains such as uk.linkedin.com.
Can it scrape company pages or keyword-search LinkedIn? Those surfaces are login-gated at the publicly visible layer, so this actor focuses on profiles and individual posts.
Why did a specific URL return nothing? Either the post is member-only/removed, or it does not exist. The run log lists each URL with the reason.
Do I need a proxy? No. The actor selects its own connection and escalates only when a page request is challenged.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build PMjjgrE6QguMnaiyI. Documentation is regenerated from the default published build; private drafts are not included.