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:
| Endpoint | Limite |
|---|---|
GET /api/v1/accounts/{id}/contacts/search | 100 / minuto |
POST /api/v1/accounts/{id}/upload | 60 / hora |
GET /api/v1/accounts/{id}/conversations/{id}/transcript | 1.000 / hora |
GET /api/v2/accounts/{id}/reports | 1.000 / minuto por conta, e 100 / minuto por usuário |
GET /api/v1/accounts/{id}/conversations/meta | 30 / 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:
| Endpoint | Limite |
|---|---|
POST /api/v1/public_checkout/subscribe | 5 / 30 minutos |
POST /api/v1/public_checkout/link | 60 / minuto |
GET /api/v1/public_checkout/prefill | 20 / 10 minutos |
POST /api/v1/public_checkout/coupon | 10 / 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ável | Padrão |
|---|---|
RACK_ATTACK_LIMIT | 3000 |
RATE_LIMIT_CONTACT_SEARCH | 100 |
RATE_LIMIT_REPORTS_API_ACCOUNT_LEVEL | 1000 |
RATE_LIMIT_REPORTS_API_USER_LEVEL | 100 |
RATE_LIMIT_CONVERSATION_TRANSCRIPT | 1000 |
RATE_LIMIT_CONVERSATIONS_META | 30 |
RACK_ATTACK_ALLOWED_IPS | — lista de IPs que ignoram os limites |
ENABLE_RACK_ATTACK | true |
:::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: