▶️ YouTube Scraper avatar

▶️ YouTube Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
▶️ YouTube Scraper

▶️ YouTube Scraper

Scrape YouTube videos, Shorts, channels, playlists, comments, and search results, no API key or quota limit. Extract subtitles, transcripts, channel emails, and a computed virality score for creator research and content analysis.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Data Minds

Data Minds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

YouTube Scraper — Videos, Channels, Comments, Transcripts & Search, No API Key

Scrape YouTube videos, Shorts, live streams, channels, playlists, hashtag pages and search results into structured data — comments, subtitles/transcripts, channel emails and a built-in virality score included, no YouTube Data API key or quota required.

🔗 View this Actor on Apify Store


📑 Table of Contents


🎥 What is YouTube Scraper?

YouTube Scraper is an Apify Actor that turns any YouTube link — or a plain search term — into clean, structured data: video and channel metadata, comments, subtitles/transcripts, channel emails, and a computed outlier/virality score and engagement rate. It talks directly to YouTube's own InnerTube API and the embedded ytInitialData/ytInitialPlayerResponse JSON that every YouTube page ships with — the same private endpoints the youtube.com front end itself calls. That means no Google Cloud project, no API key, and no daily quota to manage. As a practical YouTube API alternative, it suits anyone who has hit the official API's quota ceiling, or who simply never wants to set one up.

Running it as an Apify Actor also gets you the platform's usual conveniences for free: scheduling for recurring monitoring runs, a full run API for programmatic triggering and result pulling, automatic proxy rotation across datacenter and residential pools, live log streaming, and one-click export to JSON, CSV, Excel, or a pandas dataframe for anyone doing YouTube data analysis in Python.


📦 What data can you extract from YouTube?

In plain terms, this youtube scraper can pull:

  • 🎬 Video & Shorts details — title, description, duration, category, thumbnail, keywords, view count, like count, upload date, live/upcoming flags.
  • 👤 Channel information — name, ID, handle, subscriber and total-view counts, join date, country, description, resolved external links, and any email address published in the About panel (handy for creator/lead-gen outreach).
  • 💬 Comments — top-level comments and reply counts, with author name, channel ID, verified/owner flags and like counts — a full YouTube comment scraper without touching the official comments API.
  • 📝 Subtitles and transcripts — the caption track for a video in SRT, VTT, plain text or raw JSON3, in any available language, manual or auto-generated — a bulk YouTube transcript scraper and subtitle/caption scraper in one.
  • 📈 Outlier / virality score and engagement rate — how a video's views compare to that channel's own recent median, plus (likes + comments) / views — a ready-made YouTube outlier finder and virality-score tool computed for free from data already fetched.
  • 🔎 Search results — run any keyword through YouTube search and get back videos, channels and playlists exactly as YouTube would rank them, with the same sort/date/type/length/feature filters the youtube.com search UI exposes.

🔧 How it works

  1. Paste your inputs. Drop any mix of YouTube links into urls — a single video, a Shorts link, a live stream, a channel (@handle, /channel/UC…, /c/… or legacy /user/…), a playlist, a hashtag page, or a full YouTube search-results URL. No URL at all? Type plain search terms into searchQueries instead — each one is searched exactly as if you'd typed it into the YouTube search box.
  2. Auto-classification. Every entry in urls is parsed and routed automatically — the Actor detects whether it's a video, channel, playlist, hashtag or search page and follows the correct internal flow, so you never have to sort inputs by type yourself or run six separate actors.
  3. Self-healing network ladder. Requests start on a direct connection. If YouTube pushes back (403/429, a bot-check page, or a block marker in the HTML), the run escalates automatically: direct → datacenter proxyresidential proxy → and, as a last resort, a real headless browser session (browserFallback). Once it escalates it stays on the working tier for the rest of the run instead of retrying a route that's already blocked.
  4. Collection. For every video found, the Actor reads the embedded player response and InnerTube next payload for the core metadata, then optionally fetches comments and the subtitle track, and — for channel sources — the About panel for channel-level details and emails.
  5. Insights computed for free. With computeOutlierScore on, each video's view count is compared against the channel's own recent upload median (already collected while listing that channel's videos — no extra request) to produce an outlier ratio/label plus an engagement-rate percentage.
  6. Streamed output. Every finished record is pushed to the Apify Dataset immediately — you can watch results land in real time and export to JSON, CSV, Excel, or XML, or pull them via the Apify API into a pandas dataframe for Python analysis.
  7. Monitor mode. Turn on monitorMode for scheduled/recurring runs and the Actor remembers every video ID it has already reported (per Apify account), so a daily or weekly schedule only ever charges you for genuinely new uploads.

📋 Input parameters reference

🚀 Start here

FieldTypeDefaultDescription
urlsarray[]Video, Shorts, live-stream, channel, playlist, hashtag or search-results links — one per line, bulk/file input supported.
searchQueriesarray[]Plain search terms run on YouTube search, one per line — same as typing into the search box.
maxResultsinteger10Max regular videos to collect per search term, channel or playlist.
maxResultsShortsinteger0Max Shorts to collect per search term or channel. 0 = don't collect Shorts.
maxResultStreamsinteger0Max live/upcoming streams to collect per search term or channel. 0 = don't collect streams.

🔍 Search filters

Applies to search queries and search-result URLs. Combine freely — leave blank to skip a filter.

FieldTypeDefaultDescription
sortingOrderstring""How results are ordered: "" (relevance), relevance, rating, date, views.
dateFilterstring""Upload-date window: "" (any), hour, today, week, month, year.
videoTypestring""Restrict content type: "" (any), video, movie.
lengthFilterstring""Video length: "" (any), under4, between420, plus20.
isHDbooleanfalseOnly HD videos.
hasSubtitlesbooleanfalseOnly videos with subtitles/CC available.
hasCCbooleanfalseOnly Creative Commons–licensed videos.
is3DbooleanfalseOnly 3D videos.
isLivebooleanfalseOnly videos currently live.
isBoughtbooleanfalseOnly purchased content (account-dependent).
is4KbooleanfalseOnly 4K videos.
is360booleanfalseOnly 360° videos.
isHDRbooleanfalseOnly HDR videos.
hasLocationbooleanfalseOnly videos tagged with a location.
isVR180booleanfalseOnly VR180 videos.
sortVideosBystringNEWESTFor channel URLs — order to read the Videos/Shorts/Live tab: NEWEST, POPULAR, OLDEST.

💬 Comments & subtitles

Both are opt-in — they add extra requests per video.

FieldTypeDefaultDescription
extractCommentsbooleanfalseCollect top comments for every video (author, text, likes, replies).
maxCommentsinteger20Stop collecting comments for a video after this many.
downloadSubtitlesbooleanfalseCollect the subtitle/caption track for every video, when available.
subtitlesLanguagestringenLanguage code to prefer (e.g. en, es, hi). Use any to accept whatever is available.
subtitlesFormatstringsrtOutput format: srt, vtt, plaintext, json3.
preferAutoGeneratedSubtitlesbooleanfalsePrefer YouTube's auto-generated captions over manually-uploaded ones when both exist.

📊 Insights

Extra analytics computed for free from data already collected.

FieldTypeDefaultDescription
computeOutlierScorebooleantrueScore each video against the channel's own recent median views (virality), and compute (likes + comments) / views as an engagement rate.
extractChannelDetailsbooleantrueFor channel URLs — also read the About panel: description, country, join date, total views/videos, external links and emails found in the description.

🔁 Monitor mode

For scheduled/recurring runs — only pay for what's new since last time.

FieldTypeDefaultDescription
monitorModebooleanfalseRemembers every video ID collected by a previous run of this Actor (same account) and skips it next time.

🌍 Network & ⚡ Speed & limits

Leave alone unless you need a specific country route — the run manages itself.

FieldTypeDefaultDescription
proxyConfigurationobject{"useApifyProxy": false}By default the run starts direct and automatically escalates to datacenter then residential proxy only if YouTube pushes back. Set your own route here to override.
browserFallbackbooleantrueAs a last resort, retry stubborn requests inside a real browser session.
maxConcurrencyinteger5How many URLs/search queries to process at the same time (1–20).
maxRequestRetriesinteger3Attempts before a request is considered failed on the current network route (1–10).
maxScannedinteger20000Safety cap on how many search-result rows are examined per query before giving up.

📤 Output example

Every finished record streams to your Apify Dataset immediately. Here's a "kitchen sink" example with the optional Insights, comments and subtitles fields turned on, from a channel-sourced video — so channel-About fields are present too:

{
"id": "EufrVkKKCwE",
"url": "https://www.youtube.com/watch?v=EufrVkKKCwE",
"type": "video",
"title": "FC BARCELONA 2 vs 0 ATHLETIC CLUB | LALIGA 2026/27 MD01",
"description": "A win on the first night back at the Spotify Camp Nou…",
"duration": 194,
"channelName": "FC Barcelona",
"channelId": "UC14UlmYlSNiQCBe9Eookf_A",
"channelUrl": "https://www.youtube.com/@FCBarcelona",
"date": "2026-08-27T14:25:29-07:00",
"viewCount": 2618393,
"likes": 42437,
"commentsCount": 1200,
"commentsTurnedOff": false,
"category": "Sports",
"thumbnailUrl": "https://i.ytimg.com/vi/EufrVkKKCwE/maxresdefault.jpg",
"isLiveContent": false,
"isUpcoming": false,
"keywords": ["FC Barcelona", "La Liga", "football"],
"engagementRate": 1.6666,
"outlierScore": {
"ratio": 2.1,
"channelMedianViews": 1247000,
"label": "above_average"
},
"comments": [
{
"commentId": "UgzAbC123",
"videoId": "EufrVkKKCwE",
"text": "What a performance from the midfield!",
"publishedTimeText": "2 hours ago",
"authorName": "@barca_fan",
"authorChannelId": "UCxxxxxxxxxxxxxxxxxxxx",
"authorIsChannelOwner": false,
"authorIsVerified": false,
"likesCountText": "312",
"replyCount": 4,
"replyLevel": 0
}
],
"subtitles": {
"available": true,
"language": "en",
"kind": "asr",
"format": "srt",
"content": "1\n00:00:00,000 --> 00:00:03,200\nWelcome back to Camp Nou...\n"
},
"channelDescription": "Official channel of FC Barcelona. For business inquiries: press@fcbarcelona.com",
"channelLocation": "Spain",
"channelJoinedDate": "Feb 27, 2006",
"channelTotalViews": 4821003912,
"numberOfSubscribers": 15800000,
"channelTotalVideos": 12904,
"channelDescriptionLinks": [
{ "title": "Website", "displayText": "fcbarcelona.com", "url": "https://www.fcbarcelona.com" }
],
"channelEmails": ["press@fcbarcelona.com"]
}

Playlist- and hashtag-sourced records use a lighter shape (fromPlaylist/playlistTitle or fromHashtag in place of the full channel-About fields) before comments/subtitles/insights are layered on for the underlying video.

💬 Comment object shape

FieldDescription
commentIdUnique comment ID
videoIdVideo the comment belongs to
textComment body
publishedTimeTextRelative published time, e.g. "2 hours ago"
authorNameCommenter's display name
authorChannelIdCommenter's channel ID
authorIsChannelOwnertrue if posted by the video's own channel
authorIsVerifiedtrue if the commenter's channel is verified
likesCountTextLike count as shown on the page
replyCountNumber of replies
replyLevel0 for top-level comments

📝 Subtitles object shape

FieldDescription
availabletrue/false — whether a usable track was found
languageLanguage code of the returned track
kind"asr" for auto-generated, absent/other for manually uploaded
formatsrt / vtt / plaintext / json3, matching subtitlesFormat
contentThe caption text in the requested format
reasonPresent only when available is false (e.g. "no_caption_tracks", "temporarily_unavailable")

❌ Error-row shape

A URL that can't be processed is logged as its own dataset row instead of stopping the run:

FieldDescription
urlThe original input URL (when applicable)
inputThe parsed value the Actor tried to resolve
errorOne of the error codes below
notePlain-language explanation

ERROR_CODES:

CodeMeaning
CHANNEL_DOES_NOT_EXISTChannel does not exist
VIDEO_UNAVAILABLEVideo is not available (deleted, region-blocked, etc.)
NOT_FOUNDPage was not found
CHANNEL_HAS_NO_VIDEOSChannel exists but has no uploaded videos
CHANNEL_HAS_NO_LIVE_VIDEOSChannel exists but has no live videos
CHANNEL_HAS_NO_SHORTSChannel exists but has no Shorts
NO_RESULTSNo results collected for this input
NO_VALID_START_URLSAll provided start URLs were invalid or malformed
INVALID_INPUTActor failed due to bad configuration

This Actor already extracts subtitles and transcripts as part of a full video/channel/comment/metadata record — so if you're pulling complete video and channel intelligence (views, likes, comments, channel emails, outlier score) and just want transcripts along for the ride, you're already covered here.

If your use case is transcripts and nothing else, at high volume — for example feeding a large batch of video IDs straight into an LLM pipeline without paying for comment/channel/insight collection you won't use — try YouTube Transcript Scraper, a leaner Actor purpose-built for bulk transcript/subtitle extraction.

In short: need just transcripts, fast and at scale — use YouTube Transcript Scraper. Need full video, channel, comment, email and virality data (transcripts included) in one run — use this Actor.


❓ FAQ

This Actor only reads publicly available YouTube pages — the same pages any anonymous visitor's browser can load. It doesn't bypass logins, paywalls or private content. You're responsible for how you use the collected data — respect YouTube's Terms of Service, applicable copyright law, and privacy regulations (GDPR, CCPA, etc.) for your jurisdiction and use case.

🆚 How is this different from the official YouTube Data API?

The official YouTube Data API requires a Google Cloud project and API key, and bills every call against a daily quota that's easy to exhaust on anything beyond light use — comments, search and channel-list calls are especially quota-hungry. This Actor talks to YouTube's own InnerTube API and embedded page JSON instead, the same internal endpoints youtube.com's own front end uses. There's no key to provision and no daily quota to watch, which makes it a straightforward YouTube API quota workaround for teams that have hit quotaExceeded errors or simply don't want to manage Cloud Console credentials. It's a genuine YouTube data API alternative, not a wrapper around the official one.

💰 How much does it cost to scrape YouTube data with this Actor?

This Actor uses Apify's pay-per-event pricing: you're billed one video_result event for every finished video/Short/stream record actually saved to your dataset, and error rows are never charged. Check the Actor's Pricing tab on Apify Store for the current rate per 1,000 events, and start with a low maxResults to gauge cost before committing to a full harvest.

🔎 Can I scrape YouTube search results by keyword?

Yes — type plain terms into searchQueries (each is searched exactly as on youtube.com) or paste a /results?search_query=… URL into urls. Combine with sortingOrder, dateFilter, videoType, lengthFilter and the feature checkboxes to narrow results the same way the YouTube search filters do.

👤 Can I get YouTube channel data without logging in?

Yes — paste a channel URL (@handle, /channel/UC…, /c/… or /user/…) into urls. No YouTube account, cookies or login session is required; the Actor reads the same public channel pages a signed-out visitor sees.

💬 Does it extract YouTube comments without the official API?

Yes — turn on extractComments to collect top comments (author, text, likes, replies) per video via the same InnerTube endpoints the YouTube website itself calls when you scroll a comments section, with no API key involved.

📝 Can I bulk-extract YouTube transcripts and captions?

Yes — turn on downloadSubtitles, set subtitlesLanguage (or any) and subtitlesFormat (srt, vtt, plaintext or json3), and every video record in the run gets its caption track attached, manual or auto-generated (preferAutoGeneratedSubtitles).

📧 Does it find channel emails for outreach or lead generation?

When extractChannelDetails is on, the Actor reads the channel's About panel and extracts any email address published in the description into channelEmails — useful for building a YouTube channel email finder / creator-outreach list. Only what a channel has chosen to publish publicly is returned; not every channel lists one.

📈 What is the outlier/virality score and how is it calculated?

With computeOutlierScore on, each video's viewCount is divided by that channel's own recent-upload median view count (already gathered while listing the channel — no extra request), producing a ratio and a plain-language label (viral_outlier, above_average, average, below_average) in outlierScore. It's a free YouTube outlier finder signal for spotting which uploads are punching above a channel's normal reach — useful for trend-hunting, competitor channel research, and content-strategy work.

🔴 Does it support live streams and Shorts, or just regular videos?

All three — regular videos, Shorts and live/upcoming streams are each detected automatically and can be capped independently with maxResults, maxResultsShorts and maxResultStreams. Live streams are collected, not excluded.

❌ Why did a URL come back as an error row instead of data?

Check the error and note fields on that row — see the error-row shape and ERROR_CODES table above for what each code means. The most common cause is a deleted, private or region-blocked video, or a channel that genuinely has no videos/Shorts/streams on the requested tab.

🐍 Can I get YouTube data straight into Python or a pandas dataframe?

Yes — pull the finished dataset via the Apify API or the apify-client Python package and load the JSON directly into a pandas DataFrame; every field name is stable and documented in the Output example section above.

🔌 Is there an API for this Actor, or only the Console UI?

Both. Run it interactively from the Apify Console, or trigger and poll it entirely through the Apify API/apify-client SDKs, including run-sync-get-dataset-items for a single blocking call that returns finished rows directly.


🙋 Support

Found a bug, need a custom field, or want a tailored pipeline built on top of this Actor? Reach out at hello.dataminds@gmail.com — feedback and feature requests directly shape future updates to this Actor.