YouTube Transcript Scraper: Channels, Playlists & Shorts
Tauqeer Abbas · @nextgensda
Timestamped YouTube transcripts from videos, Shorts, channels, playlists and searches. No login, SRT/VTT, new-upload monitors.
About
YouTube Transcript Scraper: Channels, Playlists & Shorts
One rental for timestamped YouTube transcripts: single videos, Shorts, whole channels, playlists and keyword searches in one run, with the video's title, channel, views, duration and exact publish date in the same row.
No login, no API key, no browser. 256 MB. About 100 transcripts a minute.
Why this actor
| This actor | Typical transcript scrapers | |
|---|---|---|
| Usage per 1,000 transcripts | ~$0.13 (measured on Bytewells) | $2.00 – $5.00 per 1,000 elsewhere |
| Videos without captions | metadata row, or skipped | dropped |
| Channels, playlists, Shorts and search in one run | yes | often video URLs only |
| Exact publish date and time | yes | often relative ("3 weeks ago") or missing |
| SRT and WebVTT subtitles | yes | sometimes |
| Monitor channels for new uploads | built in (onlyNew) | do it yourself |
| Memory | 256 MB | 1 – 4 GB |
| Login or API key | no | sometimes |
A video found by several inputs (a channel and a search, say) is delivered once.
Built for AI datasets and research
- LLM training and fine-tuning: spoken-language text with timestamps, language and whether captions are the creator's own or auto-generated.
- RAG and agents: index a channel's back catalogue, then keep it fresh with a daily only-new run.
- Summaries and chaptering: segments with start/end times map straight to clips and chapters.
- Content and market research: what a niche's top videos for a keyword actually say, with views and dates.
- Subtitles: SRT or WebVTT ready to download.
Export as JSON, CSV, Excel or XML, schedule runs, or deliver through webhooks and the Apify API.
What you get
One row per video:
| Field | |
|---|---|
videoId, url, isShort | |
title, description, keywords, thumbnail | |
channelName, channelId, channelUrl | |
durationSeconds, viewCount | |
publishDate | ISO 8601 with time and zone, e.g. 2026-10-29T13:00:20-07:00 |
publishedText | as the channel or search page shows it ("2 weeks ago") |
isLiveContent | a live stream or its replay |
captionLanguages | every caption track: language, name, auto-generated or not |
transcriptLanguage, transcriptAutoGenerated | the track that was read |
hasTranscript | false when the video has no captions |
transcript | [{start, end, text}], seconds |
transcriptText | the whole transcript as one string |
srt, vtt | when asked for |
source, sourceUrl, scrapedAt | which input found the video |
Example segment: {"start": 1.2, "end": 3.36, "text": "All right, so here we are, in front of the elephants"}
Quick start
Transcripts of a channel's 50 newest videos:
{
"channels": ["@GoogleDevelopers"],
"maxVideosPerSource": 50
}
Search results with SRT subtitles:
{
"searches": ["sourdough starter"],
"maxVideosPerSource": 30,
"outputFormats": ["text", "srt"]
}
New uploads of several channels, every day (schedule it):
{
"channels": ["@GoogleDevelopers", "@Google"],
"channelTab": "all",
"onlyNew": true,
"monitorName": "google-channels"
}
Input
| Input | Default | Notes |
|---|---|---|
startUrls | — | videos, Shorts, youtu.be links, channels (/@handle, /videos, /shorts, /streams), playlists, search pages |
channels | — | @handles, channel URLs or UC… ids |
searches | — | keywords (videos, in YouTube's order) |
channelTab | videos | videos, shorts, streams or all (videos + Shorts) |
maxVideosPerSource | 50 | per channel tab, playlist or search |
maxItems | 1000 | videos in total |
transcripts | true | off: metadata only |
language | en | e.g. de, es, pt-BR; en-GB also matches en; empty = the spoken language |
fallbackToOriginalLanguage | true | no captions in your language: take the spoken-language transcript |
preferManualCaptions | true | the creator's captions before auto-generated ones |
includeSegments | true | the timestamped list |
outputFormats | text | add srt and/or vtt |
includePublishDate | true | exact date and time |
skipVideosWithoutTranscript | false | leave caption-less videos out |
onlyNew, monitorName | off | skip videos earlier runs delivered (remembered a year) |
concurrency | 4 | videos read at once |
proxyConfiguration | Apify Proxy | datacenter by default; switches to residential by itself if needed |
Pricing
One monthly rental, no per-row fees: as many transcripts as you need. Runs use Bytewells compute from your credit, and this actor needs very little of it.
Measured on Bytewells (256 MB, datacenter proxy):
| Run | Rows | Time | Usage |
|---|---|---|---|
| A channel (40) + a keyword search (40), with SRT | 79 transcripts + 1 video without captions | 59 s | $0.010 (~$0.13 / 1,000) |
Videos YouTube doesn't show without signing in (age-restricted, private,
removed) get a row with error.
Notes and limits
- About 1 in 8 videos has no captions at all (music, some live streams, short
clips). They come with metadata only (
hasTranscript: false), or not at all withskipVideosWithoutTranscript. - Transcripts come from YouTube's captions: the creator's own, or YouTube's automatic speech recognition. Machine translation into other languages is not offered.
- With a
languagethe video doesn't have, you get its spoken-language transcript andtranscriptLanguagesays which (turn offfallbackToOriginalLanguageto get none instead). - Age-restricted, private and members-only videos can't be read without an account.
- Channel tabs are read newest first. With
onlyNew, a channel stops at the first run of videos it already delivered, so daily runs take seconds. - Searches follow YouTube's relevance order and end after about 300–350 videos per keyword (measured); use several related keywords for more.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
startUrlsAny YouTube URL: a video (watch?v=, youtu.be/, /shorts/, /live/), a channel (/@handle, optionally /videos, /shorts or /streams), a playlist (/playlist?list=) or a search results page (/results?search_query=). Bare video ids work too.
channelsChannel handles (@GoogleDevelopers), channel URLs or UC… ids. Their newest videos come first.
searchesSearch YouTube for each keyword (videos only, in YouTube's relevance order).
channelTabWhich videos of a channel to read, unless its URL names a tab.
maxVideosPerSourceHow many videos to read from each channel tab, playlist or search.
maxItemsThe run stops after this many video rows.
transcriptsOff: video metadata only (title, channel, views, duration, description, caption languages), at the lower per-video price.
languageA language code like en, de, es or pt-BR. A regional code also matches its base language (en-GB takes en). Empty: the video's spoken language.
fallbackToOriginalLanguageWhen a video has no captions in your language, return its spoken-language transcript (the row says which language it is). Off: such videos come without a transcript.
preferManualCaptionsTake the creator's own captions over YouTube's auto-generated ones when both exist in the language.
includeSegmentsThe transcript as a list of {start, end, text} (seconds).
outputFormatsExtra fields with the whole transcript: plain text (transcriptText), srt, vtt.
includePublishDateThe video's publish date and time (one small extra request per video).
skipVideosWithoutTranscriptLeave out videos that have no captions at all (about 1 in 8). They aren't charged.
onlyNewSkip videos this monitor delivered in earlier runs (remembered a year). Skipped videos aren't charged, and a channel stops being read at the first run of videos it already has. Schedule it to get every new upload of a channel.
monitorNameKeep separate monitors apart (e.g. one per client). Letters, digits and dashes.
concurrencyVideos read at once, each through its own proxy IP.
proxyConfigurationApify's datacenter proxies work and cost least: YouTube refuses some of their IPs, and the actor moves to a new one each time. If too many in a row are refused, the run switches to US residential by itself.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is nextgensda/youtube-transcript-scraper (or nextgensda~youtube-transcript-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"channels": [
"@GoogleDevelopers"
],
"maxVideosPerSource": 10,
"outputFormats": [
"text"
]
};
const run = await client.actor('nextgensda/youtube-transcript-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"channels": [
"@GoogleDevelopers"
],
"maxVideosPerSource": 10,
"outputFormats": [
"text"
]
}
run = client.actor("nextgensda/youtube-transcript-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/nextgensda~youtube-transcript-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channels":["@GoogleDevelopers"],"maxVideosPerSource":10,"outputFormats":["text"]}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

Google Maps Full Suite — Places, Reviews & Grid Search
Tauqeer Abbas · @nextgensda
Google Maps places, full details, reviews, People Also Search For and directions in one Actor.
AutomationLead generationMarketing$19/mo7-day free trial
Google Shopping Scraper: Prices, Stores, Price History & GTIN
Tauqeer Abbas · @nextgensda
Search Google Shopping in any country: products with prices, merchants and ratings; details and specs, every store's offer, per-store price history and reviews; look products up by GTIN/UPC/EAN. Filters for price, rating, brand, store and sale. Pay per result.
E-commerceLead generationAI$49/mo3-day free trial
Reddit Scraper: Posts, Comments, Users, Search & Explore
Tauqeer Abbas · @nextgensda
Scrape Reddit posts, full comment threads, users, communities and comment search by keyword, plus the Explore tab's recommended communities. API-grade JSON with no login or browser, unaffected by Reddit's 2026 .json shutdown. Monitor brands and keywords with only-new runs.
Social mediaLead generationAI$29/mo3-day free trial
TikTok Scraper: Videos, Profiles, Comments, Sounds & Places
Tauqeer Abbas · @nextgensda
Scrape TikTok videos, profiles, hashtag feeds, keyword searches, sounds, places, followers, Shop products and comments. Full metadata: description, author, plays, likes, comments, shares, saves, music, video URLs, covers. No browser and no login; 256 MB.
Social mediaLead generationAI$29/mo3-day free trial
Google Travel Scraper: Flights, Hotels & Vacation Rentals
Tauqeer Abbas · @nextgensda
Scrape Google Flights, Google Hotels and vacation rentals in one run: every itinerary with price, stops, layovers, CO2 and return flights; hotels and rentals with nightly price, rating, class, bedrooms and every booking site's offer. Price insights included. Fast HTTP scraper, no browser.
Travel$39/mo3-day free trial