{
  "data": {
    "id": "YmiJOaB3acz5T3dIO",
    "actId": "TgWj38cfCgu54papJ",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-10-23T14:32:29.586Z",
    "finishedAt": "2026-10-23T14:32:40.103Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 10419,
      "runTimeSecs": 10.419,
      "computeUnits": 0.011576666666666667,
      "imageSizeBytes": 320826880
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"YouTube Community Posts & Polls Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What to scrape\",\n      \"type\": \"string\",\n      \"description\": \"Choose channel posts, one post per URL/ID, or comments from post URLs/IDs.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"channelPosts\",\n        \"postDetails\",\n        \"postComments\"\n      ],\n      \"enumTitles\": [\n        \"Posts from channel URLs\",\n        \"One post per URL or ID\",\n        \"Comments from post URLs or IDs\"\n      ],\n      \"default\": \"channelPosts\",\n      \"prefill\": \"channelPosts\"\n    },\n    \"urls\": {\n      \"title\": \"Channel or post URLs / IDs\",\n      \"type\": \"array\",\n      \"description\": \"Channel URLs, @handles or channel IDs when mode=channelPosts. Post URLs or post IDs when mode=postDetails/postComments.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://www.youtube.com/@MrBeast\"\n      ]\n    },\n    \"maxPosts\": {\n      \"title\": \"Maximum posts\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum posts per channel, or per run in the post modes. The run also accepts at most this many channel/post inputs. YouTube exposes at most 200 posts per channel.\",\n      \"default\": 100,\n      \"minimum\": 1,\n      \"maximum\": 200,\n      \"prefill\": 3\n    },\n    \"postTypes\": {\n      \"title\": \"Post types\",\n      \"type\": \"array\",\n      \"description\": \"In channelPosts mode, only return these post types. Leave empty to include every type. The post modes return the post URLs/IDs you give them.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"text\",\n          \"image\",\n          \"video\",\n          \"poll\",\n          \"quiz\",\n          \"playlist\",\n          \"shared\"\n        ],\n        \"enumTitles\": [\n          \"Text\",\n          \"Image or carousel\",\n          \"Shared video\",\n          \"Poll\",\n          \"Quiz\",\n          \"Shared playlist\",\n          \"Repost\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"keyword\": {\n      \"title\": \"Keyword filter\",\n      \"type\": \"string\",\n      \"description\": \"In channelPosts mode, only keep posts whose text contains this phrase. Case-insensitive. Leave empty for all posts.\",\n      \"editor\": \"textfield\"\n    },\n    \"publishedAfter\": {\n      \"title\": \"Published on or after\",\n      \"type\": \"string\",\n      \"description\": \"In channelPosts mode, keep posts published on or after this date. Uses YouTube's exact publish date, so details are fetched when set.\",\n      \"editor\": \"datepicker\"\n    },\n    \"publishedBefore\": {\n      \"title\": \"Published on or before\",\n      \"type\": \"string\",\n      \"description\": \"In channelPosts mode, keep posts published on or before this date. Uses YouTube's exact publish date, so details are fetched when set.\",\n      \"editor\": \"datepicker\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Fetch per-post details\",\n      \"type\": \"boolean\",\n      \"description\": \"In channelPosts mode, fill the exact publish date, exact like count, comment count and a 3-comment preview. Adds one detail and one comment request per post. postDetails always returns details.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeComments\": {\n      \"title\": \"Include comments\",\n      \"type\": \"boolean\",\n      \"description\": \"Return comment threads on each post (up to Maximum comments) in channelPosts and postDetails modes. postComments always returns comments.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxComments\": {\n      \"title\": \"Maximum comments per post\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum top-level comments to keep per post when comments are included. Replies are counted separately.\",\n      \"default\": 100,\n      \"minimum\": 1,\n      \"maximum\": 1000\n    },\n    \"includeReplies\": {\n      \"title\": \"Include comment replies\",\n      \"type\": \"boolean\",\n      \"description\": \"Also fetch replies under each comment when comments are included.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxRepliesPerComment\": {\n      \"title\": \"Maximum replies per comment\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum replies to keep per comment when replies are included.\",\n      \"default\": 10,\n      \"minimum\": 1,\n      \"maximum\": 100\n    },\n    \"commentSort\": {\n      \"title\": \"Comment order\",\n      \"type\": \"string\",\n      \"description\": \"Show YouTube's featured comments first, or the newest comments first, when comments are returned.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"top\",\n        \"newest\"\n      ],\n      \"enumTitles\": [\n        \"Top comments\",\n        \"Newest comments\"\n      ],\n      \"default\": \"top\",\n      \"prefill\": \"top\"\n    },\n    \"market\": {\n      \"title\": \"Market\",\n      \"type\": \"string\",\n      \"description\": \"Country used to render YouTube's localized labels and relative times.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"US\",\n        \"GB\",\n        \"CA\",\n        \"AU\",\n        \"DE\",\n        \"FR\",\n        \"JP\",\n        \"KR\",\n        \"BR\",\n        \"IN\",\n        \"MX\",\n        \"IT\",\n        \"ES\",\n        \"NL\",\n        \"PL\",\n        \"RU\",\n        \"SE\",\n        \"NO\",\n        \"DK\",\n        \"FI\",\n        \"ZA\",\n        \"SG\",\n        \"HK\",\n        \"TW\",\n        \"ID\",\n        \"MY\",\n        \"TH\",\n        \"PH\",\n        \"AR\",\n        \"CO\",\n        \"CL\"\n      ],\n      \"enumTitles\": [\n        \"United States\",\n        \"United Kingdom\",\n        \"Canada\",\n        \"Australia\",\n        \"Germany\",\n        \"France\",\n        \"Japan\",\n        \"South Korea\",\n        \"Brazil\",\n        \"India\",\n        \"Mexico\",\n        \"Italy\",\n        \"Spain\",\n        \"Netherlands\",\n        \"Poland\",\n        \"Russia\",\n        \"Sweden\",\n        \"Norway\",\n        \"Denmark\",\n        \"Finland\",\n        \"South Africa\",\n        \"Singapore\",\n        \"Hong Kong\",\n        \"Taiwan\",\n        \"Indonesia\",\n        \"Malaysia\",\n        \"Thailand\",\n        \"Philippines\",\n        \"Argentina\",\n        \"Colombia\",\n        \"Chile\"\n      ],\n      \"default\": \"US\",\n      \"prefill\": \"US\"\n    },\n    \"language\": {\n      \"title\": \"Interface language\",\n      \"type\": \"string\",\n      \"description\": \"Language used for YouTube's relative times and display labels. Post text is never translated.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"pt\",\n        \"de\",\n        \"fr\",\n        \"it\",\n        \"nl\",\n        \"pl\",\n        \"ru\",\n        \"tr\",\n        \"ar\",\n        \"hi\",\n        \"id\",\n        \"th\",\n        \"vi\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"sv\",\n        \"da\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"Portuguese\",\n        \"German\",\n        \"French\",\n        \"Italian\",\n        \"Dutch\",\n        \"Polish\",\n        \"Russian\",\n        \"Turkish\",\n        \"Arabic\",\n        \"Hindi\",\n        \"Indonesian\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese\",\n        \"Swedish\",\n        \"Danish\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    }\n  }\n}",
    "readme": "# YouTube Community Posts, Polls & Comments Scraper\n\nRead a YouTube channel's Posts (Community) tab — or a single post URL — and get clean records for text posts, image carousels, shared videos, polls, quizzes, playlists and reposts. Exact publish dates and like counts, comment counts and comment threads are available without logging in.\n\n## What this actor does\n\n- **Three modes:** `channelPosts` reads a channel feed, `postDetails` enriches one post per URL or ID, and `postComments` returns one row per comment.\n- **Every public post type:** text, single image, image carousel, shared video, text poll, image poll, quiz, shared playlist and repost with the original post's content and attachments.\n- **Exact engagement:** exact ISO publish date, exact like count and exact comment count when details are enabled; the text YouTube displays is kept too.\n- **Comments that work:** up to 1,000 top-level comments per post, Top or Newest order, and optional replies.\n- **Filters (in `channelPosts` mode):** post type, keyword and exact publish-date range.\n- **Clean output:** one best-resolution URL per image, resolved external links, hashtags and normalized UTC dates. Empty fields are omitted.\n\n## Output per post\n\n- `recordType` — `community_post` for a post, `comment` in postComments mode, or `status` for an explanatory row\n- `postId`, `postUrl` — YouTube's post ID and canonical link\n- `postType` — `text`, `image`, `video`, `poll`, `quiz`, `playlist` or `shared`\n- `channelId`, `channelName`, `channelHandle`, `channelUrl` — the channel whose tab was read\n- `channelSubscriberCountText` — subscriber label shown on the channel page\n- `authorName` — the post or repost author\n- `contentText` — post text as YouTube displays it; a long URL may be shortened here, with the full target in `links[]`\n- `links[]` — full external URLs found in the post text\n- `hashtags[]` — hashtags found in the post text\n- `publishedTimeText`, `isEdited` — relative label and edited marker\n- `publishedAt` — exact ISO 8601 UTC publish date (details on)\n- `voteCountText`, `likeCount` — displayed likes and exact likes\n- `commentCountText`, `commentCount` — displayed and exact comment counts\n- `commentsDisabled` — present when the creator turned comments off\n- `images[]`, `imageDetails[]` — one best-resolution URL per image, with dimensions\n- `videoAttachments[]` — shared video ID, title, URL, thumbnail, description, views, length, owner and badges\n- `poll` — `pollChoices`, optional `pollOptions` with images, total votes text and parsed approximate total\n- `quiz` — choices with `isCorrect` and `explanation`, plus total answers\n- `playlist` — playlist ID, title, video count, URL and thumbnail\n- `sharedPost` — a repost's original post: author, text, date label, likes label and attachments\n- `isMembership` — present only when YouTube exposes a members-only badge\n- `commentPreview[]` — first three comments when details are on but full comments are not requested\n- `comments[]` — comment rows with author, text, time, likes, reply count and optional `replies[]`\n- `scrapedAt` — ISO 8601 scrape timestamp\n\n## Output per comment (`postComments` mode)\n\nOne row per top-level comment and, when enabled, one row per reply:\n\n- `recordType` — `comment`\n- `postId`, `postUrl`, `channelId`, `channelName`, `channelHandle`, `channelUrl`\n- `commentId`, `parentCommentId`, `replyLevel`\n- `authorName`, `authorChannelId`, `authorChannelUrl`, `authorHandle`\n- `text`, `publishedTimeText`, `likeCountText`, `replyCount`\n- `isCreator`, `isVerified`, `isPinned`, `isHearted`\n- `scrapedAt`\n\nStatus rows use `recordType: \"status\"` with a `status` value such as `channel_not_found`, `no_community_tab`, `post_not_found` or `comments_disabled`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `channelPosts` | `channelPosts`, `postDetails` or `postComments` |\n| `urls` | array | – | Channel URLs/handles/IDs, or post URLs/IDs for the post modes |\n| `maxPosts` | integer | `100` | Maximum posts per channel in `channelPosts` mode, or per run in the post modes (1–200). |\n| `postTypes` | array | `[]` | `channelPosts` only: keep text/image/video/poll/quiz/playlist/shared posts |\n| `keyword` | string | – | `channelPosts` only: keep posts whose text contains this phrase |\n| `publishedAfter` | string | – | `channelPosts` only: keep posts published on or after this date |\n| `publishedBefore` | string | – | `channelPosts` only: keep posts published on or before this date |\n| `includeDetails` | boolean | `true` | `channelPosts` only: fetch exact date, likes, comment count and a 3-comment preview. `postDetails` always returns details. |\n| `includeComments` | boolean | `false` | Include comment threads in `channelPosts` and `postDetails`; `postComments` always returns comments |\n| `maxComments` | integer | `100` | Maximum top-level comments per post (1–1,000) |\n| `includeReplies` | boolean | `false` | Include replies under comments |\n| `maxRepliesPerComment` | integer | `10` | Maximum replies per comment (1–100) |\n| `commentSort` | string | `top` | `top` or `newest` when comments are requested |\n| `market` | string | `US` | Country used for YouTube's localized labels |\n| `language` | string | `en` | Interface language for relative times and labels |\n\n### Example: recent posts from two channels\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"https://www.youtube.com/@MrBeast\", \"@GoodMythicalMorning\"],\n  \"maxPosts\": 20\n}\n```\n\n### Example: polls and quizzes only\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"@veritasium\", \"@watchmojo\"],\n  \"postTypes\": [\"poll\", \"quiz\"],\n  \"maxPosts\": 50\n}\n```\n\n### Example: exact date range with comments\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"@MrBeast\"],\n  \"publishedAfter\": \"2026-08-01\",\n  \"publishedBefore\": \"2026-10-01\",\n  \"includeComments\": true,\n  \"maxComments\": 100,\n  \"commentSort\": \"newest\"\n}\n```\n\n### Example: one post by URL, with replies\n\n```json\n{\n  \"mode\": \"postDetails\",\n  \"urls\": [\"https://www.youtube.com/post/UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk\"],\n  \"includeComments\": true,\n  \"maxComments\": 200,\n  \"includeReplies\": true,\n  \"maxRepliesPerComment\": 20\n}\n```\n\n### Example: comments as one row per comment\n\n```json\n{\n  \"mode\": \"postComments\",\n  \"urls\": [\"UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk\"],\n  \"maxComments\": 500,\n  \"commentSort\": \"newest\"\n}\n```\n\n## Use cases\n\n- **Creator agencies** — track announcements, product drops and audience polls across a roster of channels\n- **Social listening** — export poll choices, post text and comment sentiment for brand monitoring\n- **Competitive research** — compare engagement and posting cadence across creators\n- **Content archiving** — save time-limited Community posts with images, links and comments\n- **AI datasets** — collect clean creator text, quizzes and threaded comments\n- **Community management** — monitor new comments on a post without opening YouTube\n\n## FAQ\n\n**What is a Community post?**\nAny text update, image, image carousel, shared video, poll, quiz, playlist or repost a channel publishes to its Posts tab — the feed that sits beside Videos and Shorts.\n\n**Do I need to log in or provide cookies?**\nNo. The actor reads the same public pages a logged-out visitor sees. Posts that a creator restricted to channel members are not visible without a membership, so they are not returned.\n\n**Why does a channel stop at 200 posts?**\nYouTube's Posts tab only serves the newest 200 posts. There is no public way to page further back. If you already have an older post URL or ID, the `postDetails` and `postComments` modes can still read it.\n\n**Why are poll percentages missing?**\nYouTube only reveals per-choice votes and percentages to signed-in viewers who voted in that poll. Logged out, the page carries the choices and a rounded total vote count, which the actor returns.\n\n**Are like and comment counts exact?**\nYes when `includeDetails` is on: the actor reads YouTube's exact counters. Counts are a point-in-time snapshot and can change after the scrape. When details are off, only the display text such as `147K` is available. Reposts do not have their own like or comment counters.\n\n**Can I get every comment on a post?**\nUp to `maxComments` top-level comments. YouTube's featured-comment feed is finite; for deeper requests the actor continues with the newest-comment feed and removes duplicates. `includeReplies` adds reply threads.\n\n**Why does a post have no comment count?**\nThe creator turned comments off. The record then carries `commentsDisabled: true` instead of inventing zero.\n\n**Does the market or language field translate post text?**\nNo. It changes YouTube's own labels and relative times, never the creator's text.\n\n**Can I filter by date, type or keyword?**\nYes, in `channelPosts` mode. `publishedAfter` and `publishedBefore` use the exact publish date, `postTypes` filters attachments, and `keyword` matches the post text case-insensitively. The post modes process the URLs/IDs you give them directly.\n\n**Is this affiliated with YouTube?**\nNo. This is an independent third-party actor that reads public YouTube pages and is not operated by or affiliated with YouTube or Google.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "youtube-community-tab-post-and-poll-scraper",
      "title": "YouTube Community Posts, Polls & Comments Scraper",
      "description": "Scrape YouTube Community-tab posts, polls, quizzes, images, videos, playlists and reposts from any channel, or fetch exact post details and comment threads by URL or ID.",
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "dockerfile": "../Dockerfile",
      "input": {
        "title": "YouTube Community Posts & Polls Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What to scrape",
            "type": "string",
            "description": "Choose channel posts, one post per URL/ID, or comments from post URLs/IDs.",
            "editor": "select",
            "enum": [
              "channelPosts",
              "postDetails",
              "postComments"
            ],
            "enumTitles": [
              "Posts from channel URLs",
              "One post per URL or ID",
              "Comments from post URLs or IDs"
            ],
            "default": "channelPosts",
            "prefill": "channelPosts"
          },
          "urls": {
            "title": "Channel or post URLs / IDs",
            "type": "array",
            "description": "Channel URLs, @handles or channel IDs when mode=channelPosts. Post URLs or post IDs when mode=postDetails/postComments.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "https://www.youtube.com/@MrBeast"
            ]
          },
          "maxPosts": {
            "title": "Maximum posts",
            "type": "integer",
            "description": "Maximum posts per channel, or per run in the post modes. The run also accepts at most this many channel/post inputs. YouTube exposes at most 200 posts per channel.",
            "default": 100,
            "minimum": 1,
            "maximum": 200,
            "prefill": 3
          },
          "postTypes": {
            "title": "Post types",
            "type": "array",
            "description": "In channelPosts mode, only return these post types. Leave empty to include every type. The post modes return the post URLs/IDs you give them.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "image",
                "video",
                "poll",
                "quiz",
                "playlist",
                "shared"
              ],
              "enumTitles": [
                "Text",
                "Image or carousel",
                "Shared video",
                "Poll",
                "Quiz",
                "Shared playlist",
                "Repost"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "keyword": {
            "title": "Keyword filter",
            "type": "string",
            "description": "In channelPosts mode, only keep posts whose text contains this phrase. Case-insensitive. Leave empty for all posts.",
            "editor": "textfield"
          },
          "publishedAfter": {
            "title": "Published on or after",
            "type": "string",
            "description": "In channelPosts mode, keep posts published on or after this date. Uses YouTube's exact publish date, so details are fetched when set.",
            "editor": "datepicker"
          },
          "publishedBefore": {
            "title": "Published on or before",
            "type": "string",
            "description": "In channelPosts mode, keep posts published on or before this date. Uses YouTube's exact publish date, so details are fetched when set.",
            "editor": "datepicker"
          },
          "includeDetails": {
            "title": "Fetch per-post details",
            "type": "boolean",
            "description": "In channelPosts mode, fill the exact publish date, exact like count, comment count and a 3-comment preview. Adds one detail and one comment request per post. postDetails always returns details.",
            "default": true,
            "prefill": false
          },
          "includeComments": {
            "title": "Include comments",
            "type": "boolean",
            "description": "Return comment threads on each post (up to Maximum comments) in channelPosts and postDetails modes. postComments always returns comments.",
            "default": false,
            "prefill": false
          },
          "maxComments": {
            "title": "Maximum comments per post",
            "type": "integer",
            "description": "Maximum top-level comments to keep per post when comments are included. Replies are counted separately.",
            "default": 100,
            "minimum": 1,
            "maximum": 1000
          },
          "includeReplies": {
            "title": "Include comment replies",
            "type": "boolean",
            "description": "Also fetch replies under each comment when comments are included.",
            "default": false,
            "prefill": false
          },
          "maxRepliesPerComment": {
            "title": "Maximum replies per comment",
            "type": "integer",
            "description": "Maximum replies to keep per comment when replies are included.",
            "default": 10,
            "minimum": 1,
            "maximum": 100
          },
          "commentSort": {
            "title": "Comment order",
            "type": "string",
            "description": "Show YouTube's featured comments first, or the newest comments first, when comments are returned.",
            "editor": "select",
            "enum": [
              "top",
              "newest"
            ],
            "enumTitles": [
              "Top comments",
              "Newest comments"
            ],
            "default": "top",
            "prefill": "top"
          },
          "market": {
            "title": "Market",
            "type": "string",
            "description": "Country used to render YouTube's localized labels and relative times.",
            "editor": "select",
            "enum": [
              "US",
              "GB",
              "CA",
              "AU",
              "DE",
              "FR",
              "JP",
              "KR",
              "BR",
              "IN",
              "MX",
              "IT",
              "ES",
              "NL",
              "PL",
              "RU",
              "SE",
              "NO",
              "DK",
              "FI",
              "ZA",
              "SG",
              "HK",
              "TW",
              "ID",
              "MY",
              "TH",
              "PH",
              "AR",
              "CO",
              "CL"
            ],
            "enumTitles": [
              "United States",
              "United Kingdom",
              "Canada",
              "Australia",
              "Germany",
              "France",
              "Japan",
              "South Korea",
              "Brazil",
              "India",
              "Mexico",
              "Italy",
              "Spain",
              "Netherlands",
              "Poland",
              "Russia",
              "Sweden",
              "Norway",
              "Denmark",
              "Finland",
              "South Africa",
              "Singapore",
              "Hong Kong",
              "Taiwan",
              "Indonesia",
              "Malaysia",
              "Thailand",
              "Philippines",
              "Argentina",
              "Colombia",
              "Chile"
            ],
            "default": "US",
            "prefill": "US"
          },
          "language": {
            "title": "Interface language",
            "type": "string",
            "description": "Language used for YouTube's relative times and display labels. Post text is never translated.",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "pt",
              "de",
              "fr",
              "it",
              "nl",
              "pl",
              "ru",
              "tr",
              "ar",
              "hi",
              "id",
              "th",
              "vi",
              "ja",
              "ko",
              "zh",
              "sv",
              "da"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "Portuguese",
              "German",
              "French",
              "Italian",
              "Dutch",
              "Polish",
              "Russian",
              "Turkish",
              "Arabic",
              "Hindi",
              "Indonesian",
              "Thai",
              "Vietnamese",
              "Japanese",
              "Korean",
              "Chinese",
              "Swedish",
              "Danish"
            ],
            "default": "en",
            "prefill": "en"
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "YouTube Community Posts, Polls & Comments Scraper Output",
        "description": "Community posts with exact dates, engagement, images, polls, quizzes, playlists, reposts and comment threads, plus one-row-per-comment output in postComments mode.",
        "properties": {
          "posts": {
            "type": "string",
            "title": "YouTube Community rows",
            "description": "Dataset containing community post rows, comment rows from postComments mode, and explanatory status rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# YouTube Community Posts, Polls & Comments Scraper\n\nRead a YouTube channel's Posts (Community) tab — or a single post URL — and get clean records for text posts, image carousels, shared videos, polls, quizzes, playlists and reposts. Exact publish dates and like counts, comment counts and comment threads are available without logging in.\n\n## What this actor does\n\n- **Three modes:** `channelPosts` reads a channel feed, `postDetails` enriches one post per URL or ID, and `postComments` returns one row per comment.\n- **Every public post type:** text, single image, image carousel, shared video, text poll, image poll, quiz, shared playlist and repost with the original post's content and attachments.\n- **Exact engagement:** exact ISO publish date, exact like count and exact comment count when details are enabled; the text YouTube displays is kept too.\n- **Comments that work:** up to 1,000 top-level comments per post, Top or Newest order, and optional replies.\n- **Filters (in `channelPosts` mode):** post type, keyword and exact publish-date range.\n- **Clean output:** one best-resolution URL per image, resolved external links, hashtags and normalized UTC dates. Empty fields are omitted.\n\n## Output per post\n\n- `recordType` — `community_post` for a post, `comment` in postComments mode, or `status` for an explanatory row\n- `postId`, `postUrl` — YouTube's post ID and canonical link\n- `postType` — `text`, `image`, `video`, `poll`, `quiz`, `playlist` or `shared`\n- `channelId`, `channelName`, `channelHandle`, `channelUrl` — the channel whose tab was read\n- `channelSubscriberCountText` — subscriber label shown on the channel page\n- `authorName` — the post or repost author\n- `contentText` — post text as YouTube displays it; a long URL may be shortened here, with the full target in `links[]`\n- `links[]` — full external URLs found in the post text\n- `hashtags[]` — hashtags found in the post text\n- `publishedTimeText`, `isEdited` — relative label and edited marker\n- `publishedAt` — exact ISO 8601 UTC publish date (details on)\n- `voteCountText`, `likeCount` — displayed likes and exact likes\n- `commentCountText`, `commentCount` — displayed and exact comment counts\n- `commentsDisabled` — present when the creator turned comments off\n- `images[]`, `imageDetails[]` — one best-resolution URL per image, with dimensions\n- `videoAttachments[]` — shared video ID, title, URL, thumbnail, description, views, length, owner and badges\n- `poll` — `pollChoices`, optional `pollOptions` with images, total votes text and parsed approximate total\n- `quiz` — choices with `isCorrect` and `explanation`, plus total answers\n- `playlist` — playlist ID, title, video count, URL and thumbnail\n- `sharedPost` — a repost's original post: author, text, date label, likes label and attachments\n- `isMembership` — present only when YouTube exposes a members-only badge\n- `commentPreview[]` — first three comments when details are on but full comments are not requested\n- `comments[]` — comment rows with author, text, time, likes, reply count and optional `replies[]`\n- `scrapedAt` — ISO 8601 scrape timestamp\n\n## Output per comment (`postComments` mode)\n\nOne row per top-level comment and, when enabled, one row per reply:\n\n- `recordType` — `comment`\n- `postId`, `postUrl`, `channelId`, `channelName`, `channelHandle`, `channelUrl`\n- `commentId`, `parentCommentId`, `replyLevel`\n- `authorName`, `authorChannelId`, `authorChannelUrl`, `authorHandle`\n- `text`, `publishedTimeText`, `likeCountText`, `replyCount`\n- `isCreator`, `isVerified`, `isPinned`, `isHearted`\n- `scrapedAt`\n\nStatus rows use `recordType: \"status\"` with a `status` value such as `channel_not_found`, `no_community_tab`, `post_not_found` or `comments_disabled`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `channelPosts` | `channelPosts`, `postDetails` or `postComments` |\n| `urls` | array | – | Channel URLs/handles/IDs, or post URLs/IDs for the post modes |\n| `maxPosts` | integer | `100` | Maximum posts per channel in `channelPosts` mode, or per run in the post modes (1–200). |\n| `postTypes` | array | `[]` | `channelPosts` only: keep text/image/video/poll/quiz/playlist/shared posts |\n| `keyword` | string | – | `channelPosts` only: keep posts whose text contains this phrase |\n| `publishedAfter` | string | – | `channelPosts` only: keep posts published on or after this date |\n| `publishedBefore` | string | – | `channelPosts` only: keep posts published on or before this date |\n| `includeDetails` | boolean | `true` | `channelPosts` only: fetch exact date, likes, comment count and a 3-comment preview. `postDetails` always returns details. |\n| `includeComments` | boolean | `false` | Include comment threads in `channelPosts` and `postDetails`; `postComments` always returns comments |\n| `maxComments` | integer | `100` | Maximum top-level comments per post (1–1,000) |\n| `includeReplies` | boolean | `false` | Include replies under comments |\n| `maxRepliesPerComment` | integer | `10` | Maximum replies per comment (1–100) |\n| `commentSort` | string | `top` | `top` or `newest` when comments are requested |\n| `market` | string | `US` | Country used for YouTube's localized labels |\n| `language` | string | `en` | Interface language for relative times and labels |\n\n### Example: recent posts from two channels\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"https://www.youtube.com/@MrBeast\", \"@GoodMythicalMorning\"],\n  \"maxPosts\": 20\n}\n```\n\n### Example: polls and quizzes only\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"@veritasium\", \"@watchmojo\"],\n  \"postTypes\": [\"poll\", \"quiz\"],\n  \"maxPosts\": 50\n}\n```\n\n### Example: exact date range with comments\n\n```json\n{\n  \"mode\": \"channelPosts\",\n  \"urls\": [\"@MrBeast\"],\n  \"publishedAfter\": \"2026-08-01\",\n  \"publishedBefore\": \"2026-10-01\",\n  \"includeComments\": true,\n  \"maxComments\": 100,\n  \"commentSort\": \"newest\"\n}\n```\n\n### Example: one post by URL, with replies\n\n```json\n{\n  \"mode\": \"postDetails\",\n  \"urls\": [\"https://www.youtube.com/post/UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk\"],\n  \"includeComments\": true,\n  \"maxComments\": 200,\n  \"includeReplies\": true,\n  \"maxRepliesPerComment\": 20\n}\n```\n\n### Example: comments as one row per comment\n\n```json\n{\n  \"mode\": \"postComments\",\n  \"urls\": [\"UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk\"],\n  \"maxComments\": 500,\n  \"commentSort\": \"newest\"\n}\n```\n\n## Use cases\n\n- **Creator agencies** — track announcements, product drops and audience polls across a roster of channels\n- **Social listening** — export poll choices, post text and comment sentiment for brand monitoring\n- **Competitive research** — compare engagement and posting cadence across creators\n- **Content archiving** — save time-limited Community posts with images, links and comments\n- **AI datasets** — collect clean creator text, quizzes and threaded comments\n- **Community management** — monitor new comments on a post without opening YouTube\n\n## FAQ\n\n**What is a Community post?**\nAny text update, image, image carousel, shared video, poll, quiz, playlist or repost a channel publishes to its Posts tab — the feed that sits beside Videos and Shorts.\n\n**Do I need to log in or provide cookies?**\nNo. The actor reads the same public pages a logged-out visitor sees. Posts that a creator restricted to channel members are not visible without a membership, so they are not returned.\n\n**Why does a channel stop at 200 posts?**\nYouTube's Posts tab only serves the newest 200 posts. There is no public way to page further back. If you already have an older post URL or ID, the `postDetails` and `postComments` modes can still read it.\n\n**Why are poll percentages missing?**\nYouTube only reveals per-choice votes and percentages to signed-in viewers who voted in that poll. Logged out, the page carries the choices and a rounded total vote count, which the actor returns.\n\n**Are like and comment counts exact?**\nYes when `includeDetails` is on: the actor reads YouTube's exact counters. Counts are a point-in-time snapshot and can change after the scrape. When details are off, only the display text such as `147K` is available. Reposts do not have their own like or comment counters.\n\n**Can I get every comment on a post?**\nUp to `maxComments` top-level comments. YouTube's featured-comment feed is finite; for deeper requests the actor continues with the newest-comment feed and removes duplicates. `includeReplies` adds reply threads.\n\n**Why does a post have no comment count?**\nThe creator turned comments off. The record then carries `commentsDisabled: true` instead of inventing zero.\n\n**Does the market or language field translate post text?**\nNo. It changes YouTube's own labels and relative times, never the creator's text.\n\n**Can I filter by date, type or keyword?**\nYes, in `channelPosts` mode. `publishedAfter` and `publishedBefore` use the exact publish date, `postTypes` filters attachments, and `keyword` matches the post text case-insensitively. The post modes process the URLs/IDs you give them directly.\n\n**Is this affiliated with YouTube?**\nNo. This is an independent third-party actor that reads public YouTube pages and is not operated by or affiliated with YouTube or Google.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Community posts & comments",
              "transformation": {
                "fields": [
                  "postId",
                  "postType",
                  "channelName",
                  "contentText",
                  "publishedAt",
                  "likeCount",
                  "commentCount"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "postId": {
                    "label": "Post ID",
                    "format": "text"
                  },
                  "postType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "channelName": {
                    "label": "Channel",
                    "format": "text"
                  },
                  "contentText": {
                    "label": "Text",
                    "format": "text"
                  },
                  "publishedAt": {
                    "label": "Published",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "commentCount": {
                    "label": "Comments",
                    "format": "number"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "ffa9dcbe28a45bec964c739bdfb293274350bf4486c64d5f01e3f4773eb0cb1f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.011576666666666667
    }
  }
}