If you have a script that pulled YouTube transcripts a year ago, there's a good chance it quietly broke. It still runs, no errors — it just returns empty. Here's what changed, and how to actually get captions again.

The symptom

You hit YouTube's caption endpoint (timedtext), get back HTTP 200… and an empty body. No exception, no 403, nothing to catch. Just nothing. So your pipeline happily writes empty transcripts and you don't notice until your RAG index is full of blanks.

This is why a lot of the popular libraries went dark in 2025–2026, even ones that are still "maintained." The request shape that used to work now returns nothing.

What actually changed: PoToken