YouTube Community Tab Post & Poll Scraper
Read a YouTube channel's Community tab and get structured records for every text post, image, poll, and shared video, with vote counts and optional comment threads.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Choose channel posts, one post per URL/ID, or comments from post URLs/IDs. |
urls | array | optional | Channel URLs, @handles or channel IDs when mode=channelPosts. Post URLs or post IDs when mode=postDetails/postComments. |
maxPosts | integer | optional | 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. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Choose channel posts, one post per URL/ID, or comments from post URLs/IDs. |
urls | array | optional | Channel URLs, @handles or channel IDs when mode=channelPosts. Post URLs or post IDs when mode=postDetails/postComments. |
maxPosts | integer | optional | 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. |
postTypes | array | optional | 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. |
keyword | string | optional | In channelPosts mode, only keep posts whose text contains this phrase. Case-insensitive. Leave empty for all posts. |
publishedAfter | string | optional | In channelPosts mode, keep posts published on or after this date. Uses YouTube's exact publish date, so details are fetched when set. |
publishedBefore | string | optional | In channelPosts mode, keep posts published on or before this date. Uses YouTube's exact publish date, so details are fetched when set. |
includeDetails | boolean | optional | 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. |
includeComments | boolean | optional | Return comment threads on each post (up to Maximum comments) in channelPosts and postDetails modes. postComments always returns comments. |
maxComments | integer | optional | Maximum top-level comments to keep per post when comments are included. Replies are counted separately. |
includeReplies | boolean | optional | Also fetch replies under each comment when comments are included. |
maxRepliesPerComment | integer | optional | Maximum replies to keep per comment when replies are included. |
commentSort | string | optional | Show YouTube's featured comments first, or the newest comments first, when comments are returned. |
market | string | optional | Country used to render YouTube's localized labels and relative times. |
language | string | optional | Language used for YouTube's relative times and display labels. Post text is never translated. |
Download the published input schema
View complete JSON
{
"properties": {
"commentSort": {
"default": "top",
"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"
],
"prefill": "top",
"title": "Comment order",
"type": "string"
},
"includeComments": {
"default": false,
"description": "Return comment threads on each post (up to Maximum comments) in channelPosts and postDetails modes. postComments always returns comments.",
"prefill": false,
"title": "Include comments",
"type": "boolean"
},
"includeDetails": {
"default": true,
"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.",
"prefill": false,
"title": "Fetch per-post details",
"type": "boolean"
},
"includeReplies": {
"default": false,
"description": "Also fetch replies under each comment when comments are included.",
"prefill": false,
"title": "Include comment replies",
"type": "boolean"
},
"keyword": {
"description": "In channelPosts mode, only keep posts whose text contains this phrase. Case-insensitive. Leave empty for all posts.",
"editor": "textfield",
"title": "Keyword filter",
"type": "string"
},
"language": {
"default": "en",
"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"
],
"prefill": "en",
"title": "Interface language",
"type": "string"
},
"market": {
"default": "US",
"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"
],
"prefill": "US",
"title": "Market",
"type": "string"
},
"maxComments": {
"default": 100,
"description": "Maximum top-level comments to keep per post when comments are included. Replies are counted separately.",
"maximum": 1000,
"minimum": 1,
"title": "Maximum comments per post",
"type": "integer"
},
"maxPosts": {
"default": 100,
"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.",
"maximum": 200,
"minimum": 1,
"prefill": 3,
"title": "Maximum posts",
"type": "integer"
},
"maxRepliesPerComment": {
"default": 10,
"description": "Maximum replies to keep per comment when replies are included.",
"maximum": 100,
"minimum": 1,
"title": "Maximum replies per comment",
"type": "integer"
},
"mode": {
"default": "channelPosts",
"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"
],
"prefill": "channelPosts",
"title": "What to scrape",
"type": "string"
},
"postTypes": {
"default": [],
"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": {
"enum": [
"text",
"image",
"video",
"poll",
"quiz",
"playlist",
"shared"
],
"enumTitles": [
"Text",
"Image or carousel",
"Shared video",
"Poll",
"Quiz",
"Shared playlist",
"Repost"
],
"type": "string"
},
"prefill": [],
"title": "Post types",
"type": "array",
"uniqueItems": true
},
"publishedAfter": {
"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",
"title": "Published on or after",
"type": "string"
},
"publishedBefore": {
"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",
"title": "Published on or before",
"type": "string"
},
"urls": {
"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"
],
"title": "Channel or post URLs / IDs",
"type": "array"
}
},
"schemaVersion": 1,
"title": "YouTube Community Posts & Polls Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
posts | string | optional | Dataset containing community post rows, comment rows from postComments mode, and explanatory status rows. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"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": {
"description": "Dataset containing community post rows, comment rows from postComments mode, and explanatory status rows.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "YouTube Community rows",
"type": "string"
}
},
"title": "YouTube Community Posts, Polls & Comments Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"channelName": {
"format": "text",
"label": "Channel"
},
"commentCount": {
"format": "number",
"label": "Comments"
},
"contentText": {
"format": "text",
"label": "Text"
},
"likeCount": {
"format": "number",
"label": "Likes"
},
"postId": {
"format": "text",
"label": "Post ID"
},
"postType": {
"format": "text",
"label": "Type"
},
"publishedAt": {
"format": "text",
"label": "Published"
}
}
},
"title": "Community posts & comments",
"transformation": {
"fields": [
"postId",
"postType",
"channelName",
"contentText",
"publishedAt",
"likeCount",
"commentCount"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
YouTube Community Posts, Polls & Comments Scraper
Read 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.
What this actor does
- Three modes:
channelPostsreads a channel feed,postDetailsenriches one post per URL or ID, andpostCommentsreturns one row per comment. - 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.
- Exact engagement: exact ISO publish date, exact like count and exact comment count when details are enabled; the text YouTube displays is kept too.
- Comments that work: up to 1,000 top-level comments per post, Top or Newest order, and optional replies.
- Filters (in
channelPostsmode): post type, keyword and exact publish-date range. - Clean output: one best-resolution URL per image, resolved external links, hashtags and normalized UTC dates. Empty fields are omitted.
Output per post
recordType—community_postfor a post,commentin postComments mode, orstatusfor an explanatory rowpostId,postUrl— YouTube's post ID and canonical linkpostType—text,image,video,poll,quiz,playlistorsharedchannelId,channelName,channelHandle,channelUrl— the channel whose tab was readchannelSubscriberCountText— subscriber label shown on the channel pageauthorName— the post or repost authorcontentText— post text as YouTube displays it; a long URL may be shortened here, with the full target inlinks[]links[]— full external URLs found in the post texthashtags[]— hashtags found in the post textpublishedTimeText,isEdited— relative label and edited markerpublishedAt— exact ISO 8601 UTC publish date (details on)voteCountText,likeCount— displayed likes and exact likescommentCountText,commentCount— displayed and exact comment countscommentsDisabled— present when the creator turned comments offimages[],imageDetails[]— one best-resolution URL per image, with dimensionsvideoAttachments[]— shared video ID, title, URL, thumbnail, description, views, length, owner and badgespoll—pollChoices, optionalpollOptionswith images, total votes text and parsed approximate totalquiz— choices withisCorrectandexplanation, plus total answersplaylist— playlist ID, title, video count, URL and thumbnailsharedPost— a repost's original post: author, text, date label, likes label and attachmentsisMembership— present only when YouTube exposes a members-only badgecommentPreview[]— first three comments when details are on but full comments are not requestedcomments[]— comment rows with author, text, time, likes, reply count and optionalreplies[]scrapedAt— ISO 8601 scrape timestamp
Output per comment (postComments mode)
One row per top-level comment and, when enabled, one row per reply:
recordType—commentpostId,postUrl,channelId,channelName,channelHandle,channelUrlcommentId,parentCommentId,replyLevelauthorName,authorChannelId,authorChannelUrl,authorHandletext,publishedTimeText,likeCountText,replyCountisCreator,isVerified,isPinned,isHeartedscrapedAt
Status rows use recordType: "status" with a status value such as channel_not_found, no_community_tab, post_not_found or comments_disabled.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | channelPosts |
channelPosts, postDetails or postComments |
urls |
array | – | Channel URLs/handles/IDs, or post URLs/IDs for the post modes |
maxPosts |
integer | 100 |
Maximum posts per channel in channelPosts mode, or per run in the post modes (1–200). |
postTypes |
array | [] |
channelPosts only: keep text/image/video/poll/quiz/playlist/shared posts |
keyword |
string | – | channelPosts only: keep posts whose text contains this phrase |
publishedAfter |
string | – | channelPosts only: keep posts published on or after this date |
publishedBefore |
string | – | channelPosts only: keep posts published on or before this date |
includeDetails |
boolean | true |
channelPosts only: fetch exact date, likes, comment count and a 3-comment preview. postDetails always returns details. |
includeComments |
boolean | false |
Include comment threads in channelPosts and postDetails; postComments always returns comments |
maxComments |
integer | 100 |
Maximum top-level comments per post (1–1,000) |
includeReplies |
boolean | false |
Include replies under comments |
maxRepliesPerComment |
integer | 10 |
Maximum replies per comment (1–100) |
commentSort |
string | top |
top or newest when comments are requested |
market |
string | US |
Country used for YouTube's localized labels |
language |
string | en |
Interface language for relative times and labels |
Example: recent posts from two channels
{
"mode": "channelPosts",
"urls": ["https://www.youtube.com/@MrBeast", "@GoodMythicalMorning"],
"maxPosts": 20
}
Example: polls and quizzes only
{
"mode": "channelPosts",
"urls": ["@veritasium", "@watchmojo"],
"postTypes": ["poll", "quiz"],
"maxPosts": 50
}
Example: exact date range with comments
{
"mode": "channelPosts",
"urls": ["@MrBeast"],
"publishedAfter": "2026-08-01",
"publishedBefore": "2026-10-01",
"includeComments": true,
"maxComments": 100,
"commentSort": "newest"
}
Example: one post by URL, with replies
{
"mode": "postDetails",
"urls": ["https://www.youtube.com/post/UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk"],
"includeComments": true,
"maxComments": 200,
"includeReplies": true,
"maxRepliesPerComment": 20
}
Example: comments as one row per comment
{
"mode": "postComments",
"urls": ["UgkxZusu9I1Z-VuU5PGZNA2gclHi8V9CJVZk"],
"maxComments": 500,
"commentSort": "newest"
}
Use cases
- Creator agencies — track announcements, product drops and audience polls across a roster of channels
- Social listening — export poll choices, post text and comment sentiment for brand monitoring
- Competitive research — compare engagement and posting cadence across creators
- Content archiving — save time-limited Community posts with images, links and comments
- AI datasets — collect clean creator text, quizzes and threaded comments
- Community management — monitor new comments on a post without opening YouTube
FAQ
What is a Community post? Any 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.
Do I need to log in or provide cookies? No. 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.
Why does a channel stop at 200 posts?
YouTube'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.
Why are poll percentages missing? YouTube 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.
Are like and comment counts exact?
Yes 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.
Can I get every comment on a post?
Up 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.
Why does a post have no comment count?
The creator turned comments off. The record then carries commentsDisabled: true instead of inventing zero.
Does the market or language field translate post text? No. It changes YouTube's own labels and relative times, never the creator's text.
Can I filter by date, type or keyword?
Yes, 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.
Is this affiliated with YouTube? No. This is an independent third-party actor that reads public YouTube pages and is not operated by or affiliated with YouTube or Google.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build YmiJOaB3acz5T3dIO. Documentation is regenerated from the default published build; private drafts are not included.