# TranscriptsDisabled: Get a Transcript When a Video Has No Captions

Source: https://transcript-yt.com/blog/youtube-transcript-api-transcripts-disabled · Updated 2026-11-10 · TranscriptYT

> TranscriptsDisabled means the video has no caption track at all, so no caption library can read one. The fix is speech-to-text: run Whisper on the audio yourself or call an API that transcribes it.

youtube-transcript-api raises TranscriptsDisabled with "Subtitles are disabled for this video" when a video has no caption track: the creator turned captions off, YouTube never generated them (common for music, short clips, and new uploads), or the video is too long or noisy for auto-captions. Retrying or a proxy won't help. The only way to get text is to transcribe the audio.

## The error

```
YouTubeTranscriptApi().fetch("euYe6W7d-rI")
# TranscriptsDisabled:
# Could not retrieve a transcript for the video https://www.youtube.com/watch?v=euYe6W7d-rI!
# This is most likely caused by:
#
# Subtitles are disabled for this video
```

## Option 1: Whisper on your own machine

Download the audio with yt-dlp and transcribe it with faster-whisper or openai-whisper. It is free apart from compute, and fine for a handful of videos on a machine with a GPU.

Two catches in production: yt-dlp's audio downloads hit the same datacenter-IP blocks as caption requests ("Sign in to confirm you're not a bot"), and a large model needs a GPU to keep up.

```
# pip install yt-dlp faster-whisper
yt-dlp -x --audio-format mp3 -o audio.mp3 "https://youtu.be/euYe6W7d-rI"

from faster_whisper import WhisperModel
model = WhisperModel("small")
segments, info = model.transcribe("audio.mp3")
for s in segments:
    print(round(s.start, 2), s.text)
```

## Option 2: an API that falls back to AI transcription

The [TranscriptYT API](https://transcript-yt.com/api) reads captions when a video has them (1 credit) and transcribes the audio with Whisper when it doesn't (1 credit per started minute), in the same request and response shape. You never handle audio, proxies, or GPUs, and nothing is charged if it fails.

Pass mode=captions to never pay for AI transcription, or mode=ai to always transcribe the audio, even when captions exist.

```
import os, requests

res = requests.get(
    "https://transcript-yt.com/v1/transcript",
    params={"url": "euYe6W7d-rI"},  # no captions: transcribed from the audio
    headers={"Authorization": f"Bearer {os.environ['TRANSCRIPTYT_KEY']}"},
    timeout=300,
)
data = res.json()
print(data["source"], data["segments"][:3])
```

## Without code

For a single video, paste the link into the free [YouTube transcript tool](https://transcript-yt.com/youtube-transcript) and click Transcribe the audio with AI (paid plans and credit packs, 1 credit per minute). The [no-captions guide](https://transcript-yt.com/blog/transcribe-youtube-video-without-captions) compares the other options.

## FAQ

### What does TranscriptsDisabled mean?

The video has no caption track, neither creator-uploaded nor auto-generated. Caption readers like youtube-transcript-api have nothing to fetch, so the error is permanent for that video.

### Can I get a transcript of a YouTube video without captions?

Yes, by transcribing the audio with a speech-to-text model such as Whisper. Download the audio with yt-dlp and run Whisper locally, or use an API that does both, such as TranscriptYT at 1 credit per started minute.

### How accurate is Whisper on YouTube videos?

Very good on clear speech in major languages, often better than YouTube's auto-captions. Accuracy drops with heavy music, overlapping speakers, and strong background noise.

### How long does it take to transcribe a video without captions?

With a hosted API about a minute or two for an hour of audio. Running Whisper yourself depends on your GPU; on a CPU, the large models can take longer than the video itself.

### Why does TranscriptsDisabled happen for videos that show captions on YouTube?

Occasionally YouTube serves a reduced response to a blocked or rate-limited IP. If the CC button works in your browser, retry from another network, or treat it like a RequestBlocked error.
