{
  "data": {
    "id": "dfsyX9J6qz6on8sQY",
    "actId": "B19O7L63i7a0To0oh",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-18T14:37:31.526Z",
    "finishedAt": "2026-10-18T14:37:52.611Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 20994,
      "runTimeSecs": 20.994,
      "computeUnits": 0.023326666666666666,
      "imageSizeBytes": 368467456
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Company Posts Scraper Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape. \\\"Auto\\\" uses the targets you provide; the actor picks the right pipeline automatically.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"companyPosts\",\n        \"postUrls\"\n      ],\n      \"enumTitles\": [\n        \"Auto (from the targets you provide)\",\n        \"Company page posts\",\n        \"Specific post URLs\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"companyUrls\": {\n      \"title\": \"Company URLs or Slugs\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn company pages to scrape. Accepts full URLs (https://www.linkedin.com/company/hubspot/), a posts URL, or just the slug (hubspot).\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.linkedin.com/company/hubspot/\"\n      ]\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs\",\n      \"type\": \"array\",\n      \"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.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxPostsPerCompany\": {\n      \"title\": \"Max Posts Per Company\",\n      \"type\": \"integer\",\n      \"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.\",\n      \"editor\": \"number\",\n      \"default\": 10,\n      \"prefill\": 2,\n      \"minimum\": 1,\n      \"maximum\": 500\n    },\n    \"postTypes\": {\n      \"title\": \"Post Types\",\n      \"type\": \"array\",\n      \"description\": \"Which post media types to keep. Leave empty to keep every type.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"text\",\n          \"image\",\n          \"video\",\n          \"article\",\n          \"document\",\n          \"repost\"\n        ],\n        \"enumTitles\": [\n          \"Text\",\n          \"Image\",\n          \"Video\",\n          \"Article link\",\n          \"Document\",\n          \"Repost\"\n        ]\n      },\n      \"default\": [],\n      \"uniqueItems\": true\n    },\n    \"includeEmployeePosts\": {\n      \"title\": \"Include Employee Posts\",\n      \"type\": \"boolean\",\n      \"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.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeIndexedPosts\": {\n      \"title\": \"Include Indexed Posts (deeper history)\",\n      \"type\": \"boolean\",\n      \"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.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"datePosted\": {\n      \"title\": \"Posted Within\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts published within this window. Applied to each post's real publish date.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"r86400\",\n        \"r604800\",\n        \"r2592000\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Past 24 hours\",\n        \"Past week\",\n        \"Past month\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"postedAfter\": {\n      \"title\": \"Posted On or After\",\n      \"type\": \"string\",\n      \"description\": \"Only posts published on or after this date. Accepts YYYY-MM-DD or an ISO date-time.\",\n      \"editor\": \"datepicker\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Posted On or Before\",\n      \"type\": \"string\",\n      \"description\": \"Only posts published on or before this date. Accepts YYYY-MM-DD or an ISO date-time.\",\n      \"editor\": \"datepicker\"\n    },\n    \"minReactions\": {\n      \"title\": \"Minimum Reactions\",\n      \"type\": \"integer\",\n      \"description\": \"Skip posts with fewer than this many reactions.\",\n      \"editor\": \"number\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minComments\": {\n      \"title\": \"Minimum Comments\",\n      \"type\": \"integer\",\n      \"description\": \"Skip posts with fewer than this many comments.\",\n      \"editor\": \"number\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"sortBy\": {\n      \"title\": \"Sort By\",\n      \"type\": \"string\",\n      \"description\": \"How to order the returned posts. Recent = newest first, Popular = most reactions first.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recent\",\n        \"popular\"\n      ],\n      \"enumTitles\": [\n        \"Recent\",\n        \"Popular\"\n      ],\n      \"default\": \"recent\",\n      \"prefill\": \"recent\"\n    },\n    \"includeReposts\": {\n      \"title\": \"Include Reposts\",\n      \"type\": \"boolean\",\n      \"description\": \"Whether to include reposts (posts the company reshared from someone else).\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"hydratePosts\": {\n      \"title\": \"Fetch Full Post Details\",\n      \"type\": \"boolean\",\n      \"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.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeReactionBreakdown\": {\n      \"title\": \"Include Reaction Breakdown\",\n      \"type\": \"boolean\",\n      \"description\": \"Also return the per-reaction-type breakdown and the repost (share) count when LinkedIn serves the richer public layout. Slightly slower.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeDocumentDetails\": {\n      \"title\": \"Include Document Details\",\n      \"type\": \"boolean\",\n      \"description\": \"For document (PDF/PPTX) posts, also return the original PDF link, page images and the per-page text transcript.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"monitorMode\": {\n      \"title\": \"Monitor Mode (new posts only)\",\n      \"type\": \"boolean\",\n      \"description\": \"Return only posts that were not returned by a previous run with the same settings. Useful for scheduled monitoring.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Preferred content language used when requesting LinkedIn pages.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"pt\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Portuguese\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    },\n    \"cookie\": {\n      \"title\": \"LinkedIn Cookie (optional, not needed)\",\n      \"type\": \"string\",\n      \"description\": \"Kept for backward compatibility with older saved tasks. The actor is 100% cookieless; any value here is ignored.\",\n      \"editor\": \"textfield\",\n      \"isSecret\": true\n    }\n  }\n}",
    "readme": "# LinkedIn Company Page Post & Engagement Extractor\n\nPull 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.\n\n## What this actor does\n\n- **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).\n- **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.\n- **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.\n- **Documents:** document (PDF/PPTX) posts expose the title, page count, and — when requested — the original PDF, page images and the per-page text transcript.\n- **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.\n- Empty fields are omitted — you will never see `null` or an empty string in a record.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `postId` | Numeric LinkedIn post ID. |\n| `postUrl` | Direct link to the post on LinkedIn. |\n| `sourcePostUrl` | The discovery URL that produced the record (may differ for reposts). |\n| `companyName` | Display name of the company page. |\n| `companySlug` | Company slug parsed from your input. |\n| `companyUrl` | Canonical URL of the company page. |\n| `companyLogoUrl` | Company logo image URL. |\n| `authorName` | Name of the author (the company, or an employee for featured posts). |\n| `authorProfileUrl` | LinkedIn URL of the author. |\n| `authorHeadline` | Author headline when the page exposes one. |\n| `authorFollowers` | Author's follower count. |\n| `authorAvatar` | Author/company avatar image URL. |\n| `content` | Full text body of the post. |\n| `postedAt` | ISO 8601 publish timestamp. Rows built without opening the post page carry `postedAtApproximate: true` (date derived from the post ID). |\n| `mediaType` | `text`, `image`, `video`, `article`, `document` or `repost`. |\n| `mediaUrls` | Flat list of attached media URLs. |\n| `mediaItems` | Structured media list (`type`, `url`, `thumbnailUrl`, `durationSec`). |\n| `videoDuration` | ISO 8601 duration for video posts (e.g. `PT22S`). |\n| `articleTitle`, `articleUrl` | Title/URL when the post shares an article or link. |\n| `linkPreview` | Link preview metadata when present. |\n| `documentTitle`, `documentPageCount` | Document post title and page count. |\n| `documentUrl` | Original PDF URL (with *Include document details* on). |\n| `documentPageImages[]`, `documentTranscript` | Page images and per-page text (with *Include document details* on). |\n| `pollOptions` | Reserved for poll posts; LinkedIn does not expose poll options to logged-out visitors, so poll posts are returned as text. |\n| `repostOf` | Original post details when this is a repost; `isRepost` is also set. |\n| `hashtags[]` | Hashtags found in the post text. |\n| `mentionedCompanies[]`, `mentionedPeople[]` | Entities tagged in the post. |\n| `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). |\n| `reactionsCount`, `commentsCount` | Engagement totals (0 is a real value). |\n| `repostsCount` | Share count — only returned when *Include reaction breakdown* is on and LinkedIn serves the richer layout. |\n| `reactionBreakdown` | Per-reaction-type counts — same conditions as `repostsCount`. |\n| `viewsCount` | Reserved; LinkedIn does not publish view counts on public post pages. |\n| `source` | Where the post was discovered: `companyPage`, `index` or `postUrl`. |\n| `inputUrl`, `recordType`, `scrapedAt` | Your input that produced the row, `\"post\"`, and the scrape timestamp. |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto` / `companyPosts` / `postUrls` |\n| `companyUrls` | array | – | Company page URLs or bare slugs (e.g. `hubspot`). |\n| `postUrls` | array | – | Specific post links to extract (mode=postUrls). |\n| `maxPostsPerCompany` | int | `10` | Hard cap per company (1–500). |\n| `postTypes` | array | all | Keep only these media types. |\n| `includeEmployeePosts` | bool | `false` | Include featured employee posts from the company feed (sub-brand/showcase posts already count as company posts). |\n| `includeIndexedPosts` | bool | `true` | Also search the public index for older company posts. |\n| `datePosted` | string | `\"\"` | Recency window: any / 24 hours / week / month. |\n| `postedAfter` | string | – | Exact ISO date: keep posts on or after this date. |\n| `postedBefore` | string | – | Exact ISO date: keep posts on or before this date. |\n| `minReactions` | int | `0` | Minimum reactions threshold. |\n| `minComments` | int | `0` | Minimum comments threshold. |\n| `sortBy` | string | `recent` | `recent` (newest first) or `popular` (most reactions). |\n| `includeReposts` | bool | `true` | Keep reposts in the output. |\n| `hydratePosts` | bool | `true` | Open each post page for full details. |\n| `includeReactionBreakdown` | bool | `false` | Add `reactionBreakdown` and `repostsCount` when available. |\n| `includeDocumentDetails` | bool | `false` | Add PDF URL, page images and transcript for documents. |\n| `monitorMode` | bool | `false` | Return only posts not seen by a previous run. |\n| `language` | string | `en` | Preferred content language. |\n| `cookie` | string | – | Legacy field, accepted and ignored. |\n\n### Example: daily prefill (smallest run)\n\n```json\n{\n  \"mode\": \"auto\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/hubspot/\"],\n  \"maxPostsPerCompany\": 2\n}\n```\n\n### Example: monitor competitor pages weekly\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"salesforce\", \"hubspot\", \"zendesk\"],\n  \"maxPostsPerCompany\": 30,\n  \"datePosted\": \"r604800\",\n  \"includeIndexedPosts\": true,\n  \"monitorMode\": true\n}\n```\n\n### Example: only high-engagement posts, newest first\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/nvidia/\"],\n  \"maxPostsPerCompany\": 50,\n  \"minReactions\": 100,\n  \"sortBy\": \"popular\",\n  \"postTypes\": [\"text\", \"image\", \"video\"]\n}\n```\n\n### Example: documents with full details\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"google\", \"microsoft\"],\n  \"maxPostsPerCompany\": 25,\n  \"postTypes\": [\"document\"],\n  \"includeDocumentDetails\": true\n}\n```\n\n## Use cases\n\n- **Competitive intelligence** — track what competitors publish, and how their audiences react.\n- **Sales & ABM signals** — watch target accounts for launches, funding, hiring and event posts.\n- **Content strategy** — analyse posting cadence, formats and top-performing topics across a sector.\n- **Social listening exports** — feed company post data into BI tools, CRMs or AI pipelines.\n- **Recruiting research** — follow employer-brand content and engagement trends.\n- **Monitoring automation** — schedule runs with monitor mode to collect only new posts.\n\n## FAQ\n\n### Does this actor need cookies or a LinkedIn login?\n\nNo. 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.\n\n### Why does a company return fewer posts than I expected?\n\nA 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.\n\n### Can it read the company's \"Posts\" tab with pagination?\n\nNo — 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.\n\n### Why are some dates marked `postedAtApproximate`?\n\nWhen 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.\n\n### How many comments are returned?\n\nUp 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.\n\n### Why is `repostsCount` missing on some rows?\n\nShare counts are only published in the richer public layout. Enable *Include reaction breakdown* to fetch them when available; the actor never invents a `0`.\n\n### Why is a document post missing its PDF link?\n\nThe 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.\n\n### Do I need to set up a proxy?\n\nNo. The actor chooses a working connection to LinkedIn and the search index automatically. Just fill in the input and run it.\n\n### Is this affiliated with LinkedIn?\n\nNo, this is a third-party actor that reads publicly available pages. LinkedIn® is a trademark of LinkedIn Corporation.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-company-page-post-and-engagement",
      "title": "LinkedIn Company Page Post & Engagement Extractor",
      "description": "Pull posts from any LinkedIn company page: captions, media, article links, hashtags, mentions, engagement counts and top comments. Works without cookies or login, with optional deeper indexed discovery.",
      "version": "1.0",
      "buildTag": "latest",
      "environmentVariables": {},
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "memoryMbytes": 1024
      },
      "input": {
        "title": "LinkedIn Company Posts Scraper Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "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"
            ],
            "default": "auto",
            "prefill": "auto"
          },
          "companyUrls": {
            "title": "Company URLs or Slugs",
            "type": "array",
            "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/"
            ]
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "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"
          },
          "maxPostsPerCompany": {
            "title": "Max Posts Per Company",
            "type": "integer",
            "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",
            "default": 10,
            "prefill": 2,
            "minimum": 1,
            "maximum": 500
          },
          "postTypes": {
            "title": "Post Types",
            "type": "array",
            "description": "Which post media types to keep. Leave empty to keep every type.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "image",
                "video",
                "article",
                "document",
                "repost"
              ],
              "enumTitles": [
                "Text",
                "Image",
                "Video",
                "Article link",
                "Document",
                "Repost"
              ]
            },
            "default": [],
            "uniqueItems": true
          },
          "includeEmployeePosts": {
            "title": "Include Employee Posts",
            "type": "boolean",
            "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.",
            "default": false,
            "prefill": false
          },
          "includeIndexedPosts": {
            "title": "Include Indexed Posts (deeper history)",
            "type": "boolean",
            "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.",
            "default": true,
            "prefill": false
          },
          "datePosted": {
            "title": "Posted Within",
            "type": "string",
            "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"
            ],
            "default": "",
            "prefill": ""
          },
          "postedAfter": {
            "title": "Posted On or After",
            "type": "string",
            "description": "Only posts published on or after this date. Accepts YYYY-MM-DD or an ISO date-time.",
            "editor": "datepicker"
          },
          "postedBefore": {
            "title": "Posted On or Before",
            "type": "string",
            "description": "Only posts published on or before this date. Accepts YYYY-MM-DD or an ISO date-time.",
            "editor": "datepicker"
          },
          "minReactions": {
            "title": "Minimum Reactions",
            "type": "integer",
            "description": "Skip posts with fewer than this many reactions.",
            "editor": "number",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 10000000
          },
          "minComments": {
            "title": "Minimum Comments",
            "type": "integer",
            "description": "Skip posts with fewer than this many comments.",
            "editor": "number",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 10000000
          },
          "sortBy": {
            "title": "Sort By",
            "type": "string",
            "description": "How to order the returned posts. Recent = newest first, Popular = most reactions first.",
            "editor": "select",
            "enum": [
              "recent",
              "popular"
            ],
            "enumTitles": [
              "Recent",
              "Popular"
            ],
            "default": "recent",
            "prefill": "recent"
          },
          "includeReposts": {
            "title": "Include Reposts",
            "type": "boolean",
            "description": "Whether to include reposts (posts the company reshared from someone else).",
            "default": true,
            "prefill": true
          },
          "hydratePosts": {
            "title": "Fetch Full Post Details",
            "type": "boolean",
            "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.",
            "default": true,
            "prefill": true
          },
          "includeReactionBreakdown": {
            "title": "Include Reaction Breakdown",
            "type": "boolean",
            "description": "Also return the per-reaction-type breakdown and the repost (share) count when LinkedIn serves the richer public layout. Slightly slower.",
            "default": false,
            "prefill": false
          },
          "includeDocumentDetails": {
            "title": "Include Document Details",
            "type": "boolean",
            "description": "For document (PDF/PPTX) posts, also return the original PDF link, page images and the per-page text transcript.",
            "default": false,
            "prefill": false
          },
          "monitorMode": {
            "title": "Monitor Mode (new posts only)",
            "type": "boolean",
            "description": "Return only posts that were not returned by a previous run with the same settings. Useful for scheduled monitoring.",
            "default": false,
            "prefill": false
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Preferred content language used when requesting LinkedIn pages.",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "pt"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Portuguese"
            ],
            "default": "en",
            "prefill": "en"
          },
          "cookie": {
            "title": "LinkedIn Cookie (optional, not needed)",
            "type": "string",
            "description": "Kept for backward compatibility with older saved tasks. The actor is 100% cookieless; any value here is ignored.",
            "editor": "textfield",
            "isSecret": true
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Company Page Post & Engagement Extractor Output",
        "description": "LinkedIn company page posts with captions, media, article links, hashtags, mentions, engagement counts, top comments and document details.",
        "properties": {
          "posts": {
            "type": "string",
            "title": "Company Posts",
            "description": "Dataset containing all scraped LinkedIn company posts.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "companyName",
                  "postedAt",
                  "mediaType",
                  "reactionsCount",
                  "commentsCount",
                  "postUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "postedAt": {
                    "label": "Posted At",
                    "format": "text"
                  },
                  "mediaType": {
                    "label": "Media Type",
                    "format": "text"
                  },
                  "reactionsCount": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "commentsCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# LinkedIn Company Page Post & Engagement Extractor\n\nPull 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.\n\n## What this actor does\n\n- **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).\n- **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.\n- **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.\n- **Documents:** document (PDF/PPTX) posts expose the title, page count, and — when requested — the original PDF, page images and the per-page text transcript.\n- **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.\n- Empty fields are omitted — you will never see `null` or an empty string in a record.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `postId` | Numeric LinkedIn post ID. |\n| `postUrl` | Direct link to the post on LinkedIn. |\n| `sourcePostUrl` | The discovery URL that produced the record (may differ for reposts). |\n| `companyName` | Display name of the company page. |\n| `companySlug` | Company slug parsed from your input. |\n| `companyUrl` | Canonical URL of the company page. |\n| `companyLogoUrl` | Company logo image URL. |\n| `authorName` | Name of the author (the company, or an employee for featured posts). |\n| `authorProfileUrl` | LinkedIn URL of the author. |\n| `authorHeadline` | Author headline when the page exposes one. |\n| `authorFollowers` | Author's follower count. |\n| `authorAvatar` | Author/company avatar image URL. |\n| `content` | Full text body of the post. |\n| `postedAt` | ISO 8601 publish timestamp. Rows built without opening the post page carry `postedAtApproximate: true` (date derived from the post ID). |\n| `mediaType` | `text`, `image`, `video`, `article`, `document` or `repost`. |\n| `mediaUrls` | Flat list of attached media URLs. |\n| `mediaItems` | Structured media list (`type`, `url`, `thumbnailUrl`, `durationSec`). |\n| `videoDuration` | ISO 8601 duration for video posts (e.g. `PT22S`). |\n| `articleTitle`, `articleUrl` | Title/URL when the post shares an article or link. |\n| `linkPreview` | Link preview metadata when present. |\n| `documentTitle`, `documentPageCount` | Document post title and page count. |\n| `documentUrl` | Original PDF URL (with *Include document details* on). |\n| `documentPageImages[]`, `documentTranscript` | Page images and per-page text (with *Include document details* on). |\n| `pollOptions` | Reserved for poll posts; LinkedIn does not expose poll options to logged-out visitors, so poll posts are returned as text. |\n| `repostOf` | Original post details when this is a repost; `isRepost` is also set. |\n| `hashtags[]` | Hashtags found in the post text. |\n| `mentionedCompanies[]`, `mentionedPeople[]` | Entities tagged in the post. |\n| `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). |\n| `reactionsCount`, `commentsCount` | Engagement totals (0 is a real value). |\n| `repostsCount` | Share count — only returned when *Include reaction breakdown* is on and LinkedIn serves the richer layout. |\n| `reactionBreakdown` | Per-reaction-type counts — same conditions as `repostsCount`. |\n| `viewsCount` | Reserved; LinkedIn does not publish view counts on public post pages. |\n| `source` | Where the post was discovered: `companyPage`, `index` or `postUrl`. |\n| `inputUrl`, `recordType`, `scrapedAt` | Your input that produced the row, `\"post\"`, and the scrape timestamp. |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto` / `companyPosts` / `postUrls` |\n| `companyUrls` | array | – | Company page URLs or bare slugs (e.g. `hubspot`). |\n| `postUrls` | array | – | Specific post links to extract (mode=postUrls). |\n| `maxPostsPerCompany` | int | `10` | Hard cap per company (1–500). |\n| `postTypes` | array | all | Keep only these media types. |\n| `includeEmployeePosts` | bool | `false` | Include featured employee posts from the company feed (sub-brand/showcase posts already count as company posts). |\n| `includeIndexedPosts` | bool | `true` | Also search the public index for older company posts. |\n| `datePosted` | string | `\"\"` | Recency window: any / 24 hours / week / month. |\n| `postedAfter` | string | – | Exact ISO date: keep posts on or after this date. |\n| `postedBefore` | string | – | Exact ISO date: keep posts on or before this date. |\n| `minReactions` | int | `0` | Minimum reactions threshold. |\n| `minComments` | int | `0` | Minimum comments threshold. |\n| `sortBy` | string | `recent` | `recent` (newest first) or `popular` (most reactions). |\n| `includeReposts` | bool | `true` | Keep reposts in the output. |\n| `hydratePosts` | bool | `true` | Open each post page for full details. |\n| `includeReactionBreakdown` | bool | `false` | Add `reactionBreakdown` and `repostsCount` when available. |\n| `includeDocumentDetails` | bool | `false` | Add PDF URL, page images and transcript for documents. |\n| `monitorMode` | bool | `false` | Return only posts not seen by a previous run. |\n| `language` | string | `en` | Preferred content language. |\n| `cookie` | string | – | Legacy field, accepted and ignored. |\n\n### Example: daily prefill (smallest run)\n\n```json\n{\n  \"mode\": \"auto\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/hubspot/\"],\n  \"maxPostsPerCompany\": 2\n}\n```\n\n### Example: monitor competitor pages weekly\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"salesforce\", \"hubspot\", \"zendesk\"],\n  \"maxPostsPerCompany\": 30,\n  \"datePosted\": \"r604800\",\n  \"includeIndexedPosts\": true,\n  \"monitorMode\": true\n}\n```\n\n### Example: only high-engagement posts, newest first\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/nvidia/\"],\n  \"maxPostsPerCompany\": 50,\n  \"minReactions\": 100,\n  \"sortBy\": \"popular\",\n  \"postTypes\": [\"text\", \"image\", \"video\"]\n}\n```\n\n### Example: documents with full details\n\n```json\n{\n  \"mode\": \"companyPosts\",\n  \"companyUrls\": [\"google\", \"microsoft\"],\n  \"maxPostsPerCompany\": 25,\n  \"postTypes\": [\"document\"],\n  \"includeDocumentDetails\": true\n}\n```\n\n## Use cases\n\n- **Competitive intelligence** — track what competitors publish, and how their audiences react.\n- **Sales & ABM signals** — watch target accounts for launches, funding, hiring and event posts.\n- **Content strategy** — analyse posting cadence, formats and top-performing topics across a sector.\n- **Social listening exports** — feed company post data into BI tools, CRMs or AI pipelines.\n- **Recruiting research** — follow employer-brand content and engagement trends.\n- **Monitoring automation** — schedule runs with monitor mode to collect only new posts.\n\n## FAQ\n\n### Does this actor need cookies or a LinkedIn login?\n\nNo. 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.\n\n### Why does a company return fewer posts than I expected?\n\nA 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.\n\n### Can it read the company's \"Posts\" tab with pagination?\n\nNo — 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.\n\n### Why are some dates marked `postedAtApproximate`?\n\nWhen 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.\n\n### How many comments are returned?\n\nUp 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.\n\n### Why is `repostsCount` missing on some rows?\n\nShare counts are only published in the richer public layout. Enable *Include reaction breakdown* to fetch them when available; the actor never invents a `0`.\n\n### Why is a document post missing its PDF link?\n\nThe 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.\n\n### Do I need to set up a proxy?\n\nNo. The actor chooses a working connection to LinkedIn and the search index automatically. Just fill in the input and run it.\n\n### Is this affiliated with LinkedIn?\n\nNo, this is a third-party actor that reads publicly available pages. LinkedIn® is a trademark of LinkedIn Corporation.\n"
    },
    "buildNumber": "1.0.2",
    "imageDigest": "31dd0f57c5dcf7e1e791bb63a53f12b9a0d7a920903ebbab90327600da4306b5",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.023326666666666666
    }
  }
}