Vexaloom Labs

LinkedIn Company Page Post & Engagement Extractor

Pull posts from any LinkedIn company page with captions, media, article links, hashtags, mentions, and reaction/comment/repost counts, filterable by date and engagement.

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 targets you provide; the actor picks the right pipeline automatically.
companyUrlsarrayoptionalLinkedIn company pages to scrape. Accepts full URLs (https://www.linkedin.com/company/hubspot/), a posts URL, or just the slug (hubspot).
postUrlsarrayoptionalSpecific LinkedIn post links to extract (any format: /posts/...-activity-..., share, ugcPost, or /feed/update/urn:li:...). Used in the "Specific post URLs" mode.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalWhat to scrape. "Auto" uses the targets you provide; the actor picks the right pipeline automatically.
companyUrlsarrayoptionalLinkedIn company pages to scrape. Accepts full URLs (https://www.linkedin.com/company/hubspot/), a posts URL, or just the slug (hubspot).
postUrlsarrayoptionalSpecific LinkedIn post links to extract (any format: /posts/...-activity-..., share, ugcPost, or /feed/update/urn:li:...). Used in the "Specific post URLs" mode.
maxPostsPerCompanyintegeroptionalMaximum posts to return per company. LinkedIn itself stops a company's post history at 500 posts and one year; deeper older posts are reachable only through the public search index.
postTypesarrayoptionalWhich post media types to keep. Leave empty to keep every type.
includeEmployeePostsbooleanoptionalThe public company page mixes a few featured employee posts into its recent feed. Turn this on to include them; off returns the company's own posts (including its showcase/sub-brand pages) only.
includeIndexedPostsbooleanoptionalAlso search the public web index for older company-authored posts. This finds more posts than the company page shows, but coverage depends on the search index.
datePostedstringoptionalKeep only posts published within this window. Applied to each post's real publish date.
postedAfterstringoptionalOnly posts published on or after this date. Accepts YYYY-MM-DD or an ISO date-time.
postedBeforestringoptionalOnly posts published on or before this date. Accepts YYYY-MM-DD or an ISO date-time.
minReactionsintegeroptionalSkip posts with fewer than this many reactions.
minCommentsintegeroptionalSkip posts with fewer than this many comments.
sortBystringoptionalHow to order the returned posts. Recent = newest first, Popular = most reactions first.
includeRepostsbooleanoptionalWhether to include reposts (posts the company reshared from someone else).
hydratePostsbooleanoptionalOpen each post's public page for the full text, exact publish time, top comments and media. Turn off for a faster, lighter run.
includeReactionBreakdownbooleanoptionalAlso return the per-reaction-type breakdown and the repost (share) count when LinkedIn serves the richer public layout. Slightly slower.
includeDocumentDetailsbooleanoptionalFor document (PDF/PPTX) posts, also return the original PDF link, page images and the per-page text transcript.
monitorModebooleanoptionalReturn only posts that were not returned by a previous run with the same settings. Useful for scheduled monitoring.
languagestringoptionalPreferred content language used when requesting LinkedIn pages.
cookiestringoptionalKept for backward compatibility with older saved tasks. The actor is 100% cookieless; any value here is ignored.

Download the published input schema

View complete JSON
{
  "properties": {
    "companyUrls": {
      "description": "LinkedIn company pages to scrape. Accepts full URLs (https://www.linkedin.com/company/hubspot/), a posts URL, or just the slug (hubspot).",
      "editor": "stringList",
      "prefill": [
        "https://www.linkedin.com/company/hubspot/"
      ],
      "title": "Company URLs or Slugs",
      "type": "array"
    },
    "cookie": {
      "description": "Kept for backward compatibility with older saved tasks. The actor is 100% cookieless; any value here is ignored.",
      "editor": "textfield",
      "isSecret": true,
      "title": "LinkedIn Cookie (optional, not needed)",
      "type": "string"
    },
    "datePosted": {
      "default": "",
      "description": "Keep only posts published within this window. Applied to each post's real publish date.",
      "editor": "select",
      "enum": [
        "",
        "r86400",
        "r604800",
        "r2592000"
      ],
      "enumTitles": [
        "Any time",
        "Past 24 hours",
        "Past week",
        "Past month"
      ],
      "prefill": "",
      "title": "Posted Within",
      "type": "string"
    },
    "hydratePosts": {
      "default": true,
      "description": "Open each post's public page for the full text, exact publish time, top comments and media. Turn off for a faster, lighter run.",
      "prefill": true,
      "title": "Fetch Full Post Details",
      "type": "boolean"
    },
    "includeDocumentDetails": {
      "default": false,
      "description": "For document (PDF/PPTX) posts, also return the original PDF link, page images and the per-page text transcript.",
      "prefill": false,
      "title": "Include Document Details",
      "type": "boolean"
    },
    "includeEmployeePosts": {
      "default": false,
      "description": "The public company page mixes a few featured employee posts into its recent feed. Turn this on to include them; off returns the company's own posts (including its showcase/sub-brand pages) only.",
      "prefill": false,
      "title": "Include Employee Posts",
      "type": "boolean"
    },
    "includeIndexedPosts": {
      "default": true,
      "description": "Also search the public web index for older company-authored posts. This finds more posts than the company page shows, but coverage depends on the search index.",
      "prefill": false,
      "title": "Include Indexed Posts (deeper history)",
      "type": "boolean"
    },
    "includeReactionBreakdown": {
      "default": false,
      "description": "Also return the per-reaction-type breakdown and the repost (share) count when LinkedIn serves the richer public layout. Slightly slower.",
      "prefill": false,
      "title": "Include Reaction Breakdown",
      "type": "boolean"
    },
    "includeReposts": {
      "default": true,
      "description": "Whether to include reposts (posts the company reshared from someone else).",
      "prefill": true,
      "title": "Include Reposts",
      "type": "boolean"
    },
    "language": {
      "default": "en",
      "description": "Preferred content language used when requesting LinkedIn pages.",
      "editor": "select",
      "enum": [
        "en",
        "es",
        "fr",
        "de",
        "pt"
      ],
      "enumTitles": [
        "English",
        "Spanish",
        "French",
        "German",
        "Portuguese"
      ],
      "prefill": "en",
      "title": "Language",
      "type": "string"
    },
    "maxPostsPerCompany": {
      "default": 10,
      "description": "Maximum posts to return per company. LinkedIn itself stops a company's post history at 500 posts and one year; deeper older posts are reachable only through the public search index.",
      "editor": "number",
      "maximum": 500,
      "minimum": 1,
      "prefill": 2,
      "title": "Max Posts Per Company",
      "type": "integer"
    },
    "minComments": {
      "default": 0,
      "description": "Skip posts with fewer than this many comments.",
      "editor": "number",
      "maximum": 10000000,
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum Comments",
      "type": "integer"
    },
    "minReactions": {
      "default": 0,
      "description": "Skip posts with fewer than this many reactions.",
      "editor": "number",
      "maximum": 10000000,
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum Reactions",
      "type": "integer"
    },
    "mode": {
      "default": "auto",
      "description": "What to scrape. \"Auto\" uses the targets you provide; the actor picks the right pipeline automatically.",
      "editor": "select",
      "enum": [
        "auto",
        "companyPosts",
        "postUrls"
      ],
      "enumTitles": [
        "Auto (from the targets you provide)",
        "Company page posts",
        "Specific post URLs"
      ],
      "prefill": "auto",
      "title": "Mode",
      "type": "string"
    },
    "monitorMode": {
      "default": false,
      "description": "Return only posts that were not returned by a previous run with the same settings. Useful for scheduled monitoring.",
      "prefill": false,
      "title": "Monitor Mode (new posts only)",
      "type": "boolean"
    },
    "postTypes": {
      "default": [],
      "description": "Which post media types to keep. Leave empty to keep every type.",
      "editor": "select",
      "items": {
        "enum": [
          "text",
          "image",
          "video",
          "article",
          "document",
          "repost"
        ],
        "enumTitles": [
          "Text",
          "Image",
          "Video",
          "Article link",
          "Document",
          "Repost"
        ],
        "type": "string"
      },
      "title": "Post Types",
      "type": "array",
      "uniqueItems": true
    },
    "postUrls": {
      "description": "Specific LinkedIn post links to extract (any format: /posts/...-activity-..., share, ugcPost, or /feed/update/urn:li:...). Used in the \"Specific post URLs\" mode.",
      "editor": "stringList",
      "title": "Post URLs",
      "type": "array"
    },
    "postedAfter": {
      "description": "Only posts published on or after this date. Accepts YYYY-MM-DD or an ISO date-time.",
      "editor": "datepicker",
      "title": "Posted On or After",
      "type": "string"
    },
    "postedBefore": {
      "description": "Only posts published on or before this date. Accepts YYYY-MM-DD or an ISO date-time.",
      "editor": "datepicker",
      "title": "Posted On or Before",
      "type": "string"
    },
    "sortBy": {
      "default": "recent",
      "description": "How to order the returned posts. Recent = newest first, Popular = most reactions first.",
      "editor": "select",
      "enum": [
        "recent",
        "popular"
      ],
      "enumTitles": [
        "Recent",
        "Popular"
      ],
      "prefill": "recent",
      "title": "Sort By",
      "type": "string"
    }
  },
  "schemaVersion": 1,
  "title": "LinkedIn Company Posts 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
postsstringoptionalDataset containing all scraped LinkedIn company posts.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "LinkedIn company page posts with captions, media, article links, hashtags, mentions, engagement counts, top comments and document details.",
  "properties": {
    "posts": {
      "description": "Dataset containing all scraped LinkedIn company posts.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Company Posts",
      "type": "string"
    }
  },
  "title": "LinkedIn Company Page Post & Engagement Extractor 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": {
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "commentsCount": {
            "format": "number",
            "label": "Comments"
          },
          "companyName": {
            "format": "text",
            "label": "Company"
          },
          "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": [
          "companyName",
          "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 Company Page Post & Engagement Extractor

Pull the public post history off any LinkedIn company page — captions, media, article links, hashtags, mentions, engagement counts and the top comments — without cookies or a login. Give it company URLs or bare slugs (one or many), and it returns one clean record per post: the company's own recent posts from its public page, plus deeper company-authored history found through the public search index.

What this actor does

  • Company page feed: reads the public recent-post feed of each company page (up to 10 posts, mixing in a few featured employee posts — employee posts are excluded by default and can be included with a toggle).
  • Deeper indexed history: optionally searches the public web index for older company-authored posts, so you can go past what the page itself shows. Coverage depends on that index; the actor reports how many posts each source contributed.
  • Full post details: each post's public page is opened for the complete text, exact publish time, top comments, follower count and media (images, video, documents). Turn detail fetching off for a faster, lighter run.
  • Documents: document (PDF/PPTX) posts expose the title, page count, and — when requested — the original PDF, page images and the per-page text transcript.
  • Filters that actually apply: post type, recency window, exact date range, minimum reactions/comments, reposts on/off, and sort by newest or most reactions. The legacy cookie field is accepted but ignored.
  • Empty fields are omitted — you will never see null or an empty string in a record.

Output per post

Field Description
postId Numeric LinkedIn post ID.
postUrl Direct link to the post on LinkedIn.
sourcePostUrl The discovery URL that produced the record (may differ for reposts).
companyName Display name of the company page.
companySlug Company slug parsed from your input.
companyUrl Canonical URL of the company page.
companyLogoUrl Company logo image URL.
authorName Name of the author (the company, or an employee for featured posts).
authorProfileUrl LinkedIn URL of the author.
authorHeadline Author headline when the page exposes one.
authorFollowers Author's follower count.
authorAvatar Author/company avatar image URL.
content Full text body of the post.
postedAt ISO 8601 publish timestamp. Rows built without opening the post page carry postedAtApproximate: true (date derived from the post ID).
mediaType text, image, video, article, document or repost.
mediaUrls Flat list of attached media URLs.
mediaItems Structured media list (type, url, thumbnailUrl, durationSec).
videoDuration ISO 8601 duration for video posts (e.g. PT22S).
articleTitle, articleUrl Title/URL when the post shares an article or link.
linkPreview Link preview metadata when present.
documentTitle, documentPageCount Document post title and page count.
documentUrl Original PDF URL (with Include document details on).
documentPageImages[], documentTranscript Page images and per-page text (with Include document details on).
pollOptions Reserved for poll posts; LinkedIn does not expose poll options to logged-out visitors, so poll posts are returned as text.
repostOf Original post details when this is a repost; isRepost is also set.
hashtags[] Hashtags found in the post text.
mentionedCompanies[], mentionedPeople[] Entities tagged in the post.
comments[] Top comments: authorName, text, postedAt, reactionsCount, and authorProfileUrl when the richer layout is served (capped at 10, up to 18 when LinkedIn serves its richer public layout).
reactionsCount, commentsCount Engagement totals (0 is a real value).
repostsCount Share count — only returned when Include reaction breakdown is on and LinkedIn serves the richer layout.
reactionBreakdown Per-reaction-type counts — same conditions as repostsCount.
viewsCount Reserved; LinkedIn does not publish view counts on public post pages.
source Where the post was discovered: companyPage, index or postUrl.
inputUrl, recordType, scrapedAt Your input that produced the row, "post", and the scrape timestamp.

Input

Field Type Default Description
mode string auto auto / companyPosts / postUrls
companyUrls array – Company page URLs or bare slugs (e.g. hubspot).
postUrls array – Specific post links to extract (mode=postUrls).
maxPostsPerCompany int 10 Hard cap per company (1–500).
postTypes array all Keep only these media types.
includeEmployeePosts bool false Include featured employee posts from the company feed (sub-brand/showcase posts already count as company posts).
includeIndexedPosts bool true Also search the public index for older company posts.
datePosted string "" Recency window: any / 24 hours / week / month.
postedAfter string – Exact ISO date: keep posts on or after this date.
postedBefore string – Exact ISO date: keep posts on or before this date.
minReactions int 0 Minimum reactions threshold.
minComments int 0 Minimum comments threshold.
sortBy string recent recent (newest first) or popular (most reactions).
includeReposts bool true Keep reposts in the output.
hydratePosts bool true Open each post page for full details.
includeReactionBreakdown bool false Add reactionBreakdown and repostsCount when available.
includeDocumentDetails bool false Add PDF URL, page images and transcript for documents.
monitorMode bool false Return only posts not seen by a previous run.
language string en Preferred content language.
cookie string – Legacy field, accepted and ignored.

Example: daily prefill (smallest run)

{
  "mode": "auto",
  "companyUrls": ["https://www.linkedin.com/company/hubspot/"],
  "maxPostsPerCompany": 2
}

Example: monitor competitor pages weekly

{
  "mode": "companyPosts",
  "companyUrls": ["salesforce", "hubspot", "zendesk"],
  "maxPostsPerCompany": 30,
  "datePosted": "r604800",
  "includeIndexedPosts": true,
  "monitorMode": true
}

Example: only high-engagement posts, newest first

{
  "mode": "companyPosts",
  "companyUrls": ["https://www.linkedin.com/company/nvidia/"],
  "maxPostsPerCompany": 50,
  "minReactions": 100,
  "sortBy": "popular",
  "postTypes": ["text", "image", "video"]
}

Example: documents with full details

{
  "mode": "companyPosts",
  "companyUrls": ["google", "microsoft"],
  "maxPostsPerCompany": 25,
  "postTypes": ["document"],
  "includeDocumentDetails": true
}

Use cases

  • Competitive intelligence — track what competitors publish, and how their audiences react.
  • Sales & ABM signals — watch target accounts for launches, funding, hiring and event posts.
  • Content strategy — analyse posting cadence, formats and top-performing topics across a sector.
  • Social listening exports — feed company post data into BI tools, CRMs or AI pipelines.
  • Recruiting research — follow employer-brand content and engagement trends.
  • Monitoring automation — schedule runs with monitor mode to collect only new posts.

FAQ

Does this actor need cookies or a LinkedIn login?

No. Everything is collected from public pages without any account, cookie or API key. The legacy cookie input is accepted for compatibility with older saved tasks and ignored.

Why does a company return fewer posts than I expected?

A company page's public feed only shows its latest handful of posts (up to 10 cards). Turn on Include indexed posts to search the public web index for older company-authored posts — that usually finds more, but its coverage varies by company. LinkedIn itself stops a company's full post history at 500 posts and one year.

Can it read the company's "Posts" tab with pagination?

No — LinkedIn requires a sign-in for that tab, and it stays behind the login page from every connection type we tested. The actor works from the public recent feed plus the public search index instead, and says so in the run summary when a company's feed is not public.

Why are some dates marked postedAtApproximate?

When detail fetching is off, the publish date is derived from the post ID (accurate to about an hour). With detail fetching on (the default), the exact timestamp from the post page is used.

How many comments are returned?

Up to 10 top comments from the public post page, or up to 18 when LinkedIn serves its richer public layout (which also includes commenter profile links). LinkedIn does not expose the full comment thread to logged-out visitors.

Why is repostsCount missing on some rows?

Share counts are only published in the richer public layout. Enable Include reaction breakdown to fetch them when available; the actor never invents a 0.

Why is a document post missing its PDF link?

The PDF, page images and transcript are only fetched when Include document details is on. Without it, document posts still include the title and page count.

Do I need to set up a proxy?

No. The actor chooses a working connection to LinkedIn and the search index automatically. Just fill in the input and run it.

Is this affiliated with LinkedIn?

No, this is a third-party actor that reads publicly available pages. LinkedIn® is a trademark of LinkedIn Corporation.

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 dfsyX9J6qz6on8sQY. Documentation is regenerated from the default published build; private drafts are not included.