YouTube Scraper - Most Comprehensive avatar

YouTube Scraper - Most Comprehensive

Pricing

from $0.04 / 1,000 contents

Go to Apify Store
YouTube Scraper - Most Comprehensive

YouTube Scraper - Most Comprehensive

🔥 ~$0.05/1K contents 🔥 Get public YouTube videos, channels, playlists, podcasts, courses, Posts, clips, comments, captions, and live chat.

Pricing

from $0.04 / 1,000 contents

Rating

0.0

(0)

Developer

Kai

Kai

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

YouTube Scraper

Collect YouTube videos, Shorts, streams, channels, playlists, podcasts, courses, Posts, clips, comments, chat, and captions as structured data. Search by topic, read a channel tab, or fetch known content by URL. Results go to the default dataset. Public collection needs no YouTube account or YouTube API key.

Use cases

  • Content research: find videos by topic, publication period, duration, and available features.
  • Channel analysis: compare public channel data, uploads, Shorts, streams, and collections.
  • Caption datasets: collect text, timed segments, available languages, and subtitle files.
  • Discussion research: collect comments, replies, creator hearts, and public channel Posts.
  • Podcast and course catalogues: find collections and collect their ordered video entries.
  • Live event research: collect available stream data and a bounded chat snapshot or replay.
  • Recommendation analysis: record related videos and their order for a source video.

Video, channel, and discussion data

  • Videos: identity, title, description, channel, publication date, duration, views, likes, comments, tags, hashtags, category, and thumbnails.
  • Video details: chapters, music credits, description links, location, collaborators, heat maps, storyboards, end screens, caption languages, and playback format metadata.
  • Streams: scheduled, live, or ended state, scheduled start time, current viewer count, and latency flags when YouTube supplies them.
  • Channels: descriptions, subscriber and video counts, total views, country, join date, images, external link destinations, and available tabs.
  • Playlists, podcasts, and courses: collection identity, title, author, description, counts, cover images, preview videos, and ordered entries.
  • Posts: text, images and galleries, attached videos, polls, quizzes, author data, publication display, likes, and comment counts.
  • Comments: text, author, likes, replies, pinned state, creator hearts, artist and edited marks, badges, links, and text attachments.
  • Chat: text, paid messages, stickers, memberships, gifts, notices, message updates and removals, other source events, author badges, timestamps, replay offsets, and original event data.
  • Clips: title, source video, start and end times, duration, and available creator data.
  • Captions: YouTube transcripts, timed segments, word offsets, available translations, and subtitle files.

Fields depend on what YouTube exposes for the target. Missing exact values remain null. Display labels, such as rounded counts and relative dates, stay separate from exact values.

Choose how to collect

What you needSet mode toRequired input
Mixed YouTube targets, or automatic query handlingautotargets or queries
Results for a topicsearchqueries; use search.type for channels or playlists
Full data for known videosvideoVideo IDs or URLs in targets
Channel metadatachannelChannel IDs, handles, or URLs in targets
A channel's regular videoschannelVideosChannel targets
A channel's ShortschannelShortsChannel targets
A channel's current, past, or scheduled streamschannelStreamsChannel targets
A channel's playlistschannelPlaylistsChannel targets
A channel's podcastschannelPodcastsChannel targets
A channel's courseschannelCoursesChannel targets
A channel's public PostschannelPostsChannel targets
Known PostspostPost IDs or URLs in targets
Known clipsclipClip IDs or URLs in targets
Related videosrelatedSource video IDs or URLs in targets
Live chat or available replayliveChatVideo IDs or URLs in targets
Videos for a hashtaghashtagTags, #tags, or hashtag URLs in targets
Ordered playlist entriesplaylistPlaylist IDs or URLs in targets
Playlist metadata without its entriesplaylistDetailsPlaylist IDs or URLs in targets
Video comments and optional repliescommentsVideo IDs or URLs in targets
Standalone transcript rowstranscriptVideo IDs or URLs in targets

The default is auto. A base channel target collects regular videos by default. Set limits to include Shorts or streams. Use channel mode when you need only channel metadata.

Video URLs can use watch, Shorts, live, embed, or youtu.be paths. Channel targets accept @handles, channel IDs, and channel URLs, including /c/ and /user/ URLs that YouTube can resolve. In auto mode, channel suffixes select the Videos, Shorts, Streams, Playlists, Podcasts, Courses, or Posts tab. /community selects Posts. Post and clip URLs select their own modes. For a bare clip ID, select clip mode explicitly.

A watch URL with a playlist parameter selects the video in auto mode. Use playlist or playlistDetails to select the playlist. Targets must use supported HTTPS YouTube URLs or IDs for the chosen mode.

Choose the data depth

SettingUse it whenResult
includeDetails: falseYou need the fields shown in a result list.Video, channel, and collection cards with available titles, counts, images, and source context.
includeDetails: trueYou need more data for each result.Full video, channel, or playlist metadata. Video results can also include full channel fields.

Auto mode enables details by default. Explicit list modes leave details off by default. Direct video targets always request full video data. channel and playlistDetails already return metadata and do not accept this option.

Captions are a separate option. Set fields to keep selected output fields. Selecting fewer fields changes the saved data; it does not disable captions.

Collect data

In Apify Console, open Input, paste an example, and start the run. Open the default dataset for the results. The SUMMARY record in the default key-value store reports saved rows and source outcomes.

Search for recent videos with captions:

{
"mode": "search",
"queries": ["machine learning tutorial"],
"maxItems": 20,
"search": { "publishedWithin": "month", "features": ["subtitles"] },
"includeDetails": true
}

Collect a channel's regular videos and Shorts:

{
"targets": ["https://www.youtube.com/@GoogleDevelopers"],
"limits": { "videos": 10, "shorts": 10, "streams": 0 },
"maxItems": 20
}

Find podcast collections. Use channelPlaylists or channelCourses for the other collection tabs:

{
"mode": "channelPodcasts",
"targets": ["@lexfridman"],
"maxItems": 20,
"includeDetails": true
}

Collect the video entries of a known playlist or course:

{
"mode": "playlist",
"targets": ["PLOU2XLYxmsILZnKn6Erxdyhxmc3fxyitP"],
"maxItems": 20,
"includeDetails": true
}

Read public channel Posts:

{
"mode": "channelPosts",
"targets": ["@veritasium"],
"maxItems": 20
}

Collect comments and up to five replies per parent:

{
"mode": "comments",
"targets": ["dQw4w9WgXcQ"],
"maxItems": 100,
"comments": { "sort": "newest", "includeReplies": true, "maxReplies": 5 }
}

Save native captions in several languages as VTT files:

{
"mode": "transcript",
"targets": ["dQw4w9WgXcQ"],
"maxItems": 10,
"captions": { "language": "all", "maxTracks": 10, "format": "vtt", "saveFile": true }
}

Collect one available live-chat snapshot:

{
"mode": "liveChat",
"targets": ["https://www.youtube.com/watch?v=tj4knR4r1UU"],
"maxItems": 100,
"liveChat": { "sort": "all", "maxPages": 5, "maxWaitSeconds": 0 }
}

Chat availability can change. Use a video that currently exposes public chat or replay to the Actor.

Input

Supply targets or queries, not both. Search mode uses queries. Other explicit modes use targets. Each list accepts up to 50 strings of at most 2,000 characters. Unknown fields and unsupported option combinations fail validation before collection.

FieldTypeDefaultBehaviour
modeenumautoSelects one of the modes above.
targetsstring[][]URLs, IDs, handles, or hashtags for the selected mode. Equivalent targets are collected once.
queriesstring[][]Search terms or YouTube results URLs. Valid in auto and search modes.
maxItemsinteger100Global dataset row limit from 1 to 1,000. Zero is invalid.
regionstringUSTwo-letter uppercase country code for YouTube results. Select the proxy country separately.
limitsobjectSee collection behaviourPer-source videos, shorts, and streams limits, each from 0 to 1,000.
includeDetailsbooleanTrue in auto; false in explicit list modesAdds full details to discovered videos, channels, playlists, and playlist entries.
fieldsstring[]All available fieldsSelects 1 to 100 top-level field names. Identity, status, language, format, and file references remain.
searchobjectNo filtersSearch type, order, publication period, duration, and features.
channelobjectNewest orderChannel video-tab order and publication boundary.
commentsobjectTop order; no repliesComment order and reply limits. Valid only in comments mode.
liveChatobjectAll chat; five pages; no waitChat order and collection bounds. Valid only in liveChat mode.
captionsobjectOff, except in transcript modeCaption source, language, format, files, and word offsets. Supplying this group enables native captions by default.
proxyConfigurationobject{"useApifyProxy":true}Apify Proxy or custom proxy settings for YouTube requests.

Search and channel options

OptionDefaultValues and behaviour
search.typeVideo collectionvideo, movie, channel, or playlist. Shorts and stream selection take priority for video results.
search.sortServer orderrelevance or views.
search.publishedWithinNo filtertoday, week, month, or year.
search.durationNo filtershort: less than 3 minutes; medium: 3 to 20 minutes inclusive; long: more than 20 minutes.
search.features[]hd, subtitles, creativeCommons, 3d, live, purchased, 4k, 360, location, hdr, vr180.
channel.sortnewestnewest, popular, or oldest. The requested order must be available for that channel tab.
channel.publishedAfterNo filterInclusive ISO date or relative age, such as 2026-09-01 or 7 days. Uses newest channel order.

search applies to auto, search, and hashtag modes. channel applies to auto and the Videos, Shorts, and Streams tab modes. Search controls do not filter channel tabs. Auto runs need a target to which the supplied controls apply.

Channel and playlist search accept only search.type in this group. Use maxItems without video limits, captions, or other search filters. The same restriction applies to results URLs. Hashtags collect videos and cannot use channel or playlist result types.

Results URLs retain supported filters unless an explicit control replaces them. A Shorts or live search URL selects that content when type limits are omitted. The Actor also checks duration bounds. A result without an exact duration cannot pass a duration filter.

Hour search is not supported. Inputs with search.publishedWithin: "hour" and results URLs with an hour filter are rejected. Use today, week, month, or year for search.

A channel publication boundary can make collection slower. Relative channel ages, such as 2 hours or 7 days, remain supported and are measured from the start of the run. That date stays the same if the run resumes.

Comment and chat options

OptionDefaultValues and behaviour
comments.sorttoptop or newest.
comments.includeRepliesfalseCollects replies as separate rows.
comments.maxReplies10From 0 to 100 per parent. Requires includeReplies: true.
liveChat.sortalltop or all.
liveChat.maxPages5From 1 to 25 pages of chat events in the selected order.
liveChat.maxWaitSeconds0From 0 to 60 seconds to wait for chat data. Zero collects the currently available snapshot.

With no wait, current chat returns one snapshot. Replay can collect more pages if they are available without a wait. A positive value allows the Actor to wait for more chat data. Collection stops at the row, page, or wait limit.

Caption options

OptionDefaultValues and behaviour
captions.modenative when supplied or in transcript mode; otherwise offoff or native.
captions.languageenA language code, any for one available language, or all for native tracks across languages. An exact language is preferred over a match in the same language family.
captions.maxTracks10From 1 to 20. Valid only with language: "all". Collects one preferred track per language.
captions.translateToNoneOutput language. Translation requires a translatable track and a language offered by YouTube. any and all are invalid.
captions.formatsrtsrt, vtt, xml, or plaintext.
captions.saveFilefalseSaves formatted native captions in the key-value store.
captions.prefermanualmanual or automatic. Uses the other track type if the preferred type is absent.
captions.wordTimingsfalseIncludes available native word offsets relative to each segment start.

Native mode gets manual or automatic caption tracks from YouTube.

Language all requires native mode without translation. Each track is a row in transcript mode, or an object in subtitles on a video or playlist entry. A failed track does not remove successful tracks. Off mode cannot have other caption options and cannot be used in transcript mode.

Caption options apply to video-producing modes and transcript mode. They do not apply to channel metadata, collection discovery, Posts, clips, comments, or chat. In auto mode, they apply to video and playlist-entry rows.

Connection and output options

Proxy access is enabled by default. Set proxyConfiguration.useApifyProxy to false for direct access. The group also accepts apifyProxyGroups, a two-letter apifyProxyCountry, or custom proxyUrls.

fields selects top-level output names, without nested paths. It does not create absent fields. Saved caption references remain even when full caption data is omitted. To reduce collection time, disable optional detail or caption work. Selecting fewer fields only reduces the saved row content.

Output

The default dataset contains one object per saved item. Each object has a type, recordId, input source, collection time scrapedAt, schemaVersion: 1, and partial status. Export the dataset as JSON or CSV. JSON keeps the nested arrays and objects.

Output at a glance

TypeMain fields
videovideoId, url, title, contentType, detailLevel, description, durationSeconds, publishedAt, counts, channel data, and optional details
channelchannelId, url, name, description, subscriberCount, videoCount, viewCount, country, joinedAt, images, links, and tabs
playlistplaylistId, url, title, description, authorName, videoCount, collectionType, cover images, and source channel where available
playlist-entryplaylistId, position, videoId, url, title, video fields, and nested playlist metadata
postpostId, channelId, url, text, textRuns, author fields, counts, images, video, poll, and quiz
commentvideoId, commentId, parentCommentId, text, author fields, counts, badges, creator marks, links, and attachments
live-chat-messagevideoId, nullable messageId, eventType, sourceEventType, rawEvent, text, author fields, badges, timestamps, replay offset, and payment or membership display
clipclipId, videoId, sourceVideoUrl, title, startMs, endMs, durationMs, and creator fields
transcriptvideoId, language, sourceLanguage, generation flags, fullText, segments, format, formattedText, and saved file references

Shorts and streams use type video. Their contentType is shorts or stream. Podcasts and courses use type playlist with the corresponding collectionType. Metadata discovery and playlist entry collection are separate modes.

Example from a recorded clip result, with selected fields:

{
"type": "clip",
"recordId": "clip:UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs",
"clipId": "UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs",
"videoId": "NiXD4xVJM5Y",
"title": "Test Clip",
"sourceVideoUrl": "https://www.youtube.com/watch?v=NiXD4xVJM5Y",
"startMs": 0,
"endMs": 15000,
"durationMs": 15000,
"creatorName": "Futium",
"creatorChannelId": null,
"source": "https://www.youtube.com/clip/UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs",
"scrapedAt": "2026-09-23T11:24:21.612Z",
"schemaVersion": 1,
"partial": false
}

Video and channel fields

Discovered rows use detailLevel: "list". When the full-details option succeeds, the row uses "full". Search rows can include estimatedResultCount. This is YouTube's estimate for the query. It can differ from the number of saved rows after filtering. Related-video rows add sourceVideoId and one-based recommendationRank.

Description links preserve video, timestamp, channel, YouTube page, and web destinations. Sound links identify a source only when YouTube names it. Channel links have title, url, and urlText; urlText preserves the display and url is null when no valid destination is supplied. translatedTitle and translatedText contain YouTube's available text and can match the original.

Format data describes the playback versions available from YouTube. It includes codecs, dimensions, frame rate, bitrate, audio properties, colour data, and available size or duration. Media download URLs are not included. Storyboard URLs can expire. isMonetized remains null. Restricted or verified status is not inferred from missing data.

Collections and playlist entries

Collection rows include collectionType, previewVideoIds, descriptionSnippet, lastUpdatedText, and source channel fields when available. A source channel is the channel whose tab was read; it is not an inferred owner.

Playlist-entry rows keep playlistId and position. Repeated videos at different playlist positions remain separate rows. Nested playlist data includes collectedEntryCount and collectedDurationSeconds. These totals cover the entries collected from that playlist. A run limit can reduce the number saved, so the totals can exceed the saved entries. The duration sum is null if any collected duration is unknown. Entry thumbnails describe the video; nested playlist thumbnails describe its cover. playlistDetails has no collected totals.

Posts, comments, and chat

Posts keep attachment order in images. The attached video, poll, and quiz are separate fields. Polls preserve choices and total vote labels. Quiz answers and explanations are included only when the source supplies them. Empty or missing post text is preserved. Post comment counts do not include comment bodies; Post comments are not collected.

Comments use parentCommentId: null at the top level. A reply identifies its parent comment. Fields include replyCount, replyLevel, isPinned, isCreator, isVerified, isArtist, isHeartedByCreator, isEdited, author and sponsor badges, styleRuns, links, and attachments. Relative publication text and edited marks do not establish exact publication or edit timestamps.

Chat events have an eventType, such as text, paid-message, paid-sticker, membership, membership-gift, gift-received, engagement, mode-change, or deleted. Available fields include isUpdated, isDeleted, isReplay, replayOffsetMs, timestamp, timestampUsec, timestampText, amountText, membershipText, and stickerUrl. Updates and removals are separate events; a removal can have null text and no author data.

Every chat row also has sourceEventType. It holds the original YouTube renderer name for a renderer event, or the action name for another event. Events without a normalized type use this name as eventType. messageId is null when YouTube supplies no message ID; recordId remains stable and nonempty.

rawEvent contains the original leaf YouTube action object. For a replay, the replay wrapper is excluded and replayOffsetMs stores its offset. rawEvent is included by default. If you use fields, add rawEvent to that list to keep it. sourceEventType remains with the identity fields. Chat limits and discussion-result charges count saved event rows, including control events and events without a message ID.

Caption fields

Native captions include source and requested languages, available track and translation languages, full text, timed segments, and video metadata when available. isAutoGenerated identifies YouTube automatic captions. isTranslated identifies caption translation. Attached captions stay in subtitles on a video or playlist-entry row.

This illustrative segment shows the time units. It is not a recorded caption:

{
"startMs": 1000,
"endMs": 2500,
"text": "First section.",
"words": [
{ "text": "First", "offsetMs": 0 },
{ "text": "section.", "offsetMs": 500 }
]
}

Native word offsets are relative to the segment start. Missing word data or exact offsets remain null.

Saved captions have subtitleKey, subtitleUrl, and a format URL such as vttUrl. Large caption content moves to transcriptKey and transcriptUrl; the row's fullText, segments, and formattedText then become null.

Collection behaviour

Row and content limits

maxItems limits rows across the whole run. Each video, collection, Post, comment, reply, chat event, clip, or standalone transcript track counts as one row. Attached captions do not add rows. Collection stops before another source when the global limit is reached.

For search, hashtags, and auto base-channel targets, omitted type limits mean regular videos use maxItems, while Shorts and streams use zero. If any limits value is supplied, omitted types use zero. The Actor collects regular videos, then Shorts, then streams. Each type limit applies per source and is capped by the remaining row capacity when results are saved.

An explicit Videos, Shorts, or Streams tab uses maxItems when all type limits are omitted. Once a type limit is supplied, an omitted limit for that tab is zero. Playlist entries use limits.videos or maxItems; explicit playlist mode rejects Shorts and stream limits. Channel and playlist search, channel collections, Posts, related videos, and chat use maxItems directly.

All effective type limits at zero return channel metadata for auto channel targets, including video-tab URLs. Explicit video-tab modes then return no rows. Direct video targets still return metadata. Search and hashtag targets with all type limits at zero return no videos.

For search.features: ["live"], only streams are collected. The limit is limits.streams, then limits.videos if supplied, otherwise maxItems when no type limit is set. A Shorts-only limit gives no live rows.

Ordering and duplicates

Results follow the source order and supplied target order. There is no global chronological sort across targets. The Actor removes equivalent input targets and repeated record IDs. source is the first input that produced the row. Playlist identity includes the position; related-video identity includes the source video. Recommendations and search results can change between runs.

Partial results and unavailable data

A valid search with no matches succeeds with no rows. Results can be partial when a limit is reached, YouTube stops providing data, or optional work fails. Rows then have partial: true and a reason when available. Failed detail or caption work can keep the base row with enrichmentErrors. Successful caption tracks remain if another track fails.

Public metadata can exist when playback is unavailable. Check playabilityStatus and playbackAvailable. Counts and relative dates are only exact when the source gives an exact value. The Actor does not infer poll percentages, monetisation, or private audience data.

SUMMARY reports the saved count, stop reason, and outcome for each source. Mixed or incomplete work has partial status. If all processed sources fail, the run fails.

Costs and restart

Each saved dataset row counts as one billing event in one of two groups:

Billing eventSaved row types
Content result (content-result)video, channel, playlist, playlist-entry, post, clip, transcript
Discussion result (discussion-result)comment, including replies, and live-chat-message

Each group has its own price. See the Actor's Pricing tab in Apify for current rates and any start or platform charges. The row's type identifies the data it contains; the billing group does not change it.

Attached captions and their file exports are included in the video or playlist-entry result. They add no billing event. In transcript mode, each returned language track counts as one content result.

maxItems limits the total saved rows across both groups. Content, reply, track, and chat limits also apply as described above.

An interrupted run can resume with the same input. Start a new run when you change the input. If saved rows and charges do not match, the run stops to prevent repeated charges. Use recordId to remove duplicates if you combine exports or repeat a run.

Public access and source changes

The Actor collects content available without signing in. Private or member-only content, owner analytics, moderation tools, and business email that requires sign-in are not available. Video and audio downloads are not included.

Chat and replay must be publicly available to the Actor. A chat snapshot covers a limited period; it does not monitor a stream continuously. Large collections can be incomplete. YouTube can restrict access, remove content, or change the available data. scrapedAt records the collection time.