YouTube Scraper - Videos, Channels, Comments & Subtitles avatar

YouTube Scraper - Videos, Channels, Comments & Subtitles

Pricing

from $0.80 / 1,000 results

Go to Apify Store
YouTube Scraper - Videos, Channels, Comments & Subtitles

YouTube Scraper - Videos, Channels, Comments & Subtitles

YouTube API alternative with no quota or key: channels, videos, Shorts, live streams, playlists, search, hashtags, community posts, comments and replies, subtitles (SRT/VTT/text), chapters and exact upload dates. Drop-in input for popular YouTube scrapers. From $0.80 per 1,000.

Pricing

from $0.80 / 1,000 results

Rating

0.0

(0)

Developer

Alom Dev

Alom Dev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

YouTube Scraper

Scrape YouTube into JSON, CSV or Excel: channel videos, Shorts, live streams, community posts and playlists, hashtag pages, search results (videos, Shorts, channels, playlists), video details, subtitles and comments (with replies). You get titles, views, likes, comment counts, exact upload times, durations, descriptions and their links, chapters, hashtags, tags, related videos, channel subscribers, location and join date, and full comment threads.

✅ No login, no API key, no quota: it reads the same data youtube.com shows logged-out visitors. ✅ One Actor for channels, Shorts, streams, posts, playlists, hashtags, search, subtitles and comments. ✅ YouTube transcripts from captions: a video's subtitles (manual or auto-generated) as plain text, SRT or VTT, in every language the video has captions for. ✅ Drop-in compatible with the most-used YouTube scrapers' input and output field names. ✅ Monitoring mode: return only videos and comments you haven't seen yet, on a schedule. ✅ You never pay for errors: a deleted video or an unknown channel produces no row and no charge.

What can you use YouTube data for?

  • Influencer & creator research: subscribers, upload frequency, views and likes per video, country.
  • Competitor and brand monitoring: new videos from a list of channels every day, and what viewers say about them.
  • Content & trend research: what ranks for a keyword this week, which Shorts take off, which formats get likes.
  • Audience research / sentiment analysis: thousands of comments and replies per video.
  • AI & research datasets: titles, descriptions, tags and comments at scale.

Switching from another YouTube scraper?

  1. Keep your input. These fields work the same way as in the most-used YouTube scrapers: startUrls, searchQueries, maxResults, maxResultsShorts, maxResultStreams, sortingOrder, dateFilter, videoType, lengthFilter, isHD/is4K/isLive/… filters, oldestPostDate, sortVideosBy, channels, sortChannelShortsBy, maxComments, sortCommentsBy, oldestCommentDate, and the subtitle options transcriptionAndSubtitle, subtitlesLanguage, subtitlesFormat, preferAutoGeneratedSubtitles, saveSubsToKVS. Also understood: keywords, youtubeHandles, maxItems, uploadDate, duration, features, sort, gl, includeShorts (apidojo-style input).
  2. Change the Actor ID to this one.
  3. Your pipeline keeps working: rows use the same field names - id, title, url, viewCount, likes, commentsCount, date, duration, text, hashtags, channelName, channelUrl, channelId, channelUsername, numberOfSubscribers, channelTotalVideos, channelTotalViews, channelJoinedDate, channelLocation, fromYTUrl, fromChannelListPage, descriptionLinks, subtitles, isMembersOnly, isAgeRestricted, order, type (video / shorts); comments use cid, comment, author, videoId, pageUrl, title, voteCount, replyCount, replyToCid, authorIsChannelOwner, hasCreatorHeart.

Differences worth knowing:

  • Coming from a comments-only scraper? Add "commentsOnly": true, otherwise you also get one row per video.
  • date is always an ISO timestamp. Where YouTube only says "3 weeks ago" it is an estimate and dateIsExact is false; the original text is in dateText. duration is HH:MM:SS, plus durationSeconds.
  • Subtitles: the ones YouTube has (uploaded or automatic). No AI speech-to-text transcription.
  • Errors (deleted video, unknown channel, a URL that is not YouTube) are not written as dataset rows, so you are never charged for them. They are named in the run's status message, the NOT_FOUND key-value record and the log. One bad URL never stops the rest of the run.

What you can scrape

InputExampleOutput
Channelhttps://www.youtube.com/@MrBeast, /channel/UC…, /c/…, /user/…its videos (maxResults), Shorts (maxResultsShorts), streams (maxResultStreams), each with channel info
Channel tab…/@MrBeast/shorts, …/@NASA/streams, …/@MrBeast/posts, …/@kurzgesagt/playlistsonly that tab
Community postsa channel + maxPosts (or a /posts URL)post rows: text, images, poll, attached video, exact likes, comment count, date
Channel playlistsa channel + maxPlaylists (or a /playlists URL)playlist rows: title, URL, number of videos
Channel infoany channel with all limits set to 0one channel row: subscribers, videos, total views, country, joined, links
SearchsearchQueries: ["lofi hip hop"] or a /results?search_query=… URLvideos, with upload date / length / type / feature filters; Type = Shorts, Channels or Playlists returns those
Hashtaghttps://www.youtube.com/hashtag/cats or hashtags: ["cats"]videos (and Shorts with maxResultsShorts)
Playlisthttps://www.youtube.com/playlist?list=…its videos in playlist order
Video or Shorthttps://www.youtube.com/watch?v=…, youtu.be/…, /shorts/…full details: exact views, likes, comment count, exact upload time, duration, tags, category, chapters, description links
Subtitlesany videos + downloadSubtitlesSRT / WebVTT / XML / plain text in the chosen language
Related videosany videos + includeRelatedVideosthe ~20 "Up next" videos per video
Commentsany of the above + maxCommentscomments (Top or Newest), optionally replies

Output examples

A video (from a channel, with includeVideoDetails):

{
"type": "video",
"id": "v9QtM6qnG50",
"url": "https://www.youtube.com/watch?v=v9QtM6qnG50",
"title": "I Built A City To Save Kids From Illegal Labor",
"text": "Huge thanks to the 1 Billion Followers Summit, …",
"viewCount": 82636809,
"viewCountText": "82,636,809 views",
"likes": 2032918,
"commentsCount": 94000,
"commentsTurnedOff": false,
"date": "2026-09-19T16:00:01.000Z",
"dateText": "10 days ago",
"dateIsExact": true,
"duration": "00:19:02",
"durationSeconds": 1142,
"thumbnailUrl": "https://i.ytimg.com/vi/v9QtM6qnG50/hq720_custom_2.jpg?…",
"hashtags": [],
"keywords": [],
"category": "Entertainment",
"descriptionLinks": [{ "url": "https://www.1billionsummit.com/", "text": "https://www.1billionsummit.com/" }],
"chapters": [{ "title": "Intro", "startSeconds": 0, "timeText": "0:00" }],
"chaptersAutoGenerated": false,
"isMembersOnly": false,
"isAgeRestricted": false,
"isUnlisted": false,
"liveStatus": null,
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelName": "MrBeast",
"channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelUsername": "MrBeast",
"numberOfSubscribers": 519000000,
"isChannelVerified": true,
"channelLocation": "United States",
"channelJoinedDate": "Feb 19, 2012",
"channelTotalVideos": 1004,
"channelTotalViews": 141227305543,
"detailsScraped": true,
"subtitles": null,
"subtitleLanguages": null,
"relatedVideos": null,
"fromChannelListPage": "videos",
"order": 0,
"fromYTUrl": "https://www.youtube.com/@MrBeast/videos",
"input": "https://www.youtube.com/@MrBeast",
"scrapedAt": "2026-09-30T11:40:00.000Z"
}

A comment:

{
"type": "comment",
"cid": "Ugzge340dBgB75hWBm54AaABAg",
"comment": "can confirm: he never gave us up",
"author": "@YouTube",
"authorChannelId": "UCBR8-60-B28hp2BmDPdntcQ",
"authorIsChannelOwner": false,
"authorIsVerified": true,
"hasCreatorHeart": true,
"isPinned": true,
"voteCount": 321000,
"replyCount": 963,
"date": "2025-09-30T11:38:17.654Z",
"publishedTimeText": "1 year ago",
"isReply": false,
"replyToCid": null,
"videoId": "dQw4w9WgXcQ",
"pageUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"commentsCount": 2457929
}

A community post:

{
"type": "post",
"postId": "UgkxHIfkQ3K2my65-kPq4VkRv9KrBRyN7alx",
"url": "https://www.youtube.com/post/UgkxHIfkQ3K2my65-kPq4VkRv9KrBRyN7alx",
"text": "NO MORE WAITING, this Saturday …",
"date": "2026-09-29T13:58:34.465Z",
"dateText": "1 day ago",
"likes": 147168,
"commentsCount": 3600,
"attachmentType": "image",
"images": ["https://yt3.ggpht.com/…"],
"videoId": null,
"poll": null,
"isMembersOnly": false,
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelName": "MrBeast",
"channelUsername": "MrBeast",
"fromYTUrl": "https://www.youtube.com/@MrBeast/posts"
}

Shorts rows have "type": "shorts" and a /shorts/ URL; streams have "type": "stream" and liveStatus (live, upcoming, was_live). Values YouTube doesn't show on a given page are null, never a made-up 0.

How much does it cost?

Proposed pricing (not live yet): pay per result, platform usage (compute and proxy) included. One result = one video, Short, stream, comment or channel row.

Apify planPrice per 1,000 results
Free$1.50
Starter (Bronze)$1.25
Scale (Silver)$1.00
Business (Gold) and above$0.80
  • 1,000 videos from 10 channels: $1.50 on the Free plan, $0.80 on Business.
  • 10,000 comments: $15 on Free, $8 on Business - the popular comments scraper charges $9-20.
  • Full video details and comments cost the same per row - they only make the run take longer (see below).

Full video details (includeVideoDetails)

Channel, search and playlist pages show YouTube's rounded numbers ("82M views", "3 weeks ago") and no likes. With Add full video details on, the scraper opens every video (2 extra requests) and adds exact views, likes, comment count, the exact upload time, duration, full description and its links, chapters, tags (keywords), category and the members-only / age-restricted flags. This makes runs roughly 5-10x slower (measured: 300 videos in about 4 minutes) but does not change the price per row. Video URLs you enter directly always get full details.

Subtitles (downloadSubtitles)

Turn on Download subtitles and pick a language (en, de, pt-BR, … or any) and a format (srt, vtt, xml, plaintext). Each video row gets subtitles: [{ language, languageName, type, format, srt }] (type is user_generated or auto_generated) and subtitleLanguages - every language the video has. A video without subtitles in that language gets subtitles: []; if YouTube does not show the list (age-restricted or members-only videos) it is null. Also save subtitles as files puts each file in the run's key-value store (srtUrl). There is no AI transcription and no machine translation. The price per row stays the same.

Your own cookies (optional, advanced)

Everything above works without an account. The only thing YouTube hides from logged-out visitors is age-restricted videos (exact data, subtitles) and their comments. For those, you can paste the cookies of a logged-in youtube.com browser tab into Your YouTube cookies (a cookie-extension JSON export, a cookies.txt file or a name=value; … header).

⚠️ Use a secondary Google account, never your main one. Requests are then made as that account from many proxy IPs; YouTube may ask it to verify itself or restrict it for automated use. The field is stored encrypted and the cookies are never logged or written to the dataset. We could not test this mode against a real account - if something looks off, tell us on the Issues tab.

Monitoring (only new videos / comments)

Turn on "Only new videos/comments since my last run", give it a name (e.g. competitors-daily) and schedule the run. Each run looks at the newest maxResults videos of each channel (and maxComments comments of each video) and returns only the ones no earlier run with that name returned. Videos you entered as URLs are returned once; their new comments every run.

{ "channels": ["mkbhd", "veritasium"], "maxResults": 20, "maxComments": 50, "sortCommentsBy": "NEWEST_FIRST", "deltaMode": true, "monitorName": "tech-daily" }

Limitations

  • No AI transcripts, summaries or subtitle translation - only the subtitles YouTube has. Getting the subtitle list needs YouTube's app API, which bot-checks about 2 in 3 datacenter IPs: the scraper rotates IPs and, if you kept the default proxy, tries once on a residential IP (logged, counted in STATISTICS). A video it still cannot get has subtitles: null and the run says "partial".
  • Sorting search results by upload date or rating is no longer honoured by YouTube itself (results come back by relevance). Use the Upload date filter (dateFilter) for recent videos; View count sorting works.
  • Shorts tiles have no date or duration. With oldestPostDate the scraper checks each Short's exact date automatically; for dates on every Short turn on includeVideoDetails.
  • Comment dates are approximate ("3 days ago" is all YouTube shows) and comment like counts are rounded ("321K"). The video's total comment count is exact.
  • Search returns at most ~500-700 videos per query (YouTube stops paging). Use several queries or filters for more.
  • Exact upload time and duration come from YouTube's player data, which YouTube sometimes withholds from a proxy IP ("confirm you're not a bot"). The scraper asks the YouTube Music player first (rarely checked), then the web player, on new IPs; if both fail, the row keeps the day-precise date, views and likes (dateIsExact stays true for the day).
  • Hashtag pages show logged-out visitors only ~20-30 videos. Beyond that, the scraper tops up from a search for the hashtag (those rows have the search URL in fromYTUrl).
  • Members-only and private videos: flagged (isMembersOnly) with what YouTube shows publicly; their content and comments need a paying member's login. Trending no longer exists on YouTube (removed in 2025).
  • Not available logged out: dislikes, isMonetized, video download links.

FAQ

Do I need a YouTube account or an API key? No. Nothing to configure, and no YouTube API quota.

Is it legal? It collects publicly visible data. You are responsible for how you use it, including data protection rules for personal data (usernames, comments).

Why did my run say "partial"? Some inputs could not be finished (e.g. the run hit its timeout, or YouTube kept refusing one request). Everything that was scraped is in the dataset; the status message says what was missed.

More scrapers from the same developer

Feedback

Missing a field, found a bug, or need a feature? Open an issue in the Issues tab and I'll take a look. If this Actor saved you time, a short review on the Store page helps other people find it.