YouTube Scraper — Videos, Channels, Playlists, Comments avatar

YouTube Scraper — Videos, Channels, Playlists, Comments

Pricing

from $1.26 / 1,000 results

Go to Apify Store
YouTube Scraper — Videos, Channels, Playlists, Comments

YouTube Scraper — Videos, Channels, Playlists, Comments

Scrapes YouTube search results, video details, channels, playlists and comments — views, likes, descriptions, durations, subscriber counts and full comment threads. No login or API key. Does not download video or transcripts (YouTube gates those behind a browser-only token).

Pricing

from $1.26 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Pull structured YouTube data without an API key, an account, or a quota.

Five things in one actor, chosen with a mode setting:

ModeYou give itYou get back
Search resultssearch termsmatching videos, ranked as YouTube ranks them
Video detailsvideo IDs or URLsone rich row each — views, likes, description, channel
Channelchannel IDs, @handles or URLsthe channel profile + its videos, shorts or live streams
Playlistplaylist IDs or URLsthe playlist + every video in it
Video commentsvideo IDs or URLscomment threads with authors, likes and reply counts

Why use this actor

  • No API key and no quota. The official YouTube Data API costs you 10,000 units a day and makes you register a project; this needs neither.
  • Exact numbers, not rounded ones. View counts come back as 1810223610, not "1.8B" — and like counts are read from the precise source rather than the abbreviated button label.
  • Handles, IDs or URLs — all fine. @fireship, UCsBjURrPoezykLs9EqgamOA, a /c/ legacy URL, a youtu.be/ short link, a /shorts/ link. They all resolve.
  • Real pagination. Follows YouTube's own "load more" chain, with a duplicate-detecting stop condition so it ends when the data ends.
  • Honest about gaps. Every run writes a summary row saying how many pages it walked and flagging anything YouTube itself doesn't provide.

What it does NOT do — please read before running

No video downloads, no stream URLs, and no transcripts or subtitles.

That is not an omission we can fix by trying harder. YouTube gates the player data behind a token that can only be produced by running Google's own anti-bot JavaScript in a real browser. Metadata is open; playable media and caption content are not. Any tool offering HTTP-only YouTube downloads is either running a browser somewhere or about to break.

The dangerous part, and the reason this is stated so plainly: a caption request returns HTTP 200 with an empty body, which looks like "this video has no subtitles" rather than "you were blocked". A tool that doesn't know this will quietly hand you empty transcripts. This actor omits the feature instead.

How it works

  1. You choose a mode and give it a list of queries, URLs or IDs.
  2. The actor reads YouTube's own internal data for each one, paging through results the same way the website does as you scroll.
  3. Rows land in your dataset, ready to download as JSON, CSV or Excel.

Input

{
"mode": "channel",
"queries": ["@fireship"],
"maxItems": 50,
"channelTab": "videos",
"language": "en",
"country": "US"
}
FieldTypeDescription
modestringsearch, video, channel, playlist or comments.
queriesarrayOne entry per thing to scrape — meaning depends on the mode.
maxItemsintegerVideos (or comments) per query. 0 = as many as YouTube will page. Default 50.
channelTabstringvideos, shorts or streams. Channel mode only.
searchFilterstringvideo, channel, playlist, movie, today, this_week, this_month. Search mode only.
commentSortstringtop or newest. Comments mode only.
includeChannelVideosbooleanOff = fetch only the channel profile row, in one request. Default true.
language / countrystringhl / gl codes, e.g. en / US. Affects localised text and relevance.
maxConcurrencyintegerRequests in flight. Default 4 — keep it modest.
minRequestIntervalnumberSeconds between request starts. Default 0.25.

Output

Rows share one envelope and are told apart by recordType: VIDEO, CHANNEL, PLAYLIST, COMMENT, QUERY_SUMMARY, ERROR.

VIDEO — video details mode

{
"_input": "dQw4w9WgXcQ",
"recordType": "VIDEO",
"queryMode": "video",
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"channelSubscriberText": "4.54M subscribers",
"viewCount": 1810223610,
"viewCountText": "1,810,223,610 views",
"likeCount": 19365088,
"publishedAt": "2009-10-24T00:00:00Z",
"publishedText": "Oct 24, 2009",
"description": "The official video for “Never Gonna Give You Up” by Rick Astley ...",
"thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"
}

CHANNEL — channel mode

{
"recordType": "CHANNEL",
"channelId": "UCsBjURrPoezykLs9EqgamOA",
"title": "Fireship",
"subscriberCount": 4250000,
"subscriberText": "4.25M subscribers",
"videoCount": 835,
"vanityUrl": "http://www.youtube.com/@Fireship",
"rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCsBjURrPoezykLs9EqgamOA",
"avatarUrl": "https://yt3.googleusercontent.com/...",
"bannerUrl": "https://yt3.googleusercontent.com/..."
}

Followed by one VIDEO row per upload:

{
"recordType": "VIDEO", "queryMode": "channel", "resultRank": 1,
"title": "The most expensive software bug in history...",
"viewCount": 1000000, "durationSeconds": 319,
"publishedText": "3 days ago", "publishedAtApprox": "2026-08-28T16:41:00Z"
}

COMMENT — comments mode

{
"recordType": "COMMENT", "resultRank": 1,
"videoId": "dQw4w9WgXcQ",
"commentId": "Ugzge340dBgB75hWBm54AaABAg",
"text": "can confirm: he never gave us up",
"authorName": "@YouTube",
"authorChannelId": "UCBR8-60-B28hp2BmDPdntcQ",
"authorIsVerified": true,
"likeCount": 309000,
"replyCount": 963,
"publishedText": "1 year ago",
"isReply": false
}
FieldTypeDescription
videoId / url / titlestringThe video.
channelName / channelIdstringUploader.
viewCount / likeCountintegerExact where YouTube exposes it, else null — never a guessed 0.
durationSeconds / durationTextint / stringLength. Null on Shorts.
publishedAtstringExact UTC date. Video-details mode only.
publishedAtApproxstringDerived from "3 days ago" on list surfaces. Approximate — the name says so.
descriptionstringFull description in video mode; a snippet in search.
subscriberCount / videoCountintegerChannel rows.
commentId / text / authorNamestringComment rows.
likeCount / replyCountintegerComment engagement.
notesarrayHonesty flags on the summary row.

Known limits

  • No downloads, streams, or transcripts. See above — it's a hard gate, not a setting.
  • Shorts have no publish date and no duration. YouTube's shorts shelf simply omits them. Those columns come back null and the summary row says why.
  • publishedAtApprox is approximate. List surfaces give "2 years ago"; only the video-details mode returns an exact date. Both are separate columns so you always know which one you have.
  • Comment replies aren't expanded. Top-level comments are returned; opening every "N replies" thread is a separate request per comment.
  • Age-restricted and private videos return an error row, not a partial one.
  • Rate limiting is real. YouTube answers a hot IP with an interstitial rather than a clean error. The defaults are gentle; raise minRequestInterval before raising maxConcurrency.