Captions · Troubleshooting · Languages
What to Do When a YouTube Video Has No Captions
Why some videos have no transcript, how to tell the cases apart from an API response, and what you can do about each one.
· 4 min read · YTAPI
Sooner or later a transcript request comes back empty-handed. Sometimes the video really has no captions. Often it has captions, just not the ones you asked for, or not yet. The fix depends on which of those it is, so it is worth knowing how to tell them apart.
Where YouTube captions come from
A video can carry three kinds of caption tracks:
- Creator captions. Uploaded or typed by the channel. Usually the most accurate, and the only kind that can exist for any language the creator chooses.
- Auto-generated captions. YouTube's speech recognition, created after upload in the language YouTube detects as spoken. These are the tracks with word-level timing.
- Auto-dubbed captions. Channels that use YouTube's AI dubbing get an extra audio track per language, and each dub gets its own auto-generated captions.
A transcript API can only return tracks that exist. It cannot invent captions for a video YouTube never captioned.
The common cases
Captions are turned off
The creator disabled captions, or the video has no speech YouTube could recognise (music, ambient footage, a silent screen recording). There is no track to fetch.
From YTAPI this is 404 with captions_disabled, and it costs no credit. youtube-transcript-api raises TranscriptsDisabled for the same situation. That name, a missing language, and a blocked IP are three different exceptions. The YTAPI body looks like this:
{
"error": {
"code": "captions_disabled",
"message": "Captions are disabled for this video.",
"retryable": false
}
}The video is too new
Auto-generated captions are produced after upload, and it can take a while, longer for long videos. A video published a few minutes ago may have no track at all, and a live stream usually has none until it ends and is processed. If you are monitoring a channel for new uploads, retry later instead of treating the first 404 as final.
Captions exist, but not in your language
You asked for English, and the video only has Spanish. That is 404 with language_not_found.
YTAPI's default avoids most of these. If you do not pass languages, you get the video's own language, the one spoken in it; the language field in the response says which. To choose yourself, pass a priority list and end it with "*" to fall back to the original:
curl -s https://api.ytapi.dev/v1/transcripts \
-H "Authorization: Bearer $YT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"video_id": "dQw4w9WgXcQ", "languages": ["es", "*"]}'If you pass ["en"] without "*", you are asking for English only, and a video without it returns language_not_found.
The original audio has no captions, but the dubs do
Auto-dubbed videos are an odd case. We have seen English podcasts whose caption list contains a track for every AI dub (Arabic, Spanish, Vietnamese and so on) and none for the English original. No client, ours or anyone else's, can return English captions for those, because YouTube does not provide them. With the default settings, YTAPI returns the track YouTube itself shows by default, and the language field makes it obvious that it is not English.
A track exists but is empty
Occasionally a video lists a caption track whose cues are all blank, next to a second track in the same language with the real text. Broadcast uploads with "English", "English - CC1" and similar are the usual source. YTAPI skips blank tracks and tries the others in that language before giving up; if every one is blank, you get captions_disabled.
Choosing creator captions or speech recognition
When both kinds exist, track_policy picks between them:
track_policy | Behaviour |
|---|---|
manual_first (default) | Creator captions if present, otherwise auto-generated. |
asr_first | Auto-generated if present, otherwise creator captions. Use this when you need word-level timing, which only auto-generated tracks carry. |
exact_only | Only a track whose language code matches exactly: en does not match en-GB. |
Every successful response includes track_kind (manual or asr), so you can filter out auto-generated text later if your use case needs human captions only.
When there really is no track
If a video has no usable captions at all, the remaining option is to transcribe the audio yourself with a speech-to-text model such as Whisper. That is a different job from fetching captions: you need the audio, it takes compute time proportional to the video's length, and you should make sure you have the rights to process the content. YTAPI does not do this for you; it returns the tracks YouTube issued and tells you clearly when there are none.
A checklist for your code
- Treat
404as a normal outcome, not an exception to retry blindly. Readerror.code. captions_disabled: skip, or queue for your own speech-to-text if you need it.language_not_found: add"*"tolanguages, or check which languages exist with the free basic info endpoint.- For brand-new uploads, retry after some time instead of immediately.
- Log
languageandtrack_kindso you can see what you actually received.
None of these 404 responses use a credit, so checking a long list of videos for captions costs nothing for the ones that have none.
FAQ
Can I get a transcript for a video that has no captions at all?
Not from YouTube, because there's nothing to fetch. You'd have to run speech-to-text on the audio yourself, or use a provider that does it for you: Supadata, for example, can generate one with AI at extra cost. A caption API like YTAPI returns a free 404 in that case.
Does checking whether a video has captions cost anything?
Not with YTAPI. The basic info endpoint is free and lists the available caption languages, and a transcript request for a video without captions returns a 404 that isn't billed.
Are auto-generated captions good enough?
For search, summaries and most LLM work, yes. For quotes, subtitles you publish, or names and technical terms, prefer creator captions when they exist. track_policy=manual_first, the default, picks them automatically.