spicyapiDocumentação
Referência
Conteúdo principal

Limites de solicitações

Como funcionam os limites de leitura e escrita, quais chamadas contam em cada um, outros limites possíveis e a diferença em relação à concorrência.

Um limite de solicitações restringe quantas chamadas você pode enviar em um intervalo curto. Quando você o ultrapassa, a API responde 429 (“solicitações demais”), em vez de executar o trabalho, e informa quanto tempo esperar. É uma proteção contra scripts descontrolados, não uma cota de geração.

Visão geral dos limites

LimitePadrãoResposta ao atingir o limiteDetalhes
Solicitações por conta1.000 por 10 segundos para leituras e mais 1.000 para escritas429 com Retry-AfterAbaixo
Solicitações de URL de upload1.000 por 10 segundos429 com Retry-AfterAbaixo
URLs de upload solicitadas, mas ainda não usadas128 arquivos ou 1 GiB429; esperar não resolveAbaixo
Relatório de uso30 por minuto; intervalo de 92 dias429 / 400Abaixo, Faturamento
Saldo disponível—40201Faturamento
Limites de gastos da chave (diário / mensal / total)Nenhum, a menos que você configure40202Faturamento
Limites diários / mensais da equipeNenhum40202Faturamento
Equipes de sua propriedade / membros por equipe10 / 100409 no consoleConsole e equipes

Dois controles por conta: leitura e escrita

Toda a API — os caminhos /api/v1/* e os endpoints compatíveis /v1/* e /v1beta/* — tem limites por conta, não por chave. Se o limite fosse por chave, bastaria criar mais chaves para contorná-lo.

Leituras e escritas são contabilizadas em dois controles separados, com a mesma capacidade. O limite padrão de proteção é de 1.000 solicitações por 10 segundos em cada um: cerca de 100 RPS sustentadas (solicitações por segundo), com pico de 1.000. Trata-se de uma proteção geral contra abuso e clientes descontrolados, não de uma cota baixa para o tráfego normal de geração paga.

O controle usa um token bucket, e não um contador de janela fixa: capacidade de 1.000, reposta ao longo de 10 segundos, cerca de 100 tokens por segundo. Cada solicitação consome um token; os tokens são repostos continuamente. Ao contrário de uma janela fixa, o token bucket suaviza a reposição nas transições entre intervalos.

Leituras e escritas usam controles separados

Leituras incluem toda solicitação GET — recordInfo, a lista jobs, chat/credit, usage, models — e jobs/quote, que apenas calcula o preço de uma solicitação. Escritas são todas as demais: createTask, retry, stream, purge, common/upload-url, common/download-url e os endpoints compatíveis chat/completions, messages e de geração Gemini. Os endpoints nativos e compatíveis compartilham os mesmos dois controles; migrar uma integração de texto de /api/v1 para /v1 não dá direito a outra capacidade.

Consultas de status não esgotam mais a capacidade de envio de tarefas. Um laço de consultas descontrolado esgota apenas o controle de leitura: recordInfo começa a retornar 429, enquanto createTask continua aceitando chamadas. As consultas ainda consomem solicitações; integrações de produção devem preferir webhooks para reduzir chamadas desnecessárias e latência.

O catálogo de modelos usa o controle de leitura. Não consulte um schema inalterado antes de cada tarefa; mantenha-o em cache conforme sua data de atualização e atualize-o após falhas de validação.

upload-url tem uma proteção própria de 1.000 solicitações por 10 segundos, além do controle de escrita acima. Ela protege separadamente a autorização de gravação no armazenamento de objetos; uploads normais não devem se aproximar desse limite.

usage tem uma proteção adicional bem mais restrita: 30 solicitações por minuto, além do controle de leitura acima. Essa chamada agrega tarefas históricas, portanto custa muito mais que uma leitura comum e precisa de mais proteção que apenas o limite geral. Use-a para conciliação, não para consultas contínuas. Esse controle também nunca libera chamadas quando a decisão de limite está indisponível: nesse caso, ele sempre retorna 429, enquanto outros controles podem estar configurados para liberar o tráfego.

URLs de upload ainda não usadas

Separadamente, uma conta pode manter no máximo 128 URLs de upload ainda não usadas, ou um total de 1 GiB de tamanho declarado dos arquivos. Solicitar outra retorna 429, com Too many pending uploads; finish existing uploads before requesting more, e sem Retry-After.

Esperar não resolve esse caso; não deixe um laço genérico de tentativas repeti-lo indefinidamente. Envie e confirme os arquivos cujas URLs você já solicitou, ou deixe essas URLs expirarem, o que leva cerca de 20 minutos, e o espaço será liberado imediatamente. Isso costuma acontecer quando um script solicita URLs de upload em lote e nunca as usa. Veja Mídia.

Todos os controles

Os limites são aplicados por área de acesso, de modo que todos os endpoints de uma mesma área compartilham uma cadeia de middleware. Como consumidor da API, você pode atingir os cinco primeiros:

ControleAbrangênciaContabilizado porCapacidade padrão
RedeToda solicitação à API, antes da verificação da chaveEndereço IP de origem (em IPv6, a rede /64)6.000 por minuto, muito acima do uso normal; várias pessoas em uma mesma rede empresarial compartilham esse limite
open_apiEscritas em /api/v1/*, /v1/* e /v1beta/* (todos os métodos, exceto GET/HEAD, com exceção de jobs/quote)Conta1.000 por 10 segundos, cerca de 100 RPS sustentadas
open_api_readLeituras nos mesmos caminhos: GET/HEAD, incluindo o catálogo models, e jobs/quoteConta1.000 por 10 segundos, cerca de 100 RPS sustentadas
upload_url/api/v1/common/upload-urlConta1.000 por 10 segundos, além de open_api
api_usage/api/v1/usageConta30 por minuto, além de open_api_read
ConsoleEndpoints autenticados /console/v1/*Conta120 por minuto para leituras e mais 120 para escritas
catalogCatálogo público e anônimo usado pelo site (não /api/v1/models)IP de origem300 por minuto

Por conta, não por chave

open_api e open_api_read contabilizam chamadas por conta. Criar mais chaves não aumenta a capacidade: se o limite fosse por chave, contorná-lo exigiria apenas um clique no console.

Já upload_url e api_usage são controles realmente separados: enviar uma imagem de referência consome um token de open_api e outro de upload_url; uma leitura de usage consome tokens de open_api_read e api_usage. Se qualquer um deles se esgotar, a resposta será 429.

Esses números são valores padrão que podemos alterar sem uma nova versão. Sua capacidade atual sempre aparece no cabeçalho X-RateLimit-Limit e na Visão geral do console. Confie no cabeçalho e não fixe os valores padrão no código do cliente.

Cabeçalhos de resposta

CabeçalhoPresente emSignificado
X-RateLimit-LimitToda respostaCapacidade para o intervalo atual
X-RateLimit-RemainingToda respostaTokens restantes
Retry-After429 causado por limite de solicitaçõesSegundos de espera, no mínimo 1

Uma resposta normal de uma conta com a capacidade padrão contém:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997

X-RateLimit-Remaining também é enviado em respostas bem-sucedidas, permitindo reduzir o ritmo antes de receber um 429, em vez de só depois.

Em um 401, esses cabeçalhos descrevem o controle de rede (6000), não o da sua conta, porque a chave não foi identificada.

Como é a resposta ao atingir um limite

{
  "code": 429,
  "msg": "Too many requests. Retry in a moment",
  "request_id": "req_…"
}

Status HTTP 429, com Retry-After.

Solicitações acima do limite são recusadas, não colocadas na fila

A resposta é imediata. Enfileirá-las só acumularia latência e deixaria você com uma conexão que nunca responde, mais difícil de tratar que um 429 claro. Uma solicitação recusada nunca foi aceita e, portanto, não custa nada.

Como tratar

Leia Retry-After. Não insista em intervalos fixos. Os exemplos param após cinco tentativas, o que também evita repetir para sempre o 429 de uploads pendentes explicado acima.

JavaScript
async function callRespectingLimits(url, init) {
  for (let i = 0; i < 5; i++) {
    const res = await fetch(url, init);

    if (res.status !== 429) return res;

    // The server already told you how long to wait; don't guess
    const wait = Number(res.headers.get('retry-after') ?? 1);
    await new Promise((r) => setTimeout(r, wait * 1000));
  }
  throw new Error('persistently rate-limited');
}
Python
import time, requests


def call_respecting_limits(method: str, url: str, **kwargs) -> requests.Response:
    for _ in range(5):
        res = requests.request(method, url, **kwargs)

        if res.status_code != 429:
            return res

        # The server already told you how long to wait; don't guess
        time.sleep(float(res.headers.get("retry-after", 1)))

    raise RuntimeError("persistently rate-limited")

Concorrência é outra questão

O limite controla a frequência de envio, não quantas tarefas estão em execução

Depois que uma tarefa é aceita na fila, ela deixa de consumir a capacidade do limite de solicitações. Cem tarefas sendo geradas ao mesmo tempo não provocam um 429.

O que realmente limita as tarefas em andamento, sem relação com o limite de solicitações:

  • Saldo disponível: cada tarefa em andamento reserva saldo. Quando o saldo acaba, novas tarefas recebem 40201.
  • Limites de gastos: limites diário, mensal e total da chave, limites diário e mensal da equipe para chaves que pertencem a uma equipe e limite diário da plataforma. Atingir qualquer um deles retorna 40202. Veja Limites de gastos.
  • Capacidade de execução: quando um modelo não consegue executar de forma alguma, você recebe 50301.

Por isso, para executar mais tarefas ao mesmo tempo, normalmente você precisa adicionar saldo ou elevar um limite de gastos, e não aumentar o limite de solicitações.

Como pedir mais capacidade

Sua capacidade atual aparece na Visão geral do console. Para pedir um aumento, abra uma conversa em Suporte, no assunto Integração de API, e descreva seu tráfego: pico de solicitações por segundo, se você usa lotes e qual o tamanho máximo de um lote. Isso agiliza bastante a análise.

Enquanto isso, mantenha a concorrência do cliente limitada e respeite Retry-After. Defina o limite de concorrência conforme a carga de trabalho, o tempo de geração e o saldo disponível, em vez de reduzi-lo artificialmente para caber no limite padrão de solicitações.

Quando o próprio controle de limites está indisponível

O controle de limites depende de um contador externo. Se ele falhar, a configuração determina a ação: permitir, mantendo o atendimento, ou recusar, protegendo a capacidade. Recusar é o padrão: “não conseguimos ler a configuração” nunca deve resultar em “não há limite”.

Quando a configuração determina a recusa, você recebe 429 com Retry-After: 1, não 500. Isso é intencional: 500 indica uma falha do serviço, e a maioria dos SDKs de cliente o repete imediatamente, aumentando a carga durante um incidente. 429 com Retry-After pede que o cliente aguarde e tente depois, que é o comportamento necessário.

Portanto, não interprete 429 como prova de que você estava enviando chamadas rápido demais. Respeitar Retry-After é a resposta correta em qualquer um dos casos.

Nesta página