{
  "data": {
    "id": "zL8UURqaufW1YxiHA",
    "actId": "wuq1JzPEwyJuIWboy",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-17T15:56:30.487Z",
    "finishedAt": "2026-10-17T15:56:35.570Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4981,
      "runTimeSecs": 4.981,
      "computeUnits": 0.005534444444444444,
      "imageSizeBytes": 368732672
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Keyword & Hashtag Post Discovery Scraper Input\",\n  \"description\": \"Search public LinkedIn posts by keyword or hashtag, or enrich specific post URLs. No LinkedIn cookie or login is needed.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"required\": [],\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to run. 'auto' searches when searchQuery/searchQueries are set and enriches when postUrls are set (both can run together).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"search\",\n        \"postUrls\"\n      ],\n      \"enumTitles\": [\n        \"Automatic (recommended)\",\n        \"Search by keyword or hashtag\",\n        \"Enrich these post URLs\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search Query\",\n      \"type\": \"string\",\n      \"description\": \"Keyword, phrase, or hashtag to find in public LinkedIn posts. Examples: 'artificial intelligence', '\\\"product launch\\\"', '#MachineLearning'. (mode=search/auto)\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"artificial intelligence\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search Queries (batch)\",\n      \"type\": \"array\",\n      \"description\": \"Additional queries to run in the same run; each is searched independently, duplicates are delivered once. Combine with Search Query. (mode=search/auto)\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn post or article URLs to enrich directly (activity, share, ugcPost, feed/update, /pulse/ links and country subdomains). (mode=postUrls/auto)\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"sortBy\": {\n      \"title\": \"Sort By\",\n      \"type\": \"string\",\n      \"description\": \"How to order the posts that were found. 'relevance' keeps the search engine's order; 'recency' sorts the found posts by date (newest first).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"recency\",\n        \"date_posted\"\n      ],\n      \"enumTitles\": [\n        \"Most relevant\",\n        \"Most recent (of found posts)\",\n        \"Most recent (date_posted alias)\"\n      ],\n      \"default\": \"relevance\",\n      \"prefill\": \"relevance\"\n    },\n    \"datePosted\": {\n      \"title\": \"Date Posted\",\n      \"type\": \"string\",\n      \"description\": \"Only keep posts from this time window.\",\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\": \"Only keep posts published on or after this date (YYYY-MM-DD). Leave empty to disable.\",\n      \"editor\": \"datepicker\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Posted Before\",\n      \"type\": \"string\",\n      \"description\": \"Only keep posts published on or before this date (YYYY-MM-DD). Leave empty to disable.\",\n      \"editor\": \"datepicker\",\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. Applied after each post is opened, so a post whose author type cannot be determined is kept.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"PERSON\",\n        \"COMPANY\"\n      ],\n      \"enumTitles\": [\n        \"Anyone\",\n        \"People only\",\n        \"Companies only\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"contentType\": {\n      \"title\": \"Content Types\",\n      \"type\": \"array\",\n      \"description\": \"Keep only these post types: articles (LinkedIn articles), posts (text/reposts/polls/events), documents (PDF/PPTX document cards), videos, images.\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"articles\",\n        \"posts\",\n        \"documents\",\n        \"videos\",\n        \"images\"\n      ],\n      \"prefill\": [\n        \"articles\",\n        \"posts\",\n        \"documents\",\n        \"videos\",\n        \"images\"\n      ]\n    },\n    \"minReactions\": {\n      \"title\": \"Minimum Reactions\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only posts with at least this many reactions. Posts whose reaction count is unknown are skipped when this is above 0.\",\n      \"editor\": \"number\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"minComments\": {\n      \"title\": \"Minimum Comments\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only posts with at least this many comments. Posts whose comment count is unknown are skipped when this is above 0.\",\n      \"editor\": \"number\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"excludeReposts\": {\n      \"title\": \"Exclude Reposts\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, skip posts that repeat someone else's content.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeUnmatched\": {\n      \"title\": \"Also Return Loose Matches\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, posts that do not show every word of your query are also returned, marked keywordMatch: false. Useful for hashtags.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Preferred interface language used when opening each post page (affects LinkedIn's rendered text).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"pt\",\n        \"it\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Portuguese\",\n        \"Italian\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    },\n    \"countryCode\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Prefer LinkedIn posts indexed on this country's LinkedIn domain (site:xx.linkedin.com). 'auto' uses linkedin.com worldwide.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"us\",\n        \"gb\",\n        \"de\",\n        \"fr\",\n        \"es\",\n        \"it\",\n        \"pt\",\n        \"nl\",\n        \"br\",\n        \"in\",\n        \"ca\",\n        \"au\",\n        \"mx\",\n        \"jp\",\n        \"sg\",\n        \"ae\",\n        \"sa\",\n        \"za\",\n        \"ng\",\n        \"pk\",\n        \"id\",\n        \"ph\",\n        \"my\",\n        \"pl\",\n        \"se\",\n        \"ch\",\n        \"at\",\n        \"be\",\n        \"dk\",\n        \"ie\"\n      ],\n      \"enumTitles\": [\n        \"Automatic (worldwide)\",\n        \"United States\",\n        \"United Kingdom\",\n        \"Germany\",\n        \"France\",\n        \"Spain\",\n        \"Italy\",\n        \"Portugal\",\n        \"Netherlands\",\n        \"Brazil\",\n        \"India\",\n        \"Canada\",\n        \"Australia\",\n        \"Mexico\",\n        \"Japan\",\n        \"Singapore\",\n        \"United Arab Emirates\",\n        \"Saudi Arabia\",\n        \"South Africa\",\n        \"Nigeria\",\n        \"Pakistan\",\n        \"Indonesia\",\n        \"Philippines\",\n        \"Malaysia\",\n        \"Poland\",\n        \"Sweden\",\n        \"Switzerland\",\n        \"Austria\",\n        \"Belgium\",\n        \"Denmark\",\n        \"Ireland\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"maxResults\": {\n      \"title\": \"Max Results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of posts to return per run, after filters. The search index holds fewer posts for narrow queries.\",\n      \"editor\": \"number\",\n      \"default\": 25,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 200\n    },\n    \"hydratePosts\": {\n      \"title\": \"Open Each Post Page\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, each found post is opened so the record carries the full text, author, date, engagement counts and top comments. Turn off for faster runs with link + snippet only.\",\n      \"editor\": \"checkbox\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeVideoTranscript\": {\n      \"title\": \"Include Video Transcripts\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled and a video post exposes a transcript on its public page, the transcript is added to the record.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"monitorMode\": {\n      \"title\": \"Monitor Mode (only new posts)\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, only posts that were not delivered by an earlier run with the same input are returned. Ideal for schedules.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"emitNoResultsMarker\": {\n      \"title\": \"Emit No-Results Marker\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled and a clean search finds nothing, push one marker record ({searchQuery, noResults: true}) so zero matches can be told apart from a failed run.\",\n      \"editor\": \"checkbox\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"mentions\": {\n      \"title\": \"Extra Search Terms\",\n      \"type\": \"array\",\n      \"description\": \"Additional words added to every search query, for example a company or person name.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"mentionsCompany\": {\n      \"title\": \"Mentions Company\",\n      \"type\": \"string\",\n      \"description\": \"Company name added to the search query. Numeric LinkedIn IDs cannot be used without a session and are ignored (a note is added to the run status).\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"mentionsPerson\": {\n      \"title\": \"Mentions Person\",\n      \"type\": \"string\",\n      \"description\": \"Person name added to the search query. Numeric LinkedIn IDs cannot be used without a session and are ignored (a note is added to the run status).\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"talksAbout\": {\n      \"title\": \"Talks About (Topics / Hashtags)\",\n      \"type\": \"array\",\n      \"description\": \"Topics or hashtags added to the search query; each value becomes #topic. Values with a leading # are accepted as-is.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"includeDocumentDetails\": {\n      \"title\": \"Include Document Details\",\n      \"type\": \"boolean\",\n      \"description\": \"For document (PDF/PPTX) posts, also fetch the per-page transcript and page-image URLs in addition to the document URL and page count.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeRepostCounts\": {\n      \"title\": \"Include Repost Counts\",\n      \"type\": \"boolean\",\n      \"description\": \"Last-resort fallback: if the richer public guest layout was not obtained for a post, retry a few more times to catch the repost/share counts. Normally unnecessary when the guest session is active.\",\n      \"editor\": \"checkbox\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"enrichSdui\": {\n      \"title\": \"Enrich From Public Guest Session\",\n      \"type\": \"boolean\",\n      \"description\": \"Use LinkedIn's anonymous public guest session (an ephemeral cookie issued by the site, like a normal browser) to read the richer public post layout. This adds reaction-type breakdowns, up to ~18 comments with profile links, and repost counts when available. No user account or credentials are involved.\",\n      \"editor\": \"checkbox\",\n      \"default\": true,\n      \"prefill\": false\n    }\n  }\n}",
    "readme": "# LinkedIn Keyword & Hashtag Post Discovery Scraper\n\nFind public LinkedIn posts about a topic, a brand, a person, or a hashtag — without a LinkedIn account, cookie, or login. The actor searches the public search-engine index of LinkedIn posts for your keyword, then opens each matching post's public page to return the full text, author, date, reaction and comment counts, top comments, and media. It is built for social listening, lead research, and competitor tracking, and it says plainly what the index can and cannot deliver.\n\n## What this actor does\n\n- **Three modes:** `auto`, `search` (keyword / phrase / hashtag), `postUrls` (enrich specific posts or articles)\n- **Batch search:** run up to 20 queries in one run; a post found by two queries is returned once\n- **Filters:** date window and exact date range, author type, content type, minimum reactions and comments, exclude reposts\n- **Full post records:** text, author name / profile / avatar / followers, ISO timestamp, reactions, comments, top comments with authors and likes, media, hashtags\n- **Documents:** PDF/PPTX document-card posts resolve to the original PDF, page count, and (optionally) per-page transcript and page images\n- **Engagement:** reaction-type breakdown, repost counts, and up to ~18 comments with profile links when LinkedIn serves its richer public guest layout\n- **Monitor mode:** on a schedule, only posts you have not received before\n- **Fields a post does not have are omitted** — never `null` and never made up\n\n## Output per post\n\n- `postId`, `postUrl` — canonical post identity and URL\n- `sourcePostUrl` — the URL the post was discovered from (provenance)\n- `authorName`, `authorProfileUrl`, `authorAvatar`, `authorFollowers`\n- `authorType` — `PERSON` or `COMPANY` when the public page says which\n- `authorHeadline` — when the public page shows one\n- `postedAt` — ISO 8601 timestamp\n- `content` — full post text\n- `articleTitle`, `articleUrl` — for LinkedIn articles\n- `hashtags` — parsed from the post text\n- `mediaType` — `text`, `image`, `video`, `article`, `document`, or `repost`\n- `mediaItems` — media URLs with thumbnail and duration where available\n- `comments[]` — top comments: `{authorName, text, postedAt, reactionsCount, authorProfileUrl?, dateText?}`; up to ~10 on the plain page, up to ~18 when the richer public guest layout is used\n- `commentsSource` — `post` or `sdui` (which public layout supplied the comments)\n- `documentUrl`, `documentTitle`, `documentPageCount` — for document posts (the original PDF and page count)\n- `documentTranscript`, `documentPageImages` — per-page text and page-image URLs when `includeDocumentDetails` is on\n- `reactionsCount`, `commentsCount` — as shown on the public post page\n- `reactionBreakdown` — per-type counts (`like`, `celebrate`, `love`, `insightful`, `support`, `funny`, `superLike`) when the richer guest layout is used; the sum matches the total\n- `repostsCount` — when the richer guest layout exposes it\n- `videoDuration`, `videoTranscript` — for video posts (transcript only when the input asks for it)\n- `repostOf` — details of the original post when the result repeats someone else's content\n- `snippet` — the search engine's excerpt of the post\n- `keywordMatch` — whether every word of your query is visible in the post\n- `searchQuery`, `searchEngine`, `source`, `contentSource`, `scrapedAt` — run provenance\n- Fields a post does not expose are left out of that record.\n\n### Marker rows\n\n- With `emitNoResultsMarker` on (default), a search that finishes cleanly with zero matches pushes one row: `{searchQuery, noResults: true, scrapedAt}`.\n- If a post page cannot be opened, the post is still returned as a partial row with the link, snippet, date derived from its ID, and `contentSource: \"serp\"` instead of being invented or silently dropped.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto` / `search` / `postUrls` |\n| `searchQuery` | string | – | Keyword, phrase, or `#hashtag` (mode=search/auto; prefill: `artificial intelligence`) |\n| `searchQueries` | array | `[]` | Additional queries to run in the same run |\n| `postUrls` | array | `[]` | Post or article URLs to enrich (mode=postUrls/auto) |\n| `sortBy` | string | `relevance` | `relevance` / `recency` / `date_posted` (last two are aliases) |\n| `datePosted` | string | `\"\"` | `\"\"` / `r86400` / `r604800` / `r2592000` |\n| `postedAfter` | date | `\"\"` | Keep posts on or after this date |\n| `postedBefore` | date | `\"\"` | Keep posts on or before this date |\n| `authorType` | string | `\"\"` | `\"\"` / `PERSON` / `COMPANY` |\n| `contentType` | array | `[\"articles\",\"posts\",\"documents\",\"videos\",\"images\"]` | `articles`, `posts`, `documents`, `videos`, `images` |\n| `minReactions` | integer | `0` | Minimum reactions (posts with unknown counts are skipped when > 0) |\n| `minComments` | integer | `0` | Minimum comments (same rule) |\n| `excludeReposts` | boolean | `false` | Skip reposts of other people's content |\n| `includeUnmatched` | boolean | `false` | Also return posts that miss a query word (`keywordMatch: false`) |\n| `language` | string | `en` | Interface language used when opening post pages |\n| `countryCode` | string | `auto` | Prefer a country's LinkedIn domain (`site:xx.linkedin.com`) |\n| `maxResults` | integer | `25` | Posts to return (1–200, after filters) |\n| `hydratePosts` | boolean | `true` | Open each post page for the full record; off = link + snippet only |\n| `includeVideoTranscript` | boolean | `false` | Add video transcripts when the page exposes one |\n| `includeDocumentDetails` | boolean | `false` | For document posts, also return the per-page transcript and page-image URLs |\n| `enrichSdui` | boolean | `true` | Use LinkedIn's anonymous public guest session (an ephemeral site cookie, like a normal browser) to read the richer post layout. No account or credentials involved. |\n| `includeRepostCounts` | boolean | `false` | Last resort: if the richer layout was not obtained, try up to five extra requests to catch it for repost counts |\n| `monitorMode` | boolean | `false` | On schedules: only posts not delivered by an earlier run with the same input |\n| `emitNoResultsMarker` | boolean | `true` | Push a zero-match marker instead of an empty dataset |\n| `mentions` | array | `[]` | Extra words added to every query |\n| `mentionsCompany` / `mentionsPerson` | string | `\"\"` | Names added to the query (numeric IDs are ignored and reported) |\n| `talksAbout` | array | `[]` | Topics/hashtags; each becomes `#topic` |\n\n### Example: keyword search with engagement filter\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"b2b sales automation\",\n  \"datePosted\": \"r604800\",\n  \"minReactions\": 10,\n  \"maxResults\": 50\n}\n```\n\n### Example: hashtag monitoring\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"#MachineLearning\",\n  \"sortBy\": \"recency\",\n  \"includeVideoTranscript\": false,\n  \"monitorMode\": true,\n  \"maxResults\": 100\n}\n```\n\n### Example: enrich exact posts\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/posts/example-company_product-launch-activity-7123456789012345678-abCD\",\n    \"https://www.linkedin.com/pulse/example-article-slug\"\n  ]\n}\n```\n\n### Example: several queries in one run\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"AI agents\",\n  \"searchQueries\": [\"LLM evaluation\", \"\\\"first sales hire\\\"\"],\n  \"authorType\": \"PERSON\",\n  \"maxResults\": 120\n}\n```\n\n## Use cases\n\n- **Social listening** — track what is being posted about your brand, product, or an event\n- **Lead research** — find people talking about a problem your product solves, with their recent posts\n- **Competitor monitoring** — surface company posts and announcements around a topic or brand name\n- **Content and SEO research** — see which posts and angles are indexed for your keywords\n- **Event and PR tracking** — follow a hashtag or event name during and after a campaign\n- **Research datasets** — export clean post text with dates and engagement for analysis\n\n## FAQ\n\n### Do I need a LinkedIn account or cookie?\n\nNo. The actor never logs in and never uses a user session; older tasks that still send a cookie value keep working, and the value is ignored. While reading public post pages it may receive an anonymous, server-issued guest cookie from LinkedIn and reuse it only within that run, exactly as a normal browser would. It is never an input, never stored between runs, and never logged. No `li_at` or signed-in session is involved.\n\n### How many posts can I get per run?\n\nUp to 200 with `maxResults`. The practical number depends on how many public posts the search index holds for your query — a specific phrase usually has far fewer than a broad one. The actor never pads results to hit the number: if the index or your filters run out of matches, the run returns fewer (filters such as `datePosted`, `minReactions`, `contentType` and `authorType` remove posts). Raising `maxResults` does not create posts the index does not have.\n\n### Do document posts work?\n\nYes. Document-card posts (PDF/PPTX carousels) expose a public manifest; the actor reads it and returns the original PDF (`documentUrl`), title, and page count, with per-page transcript and page images when `includeDocumentDetails` is on.\n\n### What “search” means here\n\nThe actor reads a public search-engine index of `linkedin.com/posts` pages; it does not query LinkedIn's own search database, so the result set is smaller and not identical to what a signed-in user sees, and it is not date-sorted unless you choose `recency`. As a result:\n\n- **No result counts.** Neither the index nor the actor can tell you how many posts LinkedIn would return. The status reports how many indexed posts were discovered, not a LinkedIn total.\n- **Recency is index-recency, not LinkedIn-recency.** The past-week and past-month filters were fully within their windows in testing, but the past-24-hours window often returned zero or one post because the index lags. For monitoring, run on a schedule with the past week/month window.\n- **Connection degree is unavailable.** 1st/2nd/3rd+ is viewer-specific and needs a signed-in session. Older tasks that still send a connection-degree value keep working; it is ignored.\n- **Author industry is unavailable.** Public post pages do not say which industry the author's company is in. Older tasks that still send an industry filter keep working; it is ignored. Adding an industry word to the query finds posts about that industry, not necessarily authors who work in it.\n- **Mention filters use text, not LinkedIn entity IDs.** Numeric company/person IDs cannot be resolved without a session. Enter a name or slug: the actor searches for that text, which may include third-party mentions and may miss @mentions whose visible text omits the name.\n\n### Company and school post feeds\n\nCompany and school post feeds are not supported. LinkedIn requires a sign-in for the “Posts” tab on company and school pages, and the logged-out page only shows the latest handful of posts (~6–14) with no way to load more. This actor searches the public post index instead: it can find public posts that mention a company or school, but it cannot return that entity's complete or paginated feed. If you need an entity's own posts, use the entity name as the query and check each result's author, or use a signed-in LinkedIn tool.\n\n### Why are some engagement fields missing?\n\nLinkedIn's plain public page embeds only the first ~10 comments and the totals; the richer public guest layout exposes up to ~18 comments (including author replies and commenter profile links), reaction-type breakdowns and repost counts, and the actor establishes an anonymous guest session per run so those are usually available. It never claims completeness: reading every comment, or viewer lists (likers) and view counts, requires a signed-in session and is not supported, so those fields are omitted rather than guessed. If the richer layout is not served for a post, the plain page still provides text, author, date, totals and up to ~10 comments. Counts are a snapshot of the page at the moment the post is opened.\n\n### Why are some posts returned without full text?\n\nA small share of indexed post pages show a sign-up wall to logged-out visitors. Those posts are still returned with their link, search snippet, and date, marked `contentSource: \"serp\"`, instead of being dropped or invented.\n\n### What does `keywordMatch` mean?\n\nIt tells you whether every word of your query is visible in the post's text, title, or URL. Posts that do not match are skipped unless `includeUnmatched` is on, so the dataset does not quietly fill with loosely related posts.\n\n### Do I need to set up a proxy?\n\nNo. The actor connects to the public index and to public post pages on its own, including a built-in fallback when a connection is refused.\n\n### Is this affiliated with LinkedIn?\n\nNo. This is an independent, third-party actor. It reads only publicly visible pages, and it is not operated by or affiliated with LinkedIn.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-keyword-and-hashtag-post-discovery",
      "title": "LinkedIn Keyword & Hashtag Post Discovery Scraper",
      "description": "Search public LinkedIn posts by keyword or hashtag and enrich each result with full text, author, date, engagement and top comments. No cookie, login or account required.",
      "version": "1.0",
      "buildTag": "latest",
      "environmentVariables": {},
      "dockerfile": "../Dockerfile",
      "readme": "# LinkedIn Keyword & Hashtag Post Discovery Scraper\n\nFind public LinkedIn posts about a topic, a brand, a person, or a hashtag — without a LinkedIn account, cookie, or login. The actor searches the public search-engine index of LinkedIn posts for your keyword, then opens each matching post's public page to return the full text, author, date, reaction and comment counts, top comments, and media. It is built for social listening, lead research, and competitor tracking, and it says plainly what the index can and cannot deliver.\n\n## What this actor does\n\n- **Three modes:** `auto`, `search` (keyword / phrase / hashtag), `postUrls` (enrich specific posts or articles)\n- **Batch search:** run up to 20 queries in one run; a post found by two queries is returned once\n- **Filters:** date window and exact date range, author type, content type, minimum reactions and comments, exclude reposts\n- **Full post records:** text, author name / profile / avatar / followers, ISO timestamp, reactions, comments, top comments with authors and likes, media, hashtags\n- **Documents:** PDF/PPTX document-card posts resolve to the original PDF, page count, and (optionally) per-page transcript and page images\n- **Engagement:** reaction-type breakdown, repost counts, and up to ~18 comments with profile links when LinkedIn serves its richer public guest layout\n- **Monitor mode:** on a schedule, only posts you have not received before\n- **Fields a post does not have are omitted** — never `null` and never made up\n\n## Output per post\n\n- `postId`, `postUrl` — canonical post identity and URL\n- `sourcePostUrl` — the URL the post was discovered from (provenance)\n- `authorName`, `authorProfileUrl`, `authorAvatar`, `authorFollowers`\n- `authorType` — `PERSON` or `COMPANY` when the public page says which\n- `authorHeadline` — when the public page shows one\n- `postedAt` — ISO 8601 timestamp\n- `content` — full post text\n- `articleTitle`, `articleUrl` — for LinkedIn articles\n- `hashtags` — parsed from the post text\n- `mediaType` — `text`, `image`, `video`, `article`, `document`, or `repost`\n- `mediaItems` — media URLs with thumbnail and duration where available\n- `comments[]` — top comments: `{authorName, text, postedAt, reactionsCount, authorProfileUrl?, dateText?}`; up to ~10 on the plain page, up to ~18 when the richer public guest layout is used\n- `commentsSource` — `post` or `sdui` (which public layout supplied the comments)\n- `documentUrl`, `documentTitle`, `documentPageCount` — for document posts (the original PDF and page count)\n- `documentTranscript`, `documentPageImages` — per-page text and page-image URLs when `includeDocumentDetails` is on\n- `reactionsCount`, `commentsCount` — as shown on the public post page\n- `reactionBreakdown` — per-type counts (`like`, `celebrate`, `love`, `insightful`, `support`, `funny`, `superLike`) when the richer guest layout is used; the sum matches the total\n- `repostsCount` — when the richer guest layout exposes it\n- `videoDuration`, `videoTranscript` — for video posts (transcript only when the input asks for it)\n- `repostOf` — details of the original post when the result repeats someone else's content\n- `snippet` — the search engine's excerpt of the post\n- `keywordMatch` — whether every word of your query is visible in the post\n- `searchQuery`, `searchEngine`, `source`, `contentSource`, `scrapedAt` — run provenance\n- Fields a post does not expose are left out of that record.\n\n### Marker rows\n\n- With `emitNoResultsMarker` on (default), a search that finishes cleanly with zero matches pushes one row: `{searchQuery, noResults: true, scrapedAt}`.\n- If a post page cannot be opened, the post is still returned as a partial row with the link, snippet, date derived from its ID, and `contentSource: \"serp\"` instead of being invented or silently dropped.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto` / `search` / `postUrls` |\n| `searchQuery` | string | – | Keyword, phrase, or `#hashtag` (mode=search/auto; prefill: `artificial intelligence`) |\n| `searchQueries` | array | `[]` | Additional queries to run in the same run |\n| `postUrls` | array | `[]` | Post or article URLs to enrich (mode=postUrls/auto) |\n| `sortBy` | string | `relevance` | `relevance` / `recency` / `date_posted` (last two are aliases) |\n| `datePosted` | string | `\"\"` | `\"\"` / `r86400` / `r604800` / `r2592000` |\n| `postedAfter` | date | `\"\"` | Keep posts on or after this date |\n| `postedBefore` | date | `\"\"` | Keep posts on or before this date |\n| `authorType` | string | `\"\"` | `\"\"` / `PERSON` / `COMPANY` |\n| `contentType` | array | `[\"articles\",\"posts\",\"documents\",\"videos\",\"images\"]` | `articles`, `posts`, `documents`, `videos`, `images` |\n| `minReactions` | integer | `0` | Minimum reactions (posts with unknown counts are skipped when > 0) |\n| `minComments` | integer | `0` | Minimum comments (same rule) |\n| `excludeReposts` | boolean | `false` | Skip reposts of other people's content |\n| `includeUnmatched` | boolean | `false` | Also return posts that miss a query word (`keywordMatch: false`) |\n| `language` | string | `en` | Interface language used when opening post pages |\n| `countryCode` | string | `auto` | Prefer a country's LinkedIn domain (`site:xx.linkedin.com`) |\n| `maxResults` | integer | `25` | Posts to return (1–200, after filters) |\n| `hydratePosts` | boolean | `true` | Open each post page for the full record; off = link + snippet only |\n| `includeVideoTranscript` | boolean | `false` | Add video transcripts when the page exposes one |\n| `includeDocumentDetails` | boolean | `false` | For document posts, also return the per-page transcript and page-image URLs |\n| `enrichSdui` | boolean | `true` | Use LinkedIn's anonymous public guest session (an ephemeral site cookie, like a normal browser) to read the richer post layout. No account or credentials involved. |\n| `includeRepostCounts` | boolean | `false` | Last resort: if the richer layout was not obtained, try up to five extra requests to catch it for repost counts |\n| `monitorMode` | boolean | `false` | On schedules: only posts not delivered by an earlier run with the same input |\n| `emitNoResultsMarker` | boolean | `true` | Push a zero-match marker instead of an empty dataset |\n| `mentions` | array | `[]` | Extra words added to every query |\n| `mentionsCompany` / `mentionsPerson` | string | `\"\"` | Names added to the query (numeric IDs are ignored and reported) |\n| `talksAbout` | array | `[]` | Topics/hashtags; each becomes `#topic` |\n\n### Example: keyword search with engagement filter\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"b2b sales automation\",\n  \"datePosted\": \"r604800\",\n  \"minReactions\": 10,\n  \"maxResults\": 50\n}\n```\n\n### Example: hashtag monitoring\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"#MachineLearning\",\n  \"sortBy\": \"recency\",\n  \"includeVideoTranscript\": false,\n  \"monitorMode\": true,\n  \"maxResults\": 100\n}\n```\n\n### Example: enrich exact posts\n\n```json\n{\n  \"mode\": \"postUrls\",\n  \"postUrls\": [\n    \"https://www.linkedin.com/posts/example-company_product-launch-activity-7123456789012345678-abCD\",\n    \"https://www.linkedin.com/pulse/example-article-slug\"\n  ]\n}\n```\n\n### Example: several queries in one run\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"AI agents\",\n  \"searchQueries\": [\"LLM evaluation\", \"\\\"first sales hire\\\"\"],\n  \"authorType\": \"PERSON\",\n  \"maxResults\": 120\n}\n```\n\n## Use cases\n\n- **Social listening** — track what is being posted about your brand, product, or an event\n- **Lead research** — find people talking about a problem your product solves, with their recent posts\n- **Competitor monitoring** — surface company posts and announcements around a topic or brand name\n- **Content and SEO research** — see which posts and angles are indexed for your keywords\n- **Event and PR tracking** — follow a hashtag or event name during and after a campaign\n- **Research datasets** — export clean post text with dates and engagement for analysis\n\n## FAQ\n\n### Do I need a LinkedIn account or cookie?\n\nNo. The actor never logs in and never uses a user session; older tasks that still send a cookie value keep working, and the value is ignored. While reading public post pages it may receive an anonymous, server-issued guest cookie from LinkedIn and reuse it only within that run, exactly as a normal browser would. It is never an input, never stored between runs, and never logged. No `li_at` or signed-in session is involved.\n\n### How many posts can I get per run?\n\nUp to 200 with `maxResults`. The practical number depends on how many public posts the search index holds for your query — a specific phrase usually has far fewer than a broad one. The actor never pads results to hit the number: if the index or your filters run out of matches, the run returns fewer (filters such as `datePosted`, `minReactions`, `contentType` and `authorType` remove posts). Raising `maxResults` does not create posts the index does not have.\n\n### Do document posts work?\n\nYes. Document-card posts (PDF/PPTX carousels) expose a public manifest; the actor reads it and returns the original PDF (`documentUrl`), title, and page count, with per-page transcript and page images when `includeDocumentDetails` is on.\n\n### What “search” means here\n\nThe actor reads a public search-engine index of `linkedin.com/posts` pages; it does not query LinkedIn's own search database, so the result set is smaller and not identical to what a signed-in user sees, and it is not date-sorted unless you choose `recency`. As a result:\n\n- **No result counts.** Neither the index nor the actor can tell you how many posts LinkedIn would return. The status reports how many indexed posts were discovered, not a LinkedIn total.\n- **Recency is index-recency, not LinkedIn-recency.** The past-week and past-month filters were fully within their windows in testing, but the past-24-hours window often returned zero or one post because the index lags. For monitoring, run on a schedule with the past week/month window.\n- **Connection degree is unavailable.** 1st/2nd/3rd+ is viewer-specific and needs a signed-in session. Older tasks that still send a connection-degree value keep working; it is ignored.\n- **Author industry is unavailable.** Public post pages do not say which industry the author's company is in. Older tasks that still send an industry filter keep working; it is ignored. Adding an industry word to the query finds posts about that industry, not necessarily authors who work in it.\n- **Mention filters use text, not LinkedIn entity IDs.** Numeric company/person IDs cannot be resolved without a session. Enter a name or slug: the actor searches for that text, which may include third-party mentions and may miss @mentions whose visible text omits the name.\n\n### Company and school post feeds\n\nCompany and school post feeds are not supported. LinkedIn requires a sign-in for the “Posts” tab on company and school pages, and the logged-out page only shows the latest handful of posts (~6–14) with no way to load more. This actor searches the public post index instead: it can find public posts that mention a company or school, but it cannot return that entity's complete or paginated feed. If you need an entity's own posts, use the entity name as the query and check each result's author, or use a signed-in LinkedIn tool.\n\n### Why are some engagement fields missing?\n\nLinkedIn's plain public page embeds only the first ~10 comments and the totals; the richer public guest layout exposes up to ~18 comments (including author replies and commenter profile links), reaction-type breakdowns and repost counts, and the actor establishes an anonymous guest session per run so those are usually available. It never claims completeness: reading every comment, or viewer lists (likers) and view counts, requires a signed-in session and is not supported, so those fields are omitted rather than guessed. If the richer layout is not served for a post, the plain page still provides text, author, date, totals and up to ~10 comments. Counts are a snapshot of the page at the moment the post is opened.\n\n### Why are some posts returned without full text?\n\nA small share of indexed post pages show a sign-up wall to logged-out visitors. Those posts are still returned with their link, search snippet, and date, marked `contentSource: \"serp\"`, instead of being dropped or invented.\n\n### What does `keywordMatch` mean?\n\nIt tells you whether every word of your query is visible in the post's text, title, or URL. Posts that do not match are skipped unless `includeUnmatched` is on, so the dataset does not quietly fill with loosely related posts.\n\n### Do I need to set up a proxy?\n\nNo. The actor connects to the public index and to public post pages on its own, including a built-in fallback when a connection is refused.\n\n### Is this affiliated with LinkedIn?\n\nNo. This is an independent, third-party actor. It reads only publicly visible pages, and it is not operated by or affiliated with LinkedIn.\n",
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Keyword & Hashtag Post Discovery Scraper Output",
        "description": "One record per matching LinkedIn post, with full text, author, date, engagement metrics, top comments and media where the public post page exposes them. A no-results marker row ({searchQuery, noResults: true}) is added when a clean search finds nothing.",
        "properties": {
          "posts": {
            "type": "string",
            "title": "LinkedIn Posts",
            "description": "Dataset containing all discovered and enriched LinkedIn posts.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultRunOptions": {
        "memoryMbytes": 1024
      },
      "input": {
        "title": "LinkedIn Keyword & Hashtag Post Discovery Scraper Input",
        "description": "Search public LinkedIn posts by keyword or hashtag, or enrich specific post URLs. No LinkedIn cookie or login is needed.",
        "type": "object",
        "schemaVersion": 1,
        "required": [],
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to run. 'auto' searches when searchQuery/searchQueries are set and enriches when postUrls are set (both can run together).",
            "editor": "select",
            "enum": [
              "auto",
              "search",
              "postUrls"
            ],
            "enumTitles": [
              "Automatic (recommended)",
              "Search by keyword or hashtag",
              "Enrich these post URLs"
            ],
            "default": "auto",
            "prefill": "auto"
          },
          "searchQuery": {
            "title": "Search Query",
            "type": "string",
            "description": "Keyword, phrase, or hashtag to find in public LinkedIn posts. Examples: 'artificial intelligence', '\"product launch\"', '#MachineLearning'. (mode=search/auto)",
            "editor": "textfield",
            "prefill": "artificial intelligence"
          },
          "searchQueries": {
            "title": "Search Queries (batch)",
            "type": "array",
            "description": "Additional queries to run in the same run; each is searched independently, duplicates are delivered once. Combine with Search Query. (mode=search/auto)",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "LinkedIn post or article URLs to enrich directly (activity, share, ugcPost, feed/update, /pulse/ links and country subdomains). (mode=postUrls/auto)",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "sortBy": {
            "title": "Sort By",
            "type": "string",
            "description": "How to order the posts that were found. 'relevance' keeps the search engine's order; 'recency' sorts the found posts by date (newest first).",
            "editor": "select",
            "enum": [
              "relevance",
              "recency",
              "date_posted"
            ],
            "enumTitles": [
              "Most relevant",
              "Most recent (of found posts)",
              "Most recent (date_posted alias)"
            ],
            "default": "relevance",
            "prefill": "relevance"
          },
          "datePosted": {
            "title": "Date Posted",
            "type": "string",
            "description": "Only keep posts from this time window.",
            "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": "Only keep posts published on or after this date (YYYY-MM-DD). Leave empty to disable.",
            "editor": "datepicker",
            "default": "",
            "prefill": ""
          },
          "postedBefore": {
            "title": "Posted Before",
            "type": "string",
            "description": "Only keep posts published on or before this date (YYYY-MM-DD). Leave empty to disable.",
            "editor": "datepicker",
            "default": "",
            "prefill": ""
          },
          "authorType": {
            "title": "Author Type",
            "type": "string",
            "description": "Keep only posts written by a person or by a company page. Applied after each post is opened, so a post whose author type cannot be determined is kept.",
            "editor": "select",
            "enum": [
              "",
              "PERSON",
              "COMPANY"
            ],
            "enumTitles": [
              "Anyone",
              "People only",
              "Companies only"
            ],
            "default": "",
            "prefill": ""
          },
          "contentType": {
            "title": "Content Types",
            "type": "array",
            "description": "Keep only these post types: articles (LinkedIn articles), posts (text/reposts/polls/events), documents (PDF/PPTX document cards), videos, images.",
            "editor": "stringList",
            "default": [
              "articles",
              "posts",
              "documents",
              "videos",
              "images"
            ],
            "prefill": [
              "articles",
              "posts",
              "documents",
              "videos",
              "images"
            ]
          },
          "minReactions": {
            "title": "Minimum Reactions",
            "type": "integer",
            "description": "Keep only posts with at least this many reactions. Posts whose reaction count is unknown are skipped when this is above 0.",
            "editor": "number",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 1000000
          },
          "minComments": {
            "title": "Minimum Comments",
            "type": "integer",
            "description": "Keep only posts with at least this many comments. Posts whose comment count is unknown are skipped when this is above 0.",
            "editor": "number",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 1000000
          },
          "excludeReposts": {
            "title": "Exclude Reposts",
            "type": "boolean",
            "description": "When enabled, skip posts that repeat someone else's content.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "includeUnmatched": {
            "title": "Also Return Loose Matches",
            "type": "boolean",
            "description": "When enabled, posts that do not show every word of your query are also returned, marked keywordMatch: false. Useful for hashtags.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Preferred interface language used when opening each post page (affects LinkedIn's rendered text).",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "pt",
              "it"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Portuguese",
              "Italian"
            ],
            "default": "en",
            "prefill": "en"
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Prefer LinkedIn posts indexed on this country's LinkedIn domain (site:xx.linkedin.com). 'auto' uses linkedin.com worldwide.",
            "editor": "select",
            "enum": [
              "auto",
              "us",
              "gb",
              "de",
              "fr",
              "es",
              "it",
              "pt",
              "nl",
              "br",
              "in",
              "ca",
              "au",
              "mx",
              "jp",
              "sg",
              "ae",
              "sa",
              "za",
              "ng",
              "pk",
              "id",
              "ph",
              "my",
              "pl",
              "se",
              "ch",
              "at",
              "be",
              "dk",
              "ie"
            ],
            "enumTitles": [
              "Automatic (worldwide)",
              "United States",
              "United Kingdom",
              "Germany",
              "France",
              "Spain",
              "Italy",
              "Portugal",
              "Netherlands",
              "Brazil",
              "India",
              "Canada",
              "Australia",
              "Mexico",
              "Japan",
              "Singapore",
              "United Arab Emirates",
              "Saudi Arabia",
              "South Africa",
              "Nigeria",
              "Pakistan",
              "Indonesia",
              "Philippines",
              "Malaysia",
              "Poland",
              "Sweden",
              "Switzerland",
              "Austria",
              "Belgium",
              "Denmark",
              "Ireland"
            ],
            "default": "auto",
            "prefill": "auto"
          },
          "maxResults": {
            "title": "Max Results",
            "type": "integer",
            "description": "Maximum number of posts to return per run, after filters. The search index holds fewer posts for narrow queries.",
            "editor": "number",
            "default": 25,
            "prefill": 3,
            "minimum": 1,
            "maximum": 200
          },
          "hydratePosts": {
            "title": "Open Each Post Page",
            "type": "boolean",
            "description": "When enabled, each found post is opened so the record carries the full text, author, date, engagement counts and top comments. Turn off for faster runs with link + snippet only.",
            "editor": "checkbox",
            "default": true,
            "prefill": true
          },
          "includeVideoTranscript": {
            "title": "Include Video Transcripts",
            "type": "boolean",
            "description": "When enabled and a video post exposes a transcript on its public page, the transcript is added to the record.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "monitorMode": {
            "title": "Monitor Mode (only new posts)",
            "type": "boolean",
            "description": "When enabled, only posts that were not delivered by an earlier run with the same input are returned. Ideal for schedules.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "emitNoResultsMarker": {
            "title": "Emit No-Results Marker",
            "type": "boolean",
            "description": "When enabled and a clean search finds nothing, push one marker record ({searchQuery, noResults: true}) so zero matches can be told apart from a failed run.",
            "editor": "checkbox",
            "default": true,
            "prefill": true
          },
          "mentions": {
            "title": "Extra Search Terms",
            "type": "array",
            "description": "Additional words added to every search query, for example a company or person name.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "mentionsCompany": {
            "title": "Mentions Company",
            "type": "string",
            "description": "Company name added to the search query. Numeric LinkedIn IDs cannot be used without a session and are ignored (a note is added to the run status).",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "mentionsPerson": {
            "title": "Mentions Person",
            "type": "string",
            "description": "Person name added to the search query. Numeric LinkedIn IDs cannot be used without a session and are ignored (a note is added to the run status).",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "talksAbout": {
            "title": "Talks About (Topics / Hashtags)",
            "type": "array",
            "description": "Topics or hashtags added to the search query; each value becomes #topic. Values with a leading # are accepted as-is.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "includeDocumentDetails": {
            "title": "Include Document Details",
            "type": "boolean",
            "description": "For document (PDF/PPTX) posts, also fetch the per-page transcript and page-image URLs in addition to the document URL and page count.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "includeRepostCounts": {
            "title": "Include Repost Counts",
            "type": "boolean",
            "description": "Last-resort fallback: if the richer public guest layout was not obtained for a post, retry a few more times to catch the repost/share counts. Normally unnecessary when the guest session is active.",
            "editor": "checkbox",
            "default": false,
            "prefill": false
          },
          "enrichSdui": {
            "title": "Enrich From Public Guest Session",
            "type": "boolean",
            "description": "Use LinkedIn's anonymous public guest session (an ephemeral cookie issued by the site, like a normal browser) to read the richer public post layout. This adds reaction-type breakdowns, up to ~18 comments with profile links, and repost counts when available. No user account or credentials are involved.",
            "editor": "checkbox",
            "default": true,
            "prefill": false
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "authorName",
                  "authorFollowers",
                  "postedAt",
                  "content",
                  "reactionsCount",
                  "commentsCount",
                  "postUrl",
                  "searchQuery",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "authorName": {
                    "label": "Author",
                    "format": "text"
                  },
                  "postedAt": {
                    "label": "Posted At",
                    "format": "text"
                  },
                  "content": {
                    "label": "Content",
                    "format": "text"
                  },
                  "reactionsCount": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "commentsCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  },
                  "authorFollowers": {
                    "label": "Followers",
                    "format": "number"
                  },
                  "searchQuery": {
                    "label": "Search Query",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.3",
    "imageDigest": "a09d52c9970c024e8ca406feeb1df9a40675fef9ed40c9761848082172604434",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005534444444444444
    }
  }
}