Pular para o conteúdo principal

Limites de requisição

A API limita requisições para proteger a instância. Ao estourar um limite, a resposta é 429 Too Many Requests — espere e tente de novo.

Limite geral​

3.000 requisições por minuto, por IP. Vale para tudo, inclusive o que não é API.

Limites por endpoint​

Alguns endpoints caros têm limites próprios, contados por conta:

EndpointLimite
GET /api/v1/accounts/{id}/contacts/search100 / minuto
POST /api/v1/accounts/{id}/upload60 / hora
GET /api/v1/accounts/{id}/conversations/{id}/transcript1.000 / hora
GET /api/v2/accounts/{id}/reports1.000 / minuto por conta, e 100 / minuto por usuário
GET /api/v1/accounts/{id}/conversations/meta30 / minuto por usuário

Nos limites "por usuário", quem identifica é a própria chave de API — cada chave tem sua cota.

Endpoints de autenticação​

Mais restritos, para conter força bruta: login aceita 5 tentativas por IP a cada 5 minutos e 10 por e-mail a cada 15 minutos; recuperação de senha, 5 por IP a cada 30 minutos.

Checkout público​

Os endpoints de /api/v1/public_checkout/ respondem sem chave de API, então são contados por IP:

EndpointLimite
POST /api/v1/public_checkout/subscribe5 / 30 minutos
POST /api/v1/public_checkout/link60 / minuto
GET /api/v1/public_checkout/prefill20 / 10 minutos
POST /api/v1/public_checkout/coupon10 / 10 minutos

link tem o teto mais alto porque quem chama é o servidor da sua landing page, e todas as chamadas saem de um IP só. Já coupon e prefill são apertados de propósito: validar um código e trocar um token são oráculos — sem limite, dá para descobrir os cupons ativos ou varrer tokens por tentativa.

Ajustando na sua instância​

Se você hospeda o AzChat, os limites são variáveis de ambiente:

VariávelPadrão
RACK_ATTACK_LIMIT3000
RATE_LIMIT_CONTACT_SEARCH100
RATE_LIMIT_REPORTS_API_ACCOUNT_LEVEL1000
RATE_LIMIT_REPORTS_API_USER_LEVEL100
RATE_LIMIT_CONVERSATION_TRANSCRIPT1000
RATE_LIMIT_CONVERSATIONS_META30
RACK_ATTACK_ALLOWED_IPS— lista de IPs que ignoram os limites
ENABLE_RACK_ATTACKtrue

:::info Em desenvolvimento não há limite O rate limiting só é aplicado em produção. Um script que funciona no seu ambiente local pode tomar 429 assim que subir — teste o tratamento antes. :::

Tratando o 429​

Ao receber 429, espere antes de repetir, aumentando o intervalo a cada tentativa:

async function comRetry(requisicao, tentativas = 5) {
for (let tentativa = 0; tentativa < tentativas; tentativa += 1) {
const resposta = await requisicao();
if (resposta.status !== 429) return resposta;

// 1s, 2s, 4s, 8s…
await new Promise((r) => setTimeout(r, 1000 * 2 ** tentativa));
}
throw new Error('Limite de requisições excedido');
}

Boas práticas que evitam o problema na origem:

  • Use webhooks em vez de ficar consultando a API em loop.
  • Aumente o per na paginação para fazer menos chamadas.
  • Distribua importações grandes ao longo do tempo, em vez de disparar tudo de uma vez.