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
Resposta rápida
429 significa que você está enviando requisições mais rápido do que o teto de requisições por minuto do seu plano permite - isso não tem relação com créditos ou cota diária. Se a resposta incluir um cabeçalho Retry-After, espere exatamente esse tempo. Se não incluir, use backoff exponencial com jitter, e separadamente limite quantas requisições você tem em andamento ao mesmo tempo.Limite de taxa vs. cota
Essas são duas restrições diferentes que frequentemente se confundem:
- Cota - total de requisições permitidas em uma janela mais longa (por exemplo, um dia). Esgotá-la significa esperar por um reset, às vezes horas depois.
- Limite de taxa - requisições permitidas por uma janela curta (por exemplo, um minuto). Atingi-lo significa desacelerar por segundos a um minuto, não horas.
Por baixo dos panos, a maioria das APIs implementa o limite de taxa com um token bucket (você acumula "tokens" de requisição a uma taxa constante e gasta um por requisição, permitindo pequenas explosões) ou um contador de janela fixa/deslizante (um teto rígido por minuto do relógio, reiniciando no limite). Qual deles uma dada API usa muda o quão explosivo seu tráfego pode ser com segurança - um token bucket tolera um pico curto melhor do que uma janela fixa.
O padrão HTTP: RFC 6585 e Retry-After
429 Too Many Requests não é folclore específico de provedor - foi formalmente definido na RFC 6585 (abril de 2012) como um código de status HTTP padrão. Segundo a RFC 9110, um servidor compatível pode anexar um cabeçalho Retry-After a uma resposta 429 (ou 503), em uma de duas formas:
- Forma delay-seconds - um número inteiro, por exemplo
Retry-After: 120, significando esperar 120 segundos. - Forma HTTP-date - um timestamp absoluto, por exemplo
Retry-After: Wed, 21 Oct 2026 07:28:00 GMT.
Quando presente, este cabeçalho é a autoridade - o servidor está te dizendo exatamente quando voltará a aceitar requisições. Não sobreponha seu próprio backoff exponencial a ele; isso só atrasa ainda mais sua recuperação. Só recorra ao backoff quando o cabeçalho estiver ausente.
Os limites de taxa do GetYouTubeTranscript
| Plano | Limite de taxa |
|---|---|
| Grátis | 60 req/min |
| Mensal ($5/mês) | 200 req/min |
| Anual ($4,50/mês) | 300 req/min |
Como isso é realmente aplicado
Retry-After, então trate qualquer 429 desta API como "espere até ~60 segundos e tente de novo com backoff", usando o padrão de código abaixo em vez de tentar ler um cabeçalho que não existirá.Lidando com 429s corretamente
A ordem correta de operações: verifique Retry-After primeiro, e só recorra ao backoff exponencial com jitter se ele estiver ausente. O jitter (aleatorizar levemente a espera) importa porque, quando muitos clientes atingem um limite simultaneamente e todos tentam de novo no mesmo cronograma, eles se sincronizam e criam um "efeito manada" que reativa imediatamente o mesmo limite.
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")Taxa vs. concorrência - um problema distinto
Um teto de requisições por minuto e um teto de concorrência simultânea não são a mesma coisa. Disparar 50 requisições simultaneamente com Promise.all pode acionar um 429 mesmo que seu total do minuto esteja bem dentro do orçamento, porque o servidor (ou um proxy na frente dele) também pode limitar conexões simultâneas. Ao processar muitos vídeos em lote, limite a concorrência independentemente do seu backoff de limite de taxa:
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 sustentados de alto volume, fazer upgrade de plano eleva diretamente o teto de req/min - veja preços na documentação da API, ou comece com 100 créditos grátis no painel.
Perguntas frequentes sobre limite de taxa
Qual é a diferença entre um limite de taxa e uma cota?
Uma cota limita o uso total ao longo de um período (por exemplo, por dia). Um limite de taxa limita quantas requisições você pode fazer por unidade de tempo (por exemplo, por minuto), independente do seu uso diário total - você pode atingir um limite de taxa mesmo estando bem abaixo da sua cota diária. Veja nosso guia de cota da API do YouTube para o lado da cota disso.
O que significa uma resposta 429?
429 Too Many Requests foi formalmente definido na RFC 6585 em 2012. Significa que você excedeu o limite de requisições por janela do seu plano - é um sinal para desacelerar e tentar de novo, não que sua requisição era inválida ou que você ficou sem créditos.
O que é o cabeçalho Retry-After, e devo sempre confiar nele?
Segundo a RFC 9110, um servidor pode incluir um cabeçalho Retry-After em uma resposta 429 ou 503, em uma de duas formas: um número inteiro de segundos (Retry-After: 120) ou uma HTTP-date absoluta. Se estiver presente, respeite-o exatamente em vez de sobrepor seu próprio backoff - o servidor te deu uma resposta com autoridade sobre quando tentar de novo.
Qual é o limite de taxa do GetYouTubeTranscript, e ele envia um cabeçalho Retry-After?
60 requisições/minuto no plano gratuito, 200 req/min no plano mensal, e 300 req/min no plano anual, aplicados como uma janela fixa de 1 minuto por chave de API (não uma janela deslizante). Atualmente não é enviado um cabeçalho Retry-After em 429s, então implemente seu próprio backoff (veja o código abaixo) em vez de esperar por um - como a janela é fixa em vez de deslizante, a espera é no máximo o restante do minuto atual.
Um 429 consome um crédito?
Não - uma requisição limitada por taxa nunca é cobrada. Apenas requisições bem-sucedidas consomem créditos.
Devo abrir várias chaves de API para ter mais vazão?
Não - isso geralmente viola os termos de uso justo de um provedor, e no GetYouTubeTranscript especificamente, o limite de taxa já é aplicado por chave de API, mas os créditos e a situação da conta são rastreados no nível da conta, independentemente de quantas chaves você gerar. Se precisar de mais vazão, faça upgrade de plano em vez disso, o que eleva diretamente o teto de req/min.
Por que minhas requisições falham mesmo estando abaixo do limite de requisições por minuto?
Isso costuma ser um problema de concorrência, não de taxa - disparar 50 requisições em paralelo pode sobrecarregar um servidor mesmo que seu total do minuto esteja dentro do orçamento. Use um limitador de concorrência (como p-limit no Node ou um semáforo no Python) para limitar quantas requisições estão em andamento ao mesmo tempo, separadamente de quantas você envia por minuto.
Relacionados
- 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 vs TranscriptAPI
- GetYouTubeTranscript vs youtubetotranscript.com
- GetYouTubeTranscript vs youtube-transcript.io