{
  "data": {
    "id": "2J31IX5LPEdINxWgA",
    "actId": "CIxdgqOHBfl4nTwzB",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-22T05:10:40.517Z",
    "finishedAt": "2026-10-22T05:10:58.682Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 18088,
      "runTimeSecs": 18.088,
      "computeUnits": 0.020097777777777777,
      "imageSizeBytes": 370634752
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Posts Scraper Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"Choose what to scrape: specific public post URLs, a profile's recent posts, or a company's recent posts.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"postUrls\",\n        \"profiles\",\n        \"companies\"\n      ],\n      \"enumTitles\": [\n        \"Public post URLs\",\n        \"Profile recent posts\",\n        \"Company recent posts\"\n      ],\n      \"default\": \"postUrls\",\n      \"prefill\": \"postUrls\"\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs\",\n      \"type\": \"array\",\n      \"description\": \"Public LinkedIn post URLs, feed-update URLs, activity URNs or numeric activity IDs. (mode=postUrls)\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.linkedin.com/posts/williamhgates_how-better-data-helped-us-cut-child-mortality-activity-7329207003942125568-_gfJ\"\n      ]\n    },\n    \"profileUrls\": {\n      \"title\": \"Profile URLs\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn profile URLs or public identifiers, e.g. https://www.linkedin.com/in/williamhgates/ or williamhgates. (mode=profiles)\",\n      \"editor\": \"stringList\"\n    },\n    \"companyUrls\": {\n      \"title\": \"Company URLs\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn company URLs or slugs, e.g. https://www.linkedin.com/company/google/ or google. (mode=companies)\",\n      \"editor\": \"stringList\"\n    },\n    \"maxPostsPerProfile\": {\n      \"title\": \"Max Posts Per Target\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum posts to keep per profile or company. Public profile pages expose about 6-8 recent posts and company home pages 2-10, so larger values do not unlock more history.\",\n      \"default\": 50,\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"editor\": \"number\"\n    },\n    \"mediaType\": {\n      \"title\": \"Media Type Filter\",\n      \"type\": \"array\",\n      \"description\": \"Only keep posts of these media types. Public pages reliably expose text, image, video and article; repost is a pure reshare. Leave empty to keep all.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"text\",\n          \"image\",\n          \"video\",\n          \"article\",\n          \"document\",\n          \"carousel\",\n          \"repost\",\n          \"poll\",\n          \"event\"\n        ],\n        \"enumTitles\": [\n          \"Text only\",\n          \"Image\",\n          \"Video\",\n          \"Article\",\n          \"Document\",\n          \"Carousel\",\n          \"Repost\",\n          \"Poll\",\n          \"Event\"\n        ]\n      }\n    },\n    \"postTypes\": {\n      \"title\": \"Post Types (legacy)\",\n      \"type\": \"array\",\n      \"description\": \"Legacy type filter. Left at its default of six types it changes nothing; any other selection is merged with mediaType.\",\n      \"editor\": \"select\",\n      \"default\": [\n        \"text\",\n        \"image\",\n        \"video\",\n        \"article\",\n        \"document\",\n        \"repost\"\n      ],\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\",\n          \"Document\",\n          \"Repost\"\n        ]\n      }\n    },\n    \"datePosted\": {\n      \"title\": \"Date Posted\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts published within this window, measured from the run time.\",\n      \"editor\": \"select\",\n      \"default\": \"\",\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    },\n    \"minReactions\": {\n      \"title\": \"Minimum Reactions\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep posts with at least this many reactions. Posts without a readable reaction count are treated as zero.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000000,\n      \"editor\": \"number\"\n    },\n    \"minComments\": {\n      \"title\": \"Minimum Comments\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep posts with at least this many comments. Posts without a readable comment count are treated as zero.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000000,\n      \"editor\": \"number\"\n    },\n    \"includeReposts\": {\n      \"title\": \"Include Reposts & Quotes\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, reposts and quote posts are kept with their postType and repostOf fields. When disabled, they are dropped.\",\n      \"default\": true,\n      \"prefill\": true,\n      \"editor\": \"checkbox\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max Posts\",\n      \"type\": \"integer\",\n      \"description\": \"Global cap on post records in the dataset. Diagnostic error rows are not counted toward this cap.\",\n      \"default\": 1000,\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"editor\": \"number\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy Configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy. Supply one only if your runs are consistently blocked.\",\n      \"editor\": \"proxy\"\n    }\n  }\n}",
    "readme": "# LinkedIn Activity Feed Scraper with Engagement Filters\n\nScrape **LinkedIn profile posts, company posts, and individual public post URLs** without cookies, logins, or an API key. Get the full post text, author name and profile URL, exact publish date, reaction and comment totals, the visible comments, media, and clear original/quote/repost flags.\n\n## What this actor does\n\n- **Three modes:** `postUrls` for specific public posts, `profiles` for a profile's recent posts, and `companies` for a company's recent posts.\n- **Cookieless by design:** reads public LinkedIn pages only, so there is no session cookie to export, expire, or leak.\n- **Exact post data:** full text, author identity, ISO publish date, reaction total, comment total, media URLs, and the comments visible on the public page.\n- **Correct reshare semantics:** `postType` separates `original`, `quote`, and `repost`; `repostOf` names the original author and text when LinkedIn exposes them.\n- **Filters:** media type, post type, relative date window, minimum reactions, minimum comments, and a global record cap. Empty fields are omitted.\n\n## Output per post\n\n- `postId`, `postUrl`, `postedAt` — numeric activity ID, canonical post URL, exact ISO publish date\n- `authorName`, `authorProfileUrl`, `authorType`, `authorAvatar`, `authorFollowers` — author identity; `authorType` is `Person` or `Organization`\n- `content` — full post text\n- `hashtags` — hashtags found in the post text\n- `mediaType` — `text`, `image`, `video`, `article`, `repost`; legacy values `document`, `carousel`, `poll`, and `event` are accepted by the filter but are not exposed on public pages\n- `mediaUrls`, `mediaItems` — image URLs, or a video URL with thumbnail, duration, and embed URL\n- `articleTitle` — live article/link title when the post is an article-style or image/link share\n- `comments` — up to 10 visible comments, each with `authorName`, `text`, `postedAt`, and `reactionsCount`\n- `commentsCount` — total comment count on the post\n- `reactionsCount` — total reaction count (likes plus other reactions)\n- `postType` — `original`, `quote`, or `repost`\n- `isRepost`, `isQuotePost` — flags for reshared and quote posts\n- `repostOf` — original `authorName`, `authorProfileUrl`, `authorType`, `content`, and `postUrl` when available\n- `inputUrl` — the post or target URL that produced this record\n- `inputProfileUrl` — profile URL (mode=`profiles`)\n- `inputCompanyUrl` — company URL (mode=`companies`)\n- `dataSource` — `public-post`, `public-profile`, or `public-company`\n- `partial` — present and `true` when only the discovery stub could be read (for example, the post page was blocked)\n- `recordType` — `post` for post records, `error` for diagnostic rows\n- `scrapedAt` — ISO 8601 run timestamp\n\nLegacy compatibility fields remain part of the output contract but are omitted when the public page does not expose them: `authorHeadline`, `articleUrl`, `linkPreview`, `documentUrl`, `pollOptions`, `mentionedPeople`, `mentionedCompanies`, `reactionBreakdown`, `repostsCount`, and `viewsCount`. See **Limitations**.\n\nDiagnostic rows have `recordType: \"error\"`, `targetType`, `inputUrl`, `status` (`invalid`, `not_found`, `blocked`, `empty`, or `fetch_failed`), `error`, optional `httpStatus`, and `scrapedAt`. They are not counted toward `maxItems`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `postUrls` | `postUrls`, `profiles`, or `companies` |\n| `postUrls` | array | – | Public post URLs, feed-update URLs, activity URNs, or numeric activity IDs (mode=`postUrls`) |\n| `profileUrls` | array | – | Profile URLs or public identifiers, e.g. `https://www.linkedin.com/in/williamhgates/` or `williamhgates` (mode=`profiles`) |\n| `companyUrls` | array | – | Company URLs or slugs, e.g. `https://www.linkedin.com/company/google/` or `google` (mode=`companies`) |\n| `maxPostsPerProfile` | integer | `50` | Maximum posts kept per profile or company (1–500); public pages expose about 6–8 profile posts and 2–10 company posts |\n| `mediaType` | array | – | Keep only `text`, `image`, `video`, `article`, or `repost`; empty keeps all |\n| `postTypes` | array | `[\"text\",\"image\",\"video\",\"article\",\"document\",\"repost\"]` | Legacy type filter; left at its default it changes nothing, otherwise it is merged with `mediaType` |\n| `datePosted` | string | Any time | `\"\"` (any time), `r86400` (24 hours), `r604800` (week), or `r2592000` (month) |\n| `minReactions` | integer | `0` | Minimum reaction count |\n| `minComments` | integer | `0` | Minimum comment count |\n| `includeReposts` | boolean | `true` | Keep quote posts and reposts; set to `false` to drop them |\n| `maxItems` | integer | `1000` | Global cap on post records (1–10000); error rows do not count |\n| `proxyConfiguration` | object | – | Optional. The actor works without a proxy |\n\n### Example: one public post URL\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/posts/williamhgates_how-better-data-helped-us-cut-child-mortality-activity-7329207003942125568-_gfJ\"\n  ]\n}\n```\n\n### Example: recent posts from several profiles\n\n```json\n{\n  \"mode\": \"profiles\",\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/satyanadella/\",\n    \"https://www.linkedin.com/in/adam-grant/\"\n  ],\n  \"maxPostsPerProfile\": 8\n}\n```\n\n### Example: company posts with engagement filters\n\n```json\n{\n  \"mode\": \"companies\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/google/\"],\n  \"datePosted\": \"r2592000\",\n  \"minReactions\": 100,\n  \"includeReposts\": false\n}\n```\n\n### Example: a mixed list of posts, with comments and media\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/feed/update/urn:li:activity:7518622101692436482/\",\n    \"https://www.linkedin.com/posts/nvidia_ai-is-technology-activity-7518633624649252864-9XSo\",\n    \"https://www.linkedin.com/feed/update/urn:li:activity:7518239029990023168/\"\n  ],\n  \"mediaType\": [\"image\", \"video\", \"article\"],\n  \"minComments\": 5,\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Content research** — collect full posts and visible comments from experts, creators, and companies you track.\n- **Competitive intelligence** — monitor the latest company posts and compare engagement across peers.\n- **Lead generation** — find active, high-engagement authors and the posts that sparked discussion.\n- **Influencer vetting** — check real reaction and comment counts before a sponsorship or partnership.\n- **Campaign reporting** — export exact dates, post URLs, and engagement totals for a reporting window.\n- **Dataset building** — assemble a clean post corpus for topic modelling, sentiment analysis, or LLM training.\n\n## Limitations\n\n- **Public surfaces only.** Private profiles, member-only posts, and pages that return a login wall or HTTP 999 are reported as diagnostic error rows instead of being bypassed.\n- **Profile depth is about 6–8 posts.** A public profile page shows only its latest posts and has no \"load more\" for logged-out visitors. `maxPostsPerProfile` cannot unlock older history.\n- **Company depth is about 2–10 posts.** It comes from the company home page, not the `/posts/` tab, which is login-gated. Older company posts are not available.\n- **Comments are the visible subset.** The public page exposes up to 10 comments, with text, author name, date, and likes. It does not expose replies, comment permalinks, or commenter profile URLs.\n- **These fields are not public:** shares/reposts counts, views/impressions, per-reaction-type breakdown, reactor or liker identities, and author headlines. They are omitted rather than estimated.\n- **Some media labels are not public:** document, carousel, poll, and event posts are not distinguishable on the public post page, so they are reported as `text`, `image`, `video`, or `article` based on what the page exposes.\n- **Date filters apply to what was discovered.** In profile and company modes, only the latest page of posts is filtered; the filter does not make older posts appear.\n- **A failed hydration can produce a `partial` record.** When a profile or company page lists a post but its public post page is blocked, the record keeps the listing text, date, author, and reaction count and is marked `partial: true`.\n\n## FAQ\n\n**Do I need a LinkedIn cookie or login?**\nNo. This actor reads public LinkedIn pages only. There is no cookie field to fill and no account risk.\n\n**How many posts can I get per profile?**\nAbout 6–8 recent posts per profile. That is the public page's own limit; setting `maxPostsPerProfile` higher does not add pagination.\n\n**How many posts can I get per company?**\nAbout 2–10 recent posts from the company home page. Older company posts are behind a login wall.\n\n**Why are shares, views, or the reaction breakdown missing?**\nLinkedIn does not publish those values on public post pages. The actor deliberately omits them instead of returning zeros or guesses.\n\n**What is the difference between `quote` and `repost`?**\nA `quote` adds the sharer's own commentary above the original content. A `repost` shares the original without new commentary. `repostOf` carries the original author and text when LinkedIn exposes them.\n\n**Are the comments the full thread?**\nNo. They are the up-to-10 comments LinkedIn renders on the public page, in the order LinkedIn shows them. Replies and commenter profile URLs are not included.\n\n**Why did I get an error row instead of a post?**\nThe post, profile, or company was private, deleted, rate-limited, or returned a login wall. The row's `status` and `error` fields say which case occurred; other targets in the same run still return data.\n\n**Can I scrape a specific old post?**\nYes, if it is public. Put its URL, feed-update URL, activity URN, or numeric ID in `postUrls`.\n\n**Can I run this on a schedule?**\nYes. A daily run with one public post URL is enough to return data and keep a dataset fresh.\n\n**Is this affiliated with LinkedIn?**\nNo. This is an independent, third-party actor; it is not operated by or affiliated with LinkedIn.\n\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-activity-feed-scraper-with-engagement",
      "title": "LinkedIn Activity Feed Scraper with Engagement Filters",
      "description": "Scrape LinkedIn profile posts, company posts, and individual public post URLs without cookies. Get full text, author, exact date, reactions, comment counts, top comments, media, and repost/quote flags.",
      "version": "1.0",
      "buildTag": "latest",
      "environmentVariables": {},
      "dockerfile": "./Dockerfile",
      "readme": "# LinkedIn Activity Feed Scraper with Engagement Filters\n\nScrape **LinkedIn profile posts, company posts, and individual public post URLs** without cookies, logins, or an API key. Get the full post text, author name and profile URL, exact publish date, reaction and comment totals, the visible comments, media, and clear original/quote/repost flags.\n\n## What this actor does\n\n- **Three modes:** `postUrls` for specific public posts, `profiles` for a profile's recent posts, and `companies` for a company's recent posts.\n- **Cookieless by design:** reads public LinkedIn pages only, so there is no session cookie to export, expire, or leak.\n- **Exact post data:** full text, author identity, ISO publish date, reaction total, comment total, media URLs, and the comments visible on the public page.\n- **Correct reshare semantics:** `postType` separates `original`, `quote`, and `repost`; `repostOf` names the original author and text when LinkedIn exposes them.\n- **Filters:** media type, post type, relative date window, minimum reactions, minimum comments, and a global record cap. Empty fields are omitted.\n\n## Output per post\n\n- `postId`, `postUrl`, `postedAt` — numeric activity ID, canonical post URL, exact ISO publish date\n- `authorName`, `authorProfileUrl`, `authorType`, `authorAvatar`, `authorFollowers` — author identity; `authorType` is `Person` or `Organization`\n- `content` — full post text\n- `hashtags` — hashtags found in the post text\n- `mediaType` — `text`, `image`, `video`, `article`, `repost`; legacy values `document`, `carousel`, `poll`, and `event` are accepted by the filter but are not exposed on public pages\n- `mediaUrls`, `mediaItems` — image URLs, or a video URL with thumbnail, duration, and embed URL\n- `articleTitle` — live article/link title when the post is an article-style or image/link share\n- `comments` — up to 10 visible comments, each with `authorName`, `text`, `postedAt`, and `reactionsCount`\n- `commentsCount` — total comment count on the post\n- `reactionsCount` — total reaction count (likes plus other reactions)\n- `postType` — `original`, `quote`, or `repost`\n- `isRepost`, `isQuotePost` — flags for reshared and quote posts\n- `repostOf` — original `authorName`, `authorProfileUrl`, `authorType`, `content`, and `postUrl` when available\n- `inputUrl` — the post or target URL that produced this record\n- `inputProfileUrl` — profile URL (mode=`profiles`)\n- `inputCompanyUrl` — company URL (mode=`companies`)\n- `dataSource` — `public-post`, `public-profile`, or `public-company`\n- `partial` — present and `true` when only the discovery stub could be read (for example, the post page was blocked)\n- `recordType` — `post` for post records, `error` for diagnostic rows\n- `scrapedAt` — ISO 8601 run timestamp\n\nLegacy compatibility fields remain part of the output contract but are omitted when the public page does not expose them: `authorHeadline`, `articleUrl`, `linkPreview`, `documentUrl`, `pollOptions`, `mentionedPeople`, `mentionedCompanies`, `reactionBreakdown`, `repostsCount`, and `viewsCount`. See **Limitations**.\n\nDiagnostic rows have `recordType: \"error\"`, `targetType`, `inputUrl`, `status` (`invalid`, `not_found`, `blocked`, `empty`, or `fetch_failed`), `error`, optional `httpStatus`, and `scrapedAt`. They are not counted toward `maxItems`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `postUrls` | `postUrls`, `profiles`, or `companies` |\n| `postUrls` | array | – | Public post URLs, feed-update URLs, activity URNs, or numeric activity IDs (mode=`postUrls`) |\n| `profileUrls` | array | – | Profile URLs or public identifiers, e.g. `https://www.linkedin.com/in/williamhgates/` or `williamhgates` (mode=`profiles`) |\n| `companyUrls` | array | – | Company URLs or slugs, e.g. `https://www.linkedin.com/company/google/` or `google` (mode=`companies`) |\n| `maxPostsPerProfile` | integer | `50` | Maximum posts kept per profile or company (1–500); public pages expose about 6–8 profile posts and 2–10 company posts |\n| `mediaType` | array | – | Keep only `text`, `image`, `video`, `article`, or `repost`; empty keeps all |\n| `postTypes` | array | `[\"text\",\"image\",\"video\",\"article\",\"document\",\"repost\"]` | Legacy type filter; left at its default it changes nothing, otherwise it is merged with `mediaType` |\n| `datePosted` | string | Any time | `\"\"` (any time), `r86400` (24 hours), `r604800` (week), or `r2592000` (month) |\n| `minReactions` | integer | `0` | Minimum reaction count |\n| `minComments` | integer | `0` | Minimum comment count |\n| `includeReposts` | boolean | `true` | Keep quote posts and reposts; set to `false` to drop them |\n| `maxItems` | integer | `1000` | Global cap on post records (1–10000); error rows do not count |\n| `proxyConfiguration` | object | – | Optional. The actor works without a proxy |\n\n### Example: one public post URL\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/posts/williamhgates_how-better-data-helped-us-cut-child-mortality-activity-7329207003942125568-_gfJ\"\n  ]\n}\n```\n\n### Example: recent posts from several profiles\n\n```json\n{\n  \"mode\": \"profiles\",\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/satyanadella/\",\n    \"https://www.linkedin.com/in/adam-grant/\"\n  ],\n  \"maxPostsPerProfile\": 8\n}\n```\n\n### Example: company posts with engagement filters\n\n```json\n{\n  \"mode\": \"companies\",\n  \"companyUrls\": [\"https://www.linkedin.com/company/google/\"],\n  \"datePosted\": \"r2592000\",\n  \"minReactions\": 100,\n  \"includeReposts\": false\n}\n```\n\n### Example: a mixed list of posts, with comments and media\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/feed/update/urn:li:activity:7518622101692436482/\",\n    \"https://www.linkedin.com/posts/nvidia_ai-is-technology-activity-7518633624649252864-9XSo\",\n    \"https://www.linkedin.com/feed/update/urn:li:activity:7518239029990023168/\"\n  ],\n  \"mediaType\": [\"image\", \"video\", \"article\"],\n  \"minComments\": 5,\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Content research** — collect full posts and visible comments from experts, creators, and companies you track.\n- **Competitive intelligence** — monitor the latest company posts and compare engagement across peers.\n- **Lead generation** — find active, high-engagement authors and the posts that sparked discussion.\n- **Influencer vetting** — check real reaction and comment counts before a sponsorship or partnership.\n- **Campaign reporting** — export exact dates, post URLs, and engagement totals for a reporting window.\n- **Dataset building** — assemble a clean post corpus for topic modelling, sentiment analysis, or LLM training.\n\n## Limitations\n\n- **Public surfaces only.** Private profiles, member-only posts, and pages that return a login wall or HTTP 999 are reported as diagnostic error rows instead of being bypassed.\n- **Profile depth is about 6–8 posts.** A public profile page shows only its latest posts and has no \"load more\" for logged-out visitors. `maxPostsPerProfile` cannot unlock older history.\n- **Company depth is about 2–10 posts.** It comes from the company home page, not the `/posts/` tab, which is login-gated. Older company posts are not available.\n- **Comments are the visible subset.** The public page exposes up to 10 comments, with text, author name, date, and likes. It does not expose replies, comment permalinks, or commenter profile URLs.\n- **These fields are not public:** shares/reposts counts, views/impressions, per-reaction-type breakdown, reactor or liker identities, and author headlines. They are omitted rather than estimated.\n- **Some media labels are not public:** document, carousel, poll, and event posts are not distinguishable on the public post page, so they are reported as `text`, `image`, `video`, or `article` based on what the page exposes.\n- **Date filters apply to what was discovered.** In profile and company modes, only the latest page of posts is filtered; the filter does not make older posts appear.\n- **A failed hydration can produce a `partial` record.** When a profile or company page lists a post but its public post page is blocked, the record keeps the listing text, date, author, and reaction count and is marked `partial: true`.\n\n## FAQ\n\n**Do I need a LinkedIn cookie or login?**\nNo. This actor reads public LinkedIn pages only. There is no cookie field to fill and no account risk.\n\n**How many posts can I get per profile?**\nAbout 6–8 recent posts per profile. That is the public page's own limit; setting `maxPostsPerProfile` higher does not add pagination.\n\n**How many posts can I get per company?**\nAbout 2–10 recent posts from the company home page. Older company posts are behind a login wall.\n\n**Why are shares, views, or the reaction breakdown missing?**\nLinkedIn does not publish those values on public post pages. The actor deliberately omits them instead of returning zeros or guesses.\n\n**What is the difference between `quote` and `repost`?**\nA `quote` adds the sharer's own commentary above the original content. A `repost` shares the original without new commentary. `repostOf` carries the original author and text when LinkedIn exposes them.\n\n**Are the comments the full thread?**\nNo. They are the up-to-10 comments LinkedIn renders on the public page, in the order LinkedIn shows them. Replies and commenter profile URLs are not included.\n\n**Why did I get an error row instead of a post?**\nThe post, profile, or company was private, deleted, rate-limited, or returned a login wall. The row's `status` and `error` fields say which case occurred; other targets in the same run still return data.\n\n**Can I scrape a specific old post?**\nYes, if it is public. Put its URL, feed-update URL, activity URN, or numeric ID in `postUrls`.\n\n**Can I run this on a schedule?**\nYes. A daily run with one public post URL is enough to return data and keep a dataset fresh.\n\n**Is this affiliated with LinkedIn?**\nNo. This is an independent, third-party actor; it is not operated by or affiliated with LinkedIn.\n\r\n",
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Activity Feed Scraper with Engagement Filters Output",
        "description": "One record per LinkedIn post, with full text, author, exact date, reaction and comment totals, top comments, media, post type and repost/quote details.",
        "properties": {
          "posts": {
            "type": "string",
            "title": "LinkedIn posts",
            "description": "Dataset containing all scraped LinkedIn posts and any diagnostic error rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "LinkedIn Profile Posts",
          "views": {
            "overview": {
              "title": "Posts",
              "transformation": {
                "fields": [
                  "authorName",
                  "authorType",
                  "postedAt",
                  "content",
                  "postType",
                  "mediaType",
                  "reactionsCount",
                  "commentsCount",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "authorName": {
                    "label": "Author",
                    "format": "text"
                  },
                  "authorType": {
                    "label": "Author Type",
                    "format": "text"
                  },
                  "postedAt": {
                    "label": "Posted At",
                    "format": "datetime"
                  },
                  "content": {
                    "label": "Content",
                    "format": "text"
                  },
                  "postType": {
                    "label": "Post Type",
                    "format": "text"
                  },
                  "mediaType": {
                    "label": "Media Type",
                    "format": "text"
                  },
                  "reactionsCount": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "commentsCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "input": {
        "title": "LinkedIn Profile Posts Scraper Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "Choose what to scrape: specific public post URLs, a profile's recent posts, or a company's recent posts.",
            "editor": "select",
            "enum": [
              "postUrls",
              "profiles",
              "companies"
            ],
            "enumTitles": [
              "Public post URLs",
              "Profile recent posts",
              "Company recent posts"
            ],
            "default": "postUrls",
            "prefill": "postUrls"
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "Public LinkedIn post URLs, feed-update URLs, activity URNs or numeric activity IDs. (mode=postUrls)",
            "editor": "stringList",
            "prefill": [
              "https://www.linkedin.com/posts/williamhgates_how-better-data-helped-us-cut-child-mortality-activity-7329207003942125568-_gfJ"
            ]
          },
          "profileUrls": {
            "title": "Profile URLs",
            "type": "array",
            "description": "LinkedIn profile URLs or public identifiers, e.g. https://www.linkedin.com/in/williamhgates/ or williamhgates. (mode=profiles)",
            "editor": "stringList"
          },
          "companyUrls": {
            "title": "Company URLs",
            "type": "array",
            "description": "LinkedIn company URLs or slugs, e.g. https://www.linkedin.com/company/google/ or google. (mode=companies)",
            "editor": "stringList"
          },
          "maxPostsPerProfile": {
            "title": "Max Posts Per Target",
            "type": "integer",
            "description": "Maximum posts to keep per profile or company. Public profile pages expose about 6-8 recent posts and company home pages 2-10, so larger values do not unlock more history.",
            "default": 50,
            "minimum": 1,
            "maximum": 500,
            "editor": "number"
          },
          "mediaType": {
            "title": "Media Type Filter",
            "type": "array",
            "description": "Only keep posts of these media types. Public pages reliably expose text, image, video and article; repost is a pure reshare. Leave empty to keep all.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "image",
                "video",
                "article",
                "document",
                "carousel",
                "repost",
                "poll",
                "event"
              ],
              "enumTitles": [
                "Text only",
                "Image",
                "Video",
                "Article",
                "Document",
                "Carousel",
                "Repost",
                "Poll",
                "Event"
              ]
            }
          },
          "postTypes": {
            "title": "Post Types (legacy)",
            "type": "array",
            "description": "Legacy type filter. Left at its default of six types it changes nothing; any other selection is merged with mediaType.",
            "editor": "select",
            "default": [
              "text",
              "image",
              "video",
              "article",
              "document",
              "repost"
            ],
            "items": {
              "type": "string",
              "enum": [
                "text",
                "image",
                "video",
                "article",
                "document",
                "repost"
              ],
              "enumTitles": [
                "Text",
                "Image",
                "Video",
                "Article",
                "Document",
                "Repost"
              ]
            }
          },
          "datePosted": {
            "title": "Date Posted",
            "type": "string",
            "description": "Keep posts published within this window, measured from the run time.",
            "editor": "select",
            "default": "",
            "enum": [
              "",
              "r86400",
              "r604800",
              "r2592000"
            ],
            "enumTitles": [
              "Any time",
              "Past 24 hours",
              "Past week",
              "Past month"
            ]
          },
          "minReactions": {
            "title": "Minimum Reactions",
            "type": "integer",
            "description": "Only keep posts with at least this many reactions. Posts without a readable reaction count are treated as zero.",
            "default": 0,
            "minimum": 0,
            "maximum": 10000000,
            "editor": "number"
          },
          "minComments": {
            "title": "Minimum Comments",
            "type": "integer",
            "description": "Only keep posts with at least this many comments. Posts without a readable comment count are treated as zero.",
            "default": 0,
            "minimum": 0,
            "maximum": 10000000,
            "editor": "number"
          },
          "includeReposts": {
            "title": "Include Reposts & Quotes",
            "type": "boolean",
            "description": "When enabled, reposts and quote posts are kept with their postType and repostOf fields. When disabled, they are dropped.",
            "default": true,
            "prefill": true,
            "editor": "checkbox"
          },
          "maxItems": {
            "title": "Max Posts",
            "type": "integer",
            "description": "Global cap on post records in the dataset. Diagnostic error rows are not counted toward this cap.",
            "default": 1000,
            "minimum": 1,
            "maximum": 10000,
            "editor": "number"
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy. Supply one only if your runs are consistently blocked.",
            "editor": "proxy"
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "001c5f0d72aa6b37f7149f582c3779271e0c6a62c5a4c897f08bcc0cbea814de",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.020097777777777777
    }
  }
}