YouTube Transcript API Rate Limit: What It Is and How to Handle 429s
Why APIs return 429 Too Many Requests, what RFC 6585 and the Retry-After header actually specify, how rate limits differ from daily quota, and how to implement correct retry and backoff logic.
00:08:00 · SEP 13, 2026
Respuesta rápida
429 significa que estás enviando solicitudes más rápido de lo que permite el límite de solicitudes por minuto de tu plan; no tiene relación con los créditos ni con la cuota diaria. Si la respuesta incluye un encabezado Retry-After, espera exactamente ese tiempo. Si no lo incluye, usa retroceso exponencial con jitter, y limita por separado cuántas solicitudes tienes en curso a la vez.Límite de tasa frente a cuota
Son dos restricciones distintas que suelen confundirse:
- Cuota - el total de solicitudes permitidas en una ventana más larga (por ejemplo, un día). Agotarla significa esperar un restablecimiento, a veces a muchas horas de distancia.
- Límite de tasa - las solicitudes permitidas por ventana corta (por ejemplo, un minuto). Alcanzarlo significa ir más despacio durante segundos o un minuto, no horas.
Por debajo, la mayoría de las APIs implementan el límite de tasa con un token bucket (acumulas "tokens" de solicitud a un ritmo constante y gastas uno por solicitud, lo que permite ráfagas cortas) o un contador de ventana fija/deslizante (un tope estricto por minuto de calendario, que se reinicia en el límite). Cuál de los dos use una API determinada cambia qué tan intermitente puede ser tu tráfico de forma segura: un token bucket tolera mejor un pico corto que una ventana fija.
El estándar HTTP: RFC 6585 y Retry-After
429 Too Many Requests no es folclore específico de un proveedor: se definió formalmente en la RFC 6585 (abril de 2012) como un código de estado HTTP estándar. Según la RFC 9110, un servidor conforme puede adjuntar un encabezado Retry-After a una respuesta 429 (o 503), en una de estas dos formas:
- Forma de segundos de retraso - un número entero, por ejemplo
Retry-After: 120, que significa esperar 120 segundos. - Forma de fecha HTTP - una marca de tiempo absoluta, por ejemplo
Retry-After: Wed, 21 Oct 2026 07:28:00 GMT.
Cuando está presente, este encabezado es autoritativo: el servidor te dice exactamente cuándo volverá a aceptar solicitudes. No agregues tu propio retroceso exponencial encima; eso solo retrasa más tu recuperación. Recurre al retroceso solo cuando el encabezado esté ausente.
Límites de tasa de GetYouTubeTranscript
| Plan | Límite de tasa |
|---|---|
| Gratis | 60 solicitudes/min |
| Mensual ($5/mes) | 200 solicitudes/min |
| Anual ($4.50/mes) | 300 solicitudes/min |
Cómo se aplica esto en realidad
Retry-After, así que trata cualquier 429 de esta API como "espera hasta ~60 segundos y reintenta con retroceso", usando el patrón de código de abajo en lugar de analizar un encabezado que no estará presente.Manejar correctamente los 429
El orden correcto de operaciones: primero verifica si existe Retry-After, y solo recurre al retroceso exponencial con jitter si falta. El jitter (aleatorizar ligeramente la espera) importa porque cuando muchos clientes alcanzan un límite simultáneamente y todos reintentan con el mismo cronograma, se sincronizan y crean una "estampida" que vuelve a activar de inmediato el mismo límite.
Node.js:
async function getTranscriptWithRetry(videoId, apiKey, maxRetries = 4) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch(
`https://getyoutubetranscript.com/api/v1/transcript?v=${videoId}`,
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
if (res.status !== 429) return res.json();
const retryAfter = res.headers.get('retry-after');
const waitMs = retryAfter
? Number(retryAfter) * 1000
: 500 * 2 ** attempt + Math.random() * 250; // exponential backoff + jitter
await new Promise((r) => setTimeout(r, waitMs));
}
throw new Error('Rate limited after retries');
}Python:
import os, time, random, requests
def get_transcript_with_retry(video_id, api_key, max_retries=4):
url = "https://getyoutubetranscript.com/api/v1/transcript"
for attempt in range(max_retries + 1):
res = requests.get(url, params={"v": video_id}, headers={"Authorization": f"Bearer {api_key}"})
if res.status_code != 429:
return res.json()
retry_after = res.headers.get("Retry-After")
wait = float(retry_after) if retry_after else (0.5 * 2 ** attempt + random.uniform(0, 0.25))
time.sleep(wait)
raise RuntimeError("Rate limited after retries")Tasa frente a concurrencia: un problema distinto
Un límite de solicitudes por minuto y un límite de concurrencia simultánea no son lo mismo. Disparar 50 solicitudes al mismo tiempo con Promise.all puede activar un 429 incluso si tu total del minuto está muy por debajo del presupuesto, porque el servidor (o un proxy delante de él) también puede limitar las conexiones simultáneas. Al procesar muchos videos por lotes, limita la concurrencia de forma independiente a tu retroceso por límite de tasa:
import pLimit from 'p-limit';
const limit = pLimit(5); // at most 5 requests in flight at once
const results = await Promise.all(
videoIds.map((id) => limit(() => getTranscriptWithRetry(id, apiKey)))
);Para lotes sostenidos de alto volumen, subir de nivel de plan aumenta directamente el límite de solicitudes por minuto; consulta los precios en la documentación de la API, o empieza con 100 créditos gratis desde el panel.
Preguntas frecuentes sobre límite de tasa
¿Cuál es la diferencia entre un límite de tasa y una cuota?
Una cuota limita el uso total durante un periodo (por ejemplo, por día). Un límite de tasa limita cuántas solicitudes puedes hacer por unidad de tiempo (por ejemplo, por minuto), independientemente de tu uso diario total: puedes alcanzar un límite de tasa mientras aún estás muy por debajo de tu cuota diaria. Consulta nuestra guía de cuota de la API de YouTube para el lado de la cuota.
¿Qué significa una respuesta 429?
429 Too Many Requests se definió formalmente en la RFC 6585 en 2012. Significa que superaste el límite de solicitudes por ventana de tu plan: es una señal para ir más despacio y reintentar, no que tu solicitud fuera inválida o que te quedaste sin créditos.
¿Qué es el encabezado Retry-After, y debería confiar en él siempre?
Según la RFC 9110, un servidor puede incluir un encabezado Retry-After en una respuesta 429 o 503, en una de dos formas: un número entero de segundos (Retry-After: 120) o una fecha HTTP absoluta. Si está presente, respétalo exactamente en lugar de agregar tu propio retroceso encima: el servidor te ha dado una respuesta autoritativa sobre cuándo reintentar.
¿Cuál es el límite de tasa de GetYouTubeTranscript, y envía un encabezado Retry-After?
60 solicitudes por minuto en el plan gratuito, 200 solicitudes/min en el plan mensual, y 300 solicitudes/min en el plan anual, aplicados como una ventana fija de 1 minuto por clave de API (no una ventana móvil). Actualmente no envía un encabezado Retry-After en los 429, así que implementa tu propio retroceso (ver el código de abajo) en lugar de esperar uno; como la ventana es fija en vez de móvil, la espera es como máximo el resto del minuto actual.
¿Un 429 consume un crédito?
No: una solicitud limitada por tasa nunca se cobra. Solo las solicitudes exitosas consumen créditos.
¿Debería abrir varias claves de API para obtener más rendimiento?
No: esto normalmente viola los términos de uso justo de un proveedor, y en GetYouTubeTranscript específicamente, el límite de tasa ya se aplica por clave de API, pero los créditos y el estado de la cuenta se controlan a nivel de cuenta sin importar cuántas claves generes. Si necesitas más rendimiento, sube de nivel de plan en su lugar, lo cual aumenta directamente el límite de solicitudes por minuto.
¿Por qué fallan mis solicitudes aunque esté por debajo del límite de solicitudes por minuto?
Normalmente es un problema de concurrencia, no de tasa: disparar 50 solicitudes en paralelo puede saturar un servidor aunque tu total del minuto esté dentro del presupuesto. Usa un limitador de concurrencia (como p-limit en Node o un semáforo en Python) para limitar cuántas solicitudes tienes en curso a la vez, por separado de cuántas envías por minuto.
Relacionado
- YouTube API Quota Exceeded: Causes and Fixes
- YouTube Transcript MCP Server: Setup Guide for Claude and Other AI Tools
- YouTube Transcripts in n8n: HTTP Request Workflow Guide
- GetYouTubeTranscript frente a TranscriptAPI
- GetYouTubeTranscript frente a youtubetotranscript.com
- GetYouTubeTranscript frente a youtube-transcript.io