Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringoptionalWhat to scrape. "Auto" uses the URLs you provide; the actor picks the right pipeline automatically.
profileUrlstringoptional(mode=profilePosts or auto) LinkedIn profile URL, e.g. https://www.linkedin.com/in/williamhgates, or just the username.
postUrlstringoptional(mode=postUrls or auto) A LinkedIn post link, feed-update link, activity URN or bare activity ID. No login needed.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalWhat to scrape. "Auto" uses the URLs you provide; the actor picks the right pipeline automatically.
profileUrlstringoptional(mode=profilePosts or auto) LinkedIn profile URL, e.g. https://www.linkedin.com/in/williamhgates, or just the username.
postUrlstringoptional(mode=postUrls or auto) A LinkedIn post link, feed-update link, activity URN or bare activity ID. No login needed.
postUrlsarrayoptional(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.
maxPostsintegeroptionalMaximum 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.
postedLimitstringoptionalKeep only posts published within this window. "Any time" keeps everything.
postedAfterstringoptionalOptional. Keep posts published on or after this date. Format: 2026-01-31 or full ISO 8601.
postedBeforestringoptionalOptional. Keep posts published on or before this date. Format: 2026-01-31 or full ISO 8601.
maxCommentsintegeroptionalHow 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.
includeVideoTranscriptbooleanoptionalWhen on, video posts include the full spoken transcript (can make rows large).
scrapeInteractorsbooleanoptionalOptional 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.
scrapeReactionsbooleanoptionalWith 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.
maxInteractorsintegeroptionalCap applied separately to the likers list and the commenters list of each post when interactor scraping is enabled.
cookiestringoptionalOptional 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.
cookiesarrayoptionalFull 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.
languagestringoptionalLanguage hint sent to LinkedIn. Affects localized content where available.
includeRepostsbooleanoptionalWhen off, reposts/reshared posts are excluded from the output.
minReactionsintegeroptionalSkip posts that received fewer than this many reactions. 0 keeps everything.
minCommentsintegeroptionalSkip posts that received fewer than this many comments. 0 keeps everything.
mediaTypesarrayoptionalRestrict 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.

FieldTypeRequiredDescription
resultsstringoptionalDataset 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

  1. Specific posts — paste any LinkedIn post link (linkedin.com/posts/...), a feed-update link (/feed/update/urn:li:activity:..., also ugcPost), or just the numeric activity ID. Country subdomains (uk.linkedin.com/...) work too.
  2. 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, scrapedAt
  • authorName, authorProfileUrl, authorAvatar, authorFollowers
  • content — the full post text, exactly as published
  • hashtags — pulled out of the text
  • reactionsCount, commentsCount
  • comments — the newest comments visible to logged-out visitors: authorName, text, postedAt, and reactionsCount when the comment has likes
  • mediaType — text, image, video or repost
  • mediaUrls / mediaItems — image links, or the MP4 link plus its poster frame for videos
  • videoDuration (e.g. PT1M14S), videoTranscript when you turn it on
  • isRepost and repostOf (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 sharedContent block 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.

Open the step-by-step Python guide →

Source build PMjjgrE6QguMnaiyI. Documentation is regenerated from the default published build; private drafts are not included.