Youtube Video Summarizer With Top Comments & Replies
Pricing
from $5.99 / 1,000 results
Youtube Video Summarizer With Top Comments & Replies
Summarize YouTube videos quickly with the YouTube Video Summarizer. Generate concise, timestamped summaries, key points, and chapter-style outlines from any video URL. Ideal for research, note-taking, SEO, and accessibility. Fast, accurate, and easy to integrate. Exports in TXT JSON CSV; API ready.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Video Summarizer — Transcripts, Summaries and Reply Threads
Give this Actor a YouTube link, a video ID, or just a topic to search for, and it returns one structured row per video — metadata, full transcript, chapters, and an optional AI summary — followed by every comment and every reply as its own linked child row. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. No YouTube login, no Google Cloud project, and no OAuth consent from the channel owner are required to read a public video's transcript or comments. Point it at a channel's most-discussed uploads today, and you get the same shape back tomorrow — video, comment, and reply rows tied together by ID.
What is Youtube Video Summarizer With Top Comments & Replies?
It is a YouTube video scraper that takes a list of video links or IDs — or, when you leave those empty, a list of discussion topics to search — and returns one video row per result plus one child row per comment and per reply, all linked back to the parent video by parentVideoId. What sets it apart from a plain transcript puller is that replies are not flattened into the comment list: each reply is its own row with isReply: true and a replyToCid pointing at the exact comment it answers, so thread structure survives the scrape. No YouTube account or sign-in is required — the Actor reads the same public watch page and comment feed any visitor sees.
- 🎬 Video metadata — title, description, view/like/comment counts, tags, hashtags, category, resolution, upload type (normal, live, live replay, Short, premiere)
- 📝 Full transcript with per-line timestamps, plus chapter markers when the video has them
- 🤖 Optional AI summary (short and long) generated from the transcript with your own OpenAI key — never a placeholder string when it's skipped
- 💬 Top-level comments in either of YouTube's own sort orders (top or newest)
- ↩️ Reply threads expanded and linked to their parent comment
- 🔍 Discussion-topic search, when you don't already have specific video links
- 🚫 An honest
commentsDisabledflag instead of silently returning an empty comment list
What data can you get with Youtube Video Summarizer With Top Comments & Replies?
The Actor returns three result types in one dataset: video rows, comment rows, and reply rows.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Video | title, description, published_date, duration_seconds, views, likes, comment_count, engagement_rate, tags, hashtags, category, language, live_status, upload_type, resolution, thumbnails, chapters, channel_id, channel_name, channel, transcript, transcript_source, summary, long_summary, summary_source, summaryStatus, aiConfigured | Content research, transcript indexing, LLM context, competitive video monitoring |
| Comment | commentText, commentAuthor, commentAuthorChannelId, commentAuthorAvatarUrl, commentAuthorIsCreator, commentAuthorIsVerified, commentLikeCount, commentReplyCount, commentPublishedText, commentHasCreatorHeart, commentIsPinned, cid, parentVideoId, commentSortUsed | Audience sentiment, top-fan identification, keyword-filtered discussion mining |
| Reply | Same fields as Comment, plus replyToCid linking it to the parent comment's cid | Thread-level engagement analysis, conversation reconstruction |
🔗 Linked reply threads
This is the capability a plain "top comments" scraper doesn't give you: every reply is pushed as its own row, carrying replyToCid back to the comment it answers, so you can reconstruct full conversation threads without guessing which reply belongs to which comment. Replies are collected per comment (capped by maxRepliesPerComment) and counted separately from top-level comments, so commentsCollected and repliesCollected on the video row always tell you exactly what was gathered.
{ "type": "comment", "cid": "UgxAB12cd", "commentText": "This aged well.", "replyToCid": null }{ "type": "reply", "cid": "UgxAB12cd.9fZk1", "commentText": "Facts.", "replyToCid": "UgxAB12cd" }
📝 Transcript and chapters
Every video row carries the full transcript as a list of {start, dur, text} segments — pulled from YouTube's own subtitle or auto-caption track — plus transcript_source telling you exactly which track was used (e.g. subtitles:en, auto_captions:en). When the video has chapter markers, they arrive as a chapters array of {title, startSeconds, endSeconds}, useful for jumping straight to the segment your query cares about instead of scanning the whole transcript.
How does Youtube Video Summarizer differ from the official YouTube Data API?
The YouTube Data API v3 is Google's own public API and covers video metadata and comments — but it draws a hard line at captions and offers no summarization at all. This Actor covers all three in one linked run, without the setup the official API requires.
| Feature | YouTube Data API v3 | Youtube Video Summarizer With Top Comments & Replies |
|---|---|---|
| Video metadata | videos.list, 1 quota unit per call | One row per video, no quota to manage |
| Transcript access | captions.download requires OAuth scopes (youtube.force-ssl, youtubepartner) granted by the video's own channel owner — a third party generally cannot download another channel's captions this way | Reads the video's own public transcript track directly, no OAuth or channel-owner consent involved |
| Comments | commentThreads.list, 1 quota unit per call, paginated; replies require separate comments.list calls you stitch together yourself | Comments and replies arrive already linked via cid / replyToCid in the same run |
| Summarization | Not part of the API | Optional AI summary generated with your own OpenAI key |
| Daily quota | 10,000 units/day default allocation, plus a separate 100-call/day cap on search.list (developers.google.com, checked 2026-08-15) | Governed by your own run inputs (maxVideos, maxCommentsPerVideo, maxRepliesPerComment), not a platform-wide daily quota |
| Setup | Google Cloud project, API key or OAuth client, quota monitoring | An Apify account, and optionally an OpenAI key |
Use the official API when you already run a Google Cloud project and only need metadata or comments within your quota. Use this Actor when you also need the transcript without owner consent, threaded replies in the same pass, or an AI summary — without provisioning any of Google's infrastructure yourself.
What is the difference between a transcript scraper and a video summarizer?
A transcript scraper returns raw captions — every spoken line with a timestamp, and nothing else. A video summarizer turns that same transcript into a short, readable digest. The distinction matters because a raw transcript is what you feed to your own analysis pipeline, while a summary is what a human reads directly.
This Actor returns both, from the same run, in the same video row: the raw transcript array (always present when YouTube has a caption track, with or without an API key) and the summary / long_summary fields (populated only when you supply your own OpenAI key under aiApiKey). Without a key, summary and long_summary come back null and summaryStatus reports no_api_key — never placeholder text pretending to be a summary. This lets you choose per run whether you want the raw material, the digest, or both.
How to scrape YouTube with Youtube Video Summarizer With Top Comments & Replies?
- Open the Actor's page on the Apify Store and click Start, or configure it from the Apify Console.
- Paste one or more entries into Video links or IDs (
videoLinks) — full watch links, short links, Shorts links, or bare 11-character IDs. Leave it empty and fill in Discussion topics instead if you don't have specific videos yet. - Set the comment controls that matter for your run: Comment order (
commentSort), Max comments per video (maxCommentsPerVideo), Expand reply threads (includeReplies), Max replies per comment (maxRepliesPerComment), and optionally Keep only comments containing (commentKeywords). - Optionally paste your own OpenAI key into OpenAI API key (
aiApiKey) to turn on AI summaries, then click Start. - When the run finishes, download the dataset as JSON, CSV, Excel, XML, or HTML, or pull it through the Apify API /
apify_client.
How to run multiple queries in one job
videoLinks and discussionTopics both accept arrays, so a single run can cover many videos or many topics at once. When you supply videoLinks (or the legacy urls), each entry becomes its own video row plus its comment and reply rows — maxVideos caps how many of those links are processed, but never caps the comment or reply rows they produce. When both link fields are empty, the Actor instead searches each phrase in discussionTopics and takes up to maxVideosPerTopic (1–50, default 2) videos per topic. Concurrency across videos is not a configurable input on this Actor.
⬇️ Input
Every field is optional — the run needs either at least one entry in videoLinks (or urls), or at least one entry in discussionTopics; otherwise the Actor stops with an error before starting.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
videoLinks | No | Array | One entry per video: a full watch link, short link, Shorts link, or bare 11-character video ID. | ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] |
urls | No | Array | Backward-compatible alias for videoLinks. Used only when videoLinks is empty. | [] |
discussionTopics | No | Array | Topics to search on YouTube when both link fields above are empty. | ["movie review", "product unboxing"] |
maxVideosPerTopic | No | Integer (min 1, max 50, default 2) | How many videos to take from each topic above. Only applies when both link fields are empty. | 2 |
maxVideos | No | Integer (min 0, default 0) | Stop after this many videos, counted over the links (or discovered topic videos). 0 means every link. | 0 |
maxVideoDurationSeconds | No | Integer (min 0, default 0) | Videos longer than this still return full metadata and comments, but the AI summary step is skipped. 0 means no limit. | 3600 |
includeComments | No | Boolean (default true) | Fetch the video's comment threads as child rows. | true |
commentSort | No | String enum: top (default), newest | Which of YouTube's own comment orders to read — two different sets of comments, not a re-ordering of one list. | "top" |
maxCommentsPerVideo | No | Integer (min 0, default 20) | Caps the top-level comments collected per video. 0 means all available. | 20 |
includeReplies | No | Boolean (default true) | Open each collected comment's reply thread and emit every reply as its own row. | true |
maxRepliesPerComment | No | Integer (min 0, default 5) | Caps how many replies are pulled from each comment thread. 0 means all replies. | 5 |
commentKeywords | No | Array | Keep a top-level comment only if its text contains at least one entry (case-insensitive). Replies of a kept comment are always included. | ["how", "?"] |
aiApiKey | No | String (secret) | Your own OpenAI API key (sk-...). Falls back to the OPENAI_API_KEY environment variable if left empty. Without a key, summary/long_summary are null and summaryStatus is no_api_key. | "sk-..." |
aiModel | No | String enum: gpt-4o-mini (default), gpt-4.1-mini, gpt-4o, gpt-4.1 | Which OpenAI model writes the summary. Only used when aiApiKey is supplied. | "gpt-4o-mini" |
maxRetries | No | Integer (min 1, max 10, default 3) | How many times a video is attempted before the run moves on and writes an error row for it. | 3 |
proxyConfiguration | No | Object (proxy editor) | Optional Apify Proxy configuration. Recommended for large batches. | { "useApifyProxy": true } |
Example JSON input:
{"videoLinks": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/jNQXAC9IVRw"],"includeComments": true,"commentSort": "top","maxCommentsPerVideo": 20,"includeReplies": true,"maxRepliesPerComment": 5,"commentKeywords": [],"aiApiKey": "sk-...","aiModel": "gpt-4o-mini","maxRetries": 3,"proxyConfiguration": { "useApifyProxy": true }}
Common pitfall: videoLinks and urls are not merged. If videoLinks has any entries, urls is ignored entirely — and discussionTopics is only read when both link fields are completely empty. Sending links in one field and topics in another does not combine them; the Actor uses whichever link field is populated and falls back to topics only as a last resort.
⬆️ Output
Results are written as typed, normalized JSON rows to the run's default dataset, exportable as JSON, CSV, Excel, XML, or HTML from the Apify Console or API. Every row — video, comment, or reply — carries the same 56 keys; fields that don't apply to that row type are null rather than omitted, so every export has a consistent, predictable schema. When includeComments is on, comment and reply rows are additionally pushed to a second, auxiliary dataset named <runId>-comments, so you can pull just the comment layer without filtering the main dataset.
Scraped results
[{"type": "video","isChild": false,"isReply": false,"id": "dQw4w9WgXcQ","video_id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","status": "ok","title": "Rick Astley - Never Gonna Give You Up","description": "The official video for \"Never Gonna Give You Up\"...","published_date": "2009-10-25","relativeDate": "16 year(s) ago","duration_seconds": 212,"views": 1650000000,"likes": 18000000,"comment_count": 2100000,"engagement_rate": 0.0121,"tags": ["Rick Astley", "Never Gonna Give You Up"],"hashtags": [],"category": "Music","language": "en","live_status": "none","upload_type": "normal","resolution": "1280x720","thumbnails": {"default": "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg","medium": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg","high": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg","standard": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg","maxres": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg"},"chapters": [{ "title": "Intro", "startSeconds": 0, "endSeconds": 43 },{ "title": "Chorus", "startSeconds": 43, "endSeconds": 89 }],"channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw","channel_name": "Rick Astley","channel": {"id": "UCuAXFkgsw1L7xaCfnd5JJOw","name": "Rick Astley","handle": "RickAstleyYT","url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","subscriberCount": "4200000 subscribers","logo": ["https://yt3.ggpht.com/example-avatar.jpg"],"badges": ["Verified"]},"transcript": [{ "start": "0.000", "dur": "3.500", "text": "We're no strangers to love" },{ "start": "3.500", "dur": "3.200", "text": "You know the rules and so do I" }],"transcript_source": "subtitles:en","summary": "The official music video for Rick Astley's 1987 hit, in which he sings a direct declaration of loyalty and devotion to a former partner.","long_summary": "# Never Gonna Give You Up\n\n## Overview\n\nThe track is a plea for reconciliation...","summary_source": "transcript","summaryStatus": "generated","aiConfigured": true,"commentsDisabled": false,"commentSortUsed": "top","commentsCollected": 2,"repliesCollected": 1,"parentVideoId": null,"parentVideoUrl": null,"cid": null,"replyToCid": null,"error": null,"scrapedAt": "2026-08-15T09:12:03Z","commentText": null,"commentAuthor": null,"commentAuthorChannelId": null,"commentAuthorAvatarUrl": null,"commentAuthorIsCreator": null,"commentAuthorIsVerified": null,"commentLikeCount": null,"commentReplyCount": null,"commentPublishedText": null,"commentHasCreatorHeart": null,"commentIsPinned": null},{"type": "comment","isChild": true,"isReply": false,"id": "UgxAB12cd","video_id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=UgxAB12cd","status": "ok","title": "Rick Astley - Never Gonna Give You Up","channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw","channel_name": "Rick Astley","channel": { "id": "UCuAXFkgsw1L7xaCfnd5JJOw", "name": "Rick Astley" },"commentSortUsed": "top","parentVideoId": "dQw4w9WgXcQ","parentVideoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","cid": "UgxAB12cd","replyToCid": null,"scrapedAt": "2026-08-15T09:12:11Z","commentText": "This still gives me chills in 2026.","commentAuthor": "@musicfan","commentAuthorChannelId": "UCabc123def456","commentAuthorAvatarUrl": "https://yt3.ggpht.com/example-user-avatar.jpg","commentAuthorIsCreator": false,"commentAuthorIsVerified": false,"commentLikeCount": 412,"commentReplyCount": 1,"commentPublishedText": "2 weeks ago","commentHasCreatorHeart": false,"commentIsPinned": false},{"type": "reply","isChild": true,"isReply": true,"id": "UgxAB12cd.9fZk1","video_id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=UgxAB12cd.9fZk1","status": "ok","title": "Rick Astley - Never Gonna Give You Up","channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw","channel_name": "Rick Astley","commentSortUsed": "top","parentVideoId": "dQw4w9WgXcQ","parentVideoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","cid": "UgxAB12cd.9fZk1","replyToCid": "UgxAB12cd","scrapedAt": "2026-08-15T09:12:12Z","commentText": "Facts. Timeless.","commentAuthor": "@another_viewer","commentAuthorChannelId": "UCdef789ghi012","commentAuthorAvatarUrl": "https://yt3.ggpht.com/example-user2-avatar.jpg","commentAuthorIsCreator": false,"commentAuthorIsVerified": false,"commentLikeCount": 9,"commentReplyCount": 0,"commentPublishedText": "1 week ago","commentHasCreatorHeart": false,"commentIsPinned": false}]
⚠️ Failed videos still write a charged row. If a video can't be read after
maxRetriesattempts, the Actor still pushes a row for it (status: "error",errorset to a plain-language reason,summaryStatus: "skipped") under the samerow_resultcharged event as a successful row. Filter onstatus != "error"downstream if you only want completed videos; the run itself does not skip billing for the failed ones.
How can I use the data extracted with Youtube Video Summarizer With Top Comments & Replies?
- 📊 Content researchers and media analysts: pull
transcript,summary, andengagement_rateacross a channel's uploads to track how a topic is being covered without watching every video. - 🤖 AI engineers and LLM developers: feed
transcriptandcommentTextstraight into a RAG pipeline or agent context — the video row and its linked comment/reply rows give an LLM both the source material and audience reaction in one JSON payload. - 📈 Market researchers: compare
commentsCollected,repliesCollected, andengagement_rateacross competing videos in a niche to gauge relative audience reaction. - 🎬 Creators and product teams: filter
commentKeywordsfor the specific feedback or questions you care about, and usecommentsDisabledto confirm whether a competitor has turned comments off entirely.
How do you monitor video engagement over time?
Monitoring here means re-running the Actor on the same video links on a schedule and diffing the numeric fields between runs. Because each run is a fresh scrape, views, likes, comment_count, engagement_rate, commentsCollected, and repliesCollected change between runs in step with real audience activity — a spike in repliesCollected on a specific cid thread, for instance, usually means a comment just started a debate.
Diff these fields run-over-run: views, likes, comment_count, engagement_rate, commentsCollected, repliesCollected, and commentsDisabled (in case a creator turns comments off after a controversy). A typical workflow: schedule a run across your tracked video list every day → compare each video's engagement_rate and commentsCollected against yesterday's dataset → alert when a video's reply count on a single thread jumps sharply, which usually signals an emerging discussion worth reading.
Set this up with an Apify schedule on this Actor's saved input, and pair it with a webhook to ACTOR.RUN.SUCCEEDED if you want each run's completion pushed to your own endpoint instead of polling the Console.
Integrate Youtube Video Summarizer With Top Comments & Replies and automate your workflow
Youtube Video Summarizer With Top Comments & Replies works with any language or tool that can send an HTTP request.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scrapier/youtube-video-summarizer-with-top-comments-replies").call(run_input={"videoLinks": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"includeComments": True,"commentSort": "top","maxCommentsPerVideo": 20,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["type"], row.get("title") or row.get("commentText"))
Scheduled monitoring and delivery
Use an Apify schedule to run this Actor on a cron interval against a fixed set of video links, and an Apify webhook on ACTOR.RUN.SUCCEEDED to have each finished run's dataset pushed to your own endpoint instead of polling for it.
Is it legal to scrape YouTube video comments?
Yes — scraping publicly visible YouTube content is generally lawful in most jurisdictions, and Youtube Video Summarizer With Top Comments & Replies returns only what any visitor sees on a public watch page: video metadata, the transcript, and public comments. Because comment rows include identifiable information about the people who posted them (commentAuthor, commentAuthorChannelId, commentAuthorAvatarUrl), that portion of the output is personal data and falls under data-protection regimes like the GDPR (EU) and CCPA (California) if you store or process it about identifiable individuals — you are responsible for having a lawful basis, and for honoring deletion or opt-out requests. Scraping for AI training carries a different risk profile than scraping for one-off operational monitoring, and YouTube's own Terms of Service govern what you may do with data collected from the platform regardless of data-protection law. Consult your legal team for commercial use cases involving bulk storage of comment author data.
Frequently asked questions
Which transcript language does the Actor return?
It prefers the video's own detected language, falling back to English subtitles or auto-captions, then to any other available subtitle or auto-caption track — whichever is found first is reported in transcript_source (e.g. subtitles:en, auto_captions:es). There is no explicit region or language input parameter; the Actor doesn't let you force a specific transcript language.
What's the difference between "top" and "newest" comment order?
They're two different sets of comments YouTube itself serves, not a re-ordering of the same list. commentSort: "top" (default) returns YouTube's own ranked set; commentSort: "newest" returns the most recently posted comments — set commentSortUsed on each row confirms which was used.
How does the Actor handle YouTube's anti-bot measures?
When a request is rejected with a "sign in to confirm you're not a bot" response, or hits a connection-level failure, the Actor automatically switches to an alternate residential proxy route and retries — up to maxRetries attempts per video (default 3, exponential backoff up to 8 seconds between attempts). Turning on proxyConfiguration for large batches reduces how often this escalation is needed.
Does the Actor extract replies as their own linked rows?
Yes. Every reply is pushed as its own row (type: "reply", isReply: true) with replyToCid pointing at the parent comment's cid. This only happens when includeReplies is on and the parent comment reports at least one reply; it's skipped for comments YouTube shows as having zero replies.
How many comments and replies does it return per video?
maxCommentsPerVideo caps top-level comments per video (default 20, 0 = all available), and maxRepliesPerComment caps replies per comment thread (default 5, 0 = all available in that thread) — these are Actor-side caps, not documented YouTube platform limits. maxVideos caps how many videos are processed but never counts against the comment or reply totals.
How do I monitor a video's engagement over time?
Schedule this Actor to re-run on the same video list, then compare views, engagement_rate, commentsCollected, and repliesCollected against the previous run's dataset — see "How do you monitor video engagement over time?" above for the full workflow and the Apify scheduling mechanism to use.
Does it work with Claude, ChatGPT, and AI agent frameworks?
There is no MCP server documented for this Actor. It is callable as a standard HTTP endpoint through the Apify API or apify_client from any language or agent framework, which lets an agent request fresh video and comment data before generating a grounded answer.
Can I use it without managing proxies or YouTube credentials?
Yes. No YouTube account, login, or API key is required to run it — the Actor reads public pages directly. proxyConfiguration is optional and off by default; turning it on is only recommended for large batches to spread requests across Apify Proxy.
💬 Your feedback
Found a bug or missing a field? Let us know through the Actor's Issues tab on the Apify Store, or contact Scrapier support from the Actor's page. Reports like these are how the field list and edge-case handling keep improving.