YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $1.20 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

Get transcripts from YouTube videos, Shorts, live streams, channels, playlists and search results as text, timestamped segments, SRT or WebVTT. No login or API key. You are charged only for rows that return a transcript.

Pricing

from $1.20 / 1,000 transcripts

Rating

5.0

(1)

Developer

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

YouTube Transcript Scraper extracts captions from YouTube videos, Shorts, live streams, channels, playlists and search results, and returns them as clean text, timestamped segments, SRT or WebVTT. No API key, no login, no browser. Export to JSON, CSV or Excel.

🚀 First test: keep the prefilled input (one video and the TED channel, 5 videos) and click Start. You only pay for rows that return a transcript.

🎯 Why use YouTube Transcript Scraper?

  • 🤖 LLM and RAG pipelines: feed transcripts to an LLM or a vector store. The timestamped text format ([00:01:23] ...) is made for prompts and lets you cite the exact moment.
  • 🔎 Content research: pull every talk from a channel, playlist or search query and analyze topics, quotes and keywords in bulk.
  • 📈 SEO and content repurposing: turn videos into blog posts, summaries, chapters and subtitle files.
  • ♿ Accessibility: export ready-to-use SRT and WebVTT files for subtitles.
  • 📡 Channel monitoring: schedule runs with publishedAfter set to 7 days to capture new uploads.

📋 What data does YouTube Transcript Scraper extract?

GroupFields
VideovideoId, url, title, durationSeconds, viewCount, isLive (live right now), isLiveContent (live stream or past stream)
ChannelchannelName, channelId, channelUrl
TranscripttranscriptStatus, transcriptLanguage, originalLanguage, isAutoGenerated, segmentCount, wordCount
LanguagesavailableLanguages (code, name, isAutoGenerated for each track)
Transcript formats (you choose)plain text, segments with start / duration / end, timestamped text [hh:mm:ss] ..., SRT, WebVTT
Metadata (on by default)publishedAt, likeCount, description, keywords, thumbnailUrl

⚙️ Input

ParameterTypeDefaultDescription
urlsarrayprefilledVideo, Shorts or live URLs, youtu.be links, bare video IDs, channel URLs (@handle, /channel/UC...; add /shorts or /streams to pick a tab) and playlist URLs. Mix them freely.
searchQueriesarraynoneTranscribe the top videos for each YouTube search query.
maxVideosPerSourceinteger20Limit per channel, playlist or search. Direct video URLs are not limited.
maxVideosinteger0Hard cap for the whole run. 0 means no cap.
channelTabsarrayvideosvideos, shorts, streams. Used when a channel URL has no tab.
publishedAfter / publishedBeforestringnoneYYYY-MM-DD or relative (30 days). Applies to channels, playlists and searches. Channels stop paging once older videos are reached.
languagesarrayen in the prefillLanguage codes in order of preference. The first available one wins.
fallbackToAnyLanguagebooleantrueIf no preferred language exists, return the default track instead of a LANGUAGE_NOT_AVAILABLE row.
preferAutoGeneratedbooleanfalseBy default, creator-uploaded captions win over auto-generated ones.
outputFormatsarraytext, segmentsAlso available: timestamped, srt, vtt.
includeMetadatabooleantrueAdds publish date, likes, description, keywords and thumbnail.
maxConcurrencyinteger5Videos processed in parallel (1-20).
proxyConfigurationobjectApify residentialRequired by YouTube. Its cost is included in the price.

Single video, plain text:

{
"urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],
"outputFormats": ["text"]
}

A channel, last 30 days, Spanish preferred, with SRT:

{
"urls": ["https://www.youtube.com/@TED"],
"publishedAfter": "30 days",
"languages": ["es", "en"],
"outputFormats": ["text", "srt"],
"maxVideosPerSource": 100
}

📦 Output example

Real row from a run on the TED channel (description and text shortened):

{
"videoId": "PpEUTpzWt2M",
"url": "https://www.youtube.com/watch?v=PpEUTpzWt2M",
"inputSource": "https://www.youtube.com/@TED",
"title": "How the Wealth Gap Is Reshaping Politics | Xochitl Gonzalez | TED",
"channelName": "TED",
"channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
"channelUrl": "https://www.youtube.com/channel/UCAuUUnT6oDeKwE6v1NGQxug",
"durationSeconds": 636,
"viewCount": 98795,
"isLive": false,
"publishedAt": "2026-10-13",
"likeCount": 652,
"description": "Wealth inequality gets talked about as an economic problem. Writer Xochitl Gonzalez makes the case that it's a civic one, too ...",
"keywords": ["TEDTalk", "TEDTalks", "TED"],
"thumbnailUrl": "https://i.ytimg.com/vi/PpEUTpzWt2M/sddefault.jpg",
"availableLanguages": [
{ "code": "en", "name": "English (auto-generated)", "isAutoGenerated": true }
],
"transcriptStatus": "OK",
"transcriptLanguage": "en",
"originalLanguage": "en",
"isAutoGenerated": true,
"segmentCount": 275,
"wordCount": 1703,
"text": "I'm here to tell you a story about getting a cup of coffee. Or I should say attempting to get a cup of coffee because when I went to pay for it, I couldn't. ..."
}

🚦 Status per row

Every video the actor processes produces a row with a transcriptStatus; invalid URLs and channels that cannot be found get an INVALID_INPUT row. Videos skipped by your date filter or limits are not listed.

StatusMeaningCharged
OKTranscript returnedYes
NO_TRANSCRIPTThe video has no captionsNo
LANGUAGE_NOT_AVAILABLENone of your preferred languages exist and fallback is offNo
UNAVAILABLEPrivate, removed, age-restricted or geo-blockedNo
BLOCKEDYouTube blocked the requestNo
ERRORUnexpected errorNo
INVALID_INPUTThe input is not a recognizable YouTube URL, ID or queryNo

💰 How much does YouTube Transcript Scraper cost?

YouTube Transcript Scraper uses pay per event pricing: you pay per transcript returned.

  • $2.00 per 1,000 transcripts on the Free plan. Paid plans get a lower rate, so see the Pricing tab for your plan's rate.
  • No charge for rows without a transcript (NO_TRANSCRIPT, UNAVAILABLE, and the other non-OK statuses).
  • No start fee. The residential proxy cost is included.

Example: 500 transcripts = 500 x $2.00 / 1,000 = $1.00.

Speed: in a run measured on Apify (15 Oct 2026), 315 videos finished in about 3 minutes at 256 MB with concurrency 8, with 0 errors. About 94 % of the videos returned a transcript. The rest had no captions or were unavailable, and those rows were free.

🔌 API usage

Run YouTube Transcript Scraper from your code with the Apify API.

curl -X POST "https://api.apify.com/v2/acts/rastriq~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"], "outputFormats": ["text"]}'
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("rastriq/youtube-transcript-scraper").call(run_input={
"urls": ["https://www.youtube.com/@TED"],
"publishedAfter": "30 days",
"languages": ["en"],
"outputFormats": ["timestamped"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["transcriptStatus"] == "OK":
print(row["title"], row["wordCount"])

You can also use schedules, webhooks, Make, Zapier, n8n and Google Sheets, or call the actor from AI agents through the Apify MCP server.

❓ FAQ

What if a video has no captions? You get a NO_TRANSCRIPT row at no cost. The actor does not generate transcripts from audio (no speech-to-text), and it does not offer machine translation.

Auto-generated or creator-uploaded captions? Creator-uploaded captions are preferred by default. Set preferAutoGenerated to true to reverse that. The isAutoGenerated field tells you which one you got.

How do languages work? List codes in order, for example ["es", "en"]. The first available one wins. If none exists, the default track is returned (turn off fallbackToAnyLanguage to get a LANGUAGE_NOT_AVAILABLE row instead). availableLanguages lists every track of the video.

Does it work with Shorts and live streams? Yes. Shorts and live URLs work as inputs, and you can add /shorts or /streams to a channel URL or use channelTabs.

Can it transcribe age-restricted videos? No. They require a login, which this actor does not use, so they return UNAVAILABLE and are not charged.

How do I control volume and cost? Set maxVideosPerSource for each channel, playlist or search, and maxVideos for the whole run. You can also set a maximum cost per run in the Apify run options, so a run stops when it reaches your budget.

Is it legal? The actor reads publicly available captions only. You are responsible for complying with YouTube's Terms of Service, copyright and data protection law when you use the output. This actor is not affiliated with or endorsed by YouTube or Google.

Where do I get support? Open a ticket in the Issues tab and include the run ID.

ActorWhat it does
TikTok Ad Library ScraperExtract ads from the TikTok ad library
Google Ads Transparency ScraperExtract ads from Google Ads Transparency Center
Facebook Ad Library ScraperExtract ads from the Facebook Ad Library