¿La API de Transcripciones de YouTube no funciona? Lista de diagnóstico
Cada razón real por la que falla una petición de transcripción, basada en los propios issues más discutidos de la comunidad de código abierto - no en suposiciones - más el código de error exacto y la solución para cada una.
Lista de diagnóstico
Compara tu código de error (o la forma de tu respuesta) con la tabla de abajo.
| Código | Qué significa | Qué hacer |
|---|---|---|
MISSING_URL / INVALID_URL · 400 | Falta el parámetro v, o no es un ID/URL de video que YouTube reconozca. | Pasa un ID de video válido de 11 caracteres o una URL completa youtube.com/watch?v=... |
VIDEO_UNAVAILABLE · 404 | El video es privado, fue eliminado, o está bloqueado por región - no existe desde el punto de vista del servidor. | Confirma primero que el video carga en un navegador normal. Si no lo hace, no hay nada que una API pueda recuperar. |
TRANSCRIPT_DISABLED · 404 | Normalmente significa que quien subió el video deshabilitó los subtítulos - pero los bloqueos regionales y de IP pueden producir un error con el mismo aspecto. | Revisa el aviso de abajo antes de asumir que es permanente. |
LANGUAGE_NOT_AVAILABLE · 404 | El video tiene subtítulos, solo que no en el idioma que pediste. | Quita el parámetro de idioma para obtener lo que esté disponible, o revisa primero la lista de idiomas del propio video. |
TRANSCRIPT_NOT_FOUND · 404 | No existe transcripción en ningún idioma para este video. | Igual que los subtítulos deshabilitados - no hay nada que recuperar. No todos los videos tienen uno. |
RATE_LIMITED · 429 | Tu clave de API hizo más peticiones de las que permite el límite por minuto de tu plan. | Reduce la frecuencia y reintenta, o mejora tu plan para un límite más alto. |
UPSTREAM_* · 429/503/504 | Un problema pasajero al hablar con YouTube directamente, no con tu clave ni tu petición. | Seguro reintentar tras una breve espera - exactamente el tipo de falla que una API alojada absorbe en tu lugar. |
"Subtítulos deshabilitados" no siempre significa deshabilitados
El issue más discutido en toda la historia de youtube-transcript-api de código abierto (187 comentarios) es un script que lanza "TranscriptsDisabled" para un video que en realidad no está deshabilitado - reproduce subtítulos sin problema en un navegador normal. Tres causas reales distintas producen un error casi idéntico:
- Realmente deshabilitado - quien subió el video apagó los subtítulos. No hay nada que recuperar, en ningún idioma.
- Bloqueado por región - el video o sus subtítulos no están disponibles desde el país de tu servidor, pero funcionan desde un navegador en otra región.
- Bloqueado por IP - YouTube devuelve un fallo genérico en vez de uno específico, y la causa real es el problema de alojamiento en la nube de abajo.
Un error de parseo XML crudo ("no element found", "line 1, column 0") en vez de una excepción clara es de la misma familia de problema - un cuerpo de respuesta vacío, normalmente por el mismo bloqueo de IP o PoToken de abajo, no un error en el propio código de parseo.
¿Bloqueado en AWS, GCP, Azure o un VPS?
Si un script funciona perfectamente en tu laptop y falla justo al desplegarlo en un servidor en la nube, casi siempre es por esto: el endpoint de subtítulos de YouTube bloquea rangos enteros de IPs de centros de datos, no solo IPs individuales abusivas. El espacio de IPs de cada gran proveedor de nube termina siendo afectado, porque miles de scripts sin relación entre sí comparten los mismos rangos de direcciones.
Could not retrieve a transcript for the video https://www.youtube.com/watch?v=...!
This is most likely caused by:
YouTube is blocking requests from your IP.Formas realistas de evitarlo, más o menos en orden de esfuerzo:
- Enrutar peticiones por un pool de proxies residenciales o móviles - funciona a veces, pero cada vez hay más reportes de que incluso configuraciones residenciales rotativas de pago siguen fallando. No es una solución permanente.
- Rotar entre varios proveedores de nube o regiones - gana tiempo hasta que esos rangos también se marquen.
- Cachear agresivamente para no volver a pedir los mismos videos - reduce cuántas veces chocas con el bloqueo, no lo elimina.
- Usar una API alojada que ya mantiene esta infraestructura - el problema pasa de "tu proyecto" a "alguien cuyo trabajo real es mantener esto funcionando".
Ese es el vacío real que llena nuestra propia API de Transcripciones de YouTube - no una librería distinta, sino infraestructura ya construida específicamente para este problema.
¿Te sale PoTokenRequired?
Una falla más reciente: el endpoint de subtítulos de YouTube cada vez más exige un token de origen generado en tiempo de ejecución por su propio JavaScript del reproductor - no una cookie, no una verificación de reputación de IP, un valor criptográfico. Una petición HTTP simple no tiene forma de generarlo.
Mira el detalle técnico real en jdepoix/youtube-transcript-api#592 - según ese reporte, no existe una solución documentada en la librería de código abierto.
Este es exactamente el tipo de problema que una API alojada debe absorber - llama a un endpoint y recibe una transcripción o un error claro, sin tener que resolver la generación del token tú mismo.
Qué devuelve nuestra propia API en cada falla
Si ya usas nuestra API y quieres bifurcar según la falla exacta en vez de adivinar solo por el estado HTTP, cada error viene con un campo `code` estable:
curl "https://getyoutubetranscript.com/api/v1/transcript?v=dQw4w9WgXcQ" \
-H "Authorization: Bearer sk_live_..."
# A failure looks like:
# { "success": false, "code": "TRANSCRIPT_DISABLED", "message": "Transcripts are disabled for this video." }La referencia completa de parámetros y cada código de estado está en la documentación de la API.
Errores comunes de la API de Transcripciones de YouTube
¿Por qué me sale 'YouTube is blocking requests from your IP'?
Estás llamando al endpoint de subtítulos de YouTube desde una IP de nube/centro de datos (AWS, GCP, Azure, un VPS...), y YouTube bloquea esos rangos más agresivamente que las IPs residenciales. Normalmente no es algo personal - es todo el rango de IPs, compartido con miles de otros scripts.
¿Por qué mi script funciona en local pero falla al desplegarlo?
Tu laptop tiene una IP residencial; tu servidor tiene una IP de centro de datos. Mismo código, distinta reputación de red - la causa más común de "funciona aquí, falla allá" para quien aloja su propia librería de transcripciones de YouTube.
¿Por qué 'subtítulos deshabilitados' a veces resulta ser incorrecto?
Porque YouTube no siempre devuelve una razón específica - un bloqueo regional o de IP puede producir el mismo error genérico que un video realmente deshabilitado. Revisa si el video reproduce subtítulos en un navegador normal desde otra red antes de asumir que no está disponible de forma permanente.
¿Qué es PoTokenRequired?
YouTube exigiendo un token de origen generado por el JavaScript real del reproductor en tiempo de ejecución, no un valor estático que puedas fijar o extraer una vez. Las peticiones HTTP simples - y la mayoría de librerías de scraping - no tienen forma de generarlo, por lo que actualmente no tiene solución documentada en la librería de código abierto.
¿Por qué no hay transcripción en el idioma que pedí?
El video tiene subtítulos, solo que no en ese idioma. Pide sin el parámetro de idioma para obtener lo que haya disponible, o revisa primero qué idiomas existen.
¿Cómo evito los límites de velocidad?
Existen dos límites distintos: el tope de peticiones por minuto de tu propio plan (mejóralo para uno más alto), y los límites propios de YouTube (seguro reintentar tras una breve espera - una API alojada absorbe la mayor parte de esto por ti).