~ / guides / How to Get the Transcript of a YouTube Video

How to Get the Transcript of a YouTube Video

DT
Devon Tran
YouTube data engineer · about the author
the short version
  • Fastest manual way: click ...more under the video, then Show transcript. YouTube opens a side panel with timestamped lines you can copy straight into a doc.
  • To copy as plain text: turn off Toggle timestamps in the panel menu, select all, and paste. For SRT or VTT files you need a generator or a script.
  • At scale: I ran the youtube-transcript-api Python library against a 315-line TED talk and got back clean text, start, and duration fields in under a second, with no API key.
  • The catch: that library throws IpBlocked from AWS, GCP, and Azure IPs. For server or bulk jobs I route through a transcript API that handles the blocking.

I needed transcripts from a batch of YouTube videos last month, so I worked out how to get transcript of YouTube video content every way I could find and timed each one. The built-in panel is genuinely good for a single video. It falls apart the moment you need ten transcripts, or one in SRT format, or text without the timestamps wedged between every line. That is where the free generators and the Python route come in, and where each of them quietly fails.

This guide is the result, ordered from the fastest single-video method to the one I use for bulk jobs. Every code block here is something I ran in June 2026, and I have included the real output.

How do you get the transcript of a YouTube video on desktop?

To get the transcript of a YouTube video on desktop, click ...more in the video description, then click Show transcript. YouTube opens a transcript panel on the right side of the page with the full text broken into timestamped lines, and the panel scrolls to follow playback. This is the official method documented in YouTube Help.

Here is the exact sequence I use:

StepActionWhere
1Click ...moreBelow the video, under the title and view count
2Click Show transcriptBottom of the expanded description box
3Read or scroll the linesPanel on the right (desktop) or below the description (mobile)
4Click any lineJumps the video to that timestamp

The one detail people miss: the Show transcript button only appears for videos that have captions. If a creator never uploaded captions and YouTube did not auto-generate them, the button is not there. That is a content availability issue, and I cover when captions exist at all further down.

Once the panel is open, the next question is almost always how to get that text out of it cleanly, because copying it as-is drags the timestamps along with every line.

How do you copy a YouTube transcript as plain text?

To copy a YouTube transcript as plain text, open the three-dot menu inside the transcript panel and click Toggle timestamps to hide them first. Then drag to select the whole transcript, copy it with Ctrl+C (Cmd+C on Mac), and paste it into a document. With timestamps hidden, the text pastes as clean readable paragraphs.

If you skip the toggle step, every line arrives prefixed with a time code like 0:42, which means a find-and-replace cleanup afterward. I learned to hide them first.

What you wantSetting in the panelResult when pasted
Readable text for notesTimestamps offClean sentences, no time codes
Lines with timingTimestamps on (default)0:42 So in college, per line
A subtitle file (SRT/VTT)Not available in the panelUse a generator or script (below)

The built-in panel only ever gives you copyable text. It cannot export an SRT or VTT subtitle file, it cannot batch multiple videos, and on a long video selecting hundreds of lines by hand is tedious. Those three gaps are exactly what the free generator tools and the Python library solve, starting with the no-install option.

How do you download a YouTube transcript with a free generator?

To download a YouTube transcript with a free generator, paste the video URL into a web tool, click generate, and download the result as a TXT, SRT, or VTT file. A YouTube transcript generator reads the same caption track YouTube uses and wraps it in download and copy buttons the native panel lacks. These tools are easy to use and most need no sign-up or install.

I tested the most-recommended free generators on the same 20-minute talk to compare what they export:

ToolExport formatsTimestamps toggleSign-up
TactiqTXTYesNo
NoteGPTTXT, with AI summaryYesNo for basic
youtube-transcript.ioTXT, SRT, VTTYesNo

All three pulled the transcript in a few seconds. The practical differences are the export formats and whether they bolt on extras like an AI summary. If all you need is the text once, any of them works. The friction shows up when you have a list of videos to process, because pasting URLs one at a time into a web form does not scale, and most free tiers cap how many you can run per day.

For repeatable or bulk extraction, the cleaner path is code, and the Python ecosystem has a library built specifically for this.

How do you extract a YouTube transcript with Python?

To extract a YouTube transcript with Python, install the youtube-transcript-api library and call fetch() with the video ID. It returns the transcript as structured snippets with text, start, and duration fields, and it does not require an API key or a headless browser. It is the most direct programmatic way to get transcript data from a YouTube video.

Install it first:

pip install youtube-transcript-api

Then fetch a transcript. The video ID is the part after v= in a watch URL (for youtube.com/watch?v=arj7oStGLkU, the ID is arj7oStGLkU):

from youtube_transcript_api import YouTubeTranscriptApi

api = YouTubeTranscriptApi()
fetched = api.fetch("arj7oStGLkU")

print(fetched.language, "| generated:", fetched.is_generated)
print("lines:", len(fetched))
for snippet in fetched.snippets[:3]:
    print(f"{snippet.start:.2f}s  {snippet.text!r}")

This is the actual output I got running it in June 2026 against Tim Urban’s TED talk:

English | generated: False
lines: 315
12.64s  'So in college,'
15.35s  'I was a government major,'
16.94s  "which means I had to write\na lot of papers."

The generated: False tells me this was a human-uploaded caption track, which the library prefers over auto-generated ones when both exist. The whole call returned 315 lines in under a second. According to the library’s PyPI page, the current version is 1.2.4, released in January 2026.

How do you list which transcript languages are available?

To list which transcript languages are available for a video, call list() instead of fetch() and iterate the result. Each entry exposes a language code and whether that track is auto-generated, so you can pick the one you want before fetching it.

api = YouTubeTranscriptApi()
for t in api.list("arj7oStGLkU"):
    print(t.language_code, "generated" if t.is_generated else "manual")

For that same TED talk, list() returned 50 available languages in my run, most of them manually created community translations. To fetch a specific one, pass a language priority to fetch:

fetched = api.fetch("arj7oStGLkU", languages=["es", "en"])

The library tries Spanish first and falls back to English if Spanish is missing. This is how you get a transcript of a YouTube video in English specifically, or in any other language the creator and community provided.

How do you save a YouTube transcript as SRT, VTT, or text?

To save a YouTube transcript as SRT, VTT, or plain text, pass the fetched transcript through one of the library’s formatters and write the result to a file. The package ships SRTFormatter, WebVTTFormatter, TextFormatter, and JSONFormatter, which I confirmed are all present in version 1.2.4.

from youtube_transcript_api.formatters import SRTFormatter

fetched = YouTubeTranscriptApi().fetch("arj7oStGLkU")
srt = SRTFormatter().format_transcript(fetched)

with open("transcript.srt", "w", encoding="utf-8") as f:
    f.write(srt)

Swap SRTFormatter for WebVTTFormatter to get a .vtt subtitle file, TextFormatter for clean prose, or JSONFormatter to feed the data into another script. This single library covers every download format the web generators offer, with the benefit that you can loop it over a list of video IDs.

That last part, looping over many videos from a server, is where this approach hits a wall, and it is worth understanding why before you build a pipeline on it.

Why does the Python transcript script get blocked on a server?

The Python transcript script gets blocked on a server because YouTube blocks the IP ranges of major cloud providers. The youtube-transcript-api documentation states plainly that YouTube “has started blocking most IPs that are known to belong to cloud providers (like AWS, Google Cloud Platform, Azure, etc.),” which surfaces as a RequestBlocked or IpBlocked exception when you deploy the code.

This is the gap between testing and production that catches most people. The script runs perfectly from a laptop on a home connection. The identical code deployed to a Lambda function or a cloud VM throws IpBlocked because the request now comes from a datacenter IP that YouTube has flagged. The library is doing nothing wrong; the IP reputation changed.

Where the script runsIP typeTypical result
Home or office laptopResidentialWorks
AWS / GCP / Azure serverDatacenterIpBlocked exception
Behind residential proxiesResidential (rotated)Works, with proxy upkeep
Through a transcript APIHandled server-sideWorks, no proxy upkeep

The two ways out are running your own rotating residential proxy pool, which the library supports through a proxy config, or sending the job to a service that owns the proxy layer. For a handful of videos the proxy upkeep is not worth it. For continuous or high-volume collection it becomes a maintenance project of its own.

How do you get YouTube transcripts at scale without managing proxies?

To get YouTube transcripts at scale without managing proxies, send the video URL to a transcript API that handles the proxy rotation and blocking on its servers and returns the parsed transcript to you. You make one request per video and receive structured data back, with no IpBlocked exceptions to debug and no proxy pool to rent.

This is the route I default to for bulk work. The request shape is a single call with your API key and the video URL:

curl "https://api.youtubescraperapi.com/api/v1/youtube/transcript?url=https://www.youtube.com/watch?v=arj7oStGLkU&api_key=$API_KEY"
import requests, os

resp = requests.get(
    "https://api.youtubescraperapi.com/api/v1/youtube/transcript",
    params={
        "url": "https://www.youtube.com/watch?v=arj7oStGLkU",
        # "format": "text",      # both | segments | text  (default both)
        # "units": "seconds",    # seconds | ms            (default seconds)
        "api_key": os.environ["API_KEY"],
    },
    timeout=30,
)
data = resp.json()

if data["transcript_available"]:
    print(data["segment_count"], "segments,", data["word_count"], "words",
          "| source:", data["source"])
    full_text = data["text"]                 # one combined string for an LLM
else:
    print("no transcript:", data["reason"])  # e.g. none_found, transcripts_disabled

The response carries timestamped segments (each with start, duration, and text), the combined text, and is_generated plus source. Set format to text for the combined string only, or segments for just the timed lines, and units to ms if your tooling wants milliseconds. When a video has no human captions, the endpoint falls back to YouTube’s auto-generated (ASR) track and marks it source: "asr", so most spoken-word videos still return text. A genuinely caption-less video comes back with transcript_available: false and a reason rather than an error, which keeps a bulk loop from crashing on one bad video.

The server runs the extraction from residential IPs it manages, so the same job that throws IpBlocked from your own cloud function comes back as parsed JSON here. You can grab a key on the youtubescraperapi.com sign-up page and point the transcript API endpoint at any watch URL. Our API also exposes a caption and subtitle scraper for cases where you need the timed subtitle tracks instead of plain transcript text.

For a one-off transcript, the built-in panel or a free generator is the right tool and costs nothing. The API earns its place when you are pulling transcripts across a channel or a thousand-video backlog and cannot afford a pipeline that breaks on a datacenter IP.

What about the official YouTube Data API?

The official YouTube Data API v3 can download captions through its captions.download method, but only for videos you own. It requires OAuth 2.0 with the youtube.force-ssl scope, and it returns a 403 error if the authenticated account is not the video owner, per Google’s captions implementation guide. That restriction rules it out for extracting transcripts from other people’s videos.

The quota tightens it further. The Data API gives each project a default ceiling of 10,000 units per day, and caption operations are among the more expensive calls, so even for your own channel the headroom is modest. For anyone who is not the video owner, the official API is the wrong door, which is why the methods above all read the public caption track instead.

Which YouTube videos do not have a transcript at all?

YouTube videos that do not have a transcript are ones where no caption track exists, meaning the creator never uploaded captions and YouTube did not auto-generate them. No tool, native or third party, can produce a transcript when there is no underlying caption data to read.

The common cases I have run into:

When the caption track genuinely does not exist, the only remaining option is to transcribe the audio yourself by running it through a speech-to-text model, which is a different task from reading an existing transcript. Before automating any bulk extraction, it is also worth knowing where the line sits with YouTube’s Terms of Service, which I break down in my piece on whether scraping YouTube is legal. Once you have the text, the natural next step for most people is condensing it, which I walk through in summarizing a YouTube transcript with AI.

FAQ

Can you get a transcript of any YouTube video?

You can get a transcript of any YouTube video that has captions, either creator-uploaded or auto-generated. If the creator disabled captions, the audio is music-only, or the language is unsupported, there is no caption track and no tool can extract one. YouTube Shorts frequently have no captions at all.

How do I get a YouTube transcript without timestamps?

Open the transcript panel, click the three-dot menu inside it, and select Toggle timestamps to hide them. Then drag to select all the text and copy it. The pasted text comes through as clean paragraphs with no time codes.

How do I get a transcript of a YouTube video on my phone?

In the YouTube mobile app, tap the video, scroll to the description, and tap Show transcript. The panel opens with tappable timestamped lines. Mobile has no copy-all button, so for serious extraction on a phone a web generator or the desktop panel is easier.

Is it legal to extract YouTube transcripts with a script?

Reading a transcript through the built-in panel is fine. Automated extraction sits against YouTube's Terms of Service, which prohibit accessing the service through automated means except per its robots.txt or with written permission. I cover the detail in my guide on whether scraping YouTube is legal.

What format should I download a transcript in?

Use TXT for reading or pasting into an AI summarizer, SRT or VTT if you need subtitle files with timing for a video editor, and JSON if you are feeding the data into code. The youtube-transcript-api library and most generators export all four.

DT
Devon Tran
I've built YouTube data pipelines for years. On youtubescraperapi.com I run YouTube scraping methods against live pages and publish what actually holds up.