Pular para o conteúdo

Limites de uso

A API tem um orçamento de chamadas por minuto. Ele é da empresa, não da chave.

PlanoAPIChamadas por minutoChaves ativas
GrátisNão00
StartSim603
PlenoSim18010
SupraSim60025

Esta tabela é gerada do código que decide de verdade: é a mesma função que a API chama a cada requisição para saber se a chamada passa.

O teto que vale para a sua empresa agora vem na resposta de GET /public/v1/me, em limits.requests_per_minute. Leia dali em vez de fixar o número no seu código: a empresa pode mudar de plano, e o painel também permite ajustar o valor de uma empresa em particular.

Troca de plano leva até um minuto para valer na API, porque o plano resolvido fica em memória por esse tempo.

Toda resposta que passa pelo contador traz três cabeçalhos:

CabeçalhoO que éComo usar
RateLimit-LimitO teto por minuto da empresaCompare com o que você planeja disparar
RateLimit-RemainingQuantas chamadas ainda cabem na janelaAbaixo de uma margem sua, segure o ritmo antes de tomar 429
RateLimit-ResetEm quantos segundos abre a próxima vagaUse como intervalo mínimo quando RateLimit-Remaining chegar a zero

No 429 entra um quarto:

CabeçalhoO que é
Retry-AfterQuantos segundos esperar antes de tentar de novo

A janela é deslizante: ela olha os últimos 60 segundos a partir de agora, não o minuto do relógio. Por isso o RateLimit-Reset cai aos poucos em vez de zerar de uma vez.

Empresa sem teto na aplicação não passa pelo contador, e aí esses cabeçalhos não aparecem. Nesse caso limits.requests_per_minute vem null em GET /public/v1/me.

{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Limite de chamadas por minuto atingido. Tente de novo em instantes.",
"request_id": "3d81b6ac-2f45-4a0e-9c7b-1e5f8a2d4c60",
"doc_url": "https://docs.fatureihoje.com/errors#rate_limit_exceeded"
}
}
  1. Espere o que o Retry-After diz. Ele vem em segundos e é calculado em cima da janela real, não é um palpite.
  2. Recue progressivamente. Se o segundo 429 vier logo depois, dobre a espera a cada tentativa, até um teto seu.
  3. Espalhe um pouco. Some alguns milissegundos aleatórios à espera. Sem isso, várias filas que tomaram 429 no mesmo instante voltam juntas no mesmo instante.
  4. Nunca repita em laço apertado. Repetir na hora não adianta e ainda atrasa as chamadas boas da mesma empresa, que dividem o mesmo contador.

Chamada recusada por permissão é diferente: o 403 acontece depois do contador e gasta orçamento, de propósito. Sondar rota que a chave não pode usar não sai de graça.

Terminal window
curl -sS -D - -o /dev/null https://api.fatureihoje.com/public/v1/me \
-H "Authorization: Bearer $FH_API_KEY"

-D - imprime os cabeçalhos e -o /dev/null joga fora o corpo.

O orçamento por minuto não é o único contador. A autenticação tem um teto próprio de falhas por IP: chave errada repetida muitas vezes no mesmo minuto passa a receber 429 mesmo antes de a chave ser conferida. Esse contador só conta o que deu errado, então uso normal não encosta nele. Está descrito em Autenticação.

Os dois usam o mesmo code, rate_limit_exceeded, e os dois trazem Retry-After. A diferença aparece no contexto: se as suas chamadas estão sendo aceitas e de repente vem 429, é o orçamento da empresa; se elas estão sendo recusadas com 401 e depois vira 429, é o teto de falhas.

A tabela acima também traz quantas chaves ativas cada plano permite. Chave revogada e chave expirada não contam; chave em convivência de rotação conta, porque ela ainda autentica.

Passar desse número devolve plan_limit_reached, com status 403. Rotacionar uma chave existente não esbarra nesse limite; criar mais uma, sim.

  • Erros: o catálogo inteiro, com rate_limit_exceeded e plan_limit_reached.
  • Paginação: varredura de lista longa é o que mais consome orçamento.