YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $4.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

Extract transcripts from YouTube videos in bulk. Get timestamped segments and full text in any language. Proxies included.

Pricing

from $4.50 / 1,000 transcripts

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Turn any list of YouTube videos into clean, timestamped transcripts and full text, in any language. In seconds, not hours.

Paste your video links, pick a language, and get back one tidy record per video: the full transcript, every line with its timestamp, the title, and the language. No copy-pasting from the transcript panel, no one-video-at-a-time tools, no manual cleanup.

How it works

How the YouTube Transcript Scraper works

  1. Paste a list of YouTube video URLs (watch links, youtu.be short links, Shorts, or embeds).
  2. Choose your target language.
  3. Get one structured record per video with full text and timestamped segments, ready to export or pipe into your tools.

✨ Why teams choose this over other YouTube transcript scrapers

Tired of copying transcripts line by line from the YouTube panel? Stuck with a tool that only does one video per run? Watched a "transcript downloader" suddenly return nothing?

  • πŸ’° Pay per result, not per minute. No compute costs, proxies included. You pay for transcripts delivered, period.
  • πŸ“‹ Whole lists in one run. Drop in dozens or hundreds of video URLs at once and get a clean record for each. The popular alternative handles a single video per run.
  • 🧱 Output you can actually use. Every record carries the video ID and URL, title, channel, view count, duration, description, keywords, the full transcript text, and the timestamped segments. Other tools hand you bare segments and leave you to stitch in the rest.
  • 🎬 Ready-made subtitle files. Pick SRT or VTT and get a drop-in subtitle file per video, not just raw timestamps you have to format yourself.
  • βœ… Know what you are reading. Each record flags whether captions are creator-written or auto-generated, and lists every language the video offers, so you can trust and route the text correctly.
  • 🌍 Any language, the right way. When the video already has captions in your target language, you get that faithful native track. When it does not, you get an automatic translation. You always get the best text available.
  • πŸ”— Every link format works. Standard watch URLs, youtu.be short links, Shorts, and embed links all resolve to the right video. No reformatting your list first.
  • 🧹 Clean text, not raw markup. HTML entities are decoded, stray line breaks are merged, and a ready-to-read full transcript is joined for you alongside the per-line segments.
  • πŸ” Built to keep working. Reliable retrieval that keeps returning transcripts when simpler tools break.

🎯 What you can do with YouTube transcript data

TeamWhat they build
Content marketingTurn a channel's back catalog into blog posts, newsletters, and show notes without rewatching anything
SEOGenerate keyword-rich, indexable text from videos to capture search traffic the video alone cannot
Social / short-formPull exact quotes and timestamps to cut clips and write captions for Shorts, Reels, and TikTok
LocalizationDraft subtitles and translated transcripts to bring videos to new-language audiences
Research & academiaBuild searchable corpora of talks, lectures, and interviews for coding and analysis
Data / AI teamsFeed transcripts into RAG pipelines, summarizers, and training sets, one clean record per video
Product & UX researchMine user interviews and demo recordings posted on YouTube for themes and verbatim quotes
Sales & competitive intelTranscribe competitor webinars and product launches to track messaging and positioning

πŸ“₯ Input parameters

ParameterTypeRequiredDefaultDescription
videoUrlsarray of stringsYes-YouTube video links. Accepts watch URLs, youtu.be short links, Shorts, and embed links.
targetLanguagestring (select)NoenThe language you want the transcript in (ISO 639-1 code). A native track is used when available, otherwise the transcript is translated.
outputFormatstring (select)Nojsonjson (segments + full text), text (plain text), srt or vtt (adds a ready-to-use subtitle file).
debugModebooleanNofalseAdds detailed run logs. Leave off for normal use.

Example input

{
"videoUrls": [
"https://www.youtube.com/watch?v=IELMSD2kdmk",
"https://youtu.be/M7lc1UVf-VE",
"https://www.youtube.com/shorts/abcdefghijk"
],
"targetLanguage": "en",
"outputFormat": "json"
}

πŸ“Š Output data

You get one record per video. Each record includes the full transcript text and a segments array where every entry has a start time, a duration, and the spoken text.

Native transcript (video already in the target language)

{
"videoUrl": "https://www.youtube.com/watch?v=IELMSD2kdmk",
"videoId": "IELMSD2kdmk",
"title": "Apache Spark in 100 Seconds",
"channelName": "Fireship",
"channelId": "UCsBjURrPoezykLs9EqgamOA",
"durationSeconds": 159,
"viewCount": 1635169,
"language": "en",
"isTranslated": false,
"isAutoGenerated": false,
"availableLanguages": ["en", "es", "fr"],
"description": "Apache Spark is an open-source data analytics engine ...",
"keywords": ["spark", "data", "analytics"],
"transcript": "Apache Spark an open-source data analytics engine that can process massive streams of data ...",
"segments": [
{ "start": "0", "dur": "4.2", "text": "Apache Spark an open-source data analytics engine" },
{ "start": "4.2", "dur": "3.1", "text": "that can process massive streams of data" }
]
}

Translated transcript (no native track in the target language)

{
"videoUrl": "https://www.youtube.com/watch?v=M7lc1UVf-VE",
"videoId": "M7lc1UVf-VE",
"language": "es",
"isTranslated": true,
"title": "YouTube Developers Live: Embedded Web Player Customization",
"transcript": "JEFF POSNICK: Hola a todos. Bienvenidos al programa de esta semana ...",
"segments": [
{ "start": "10.349", "dur": "1", "text": "JEFF POSNICK: Hola a todos." },
{ "start": "11.349", "dur": "2.681", "text": "Bienvenidos al programa de esta semana de YouTube Developers Live." }
]
}

Subtitle file (when outputFormat is srt or vtt)

With "outputFormat": "srt", each record also includes a ready-to-use subtitles string:

1
00:00:10,349 --> 00:00:11,349
JEFF POSNICK: Hey, everybody.
2
00:00:11,349 --> 00:00:14,030
Welcome to this week's show of YouTube Developers Live.

πŸ—‚οΈ Data fields

FieldTypeDescription
videoUrlstringThe original video URL you provided.
videoIdstringThe 11-character YouTube video ID.
titlestringThe video title.
channelNamestringThe channel (author) name.
channelIdstringThe channel ID (stable identifier).
durationSecondsnumberVideo length in seconds.
viewCountnumberView count at scrape time.
languagestringThe language of the returned transcript (ISO 639-1).
isTranslatedbooleantrue if translated to your target language, false if from a native track.
isAutoGeneratedbooleantrue if captions are auto-generated, false if creator-written.
availableLanguagesarrayAll caption languages the video offers.
descriptionstringThe video description.
keywordsarrayThe video tags.
transcriptstringThe full transcript as one continuous, ready-to-read text.
subtitlesstringReady-to-use SRT or VTT file (present when outputFormat is srt or vtt).
segmentsarrayThe transcript split into timed lines.
segments[].startstringStart time of the line, in seconds.
segments[].durstringDuration of the line, in seconds.
segments[].textstringThe spoken text for that line.

πŸš€ Examples

Get one video's transcript

{
"videoUrls": ["https://www.youtube.com/watch?v=IELMSD2kdmk"],
"targetLanguage": "en"
}

Transcribe a batch of videos at once

{
"videoUrls": [
"https://www.youtube.com/watch?v=IELMSD2kdmk",
"https://www.youtube.com/watch?v=M7lc1UVf-VE",
"https://youtu.be/dQw4w9WgXcQ"
],
"targetLanguage": "en"
}

Pull a Spanish transcript from an English video

{
"videoUrls": ["https://www.youtube.com/watch?v=M7lc1UVf-VE"],
"targetLanguage": "es"
}

Generate SRT subtitle files

{
"videoUrls": ["https://www.youtube.com/watch?v=IELMSD2kdmk"],
"targetLanguage": "en",
"outputFormat": "srt"
}

Transcribe Shorts for clip ideas

{
"videoUrls": [
"https://www.youtube.com/shorts/abcdefghijk",
"https://www.youtube.com/shorts/lmnopqrstuv"
],
"targetLanguage": "en"
}
{
"videoUrls": [
"https://www.youtube.com/watch?v=IELMSD2kdmk",
"https://youtu.be/M7lc1UVf-VE",
"https://www.youtube.com/embed/dQw4w9WgXcQ"
],
"targetLanguage": "fr"
}

πŸ€– Copy to your AI assistant

Paste this block into Claude, ChatGPT, or Cursor to give it full context about this scraper:

You have access to the YouTube Transcript Scraper on Apify: silentflow/youtube-transcript-scraper
Input schema:
- videoUrls (required, array of strings): YouTube video links. Accepts watch URLs, youtu.be short links, Shorts, and embed links.
- targetLanguage (string, default "en"): ISO 639-1 language code. Native caption track is preferred; automatic translation is used as fallback.
- outputFormat (string, default "json"): one of json, text, srt, vtt. srt/vtt add a ready-to-use subtitle file.
- debugMode (boolean, default false): adds detailed run logs.
Output: one record per video, with fields:
- videoUrl (string), videoId (string), title (string)
- channelName (string), channelId (string)
- durationSeconds (number), viewCount (number)
- language (string), isTranslated (boolean), isAutoGenerated (boolean)
- availableLanguages (array of strings)
- description (string), keywords (array of strings)
- transcript (string): full continuous text
- subtitles (string): SRT or VTT file, present when outputFormat is srt or vtt
- segments (array of { start (string, seconds), dur (string, seconds), text (string) })
Pay per result. Proxies included. Use apify-client for Python or JavaScript.

πŸ’» Integrations

Build a content repurposing pipeline (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/youtube-transcript-scraper").call(run_input={
"videoUrls": [
"https://www.youtube.com/watch?v=IELMSD2kdmk",
"https://youtu.be/M7lc1UVf-VE",
],
"targetLanguage": "en",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
# Save each transcript as a draft for the writing team
with open(f"{item['videoId']}.txt", "w") as f:
f.write(f"# {item['title']}\n\n{item['transcript']}")
print("Saved draft for", item["title"])

Pull quotes with timestamps for clips (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('silentflow/youtube-transcript-scraper').call({
videoUrls: ['https://www.youtube.com/watch?v=IELMSD2kdmk'],
targetLanguage: 'en',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
// Find every line mentioning "data" and where it happens, for cutting clips
for (const video of items) {
const hits = video.segments.filter((s) => s.text.toLowerCase().includes('data'));
hits.forEach((s) => console.log(`${video.videoId} @ ${s.start}s: ${s.text}`));
}

Export every transcript to CSV (Python)

import csv
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/youtube-transcript-scraper").call(run_input={
"videoUrls": ["https://www.youtube.com/watch?v=IELMSD2kdmk"],
"targetLanguage": "en",
})
with open("transcripts.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["videoId", "title", "language", "transcript"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
writer.writerow([item["videoId"], item["title"], item["language"], item["transcript"]])

πŸ“ˆ Performance

MetricResult
Single transcriptAbout 1 second
Batch processingMultiple videos in parallel
OutputOne clean record per video
ReliabilityNative track preferred, translation fallback, resilient retrieval

Runtime per video depends on transcript length and YouTube response times. Larger lists process several videos at the same time.

πŸ’Ύ Data export

Export results from the Apify dataset in JSON, CSV, Excel, HTML, RSS, or XML. Pull them programmatically from the dataset API:

https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN

πŸ’‘ Tips for best results

  • Pass clean video URLs. Watch links, youtu.be, Shorts, and embeds all work. Playlist and channel links are not video links, expand them to individual videos first.
  • Pick the language you actually need. If you set a language the video does not have natively, you get an automatic translation, flagged with isTranslated: true.
  • Your list is your batch size. The number of URLs you pass is exactly how many videos are processed, one record each. No extra limit to configure.
  • Use the full transcript field for reading and search, and segments for timing. The full text is best for repurposing and indexing; the segments are best for clips and subtitles.
  • De-duplicate is automatic. If the same video appears twice in your list, it is processed once.

❓ FAQ

What exactly does this scraper return? For each video, the full transcript text plus a list of timed segments (start, duration, text), along with the video ID, URL, title, and language.

Which videos work? Any public video that has captions, whether the creator added them or YouTube generated them automatically. Videos with no captions at all are skipped.

Can I get transcripts in another language? Yes. Set targetLanguage. If the video has a caption track in that language, you get it directly. If not, you get an automatic translation.

What link formats are supported? Standard watch URLs, youtu.be short links, Shorts links, and embed links. Each resolves to the right video automatically.

Can I transcribe many videos at once? Yes. Pass a list of URLs in videoUrls and the scraper returns one record per video, as many as you provide.

Do I need a YouTube account or API key? No. The scraper reads publicly available caption data. No login, no API key.

How fresh is the data? Transcripts are pulled live at run time, so you get whatever captions are currently available for each video.

Why is a field like title sometimes shorter than expected, or a transcript auto-generated? The data comes from YouTube itself. Auto-generated captions can include filler and lack punctuation, and some videos only offer them. The scraper returns exactly what is available, faithfully.

What happens to a video with no captions? It is skipped and noted, and the rest of your batch still completes.

This Actor extracts publicly available caption data from YouTube. It does not bypass any login, paywall, or CAPTCHA. Users are responsible for complying with YouTube's terms of service and applicable laws in their jurisdiction. The data returned is informational; verify accuracy for regulated use cases.

πŸ“¬ Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Check out our other scrapers: silentflow on Apify