
How to Download YouTube Transcripts as Text (2026)
YouTube shows you the transcript but doesn't give you a download button. If you want to save the transcript as a text file — for notes, research, subtitles, or content repurposing — you need a workaround.
Here are five ways to download a YouTube transcript, from easiest to most technical.
Method 1: EasyTranscriber (One-Click Download)
The fastest way to download any YouTube transcript as clean text.
Steps:
- Go to EasyTranscriber
- Paste the YouTube video URL
- Wait for the transcript to load (usually under 5 seconds)
- Click the copy button to copy the full transcript to your clipboard
- Paste into any text editor and save as
.txt
Why this method:
- Clean text without formatting artifacts
- Works even on videos without captions (AI transcription fallback)
- Option to include or exclude timestamps
- Can also generate an AI summary of the content
Your first two transcripts are free — no account needed.
Method 2: EasyTranscriber Chrome Extension (Fastest for Regular Use)
If you find yourself downloading transcripts regularly, the EasyTranscriber Chrome extension is the quickest workflow — no tab switching, no URL copying.
Steps:
- Install the EasyTranscriber Chrome extension from the Chrome Web Store
- Navigate to any YouTube video
- Click the "Transcribe" button that appears below the video player
- The transcript loads in a sidebar — right there on the YouTube page
- Click copy to grab the full text, or use the download button for a file
Why this method:
- Zero friction — you never leave YouTube
- Transcript search built directly into the sidebar
- Works on videos without existing captions
- Keeps your browser history and context intact
This is the best option if you frequently work with YouTube content and want the smallest amount of friction in your workflow.
Method 3: Copy from YouTube's Transcript Panel
If you don't want to use a tool, you can copy the transcript directly from YouTube.
Steps:
- Open the YouTube video
- Click "...more" below the title
- Click "Show transcript"
- Click inside the transcript panel
- Press Ctrl+A (Cmd+A on Mac) to select all text
- Press Ctrl+C to copy
- Paste into a text editor
The catch: You'll get timestamps mixed into the text, like this:
0:00
hey everyone welcome back to the channel
0:03
today we're going to talk about
0:05
something really interesting
To remove timestamps, use find-and-replace with a regex pattern like ^\d+:\d+\n in a text editor that supports regex (VS Code, Sublime Text, Notepad++).
Limitations:
- Doesn't work if the video has no captions
- Timestamps mixed into the text
- No search or summary
- Tedious for long videos
Method 4: EasyTranscriber API (For Developers)
If you need to download transcripts programmatically — for multiple videos, automated pipelines, or integrating into your own app — the EasyTranscriber API is the right tool.
cURL
# Download transcript as JSON curl -X POST https://api.easytranscriber.com/v1/transcribe \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://youtube.com/watch?v=VIDEO_ID"}' \ -o transcript.json
Python
import requests response = requests.post( "https://api.easytranscriber.com/v1/transcribe", headers={ "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" }, json={"url": "https://youtube.com/watch?v=VIDEO_ID"} ) data = response.json() # Save as plain text with open("transcript.txt", "w") as f: f.write(data["transcript"]["text"]) # Save as SRT with open("transcript.srt", "w") as f: for i, segment in enumerate(data["transcript"]["segments"], 1): start = segment["start"] end = segment["end"] f.write(f"{i}\n") f.write(f"{format_srt_time(start)} --> {format_srt_time(end)}\n") f.write(f"{segment['text']}\n\n") print(f"Transcript saved — {len(data['transcript']['segments'])} segments")
JavaScript (Node.js)
const fs = require('fs'); async function downloadTranscript(videoUrl) { const response = await fetch('https://api.easytranscriber.com/v1/transcribe', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ url: videoUrl }) }); const data = await response.json(); // Save plain text fs.writeFileSync('transcript.txt', data.transcript.text); // Save JSON with timestamps fs.writeFileSync('transcript.json', JSON.stringify(data.transcript, null, 2)); console.log(`Downloaded transcript: ${data.transcript.segments.length} segments`); } downloadTranscript('https://youtube.com/watch?v=VIDEO_ID');
The response includes the full transcript text, individual segments with timestamps, and video metadata. Full API documentation →
Method 5: youtube-transcript-api (Python, Open Source)
For developers who want a free, self-hosted option without API credits:
from youtube_transcript_api import YouTubeTranscriptApi # Get transcript transcript = YouTubeTranscriptApi.get_transcript("VIDEO_ID") # Save as plain text with open("transcript.txt", "w") as f: for entry in transcript: f.write(entry["text"] + "\n") # Save as SRT def format_timestamp(seconds): h = int(seconds // 3600) m = int((seconds % 3600) // 60) s = int(seconds % 60) ms = int((seconds % 1) * 1000) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" with open("transcript.srt", "w") as f: for i, entry in enumerate(transcript, 1): start = entry["start"] end = start + entry["duration"] f.write(f"{i}\n") f.write(f"{format_timestamp(start)} --> {format_timestamp(end)}\n") f.write(f"{entry['text']}\n\n")
Note: This only works with videos that have existing YouTube captions. It doesn't support videos without captions and can break when YouTube updates their internal API. For production use, the EasyTranscriber API is more reliable.
Downloading in Different Formats
Depending on your use case, you might need the transcript in a specific format. Here's what each format is good for and how to get it.
Plain Text (.txt)
The simplest format — just the words, no markup. Good for reading, note-taking, feeding into an LLM, or storing in a database.
How to get it:
- EasyTranscriber copy button → paste into a
.txtfile - API response:
data.transcript.text - Manual copy-paste from YouTube's transcript panel
SRT (.srt)
Subtitle format used by video editing software (Premiere Pro, DaVinci Resolve, Final Cut Pro, VLC). Each entry includes an index, a time range, and the subtitle text.
1
00:00:00,000 --> 00:00:03,500
Hey everyone, welcome back to the channel.
2
00:00:03,500 --> 00:00:07,000
Today we're going to talk about something
really interesting.
How to get it: Use the EasyTranscriber API with the format=srt parameter, or format the timestamped segments from the API response manually.
JSON
Structured data with every segment, its start time, end time, and text. Best for building apps, processing transcripts programmatically, or integrating with other tools.
{ "transcript": { "text": "Hey everyone, welcome back...", "language": "en", "segments": [ { "start": 0.0, "end": 3.5, "text": "Hey everyone, welcome back to the channel." } ] } }
How to get it: The EasyTranscriber API returns JSON by default. Save the response directly.
VTT (WebVTT)
Similar to SRT but used for HTML5 video players and web-based subtitle displays.
WEBVTT
00:00:00.000 --> 00:00:03.500
Hey everyone, welcome back to the channel.
How to get it: Convert from SRT using a simple script, or request format=vtt from the API.
Batch Downloading Transcripts
If you need to download transcripts for many videos at once — a full YouTube channel, a playlist, a curated list of URLs — here's how to do it efficiently.
Batch Download with EasyTranscriber API
import requests import json import time API_KEY = "YOUR_API_KEY" BASE_URL = "https://api.easytranscriber.com/v1/transcribe" video_urls = [ "https://youtube.com/watch?v=VIDEO_ID_1", "https://youtube.com/watch?v=VIDEO_ID_2", "https://youtube.com/watch?v=VIDEO_ID_3", # ... add more URLs ] results = [] for i, url in enumerate(video_urls): print(f"Processing {i+1}/{len(video_urls)}: {url}") response = requests.post( BASE_URL, headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={"url": url} ) if response.status_code == 200: data = response.json() results.append({ "url": url, "transcript": data["transcript"]["text"], "segments": data["transcript"]["segments"] }) # Save individual file video_id = url.split("v=")[1] with open(f"transcripts/{video_id}.txt", "w") as f: f.write(data["transcript"]["text"]) else: print(f" Error: {response.status_code}") # Rate limit: 1 request per second time.sleep(1) # Save all as one JSON with open("all_transcripts.json", "w") as f: json.dump(results, f, indent=2) print(f"Done! {len(results)} transcripts saved.")
This script processes a list of URLs, saves each transcript as an individual .txt file, and compiles everything into a single JSON file. Rate limiting is handled by the 1-second sleep between requests.
Batch Download from a Playlist
# First, extract video IDs from a playlist using yt-dlp # pip install yt-dlp import subprocess import json playlist_url = "https://youtube.com/playlist?list=PLAYLIST_ID" # Get all video URLs from the playlist result = subprocess.run( ["yt-dlp", "--flat-playlist", "-J", playlist_url], capture_output=True, text=True ) playlist_data = json.loads(result.stdout) video_urls = [ f"https://youtube.com/watch?v={entry['id']}" for entry in playlist_data["entries"] ] print(f"Found {len(video_urls)} videos in playlist") # Then run through the batch download script above
Tips for Working with Downloaded Transcripts
Cleaning up auto-generated transcripts
YouTube's auto-captions often have errors — missing punctuation, wrong words, no paragraph breaks. After downloading:
- Add punctuation: Use an AI tool or do a quick manual pass
- Fix proper nouns: Product names, people's names, and technical terms are often wrong
- Add paragraph breaks: Auto-captions are one continuous stream — break them into logical paragraphs
Downloading transcripts in other languages
If a video has captions in multiple languages, YouTube lets you switch languages before copying. In EasyTranscriber, the transcript is extracted in the video's default language, and you can generate a summary in any of 15+ languages.
To request a specific language via the API:
curl -X POST https://api.easytranscriber.com/v1/transcribe \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://youtube.com/watch?v=VIDEO_ID", "language": "es"}'
FAQ
Can you download a YouTube transcript as a file?
YouTube doesn't have a built-in download button for transcripts. You can copy the text manually from the transcript panel, or use EasyTranscriber to get a clean transcript you can copy with one click. The EasyTranscriber API lets you download transcripts as TXT, SRT, or JSON programmatically.
How do I download YouTube subtitles as SRT?
SRT format requires timestamps in a specific format. Use the EasyTranscriber API with format=srt, or use the Python youtube-transcript-api library to get timestamped segments, then format them as SRT. You can also use the Chrome extension to copy timestamped text directly from the YouTube page.
Can I download transcripts from private YouTube videos?
No. Transcript tools can only access public and unlisted YouTube videos. Private videos require the owner to share the recording file directly.
How do I download transcripts from a YouTube playlist?
Use the EasyTranscriber API to loop through playlist video IDs. Extract playlist video IDs with yt-dlp --flat-playlist, then batch process them through the API. Each video is transcribed individually.
Is there a Chrome extension for downloading YouTube transcripts?
Yes — the EasyTranscriber Chrome extension adds a "Transcribe" button directly to YouTube pages. Click it and the transcript appears in a sidebar, where you can copy or download it without leaving YouTube.
What's the difference between downloading a transcript and downloading subtitles?
Subtitles (SRT, VTT) include timing information for each line, formatted for video players. A transcript is just the plain text content. EasyTranscriber lets you get both — clean text for reading and SRT files for video editing.
Can I batch download transcripts from an entire YouTube channel?
Yes. Use yt-dlp to extract all video IDs from a channel, then loop through them using the EasyTranscriber API. The API handles rate limiting and AI fallback for videos without captions. This is how developers build YouTube research tools and content archives.
Does the Chrome extension work offline?
No — the EasyTranscriber Chrome extension requires an internet connection to fetch and process transcripts. The transcript data is returned from EasyTranscriber's servers, not processed locally in the browser.