Recompensas em dobro

IPs rotativos:Compre 50GB e ganhe 10GB grátis

IPs estáticos:Ganhe 7 dias extras a cada 30 dias comprados, mais 500 MB por pedido

Compre agora >

Alerta de segurançaUm site de phishing fraudulento ( rola-ip.com) está se passando por nosso site oficial anterior. O único site oficial da ROLA IP é rola-ip.co (certifique-se de que ele usa o .co sufixo de domínio). Para proteger seus fundos, não faça pagamentos em nenhum outro domínio!

Erro 429 no Reddit: como resolver o limite de requisições

Marcus Bennett

29 de out. de 2026 · Guias · 14 min de leitura

erro 429 no Reddit, muitas vezes acompanhado de “rate limit exceeded”, pede uma pausa no envio de requisições. Antes de tentar novamente, identifique a ação afetada e leia a mensagem completa. Uma restrição ao publicar comentários, uma cota da API e um bloqueio de segurança da rede exigem diagnósticos diferentes.

Para quem desenvolve aplicações, o caminho é controlar a fila, respeitar os cabeçalhos de espera e compartilhar o orçamento de requisições entre os processos. Para quem usa o navegador ou a aplicação oficial, o primeiro passo é interromper atualizações e envios repetidos.

Resumo: o que fazer ao receber “rate limit exceeded”

Interrompa o tráfego que produz o erro e descubra qual limite foi atingido. Repetir a mesma operação sem interpretar a resposta dificulta o diagnóstico.

  • Guarde a mensagem e o contexto: ação, horário e código HTTP, quando disponível.
  • Respeite o tempo informado: contador da interface, Retry-After ou cabeçalhos da API.
  • Coordene os processos: vários workers podem consumir a cota do mesmo cliente OAuth.
  • Reduza trabalho duplicado: use cache permitido, deduplicação e uma fila com concorrência definida.
  • Separe conectividade de capacidade: a configuração da rota de rede e o limite da aplicação são controles distintos.

reddit-app-rate-limited-message

O que significa o erro 429 no Reddit?

O HTTP 429 indica que houve requisições demais para o limite aplicado pelo servidor. O código não informa, por si só, como o servidor identifica o cliente ou contabiliza as operações, conforme a RFC 6585.

O guia sobre HTTP 429 da Rola IP, em inglês explica o status em diferentes serviços. No Reddit, comece pelo contexto:

Contexto a investigar Onde aparece Evidência útil Primeira medida
Conta ou ação Publicações, comentários, mensagens e login Contagem regressiva, aviso da conta e operação afetada Interromper a ação e aguardar
Navegador ou sessão Atualizações repetidas, extensões e abas duplicadas Requisições em segundo plano e comparação entre sessões Desativar a atualização automática e isolar o cliente
Cliente OAuth Integrações com a Data API Cabeçalhos de limite e registros da aplicação Pausar a fila compartilhada
Endereço de saída Rede compartilhada ou rota específica Falha semelhante em clientes que usam a mesma rota Investigar o tráfego agregado e comparar de forma controlada
Endpoint Uma operação específica Corpo da resposta e documentação da rota Reduzir essa operação
Concorrência ou rajada Vários workers em paralelo Requisições simultâneas, horários e tentativas Reduzir concorrência e centralizar novas tentativas

Essa tabela organiza hipóteses de diagnóstico; não descreve uma lista pública de todos os contadores internos do Reddit. Um erro 429 isolado não comprova banimento de IP nem suspensão da conta. Avisos de segurança, recuperação de conta e moderação precisam de análise própria.

Como resolver no navegador ou na aplicação do Reddit

No uso comum, comece pela mensagem exibida e faça apenas uma verificação após o período indicado. Alterar várias configurações ao mesmo tempo impede saber qual delas teve efeito.

  1. Pare de atualizar ou reenviar. Feche abas duplicadas e pause extensões ou tarefas que recarregam páginas.
  2. Registre o aviso. Anote horário, ação e duração informada. Oculte cookies, tokens e dados da conta nas capturas.
  3. Aguarde o prazo mostrado. Depois, faça uma única tentativa manual. Não transforme a espera em uma sequência de testes.
  4. Compare a interface. Verifique o comportamento na aplicação oficial e em um navegador compatível, sem automação em paralelo.
  5. Consulte o estado do serviço. Se a falha atingir dispositivos e redes independentes, confira o status do Reddit antes de alterar a rede local.
  6. Siga o procedimento do aviso. Bloqueio de segurança, senha, suspensão e recurso de moderação não são sinônimos de limite de requisições.

Uma janela privada ajuda a comparar o estado da sessão. Limpar cookies pode corrigir uma sessão defeituosa, mas também encerra o login; essas ações não devem ser tratadas como formas de zerar contadores de uso.

Qual é o limite de requisições da API do Reddit em 2026?

A Data API Wiki informa 100 consultas por minuto por identificador de cliente OAuth, para acesso gratuito elegível, com média calculada em uma janela de 10 minutos. Essa referência precisa ser lida junto das condições de acesso e do calendário de migração.

Não atribua esse orçamento inteiro a cada worker. A aplicação precisa consolidar o consumo e observar os cabeçalhos retornados:

Cabeçalho Informação
X-Ratelimit-Used Consumo aproximado no período
X-Ratelimit-Remaining Quantidade aproximada ainda disponível
X-Ratelimit-Reset Segundos aproximados até o fim do período
Retry-After Orientação de espera, quando fornecida na resposta

reddit-official-rate-limits

A migração da API pública muda o planejamento

O Reddit publicou um calendário de migração das aplicações e bots da API pública para a Developer Platform. Na data desta revisão, as próximas etapas anunciadas eram:

Data Mudança anunciada
31 de outubro de 2026 Encerramento do recebimento de novos pedidos de acesso à API pública
12 de janeiro de 2027 Início da retirada de acesso de aplicações e usuários que não se registraram nem interagiram com a equipe responsável
Março de 2027 Encerramento do acesso público restante previsto no calendário

A primeira data se refere a pedidos de concessão de acesso, não a uma interrupção geral das requisições HTTP naquele dia. Consulte o comunicado de migração e a página de registro de aplicações para avaliar o seu caso.

Portanto, ajustar o código ao valor de 100 consultas por minuto não resolve o planejamento de continuidade. Verifique também a migração, as funcionalidades necessárias e as condições específicas do seu acesso.

Identificação correta da aplicação

Os Termos da API de Dados exigem o uso das informações de acesso fornecidas e vedam mascarar a identidade OAuth ou o User-Agent, além de contornar os limites. Use a identidade real da aplicação; mudanças de conta, cliente ou rota não substituem a capacidade aprovada.

Como tratar um erro 429 em aplicações e coletores

Uma recuperação previsível depende de uma única política de tentativas e de uma fila que conheça o consumo agregado. Antes de mexer nos intervalos, descubra quantas camadas estão repetindo a mesma requisição.

Registre apenas o necessário:

  • horário em UTC, método HTTP e caminho do endpoint;
  • status e resumo seguro da resposta;
  • Retry-After e cabeçalhos de limite disponíveis;
  • identificador interno não secreto da aplicação;
  • número de workers, requisições simultâneas e tentativa atual;
  • tempo decorrido, uso de cache e identificador de rastreamento com dados sensíveis ocultados.

Não inclua tokens OAuth, segredos do cliente, cookies, senhas de proxy, cabeçalhos de autorização ou URLs com credenciais.

reddit-http-429-response

Centralize as novas tentativas

Biblioteca HTTP, worker, orquestrador e aplicação podem ter políticas próprias. Se todas repetirem a mesma falha, a carga aumenta. Escolha uma camada para controlar o orçamento e ajuste as demais.

Compartilhe o saldo entre os workers

Use um agendador comum para consolidar consumo e reinício do período. Perto do esgotamento, suspenda tarefas não essenciais. Se o projeto precisa atender operações interativas, considere essa prioridade no orçamento.

Reaproveite leituras e elimine duplicatas

Quando as regras de uso permitirem, mantenha respostas reutilizáveis em cache. Um mecanismo de single-flight reúne pedidos simultâneos do mesmo recurso: dez workers deixam de gerar dez consultas idênticas. A retenção ainda precisa acompanhar exclusões de conteúdo e demais obrigações aplicáveis.

Reduza a concorrência antes de ajustar pequenas pausas

Comece com um worker e observe o comportamento. Uma pausa aleatória em cada processo não elimina uma rajada produzida por cinquenta processos simultâneos. Frequência média, concorrência e volume de tentativas precisam ser medidos separadamente.

Exemplo em Python: tentativas limitadas e espera pelo servidor

O exemplo preserva o código do original: valida o destino, aceita espera em segundos ou data HTTP, limita tentativas e verifica o JSON antes de informar sucesso. Ele serve como referência para integrações OAuth com acesso válido; não implementa a migração para a Developer Platform nem um agendador distribuído.

Prepare o ambiente e as variáveis

Como ambiente proposto para validar a adaptação, use Python 3.10 ou superior e Requests 2.34.2, cujo requisito de versão está informado no PyPI. Essa combinação não foi executada contra o Reddit nesta adaptação.

Em um ambiente virtual já ativado:

python -m pip install "requests==2.34.2"
python --version
python -m pip show requests

Salve o código a seguir como reddit_429.py. Configure estas variáveis no ambiente do processo, por meio do mecanismo de segredos do projeto:

Variável Conteúdo esperado
REDDIT_OAUTH_TOKEN Token válido da aplicação
REDDIT_USER_AGENT Identificação descritiva e verdadeira do cliente
AUTHORIZED_REDDIT_URL URL HTTPS do endpoint permitido em oauth.reddit.com
AUTHORIZED_REDDIT_PATH_PREFIX Caminho autorizado mais restrito possível; evite / sem necessidade
REQUIRED_JSON_FIELDS Campos obrigatórios do objeto JSON de nível superior, separados por vírgulas

O endpoint, os escopos OAuth e os campos esperados dependem da integração. Copiá-los de outro projeto pode produzir um teste sem relação com a operação pretendida.

Código completo do original

from datetime import datetime, timezone
from email.utils import parsedate_to_datetime
import math
import os
import random
import time
from typing import Optional
from urllib.parse import urlparse

import requests


OAUTH_TOKEN = os.environ["REDDIT_OAUTH_TOKEN"]
USER_AGENT = os.environ["REDDIT_USER_AGENT"]
AUTHORIZED_PATH_PREFIX = os.environ["AUTHORIZED_REDDIT_PATH_PREFIX"].rstrip("/") or "/"
REQUIRED_JSON_FIELDS = tuple(
    field.strip()
    for field in os.environ["REQUIRED_JSON_FIELDS"].split(",")
    if field.strip()
)

MAX_ATTEMPTS = 3
MAX_INLINE_WAIT_SECONDS = 300
TOTAL_ELAPSED_BUDGET_SECONDS = 360
ALLOWED_REDDIT_HOST = "oauth.reddit.com"


def validate_authorized_url(value: str) -> str:
    parsed = urlparse(value)
    prefix_matches = (
        parsed.path.startswith("/")
        if AUTHORIZED_PATH_PREFIX == "/"
        else parsed.path == AUTHORIZED_PATH_PREFIX
        or parsed.path.startswith(f"{AUTHORIZED_PATH_PREFIX}/")
    )
    if (
        parsed.scheme != "https"
        or parsed.hostname != ALLOWED_REDDIT_HOST
        or parsed.port not in (None, 443)
        or parsed.username is not None
        or parsed.password is not None
        or parsed.fragment
        or not prefix_matches
    ):
        raise ValueError("Refusing a Reddit URL outside the approved HTTPS host and path")
    return value


if not REQUIRED_JSON_FIELDS:
    raise ValueError("REQUIRED_JSON_FIELDS must name the endpoint's required fields")

AUTHORIZED_URL = validate_authorized_url(os.environ["AUTHORIZED_REDDIT_URL"])


def parse_retry_after(value: Optional[str]) -> Optional[int]:
    if value is None:
        return None
    text = value.strip()
    if text.isdigit():
        return int(text)
    try:
        retry_at = parsedate_to_datetime(text)
    except (TypeError, ValueError, OverflowError):
        return None
    if retry_at.tzinfo is None:
        return None
    seconds = (retry_at - datetime.now(timezone.utc)).total_seconds()
    return max(0, math.ceil(seconds))


def parse_reset_seconds(value: Optional[str]) -> Optional[int]:
    if value is None:
        return None
    try:
        seconds = float(value.strip())
    except (TypeError, ValueError):
        return None
    if not math.isfinite(seconds) or seconds < 0:
        return None
    return math.ceil(seconds)


def parse_wait_seconds(response: requests.Response) -> int:
    candidates = [
        parse_retry_after(response.headers.get("Retry-After")),
        parse_reset_seconds(response.headers.get("X-Ratelimit-Reset")),
    ]
    valid = [value for value in candidates if value is not None]
    if not valid:
        raise RuntimeError("429 had no valid Retry-After or reset value; defer the job")
    return max(1, max(valid))


def validate_success_payload(response: requests.Response) -> dict:
    media_type = response.headers.get("Content-Type", "").split(";", 1)[0].lower()
    if media_type != "application/json" and not media_type.endswith("+json"):
        raise RuntimeError(f"Unexpected success content type: {media_type or 'missing'}")
    try:
        payload = response.json()
    except ValueError as exc:
        raise RuntimeError("Success response did not contain valid JSON") from exc
    if not isinstance(payload, dict):
        raise RuntimeError("Success JSON did not match the expected object shape")
    missing = [field for field in REQUIRED_JSON_FIELDS if field not in payload]
    if missing:
        raise RuntimeError(f"Success JSON is missing required fields: {', '.join(missing)}")
    return payload


session = requests.Session()
session.headers.update(
    {
        "Authorization": f"Bearer {OAUTH_TOKEN}",
        "User-Agent": USER_AGENT,
        "Accept": "application/json",
    }
)

started_at = time.monotonic()

for attempt in range(1, MAX_ATTEMPTS + 1):
    elapsed = time.monotonic() - started_at
    if elapsed >= TOTAL_ELAPSED_BUDGET_SECONDS:
        raise RuntimeError("Elapsed-time budget exhausted before the next request")

    try:
        response = session.get(
            AUTHORIZED_URL,
            timeout=(5, 20),
            allow_redirects=False,
        )
    except requests.Timeout as exc:
        raise RuntimeError("Reddit request timed out; no retry was scheduled") from exc
    except requests.RequestException as exc:
        raise RuntimeError("Reddit request failed before a valid response arrived") from exc

    if 300 <= response.status_code < 400:
        raise RuntimeError("Redirect refused so the Bearer token stays on the approved host")

    if response.status_code == 429:
        wait_seconds = parse_wait_seconds(response)
        if attempt == MAX_ATTEMPTS:
            raise RuntimeError("Reddit rate limit persisted after bounded attempts")
        if wait_seconds > MAX_INLINE_WAIT_SECONDS:
            raise RuntimeError(
                f"Defer this job for at least {wait_seconds} seconds instead of sleeping inline"
            )

        sleep_seconds = wait_seconds + random.uniform(0.25, 1.0)
        if time.monotonic() - started_at + sleep_seconds > TOTAL_ELAPSED_BUDGET_SECONDS:
            raise RuntimeError("Defer the job because the next wait exceeds its elapsed-time budget")
        time.sleep(sleep_seconds)
        continue

    if not 200 <= response.status_code < 300:
        try:
            response.raise_for_status()
        except requests.HTTPError as exc:
            raise RuntimeError(f"Reddit returned HTTP {response.status_code}") from exc
        raise RuntimeError(f"Unexpected non-success HTTP status: {response.status_code}")

    validate_success_payload(response)
    print(
        "Validated Reddit JSON response",
        response.status_code,
        "required_fields=",
        ",".join(REQUIRED_JSON_FIELDS),
    )
    break
else:
    raise RuntimeError("Request loop ended without a response")

Depois de configurar o ambiente:

python reddit_429.py

O que os parâmetros controlam

Parâmetro Valor preservado Função
MAX_ATTEMPTS 3 Máximo de tentativas, incluindo a primeira
MAX_INLINE_WAIT_SECONDS 300 Limite para a espera indicada pelo servidor dentro do processo
TOTAL_ELAPSED_BUDGET_SECONDS 360 Orçamento verificado antes de iniciar outra chamada ou espera
timeout (5, 20) Tempos de conexão e leitura, em segundos
Acréscimo aleatório à espera 0,25 a 1,0 segundo Pequeno jitter aplicado após o intervalo escolhido
Host permitido oauth.reddit.com Destino aceito antes de anexar o token

Quando Retry-After e X-Ratelimit-Reset são válidos, prevalece a maior espera. Se nenhum valor puder ser interpretado, o processo encerra o trabalho para adiamento, em vez de inventar um intervalo.

O limite de 300 segundos se aplica à espera base; o jitter é acrescentado depois. Já o orçamento de 360 segundos é verificado entre operações: não é um prazo rígido capaz de interromper uma leitura em andamento. O timeout=(5, 20) também não representa a duração máxima de todo o trabalho.

O script recusa redirecionamentos, interrompe falhas de conexão e exige JSON com os campos configurados. A presença desses campos não substitui a validação dos tipos e das regras do endpoint. Em produção, filtre os registros e não publique tracebacks completos que possam incluir dados sensíveis.

Para aprofundar a estratégia, consulte o guia de novas tentativas com Python Requests, em inglês.

O que a demonstração local comprova

O material original descreve uma demonstração local que devolve um 429 com Retry-After: 1 e, depois, um 200. A imagem identifica Python 3.9 e max_attempts=2 para esse demonstrador, enquanto o template acima permite três tentativas. São escopos diferentes: a figura não comprova a execução integral deste código nem acesso real ao Reddit.

bounded-retry-terminal

Quando um proxy para Reddit com sessão fixa faz sentido?

Uma sessão fixa é útil quando um fluxo precisa manter o mesmo endereço de saída durante várias etapas. Ela não amplia a cota OAuth nem elimina o intervalo de uma ação da conta; seu papel é dar continuidade à rota de rede.

Esse requisito pode aparecer em testes regionais, verificação de experiências públicas em mercados aprovados ou jornadas que dependem de cookies. A escolha deve acompanhar o estado do fluxo:

Cliente Estratégia de sessão Evidência a registrar
Python Requests Manter uma rota estável no trabalho autenticado; separar testes regionais independentes Mesmo cliente OAuth, endpoint, concorrência e agenda; status, campos JSON e região observada
Scrapy Centralizar fila, concorrência e tentativas; nomear sessões de lotes independentes Duplicatas, quantidade de itens, campos obrigatórios, respostas 401/403/429 e rótulo da rota
Selenium Usar sessão persistente em login, cookies, redirecionamentos e navegação em várias etapas País, saída inicial e final, modo de sessão, URL final e elemento esperado

proxy-scope-boundary

Como avaliar a Rola IP nesse cenário

A solução de proxy para Reddit da Rola IP, em inglês é um ponto de partida para avaliar requisitos de rota. A documentação descreve redes residenciais rotativas, datacenter rotativo e IP móvel; o guia de configuração apresenta controles como sessionid, sessiontime e rotação por requisição.

Para jornadas com cookies, login ou paginação dependente de estado, avalie uma sessão residencial persistente, também chamada sticky session. Reserve a troca de saída para trabalhos independentes. Alterar o IP em cada requisição de uma jornada Selenium pode desfazer a consistência que o teste pretende manter.

Confira os detalhes gerados para a conta e os parâmetros atuais no guia de configuração da Rola IP. Não deduza porta, disponibilidade regional ou duração da sessão apenas pelo nome do produto.

Antes de ampliar o uso, faça uma comparação em que apenas a rota muda:

  1. Mantenha a mesma identidade Reddit, endpoint, carga útil, versão do cliente, concorrência e agenda.
  2. Confirme saída e país em um endpoint de verificação apropriado, usando o cliente que será avaliado.
  3. Valide a resposta do Reddit por campos obrigatórios ou elementos da página.
  4. Registre rótulo da rota e modo de sessão, sem senhas ou cookies.
  5. Se ambas as rotas apresentarem o mesmo 429 ligado ao cliente OAuth, investigue a fila e o orçamento antes de atribuir a falha ao IP.

Respostas 401, 403, 429 e telas de login devem ter tratamentos separados. Antes de contratar capacidade adicional, confirme também unidade de cobrança, duração do pacote, tráfego de tentativas malsucedidas e limite de gasto do projeto.

Como reduzir requisições desnecessárias na coleta de dados

A melhor otimização é evitar trabalho repetido e usar uma interface adequada ao projeto. O controle de demanda deve acontecer antes de aumentar workers ou capacidade de rede.

O comparativo entre web scraping e API, em inglês ajuda a organizar essa escolha. Para uma coleta já aprovada:

  1. Defina campos necessários, prazo de retenção e método de acesso.
  2. Confirme a viabilidade da integração na API disponível ou na Developer Platform.
  3. Concentre requisições em uma fila com teto de concorrência.
  4. Compartilhe saldo e momento de reinício do período entre os workers.
  5. Reaproveite respostas permitidas e reúna pedidos duplicados.
  6. Prefira coleta incremental a baixar o mesmo histórico em todas as execuções.
  7. Classifique autenticação, restrições de acesso, 429, redirecionamentos e respostas inesperadas separadamente.
  8. Reavalie capacidade, migração e contrato quando a demanda ultrapassar o que o acesso atual suporta.

Receber 200 OK não basta para declarar sucesso. Verifique tipo de conteúdo, URL final quando aplicável, campos, paginação e quantidade de registros. Uma página de login ou um corpo incompleto pode chegar com um status aparentemente bem-sucedido.

Conclusão

Resolver um erro 429 no Reddit começa por identificar a operação limitada e controlar a demanda. Aguarde a orientação recebida, coordene os workers e valide os dados antes de retomar a fila.

Para integrações existentes, inclua a migração da API no planejamento. Quando houver uma necessidade específica de rota ou região, avalie a Rola IP pela continuidade da sessão, configuração do cliente e resultado observado. Registre o que mudou e use essa evidência para decidir o próximo passo.

Perguntas frequentes