{
  "data": {
    "id": "NnpM3ONrdHeX2rfXi",
    "actId": "bTHVIwGpTDUckiRZf",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-30T07:56:40.692Z",
    "finishedAt": "2026-10-30T07:56:50.351Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9577,
      "runTimeSecs": 9.577,
      "computeUnits": 0.010641111111111112,
      "imageSizeBytes": 359302144
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Hashtag Posts Scraper Input\",\n  \"description\": \"Collect public LinkedIn posts for one or more hashtags. No LinkedIn login or cookie is needed.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"required\": [\n    \"hashtags\"\n  ],\n  \"properties\": {\n    \"hashtags\": {\n      \"title\": \"Hashtags\",\n      \"type\": \"array\",\n      \"description\": \"Hashtags to collect. Accepts #AI, AI, artificial-intelligence, https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai. Duplicates are removed.\",\n      \"editor\": \"stringList\",\n      \"minItems\": 1,\n      \"maxItems\": 20,\n      \"uniqueItems\": true,\n      \"prefill\": [\n        \"AI\"\n      ]\n    },\n    \"maxPostsPerHashtag\": {\n      \"title\": \"Max Posts Per Hashtag\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum posts to keep for each hashtag after the hashtag check and filters are applied.\",\n      \"default\": 50,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 500\n    },\n    \"datePosted\": {\n      \"title\": \"Date Posted\",\n      \"type\": \"string\",\n      \"description\": \"Restrict posts to a recent window. Applied by the search index and re-checked against each post's published 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 After\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts published on or after this date (YYYY-MM-DD, UTC day). Leave empty to disable.\",\n      \"editor\": \"datepicker\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Posted Before\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts published on or before this date (YYYY-MM-DD, whole UTC day). Leave empty to disable.\",\n      \"editor\": \"datepicker\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"sortBy\": {\n      \"title\": \"Sort By\",\n      \"type\": \"string\",\n      \"description\": \"Order the posts found in this run. Relevance keeps the search index order; date and engagement sort only the posts that were found, not all of LinkedIn.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"date\",\n        \"engagement\"\n      ],\n      \"enumTitles\": [\n        \"Relevance (index order)\",\n        \"Newest first\",\n        \"Most engagement first\"\n      ],\n      \"default\": \"relevance\",\n      \"prefill\": \"relevance\"\n    },\n    \"mediaTypeFilter\": {\n      \"title\": \"Media Type\",\n      \"type\": \"string\",\n      \"description\": \"Keep only one post type. Text, image, video, article and repost are the types public posts expose most often.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"text\",\n        \"image\",\n        \"video\",\n        \"article\",\n        \"document\",\n        \"repost\",\n        \"poll\"\n      ],\n      \"enumTitles\": [\n        \"All types\",\n        \"Text only\",\n        \"Image\",\n        \"Video\",\n        \"Article\",\n        \"Document\",\n        \"Repost\",\n        \"Poll\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"authorType\": {\n      \"title\": \"Author Type\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts written by a person or by a company page. Author type is read from the public author profile link.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"PERSON\",\n        \"COMPANY\"\n      ],\n      \"enumTitles\": [\n        \"Anyone\",\n        \"People\",\n        \"Companies\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"minReactions\": {\n      \"title\": \"Minimum Reactions\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer than this many reactions. A post with no visible reaction count is treated as 0.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"minComments\": {\n      \"title\": \"Minimum Comments\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer than this many comments. A post with no visible comment count is treated as 0.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"includeComments\": {\n      \"title\": \"Include Comments\",\n      \"type\": \"boolean\",\n      \"description\": \"Include the first public page of comments (up to 10) with each post. No extra request is made.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeVideoTranscript\": {\n      \"title\": \"Include Video Transcript\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the public transcript and caption URL when a video post publishes them.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeReposts\": {\n      \"title\": \"Exclude Reposts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts that reshare another post.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"dedupeAcrossHashtags\": {\n      \"title\": \"Dedupe Across Hashtags\",\n      \"type\": \"boolean\",\n      \"description\": \"Return each post once even when it appears under several requested hashtags. By default a post is returned once per hashtag.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  }\n}",
    "readme": "# LinkedIn Hashtag Post Monitor Scraper\n\nTrack what a professional community is publishing under a LinkedIn hashtag. Give this actor one or more hashtags and it returns the public posts behind them: full text, author identity and followers, media, reactions, comment totals and the first page of comments. No LinkedIn account, session cookie or proxy setup is required.\n\n## What it does\n\n- **Hashtag monitoring, not keyword guessing** — every returned post is checked to carry the requested hashtag in its own public text, so off-topic index results are dropped\n- **Batch hashtags** — collect several tags in one run, or return each post once across them with `dedupeAcrossHashtags`\n- **Date precision** — combine a quick recency window (`datePosted`) with exact `postedAfter` / `postedBefore` dates\n- **Engagement and audience filters** — minimum reactions, minimum comments, person vs company authors, media type, and an optional repost exclusion\n- **Post depth** — author followers and avatar, images or video, video transcript on request, repost origin, and up to 10 public comments\n- **Local sorting** — order by relevance, newest first, or highest total engagement\n- Empty fields are omitted from each record rather than written as `null` or `0`\n\n## Services\n\n- **Hashtag discovery** across the public web index for `linkedin.com/posts`\n- **Public post hydration** for text, author, date, media and engagement\n- **First-page comment capture** without a login\n- **Video transcript and caption extraction** for posts that publish them\n- **Repost detection** with the original author and text\n- **Hashtag verification** so a post is only attributed to a tag it actually uses\n\n## How it works\n\nLinkedIn does not publish a cookieless hashtag feed, so this actor finds posts through a public search index and then opens each post's public page. During that second step it reads the post's structured public data, re-checks the hashtag in the text, and applies your date, media, author and engagement filters locally. If a post's page is sign-up walled or deleted, that post is skipped; the run never inserts placeholder or status rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `hashtags` | array | – | Required. `#AI`, `AI`, `artificial-intelligence`, or a LinkedIn hashtag URL. Up to 20, deduplicated. |\n| `maxPostsPerHashtag` | integer | `50` | Posts to keep per hashtag after verification and filters (1–500). |\n| `datePosted` | string | any time | `r86400` (24h), `r604800` (week) or `r2592000` (month). |\n| `postedAfter` | date | – | Keep posts on or after this UTC day. |\n| `postedBefore` | date | – | Keep posts on or before this UTC day. |\n| `sortBy` | string | `relevance` | `relevance`, `date` (newest first) or `engagement`. |\n| `mediaTypeFilter` | string | all | `text`, `image`, `video`, `article`, `document`, `repost` or `poll`. |\n| `authorType` | string | anyone | `PERSON` or `COMPANY`. |\n| `minReactions` | integer | `0` | Drop posts below this reaction count. |\n| `minComments` | integer | `0` | Drop posts below this comment count. |\n| `includeComments` | boolean | `true` | Add the first public comment page (max 10). |\n| `includeVideoTranscript` | boolean | `false` | Add transcript and caption URL when published. |\n| `excludeReposts` | boolean | `false` | Drop reshared posts. |\n| `dedupeAcrossHashtags` | boolean | `false` | One row per post across all requested hashtags. |\n\n### Example: weekly AI pulse\n\n```json\n{\n  \"hashtags\": [\"AI\", \"MachineLearning\"],\n  \"datePosted\": \"r604800\",\n  \"sortBy\": \"engagement\",\n  \"minReactions\": 25,\n  \"maxPostsPerHashtag\": 100\n}\n```\n\n### Example: company voices in an exact date range\n\n```json\n{\n  \"hashtags\": [\"ProductManagement\"],\n  \"postedAfter\": \"2026-10-01\",\n  \"postedBefore\": \"2026-10-31\",\n  \"authorType\": \"COMPANY\",\n  \"excludeReposts\": true\n}\n```\n\n### Example: video posts with transcripts\n\n```json\n{\n  \"hashtags\": [\"https://www.linkedin.com/feed/hashtag/generativeai/\"],\n  \"mediaTypeFilter\": \"video\",\n  \"includeVideoTranscript\": true,\n  \"maxPostsPerHashtag\": 20\n}\n```\n\n## Output\n\n| Field | Description |\n|---|---|\n| `postId` | LinkedIn activity ID |\n| `postUrl` | Canonical public post URL |\n| `hashtag` | The requested hashtag that produced this row (lowercase, no `#`) |\n| `hashtags` | Every hashtag found in the post text |\n| `matchedHashtags` | Requested hashtags that appear in this post |\n| `authorName` | Author display name |\n| `authorProfileUrl` | Canonical LinkedIn profile or company URL |\n| `authorType` | `person`, `company`, `school` or `unknown` |\n| `authorAvatar` | Author image URL when public |\n| `authorFollowers` | Author follower count when public |\n| `authorHeadline` | Author headline, only when the public post includes one |\n| `postedAt` | Publication time, ISO 8601 UTC |\n| `content` | Full public post text |\n| `headline` | Post headline or title |\n| `mediaType` | `text`, `image`, `video`, `article`, `document` or `repost` |\n| `imageUrls` | Image URLs on the post |\n| `videoUrl` | Public MP4 URL for video posts |\n| `videoDuration` | ISO 8601 duration (e.g. `PT3M36S`) |\n| `videoTranscript` | Transcript text when requested and published |\n| `videoCaptionUrl` | Caption file URL when requested and published |\n| `reactionsCount` | Total reactions |\n| `commentsCount` | Total comments on the post |\n| `comments` | Up to 10 public comments: `authorName`, `text`, `postedAt`, `likes` |\n| `isRepost`, `repostOf` | Repost flag and the original `authorName`, `authorProfileUrl`, `content`, `postUrl` |\n| `mediaItems`, `mediaUrls` | Structured media list and flat URL list |\n| `articleTitle`, `articleUrl` | Article details when the post shares an article |\n| `scrapedAt` | When this row was collected |\n\n## Usage cost\n\nThis actor is billed per delivered result plus normal Apify platform usage (compute and storage). The daily test uses a tiny prefill, and the actor stops as soon as it reaches `maxPostsPerHashtag`. Larger hashtag sets, deep caps and transcript collection take longer and therefore use more compute. See the Store listing for the current per-result price.\n\n## Use cases\n\n- **Community listening** — see what practitioners post under an industry tag this week\n- **Creator and expert discovery** — rank authors by engagement and follower count on a topic\n- **Campaign tracking** — follow a branded hashtag and compare post volume and reactions over time\n- **Content benchmarking** — collect the top posts in a niche before planning your own\n- **Competitive voice analysis** — separate company-page posts from individual posts\n- **Research datasets** — export hashtag posts with dates and engagement for analysis\n\n## FAQ\n\n**Do I need a LinkedIn account or cookie?**\nNo. The actor reads public post pages only and never asks for credentials.\n\n**Why does a hashtag return few or zero posts?**\nLinkedIn's hashtag feed is login-gated, so discovery relies on a public search index that is not exhaustive and lags behind the site. Popular tags and wider date windows return more. The run status explains whether the index was empty, the post pages were walled, the hashtag check failed, or your filters removed everything.\n\n**Why is the comment list capped at 10?**\nPublic post pages expose only the first comment page. The total is still in `commentsCount`; older comments require a signed-in session, which this actor does not use.\n\n**Why are `repostsCount`, `viewsCount` or a reaction breakdown missing?**\nLinkedIn does not publish share counts, view counts or per-reaction splits on public posts. Those fields are omitted rather than filled with invented zeros.\n\n**Why is `authorHeadline` missing on many rows?**\nHeadlines live on profile pages, not on public post pages, and profile pages are frequently blocked. The field appears only when the post itself publishes it.\n\n**Can I get posts from several hashtags at once?**\nYes. Add up to 20 tags. By default each post is returned once per matching hashtag; set `dedupeAcrossHashtags` to return it once.\n\n**Is sorting global?**\nNo. Sorting applies to the posts found in this run. The public index has no sort parameter, so `date` and `engagement` order the collected set, not all of LinkedIn.\n\n**How fresh is the data?**\nThe index can take days to pick up new posts. Use the past week or month for monitoring, and treat the 24-hour window as best-effort.\n\n**Does a hashtag URL work?**\nYes. Paste `https://www.linkedin.com/feed/hashtag/ai/` or `.../feed/hashtag/?keywords=ai`; it is normalized to `ai`.\n\n**Is this affiliated with LinkedIn?**\nNo. It is an independent third-party actor that reads public pages. It is not affiliated with or endorsed by LinkedIn Corporation.\n\n## Notes\n\n- Hashtag matching is case-insensitive and ignores hyphens/underscores, so `#MachineLearning` and `#machine-learning` are treated as the same tag.\n- A post with no visible reaction or comment count is treated as `0` when a minimum filter is set.\n- `postedBefore` includes the whole chosen UTC day; timestamps inside the input are used exactly.\n- Reposts are returned by default with `mediaType: repost` and the original post in `repostOf`.\n- A zero-result run is a valid result: the dataset stays empty and the status message explains why.\n\n## Limitations\n\n- **No direct hashtag feed.** LinkedIn login-gates every hashtag page, so coverage depends on the public search index and is not guaranteed to be complete.\n- **Index lag.** Very recent posts may not be indexed yet; the 24-hour filter can be sparse.\n- **First comment page only.** Public pages show up to 10 comments; full threads need a login.\n- **No repost, view or reaction-type counts.** These are not published publicly.\n- **Author headlines are rare.** Profile enrichment is not performed because profile pages are inconsistently reachable.\n- **Document, poll, carousel and event posts** are classified only when the public page exposes a matching shape; document posts are occasionally seen, while poll, carousel and event shapes have not been observed, so the `poll` filter can return no rows. The enum values are kept for forward compatibility.\n- **Set-local sorting.** Ordering applies to the posts found in the current run.\n- **Practical caps.** Each hashtag is limited to 500 posts, and the search index itself may stop returning new results before that.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-hashtag-feed-engagement-scraper",
      "title": "LinkedIn Hashtag Post Monitor Scraper",
      "description": "Scrape public LinkedIn posts for any hashtag: full text, author, followers, media, engagement and first-page comments. Multiple hashtags, date and engagement filters, no login or cookie.",
      "version": "2.0",
      "buildTag": "latest",
      "environmentVariables": {},
      "dockerfile": "./Dockerfile",
      "readme": "# LinkedIn Hashtag Post Monitor Scraper\n\nTrack what a professional community is publishing under a LinkedIn hashtag. Give this actor one or more hashtags and it returns the public posts behind them: full text, author identity and followers, media, reactions, comment totals and the first page of comments. No LinkedIn account, session cookie or proxy setup is required.\n\n## What it does\n\n- **Hashtag monitoring, not keyword guessing** — every returned post is checked to carry the requested hashtag in its own public text, so off-topic index results are dropped\n- **Batch hashtags** — collect several tags in one run, or return each post once across them with `dedupeAcrossHashtags`\n- **Date precision** — combine a quick recency window (`datePosted`) with exact `postedAfter` / `postedBefore` dates\n- **Engagement and audience filters** — minimum reactions, minimum comments, person vs company authors, media type, and an optional repost exclusion\n- **Post depth** — author followers and avatar, images or video, video transcript on request, repost origin, and up to 10 public comments\n- **Local sorting** — order by relevance, newest first, or highest total engagement\n- Empty fields are omitted from each record rather than written as `null` or `0`\n\n## Services\n\n- **Hashtag discovery** across the public web index for `linkedin.com/posts`\n- **Public post hydration** for text, author, date, media and engagement\n- **First-page comment capture** without a login\n- **Video transcript and caption extraction** for posts that publish them\n- **Repost detection** with the original author and text\n- **Hashtag verification** so a post is only attributed to a tag it actually uses\n\n## How it works\n\nLinkedIn does not publish a cookieless hashtag feed, so this actor finds posts through a public search index and then opens each post's public page. During that second step it reads the post's structured public data, re-checks the hashtag in the text, and applies your date, media, author and engagement filters locally. If a post's page is sign-up walled or deleted, that post is skipped; the run never inserts placeholder or status rows.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `hashtags` | array | – | Required. `#AI`, `AI`, `artificial-intelligence`, or a LinkedIn hashtag URL. Up to 20, deduplicated. |\n| `maxPostsPerHashtag` | integer | `50` | Posts to keep per hashtag after verification and filters (1–500). |\n| `datePosted` | string | any time | `r86400` (24h), `r604800` (week) or `r2592000` (month). |\n| `postedAfter` | date | – | Keep posts on or after this UTC day. |\n| `postedBefore` | date | – | Keep posts on or before this UTC day. |\n| `sortBy` | string | `relevance` | `relevance`, `date` (newest first) or `engagement`. |\n| `mediaTypeFilter` | string | all | `text`, `image`, `video`, `article`, `document`, `repost` or `poll`. |\n| `authorType` | string | anyone | `PERSON` or `COMPANY`. |\n| `minReactions` | integer | `0` | Drop posts below this reaction count. |\n| `minComments` | integer | `0` | Drop posts below this comment count. |\n| `includeComments` | boolean | `true` | Add the first public comment page (max 10). |\n| `includeVideoTranscript` | boolean | `false` | Add transcript and caption URL when published. |\n| `excludeReposts` | boolean | `false` | Drop reshared posts. |\n| `dedupeAcrossHashtags` | boolean | `false` | One row per post across all requested hashtags. |\n\n### Example: weekly AI pulse\n\n```json\n{\n  \"hashtags\": [\"AI\", \"MachineLearning\"],\n  \"datePosted\": \"r604800\",\n  \"sortBy\": \"engagement\",\n  \"minReactions\": 25,\n  \"maxPostsPerHashtag\": 100\n}\n```\n\n### Example: company voices in an exact date range\n\n```json\n{\n  \"hashtags\": [\"ProductManagement\"],\n  \"postedAfter\": \"2026-10-01\",\n  \"postedBefore\": \"2026-10-31\",\n  \"authorType\": \"COMPANY\",\n  \"excludeReposts\": true\n}\n```\n\n### Example: video posts with transcripts\n\n```json\n{\n  \"hashtags\": [\"https://www.linkedin.com/feed/hashtag/generativeai/\"],\n  \"mediaTypeFilter\": \"video\",\n  \"includeVideoTranscript\": true,\n  \"maxPostsPerHashtag\": 20\n}\n```\n\n## Output\n\n| Field | Description |\n|---|---|\n| `postId` | LinkedIn activity ID |\n| `postUrl` | Canonical public post URL |\n| `hashtag` | The requested hashtag that produced this row (lowercase, no `#`) |\n| `hashtags` | Every hashtag found in the post text |\n| `matchedHashtags` | Requested hashtags that appear in this post |\n| `authorName` | Author display name |\n| `authorProfileUrl` | Canonical LinkedIn profile or company URL |\n| `authorType` | `person`, `company`, `school` or `unknown` |\n| `authorAvatar` | Author image URL when public |\n| `authorFollowers` | Author follower count when public |\n| `authorHeadline` | Author headline, only when the public post includes one |\n| `postedAt` | Publication time, ISO 8601 UTC |\n| `content` | Full public post text |\n| `headline` | Post headline or title |\n| `mediaType` | `text`, `image`, `video`, `article`, `document` or `repost` |\n| `imageUrls` | Image URLs on the post |\n| `videoUrl` | Public MP4 URL for video posts |\n| `videoDuration` | ISO 8601 duration (e.g. `PT3M36S`) |\n| `videoTranscript` | Transcript text when requested and published |\n| `videoCaptionUrl` | Caption file URL when requested and published |\n| `reactionsCount` | Total reactions |\n| `commentsCount` | Total comments on the post |\n| `comments` | Up to 10 public comments: `authorName`, `text`, `postedAt`, `likes` |\n| `isRepost`, `repostOf` | Repost flag and the original `authorName`, `authorProfileUrl`, `content`, `postUrl` |\n| `mediaItems`, `mediaUrls` | Structured media list and flat URL list |\n| `articleTitle`, `articleUrl` | Article details when the post shares an article |\n| `scrapedAt` | When this row was collected |\n\n## Usage cost\n\nThis actor is billed per delivered result plus normal Apify platform usage (compute and storage). The daily test uses a tiny prefill, and the actor stops as soon as it reaches `maxPostsPerHashtag`. Larger hashtag sets, deep caps and transcript collection take longer and therefore use more compute. See the Store listing for the current per-result price.\n\n## Use cases\n\n- **Community listening** — see what practitioners post under an industry tag this week\n- **Creator and expert discovery** — rank authors by engagement and follower count on a topic\n- **Campaign tracking** — follow a branded hashtag and compare post volume and reactions over time\n- **Content benchmarking** — collect the top posts in a niche before planning your own\n- **Competitive voice analysis** — separate company-page posts from individual posts\n- **Research datasets** — export hashtag posts with dates and engagement for analysis\n\n## FAQ\n\n**Do I need a LinkedIn account or cookie?**\nNo. The actor reads public post pages only and never asks for credentials.\n\n**Why does a hashtag return few or zero posts?**\nLinkedIn's hashtag feed is login-gated, so discovery relies on a public search index that is not exhaustive and lags behind the site. Popular tags and wider date windows return more. The run status explains whether the index was empty, the post pages were walled, the hashtag check failed, or your filters removed everything.\n\n**Why is the comment list capped at 10?**\nPublic post pages expose only the first comment page. The total is still in `commentsCount`; older comments require a signed-in session, which this actor does not use.\n\n**Why are `repostsCount`, `viewsCount` or a reaction breakdown missing?**\nLinkedIn does not publish share counts, view counts or per-reaction splits on public posts. Those fields are omitted rather than filled with invented zeros.\n\n**Why is `authorHeadline` missing on many rows?**\nHeadlines live on profile pages, not on public post pages, and profile pages are frequently blocked. The field appears only when the post itself publishes it.\n\n**Can I get posts from several hashtags at once?**\nYes. Add up to 20 tags. By default each post is returned once per matching hashtag; set `dedupeAcrossHashtags` to return it once.\n\n**Is sorting global?**\nNo. Sorting applies to the posts found in this run. The public index has no sort parameter, so `date` and `engagement` order the collected set, not all of LinkedIn.\n\n**How fresh is the data?**\nThe index can take days to pick up new posts. Use the past week or month for monitoring, and treat the 24-hour window as best-effort.\n\n**Does a hashtag URL work?**\nYes. Paste `https://www.linkedin.com/feed/hashtag/ai/` or `.../feed/hashtag/?keywords=ai`; it is normalized to `ai`.\n\n**Is this affiliated with LinkedIn?**\nNo. It is an independent third-party actor that reads public pages. It is not affiliated with or endorsed by LinkedIn Corporation.\n\n## Notes\n\n- Hashtag matching is case-insensitive and ignores hyphens/underscores, so `#MachineLearning` and `#machine-learning` are treated as the same tag.\n- A post with no visible reaction or comment count is treated as `0` when a minimum filter is set.\n- `postedBefore` includes the whole chosen UTC day; timestamps inside the input are used exactly.\n- Reposts are returned by default with `mediaType: repost` and the original post in `repostOf`.\n- A zero-result run is a valid result: the dataset stays empty and the status message explains why.\n\n## Limitations\n\n- **No direct hashtag feed.** LinkedIn login-gates every hashtag page, so coverage depends on the public search index and is not guaranteed to be complete.\n- **Index lag.** Very recent posts may not be indexed yet; the 24-hour filter can be sparse.\n- **First comment page only.** Public pages show up to 10 comments; full threads need a login.\n- **No repost, view or reaction-type counts.** These are not published publicly.\n- **Author headlines are rare.** Profile enrichment is not performed because profile pages are inconsistently reachable.\n- **Document, poll, carousel and event posts** are classified only when the public page exposes a matching shape; document posts are occasionally seen, while poll, carousel and event shapes have not been observed, so the `poll` filter can return no rows. The enum values are kept for forward compatibility.\n- **Set-local sorting.** Ordering applies to the posts found in the current run.\n- **Practical caps.** Each hashtag is limited to 500 posts, and the search index itself may stop returning new results before that.\n",
      "input": {
        "title": "LinkedIn Hashtag Posts Scraper Input",
        "description": "Collect public LinkedIn posts for one or more hashtags. No LinkedIn login or cookie is needed.",
        "type": "object",
        "schemaVersion": 1,
        "required": [
          "hashtags"
        ],
        "properties": {
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags to collect. Accepts #AI, AI, artificial-intelligence, https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai. Duplicates are removed.",
            "editor": "stringList",
            "minItems": 1,
            "maxItems": 20,
            "uniqueItems": true,
            "prefill": [
              "AI"
            ]
          },
          "maxPostsPerHashtag": {
            "title": "Max Posts Per Hashtag",
            "type": "integer",
            "description": "Maximum posts to keep for each hashtag after the hashtag check and filters are applied.",
            "default": 50,
            "prefill": 3,
            "minimum": 1,
            "maximum": 500
          },
          "datePosted": {
            "title": "Date Posted",
            "type": "string",
            "description": "Restrict posts to a recent window. Applied by the search index and re-checked against each post's published date.",
            "editor": "select",
            "enum": [
              "",
              "r86400",
              "r604800",
              "r2592000"
            ],
            "enumTitles": [
              "Any time",
              "Past 24 hours",
              "Past week",
              "Past month"
            ],
            "default": "",
            "prefill": ""
          },
          "postedAfter": {
            "title": "Posted After",
            "type": "string",
            "description": "Keep posts published on or after this date (YYYY-MM-DD, UTC day). Leave empty to disable.",
            "editor": "datepicker",
            "default": "",
            "prefill": ""
          },
          "postedBefore": {
            "title": "Posted Before",
            "type": "string",
            "description": "Keep posts published on or before this date (YYYY-MM-DD, whole UTC day). Leave empty to disable.",
            "editor": "datepicker",
            "default": "",
            "prefill": ""
          },
          "sortBy": {
            "title": "Sort By",
            "type": "string",
            "description": "Order the posts found in this run. Relevance keeps the search index order; date and engagement sort only the posts that were found, not all of LinkedIn.",
            "editor": "select",
            "enum": [
              "relevance",
              "date",
              "engagement"
            ],
            "enumTitles": [
              "Relevance (index order)",
              "Newest first",
              "Most engagement first"
            ],
            "default": "relevance",
            "prefill": "relevance"
          },
          "mediaTypeFilter": {
            "title": "Media Type",
            "type": "string",
            "description": "Keep only one post type. Text, image, video, article and repost are the types public posts expose most often.",
            "editor": "select",
            "enum": [
              "",
              "text",
              "image",
              "video",
              "article",
              "document",
              "repost",
              "poll"
            ],
            "enumTitles": [
              "All types",
              "Text only",
              "Image",
              "Video",
              "Article",
              "Document",
              "Repost",
              "Poll"
            ],
            "default": "",
            "prefill": ""
          },
          "authorType": {
            "title": "Author Type",
            "type": "string",
            "description": "Keep only posts written by a person or by a company page. Author type is read from the public author profile link.",
            "editor": "select",
            "enum": [
              "",
              "PERSON",
              "COMPANY"
            ],
            "enumTitles": [
              "Anyone",
              "People",
              "Companies"
            ],
            "default": "",
            "prefill": ""
          },
          "minReactions": {
            "title": "Minimum Reactions",
            "type": "integer",
            "description": "Drop posts with fewer than this many reactions. A post with no visible reaction count is treated as 0.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 1000000
          },
          "minComments": {
            "title": "Minimum Comments",
            "type": "integer",
            "description": "Drop posts with fewer than this many comments. A post with no visible comment count is treated as 0.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 1000000
          },
          "includeComments": {
            "title": "Include Comments",
            "type": "boolean",
            "description": "Include the first public page of comments (up to 10) with each post. No extra request is made.",
            "default": true,
            "prefill": true
          },
          "includeVideoTranscript": {
            "title": "Include Video Transcript",
            "type": "boolean",
            "description": "Add the public transcript and caption URL when a video post publishes them.",
            "default": false,
            "prefill": false
          },
          "excludeReposts": {
            "title": "Exclude Reposts",
            "type": "boolean",
            "description": "Drop posts that reshare another post.",
            "default": false,
            "prefill": false
          },
          "dedupeAcrossHashtags": {
            "title": "Dedupe Across Hashtags",
            "type": "boolean",
            "description": "Return each post once even when it appears under several requested hashtags. By default a post is returned once per hashtag.",
            "default": false,
            "prefill": false
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Hashtag Posts Scraper Output",
        "description": "One record per public LinkedIn post found for a hashtag, with author, followers, text, media, engagement and first-page comments.",
        "properties": {
          "posts": {
            "type": "string",
            "title": "LinkedIn Hashtag Posts",
            "description": "Dataset containing every hashtag post collected in the run.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultRunOptions": {
        "memoryMbytes": 1024
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "LinkedIn Hashtag Posts",
          "views": {
            "overview": {
              "title": "Posts",
              "transformation": {
                "fields": [
                  "hashtag",
                  "authorName",
                  "authorFollowers",
                  "postedAt",
                  "content",
                  "mediaType",
                  "reactionsCount",
                  "commentsCount",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "hashtag": {
                    "label": "Hashtag",
                    "format": "text"
                  },
                  "authorName": {
                    "label": "Author",
                    "format": "text"
                  },
                  "authorFollowers": {
                    "label": "Followers",
                    "format": "number"
                  },
                  "postedAt": {
                    "label": "Posted At",
                    "format": "datetime"
                  },
                  "content": {
                    "label": "Content",
                    "format": "text"
                  },
                  "mediaType": {
                    "label": "Media Type",
                    "format": "text"
                  },
                  "reactionsCount": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "commentsCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.1",
    "imageDigest": "8065dfd15f5384e0eb5c713245611d36f674f1fc762526bda8f41fa1c2598fcf",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.010641111111111112
    }
  }
}