YouTube Scraper - Videos, Search, Subtitles & Comments avatar

YouTube Scraper - Videos, Search, Subtitles & Comments

Pricing

from $0.50 / 1,000 video rows

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

YouTube Scraper - Videos, Search, Subtitles & Comments

Paste any YouTube URL or a search term and get the videos back as rows: title, channel, views, duration and date. Switch on subtitles, comments or sponsor deals to add them in the same run. No API key, no login, no Data API quota.

Pricing

from $0.50 / 1,000 video rows

Rating

0.0

(0)

Developer

DONGMIN KIM

DONGMIN KIM

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 hours ago

Last modified

Share

YouTube Scraper — Any URL or Search, One Actor

YouTube Scraper — Any URL or Search, One Actor

Paste a video, channel, @handle or playlist URL — or just a search term — and get the videos back as rows: title, channel, views, duration, date, thumbnail.

Then switch on what else you want in the same run: subtitles, comments, sponsor deals. No second Actor, no second input list, no stitching two datasets together afterwards.

No API key, no login, no Data API quota.

What it does well

  • One input for everything — mix video URLs, channels, playlists and search terms in one run. It works out what each one is.
  • Add-ons instead of separate runs — subtitles, comments and sponsor deals attach to the videos you already asked for.
  • Filters run before billing — narrow by views or age and the ones you dropped cost nothing.
  • Honest date filtering — a live stream carries no publish date, so it is dropped rather than passed through unchecked. You are never billed for a row that was not tested against your filter.
  • Cheap and stable — starts on datacenter proxies and escalates only once blocking is proven.

Input

{
"startUrls": ["@veritasium", "https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"searchQueries": ["how to make sourdough"],
"maxResults": 50,
"publishedWithinDays": 90,
"includeTranscript": true,
"transcriptFormat": "text"
}

The same wording you see in the Apify console, with the JSON key for API and MCP callers.

OptionWhat it doesDefault
YouTube URLsstartUrlsAny mix of video, channel, @handle and playlist URLs. Channels and playlists are expanded into their videos; a video URL you pass is always kept, filters or not, because you already chose it.
Search termssearchQueriesOr search instead. Each term is run separately and every result becomes a row tagged with the term that found it. Use this with URLs or on its own.
Max videosmaxResultsTotal videos across everything you passed. This is the main cost control. URLs are served first and search fills what is left — you named the channel, the search is us guessing — so raise this when you pass both. Leave empty to take everything.100
Which videos from a channelchannelTabOnly applies to channel URLs. Shorts carry no date or length on their shelf, so switch on subtitles or sponsors if you need those fields for them."videos"
Sort search results bysearchSortByOnly applies to search terms. Relevance or most viewed — two and not four on purpose, because YouTube's upload-date and rating params were measured returning relevance order anyway, and a sort that quietly does not sort is worse than none."relevance"
Only videos newer than (days)publishedWithinDays0 disables. Applies to videos found by search or by reading a channel or playlist. Accurate to about a day, and rows with no date at all are dropped. Filtered videos are not billed.0
Minimum viewsminViewCount0 disables. Applies to videos found by search or by reading a channel or playlist. Filtered videos are not billed.0
Add subtitlesincludeTranscriptFetch each video's caption track and put it on the row. Billed per transcript delivered, and only when text came back.false
Subtitle formattranscriptFormatPlain text, SRT, VTT, or chunks for a vector store."text"
Preferred subtitle languagestranscriptLanguagesIn order of preference. Falls back to any available track.["en"]
Add commentsincludeCommentsWrite each video's top comments as their own rows. Billed per comment.false
Max comments per videomaxCommentsPerVideoComments arrive about 20 per request, so this is what a comments run costs.20
Add sponsor dealsincludeSponsorshipsRead descriptions and spoken captions for brand deals. Billed per deal found — videos with no deal are free.false
Add a channel summary rowincludeChannelRowOne row per channel you passed: subscribers, total video count, description, keywords, avatar, RSS URL. The record arrives with the listing, so it costs no extra request.false
Add a creator lead rowincludeCreatorLeadOne row per channel with the business email it publishes, audience and upload bands, and — with sponsor deals also on — which brands already pay it.false
ConcurrencyconcurrencyHow many videos to read in parallel.5
ProxyproxyConfigurationLeave the default. Starts on datacenter proxies and escalates only once blocking is proven.{"useApifyProxy":true}

Output

Row types share one dataset and are told apart by type. Video rows always appear; the comment, sponsorship, channel and lead rows only when you switch those add-ons on. Channel and lead rows are one per channel you passed, not per video.

FieldRowWhat it is
typeall"video", "comment" or "sponsorship".
videoIdallThe 11-character id.
urlvideowatch?v= URL.
titlevideoVideo title.
channelNamevideo · sponsorshipChannel display name.
channelIdvideoThe UC… id.
channelUrlvideoCanonical channel URL.
viewCountvideoViews, parsed from the display text.
durationSecondsvideoLength in seconds.
publishedTextvideoYouTube's relative text, e.g. "9 days ago". Empty on live streams.
publishedAtvideoExact upload timestamp. Only present when an add-on made us read the video.
approxAgeDaysvideoAge in days, from publishedAt when we have it, otherwise from publishedText.
thumbnailUrlvideoLargest available thumbnail, derived from the id when the listing gave none.
isShortvideotrue when YouTube served the item as a Short.
descriptionvideoFull description. Only when an add-on made us read the video.
keywordsvideoThe channel's tags for the video, same condition.
foundByvideoHow it got into the run: "url", "search" or "listing".
queryvideoThe search term that found it, when foundBy is "search".
scrapedAtvideo · sponsorshipISO timestamp of the run.
transcriptvideoPlain text, with transcriptFormat: "text".
srt / vttvideoSubtitle file contents, with the matching format.
chunksvideoOverlapping passages sized for a vector store, with "chunks".
transcriptLanguagevideoLanguage code of the track that was used.
transcriptWordCountvideoWords in the transcript.
commentIdcommentThe comment's id.
textcommentComment body.
publishedTimeTextcommentRelative time, as YouTube shows it.
likeCount / replyCountcommentEngagement on the comment.
replyLevel / isReplycommentWhere it sits in the thread.
authorNamecommentCommenter's display name.
authorChannelId / authorChannelUrlcommentCommenter's channel.
authorAvatarUrlcommentCommenter's avatar.
authorIsVerified / authorIsCreatorcommentBadges YouTube shows.
isPinnedcommentPinned by the creator.
commentUrlcommentDeep link to the comment.
videoUrl / videoTitlecomment · sponsorshipThe video the row belongs to.
brandsponsorshipThe sponsor, as a domain.
brandDomain / sponsorUrlsponsorshipWhere the deal points.
campaign / trackedLinksponsorshipThe tracked campaign path, when there is one.
code / offersponsorshipDiscount code and the offer text.
sourcesponsorship"description", "transcript" or both.
evidence / spokenEvidencesponsorshipThe text the deal was read out of.
readAtSecondssponsorshipWhere in the video it was spoken.
handle / handleUrlchannel · leadThe @handle and its URL.
subscriberCountchannel · leadSubscribers, parsed.
subscriberCountTextchannel · leadThe unparsed original, e.g. "21.1M subscribers".
videoCountchannel · leadTotal uploads the channel reports — not the number scraped.
avatarUrlchannel · leadLargest available avatar.
rssUrlchannel · leadThe channel's RSS feed, useful for cheap polling between runs.
videosFoundchannelHow many videos this run returned for the channel.
email / emailsleadThe address the channel publishes. Business addresses rank first.
hasBusinessEmailleadtrue when the address is partnerships@-style rather than personal.
instagram / twitter / tiktok / facebook / discord / patreonleadOne key per network found in the description.
audienceBandleadnano · micro · mid · large · mega. A band, not a score.
uploadBandleadactive · slowing · dormant · stale.
daysSinceNewestVideoleadHow long since the last upload.
uploadsLast30Days / uploadsLast90DaysleadOutput volume in the videos this run read.
scannedVideosleadThe denominator behind sponsorshipRate. Zero when sponsor deals were off.
sponsoredVideos / sponsorshipRateleadHow many carried a deal, and the percentage. Empty when sponsor deals were off.
sponsorCount / sponsorBrandsleadDistinct brands found, and which.
trackedCampaignCountleadDeals carrying a tracked campaign link.
takesSponsorshipsleadtrue when any deal was found.

What it costs

Video rows are the base. Everything else is an add-on you switch on, and each one is billed only for what it actually delivers:

You getPrice
A video row$0.50 per 1,000
A subtitle track on that row$2.00 per 1,000
A comment$0.50 per 1,000
A sponsor deal found$8.00 per 1,000
A channel summary row$5.00 per 1,000
A creator lead row$6.00 per 1,000

A 100-video run with nothing switched on is 5 cents. The same run with subtitles is 25.

Who this is for

  • Anyone who does not want to pick a tool first — paste the URL, get the data, add what else you need with a checkbox.
  • AI and RAG engineers — search a topic, take the transcripts as chunks, done in one run.
  • Competitive and market researchers — a channel, its videos, what its viewers say and who pays for its content, in one dataset.
  • Data teams — one Actor to integrate instead of four, one dataset to read.

Common uses

  • Topic research — search a niche, filter to the last 90 days, pull transcripts of what ranks.
  • Channel audit — one @handle, the whole catalogue, with sponsor deals attached.
  • Comment mining — search your category and read what the audience asks under the top results.
  • Feeding a vector storetranscriptFormat: "chunks" goes straight in.

Pricing

Pay only for rows you receive. Filtered videos, failed videos and every discovery step are free, and a video with no captions costs nothing extra even with subtitles switched on.

Starting a run costs $0.00001 — the platform's $0.00001 minimum, charged once per GB of memory, and these Actors run on 512 MB.

Other Actors in this family

Same engines, same billing, no account or API key on any of them.

YouTube & video

Search demand

E-commerce

Hiring

Run it from code

Nothing here needs a login to the source, only your Apify token.

HTTP — start a run and wait for the rows:

curl -X POST "https://api.apify.com/v2/acts/gganbukim~youtube-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "content-type: application/json" \
-d @input.json

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('gganbukim/youtube-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("gganbukim/youtube-scraper").call(run_input=input)
items = client.dataset(run["defaultDatasetId"]).list_items().items

Scheduled or event-driven — attach a schedule to run it on a cron, or a webhook to push each finished run into your own endpoint. It also connects through Apify's Zapier, Make, n8n and LangChain integrations, and is reachable from an MCP server if you are driving it from an agent.

Standby / API mode — the run above is synchronous: one call in, rows out, no polling. That is the shape to use if you are calling this per request rather than in a batch.

Errors, limits and what you are charged for

  • You pay for delivered rows only. A row your filters removed, a page that failed, a retry — none of it is billed. Starting a run costs $0.00001: the platform minimum, charged once per gigabyte, and this Actor runs on 512 MB.
  • A run that delivers nothing still costs the start fee and nothing else. If the input resolved to zero items, the run fails loudly with the reason rather than finishing green on an empty dataset.
  • Blocking is handled by changing address, not by waiting. The Actor starts on cheap datacenter proxies and moves up only after a tier has actually been refused several times in a row, then drops back down once the cheap tier answers cleanly again. You are not paying for residential bandwidth that was never needed.
  • Rate limits belong to the source, not to this Actor. Very large inputs are worked through in batches; the run reports how many items succeeded, were filtered, and failed, so a partial result is never presented as a complete one.
  • Dataset retention follows your Apify plan. Export what you need, or push it out with a webhook, if you want it past that window.

This Actor reads pages and public endpoints that anyone can open in a browser without an account. It does not log in, does not defeat a paywall, and does not touch anything behind authentication.

Scraping public data is broadly lawful in the US and the EU, and courts have repeatedly said so — but "public" is not the same as "unrestricted", and what you may then do with the data is a separate question from whether you may collect it. Personal data pulls in the GDPR and similar regimes whatever the source, so if your rows contain people, you need a lawful basis for keeping them.

Apify publishes a fuller treatment in Is web scraping legal? and an ethical scraping guide. None of this is legal advice; if the use is commercial and the data is personal, ask someone qualified.

Something wrong, or missing?

Open an issue on the Actor's Issues tab — it goes straight to the developer and is the fastest route. Include the run ID; it carries the input and the log, which is usually enough to reproduce the problem without another round trip.

Sources change without warning, and a field that quietly goes null is worth reporting even if the run succeeded. A broken parser looks exactly like a quiet day in the data until someone says so.

FAQ

Will I get blocked, or my account banned? There is no account to ban — this Actor never signs in and sends no cookies. It reads the same endpoints the player and the search page use, on cheap datacenter proxies, escalating to residential only once datacenter is provably blocked. YouTube signals throttling with an HTTP 200 and an error body rather than an error code, which is the trap that silently halves most scrapers' results; this one detects it by reason and rotates.

Is it legal to scrape YouTube? It reads the same public pages a browser requests, with no login and nothing bypassed, and the fields are facts about videos rather than the videos themselves. Public-data scraping is broadly treated as lawful in the US and EU. What you do with the data afterwards — republishing transcripts wholesale, or handling personal data from comments — is a separate question with its own rules.

Does this need a YouTube API key? No. Nor a Google account, nor the 10,000-unit daily Data API quota.

Why would I use this instead of the single-purpose Actors? Convenience, mostly. If you only ever want transcripts, the dedicated transcript Actor has more knobs for them — any language, empty-result rows, segment output. This one is for when you want a few things at once, or do not want to think about which tool to reach for.

What if a video has no captions? The row still arrives, with transcript: null, and you are not billed for a transcript.

How much does 1,000 videos cost? $0.50, plus $0.00002 for the run itself. Add-ons are priced separately in the table above and only bill for what arrives.

Can I export the results to Excel or Google Sheets? Yes. Every run's dataset exports as CSV, XLSX, JSON or XML from the console, or through the API.

Can I connect it to Zapier, Make or n8n? Yes — Apify publishes integrations for all three, plus webhooks that fire when a run finishes.

Do I need to write code? No. Fill the form in the console and press Start.

Can I run it on a schedule? Yes, from the Schedules tab. Pair it with a webhook to push new rows wherever you want them.