YouTube Community Posts Scraper & New Post Monitor
Pricing
from $2.40 / 1,000 post returneds
YouTube Community Posts Scraper & New Post Monitor
Posts from any YouTube channel's Posts (Community) tab: text, full links, images, polls with vote totals, quizzes with correct answers, shared videos, likes and comments. Monitoring mode returns only posts that are new since the last run, and can track poll vote counts.
Pricing
from $2.40 / 1,000 post returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Posts from any YouTube channel's Posts tab (formerly the Community tab): the post text with its full links, images, polls with their vote totals, quizzes with the correct answer and explanation, shared videos and playlists, likes and comments. With monitoring on, a scheduled run returns only the posts that are new since the last run, and can also return a poll again when its vote count moves.
Paste channels in any form, mixed in one list: @handle, a plain handle, a UC... channel id, a channel URL (/@name, /channel/UC..., /c/Name, /user/Name), or a video URL - for a video, the channel that uploaded it is read.
What you get for each post
| Column | What it is |
|---|---|
postId, postUrl | The post's id and its link (https://www.youtube.com/post/...) |
postType | text, image, poll, quiz, video or playlist |
text | The post text as YouTube displays it |
links | The real URLs linked in the text. YouTube shortens long links in the displayed text ("https://sept11documents.cityofnewyork..."); links has the full address (https://sept11documents.cityofnewyork.us/) |
publishedTimeText, publishedAgoValue, publishedAgoUnit, publishedMinAgeDays, isEdited | YouTube shows only a relative time ("13 days ago", "2 years ago (edited)"). It is split into its number and unit, and publishedMinAgeDays counts it as days (a week as 7, a month as 30, a year as 365). No calendar date is invented. |
likeCount, likeCountText, likeCountIsRounded | Likes as displayed ("101K likes" is 101000, flagged as rounded) |
commentCount, commentCountText, commentCountIsRounded | Number of comments as displayed |
images, imageCount | The largest image URL YouTube offers for each image of the post |
pollChoices, pollType | The choices of a poll (text or image poll) |
quizChoices | Each quiz choice with isCorrect and the explanation YouTube shows after answering |
voteCount, voteCountText, voteCountIsRounded | The total votes of a poll ("1.7M votes") or answers of a quiz ("330K answered") |
videoId, videoUrl, videoTitle, videoLengthText, videoViewCount, videoPublishedTimeText, videoChannelId, videoChannelTitle, videoIsMembersOnly | The video shared in the post (it can belong to another channel) |
playlistId, playlistTitle, playlistVideoCount | The playlist shared in the post |
channelId, channelTitle, handle, channelUrl | The channel whose Posts tab was read |
input, inputType, resolvedFromVideoId, channelMatchesInput | What you typed, and whether the channel YouTube returned is the handle or id you typed (null for /c/, /user/ and video URLs) |
returnedBecause, previousVoteCount, voteCountDelta, voteCountDeltaIsApproximate, previousCheckedAt | Monitoring only: why the post came back, and the vote count change of a poll |
Poll percentages are not in the output. YouTube shows the share of each choice only to signed-in users who have voted; the public page carries the choices and the rounded total only.
Measured on 2026-09-14 on 156 posts from 7 channels (MrBeast, Veritasium, TED-Ed, PewDiePie, Markiplier, Marques Brownlee and YouTube's Music channel):
| postType | Posts |
|---|---|
| image | 97 |
| text | 24 |
| video | 20 |
| poll | 9 |
| quiz | 4 |
| playlist | 2 |
153 of the 156 like counts were abbreviated by YouTube (for example "3.4M"), which is why every count comes with its original text and a rounded flag.
Why every post is checked against the channel
A YouTube channel page also carries other channels' ids and names. This Actor reads the channel's own id from the page's metadata, and returns a post only when the channel that wrote it is that same id; posts written by another channel are not returned. Every row states the channel it came from (channelId, handle, channelTitle), and the run log prints the name each input resolved to.
How many posts are read
- The Posts page of a channel carries its newest posts (6 to 10 per channel in the measurements of 2026-09-14). Older posts are loaded 10 at a time, the same way YouTube's website loads them when you scroll, until
maxPostsPerChannelposts are read (up to 1,000) or YouTube has no more. On 2026-09-14, MrBeast's Posts tab ended at 84 posts. - When a channel has more posts than
maxPostsPerChannel, a freemore-posts-availablerow names it. Posts beyond the limit are not read and not charged. - Loading the older posts uses
youtube.com/youtubei/v1/browse, which YouTube's robots.txt disallows for crawlers. The newest posts on a channel's Posts page do not need it: whenmaxPostsPerChannelis not more than the posts on that first page, or when a monitoring run finds a post seen last time on it, only the Posts page is requested. - Filters (
postTypes,maxPostAgeDays,keywords,excludeKeywords) are applied to the posts read. WithmaxPostAgeDays, once every post on a page is older than the limit, older pages are not requested.
Monitoring mode
Turn monitoringMode on and schedule the Actor. It remembers which posts each channel had and, on later runs:
- only posts published since the last run are returned, oldest first, with
returnedBecause: "new-post"; - a run reads each channel's posts until it reaches a post seen last time.
maxPostsPerChanneldoes not cut the new posts: if 40 posts appeared since the last run, all 40 are returned. It is used only on the first run for a channel, to decide how many of the newest posts to read (and return) that first time. If none of the posts seen last time is on the Posts tab any more (they were deleted, or 100 pages - about 1,000 posts - were read without reaching them), new posts cannot be told apart from older ones: that channel returns nothing and is not charged (not even the check), the posts now on the tab are remembered as the new starting point, and amonitoring-restartedrow says so; - a channel with no new post is not returned as a row; it costs the check fee (see below), and if no channel has a new post you get one free
no-new-postsrow; - if YouTube stops answering before the run reaches the posts seen last time, that channel returns nothing and is not charged at all (not even the check), and an
incompleterow names it, so no new post is skipped.
Turn on trackPollVotes as well to return a poll or quiz seen on an earlier run again whenever the total vote count YouTube displays has changed, with returnedBecause: "vote-count-changed", previousVoteCount, voteCountDelta and previousCheckedAt. It compares the polls among the posts read in that run, which are at least each channel's newest maxPostsPerChannel posts. YouTube displays the total rounded ("1.7M votes"), so voteCountDeltaIsApproximate is true when either side was abbreviated, and a large poll can show the same figure for a long time.
Posts are remembered per channel, not per list, in a store in your own account, so adding a channel to the list does not re-charge the others. Posts dropped by your filters are remembered too, so removing a filter later does not return old posts as new. resetMonitoringState clears everything that was remembered. Do not leave it on in a schedule: every run would then start over and return and charge all posts again as a first monitoring run (a monitoring-memory-cleared row warns about this).
To cap what a monitoring run can cost, set the run's maximum total charge. Before reading each channel, the run makes sure the maximum leaves room for that channel's check plus one post row, so a low limit does not keep charging checks without returning anything: channels that did not fit are not read, not charged, and named in a free not-read row. If the limit runs out in the middle of a channel's new posts, the older ones are returned and remembered, and the newer ones are not remembered, so a later run with enough room returns them.
Do not put the same channel in two monitoring schedules that can run at the same time. Each run re-reads what was remembered just before saving and adds only what it saw itself, so overlapping runs keep each other's posts. But Apify's key-value store has no atomic update, so two runs saving the same channel at the same moment can still overwrite each other, and a post may then be returned once more on a later run.
What it costs
- Post returned: $3.00 per 1,000 posts. With monitoring off, that is the only charge: one per post row you receive.
- Channel checked (monitoring mode only): $0.30 per 1,000 checks - one per channel whose posts were read and compared, whether or not it had a new post. This pays for watching on the days when nothing was posted.
- The rows that explain a missing channel, a missing Posts tab, a duplicate, "no new posts", "no filter match", more available posts or an unread channel are free. A channel that could not be read is not charged as a check.
Example: 100 channels checked once a day is about 3,000 checks a month, $0.90, plus $3.00 per 1,000 for the new posts returned.
Input
| Field | Meaning |
|---|---|
channels | One channel per line: @handle, handle, UC... id, channel URL or video URL. Up to 1,000 lines per run. The same channel given twice is read and charged once. Empty = @MrBeast as an example, and a row says so. |
maxPostsPerChannel | How many of each channel's newest posts to read (1-1,000, default 50). In monitoring mode, used only on a channel's first run and for poll tracking. |
postTypes | Keep only text, image, poll, quiz, video or playlist posts. Empty = all. |
maxPostAgeDays | Keep only posts whose displayed age, counted as days, is at most this. 0 = no limit. |
keywords, keywordMatch, excludeKeywords | Keep or drop posts by words in the text, poll choices, shared video title or shared playlist title. |
monitoringMode | Return only posts that are new since the last run (see above). |
trackPollVotes | Monitoring only: also return polls and quizzes whose displayed vote count changed. |
resetMonitoringState | Forget every remembered post and vote count before the run. |
useProxy | Pages are requested directly first; on a bot check, HTTP 429 or a page without the expected data, the run retries through a proxy session (up to 3 attempts). |
Rows that are not posts
Every row has a status. Posts are ok. The others explain why there is no post, and are never charged:
| status | Meaning |
|---|---|
no-such-channel | YouTube answered HTTP 404 for this channel address. |
no-such-video | The video URL did not resolve to a video, so its channel could not be found. |
invalid-input | The line is not a handle, channel id, channel URL or video URL (search, playlist, hashtag and single post pages are not read). |
no-posts-tab | YouTube opened another tab of the channel instead of a Posts tab, so there are no posts to read. The row does not claim why. |
no-results | The Posts tab loaded but lists no posts. |
blocked | Every attempt came back with a bot check. |
unreadable | The page loaded but did not contain what was expected; the reason is in the note. |
incomplete | A later page of the channel's posts could not be read. |
monitoring-restarted | Monitoring: none of the posts remembered last time is on the channel's Posts tab any more, so nothing was returned or charged for it and the posts now on the tab were remembered as the new starting point. |
monitoring-memory-cleared | resetMonitoringState was on, so everything remembered was cleared before the run. Leaving it on in a schedule returns and charges all posts again on every run. |
duplicate | The line points to a channel already read in this run. |
no-new-posts | Monitoring: no channel had a new post (or a changed poll, with trackPollVotes). The note says how many checks were charged. |
no-match | Posts were read but none matched your filters. |
more-posts-available | These channels have more posts than maxPostsPerChannel. |
budget-reached | The run's maximum total charge was reached; the posts that did not fit are not in the dataset and were not charged. |
not-read | Channels that were not read because the maximum total charge left no room, or because a run reads at most 1,000 lines. |
example-input | No channel was given, so @MrBeast was read as an example. |
Good to know
- Only public posts are read, without signing in. Members-only content is not unlocked; a shared members-only video is flagged in
videoIsMembersOnly. - The numbers are YouTube's displayed figures at the time of the run.
scrapedAtsays when. - Values YouTube does not show are
null, never 0 (for examplevideoViewCountof a members-only video). - E-mail addresses and phone numbers written into a post's text or poll choices are replaced with
[email removed]/[phone removed]. The URLs inlinksare returned as they are. - The first page of each channel is requested directly; a proxy is used only when YouTube answers with a bot check, which did not happen in the measurements of 2026-09-14.