Rate limits
Pra proteger a plataforma contra abuso e estouro de cota, cada endpoint tem um limite por minuto, contado pelo token usado.
O contador fica no banco, compartilhado por todas as instâncias da API. O limite que você lê aqui é o limite que vale de verdade, não uma estimativa por servidor.
Limites atuais
| Endpoint | Limite | Janela | Contagem por |
|---|---|---|---|
GET /contacts (lista e lookup) |
120 req | 60 s | chave |
GET /conversations, /messages, /agents, /connections, /campaigns, /automations |
120 req | 60 s | chave |
GET /org, /templates, /fields, /tags, /pipelines, /users, /quick-replies |
60 req | 60 s | chave |
POST /templates/sync |
60 req | 60 s | chave |
/webhooks e sub-rotas |
60 req | 60 s | chave |
GET /events |
120 req | 60 s | chave |
POST /messages |
120 req | 60 s | chave |
Ações de /conversations/{id} |
120 req | 60 s | chave |
POST /contacts/batch |
30 req | 60 s | chave |
POST /contacts e sub-rotas (/tag, /assign, /note, /field, /stage) |
300 req | 60 s | chave |
GET /contacts-schema |
60 req | 60 s | chave |
POST /automation-trigger |
sem limite explícito | não se aplica | token do fluxo |
Endpoints de envio (/send-template, /send-message, /send-buttons, /send-list, /send-cta-url, /send-location-request, /send-product, /send-product-list, /send-conversation-message) |
60 req | 60 s | chave |
GET /health |
sem limite | não se aplica | nenhuma |
Resposta quando estoura
Quando você ultrapassa o limite, a resposta é:
- HTTP 429 Too Many Requests
- Header
Retry-After: <segundos>(quanto tempo esperar antes da próxima tentativa). - Corpo JSON:
{ "error": "Too many requests", "retry_after": <segundos> }
curl -i -X POST https://api.wevi.chat/functions/v1/contacts \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{...}'
# HTTP/1.1 429 Too Many Requests
# Retry-After: 47
# {"error":"Too many requests","retry_after":47}
const res = await fetch(url, { method: "POST", headers, body });
if (res.status === 429) {
const wait = Number(res.headers.get("Retry-After") ?? 60);
await new Promise(r => setTimeout(r, wait * 1000));
// ... retry
}
Estratégia recomendada
- Backoff exponencial: na primeira falha 429, espera o
Retry-After. Na segunda seguida, dobre o tempo. - Não paralelize além do limite. Se vai sincronizar 10 mil contatos, faça em série ou em lotes pequenos com
setTimeout. - Use
idempotency_keynos endpoints de envio (/send-template,/send-message) pra retries não duplicarem mensagens.
Limites mais altos
Se precisa de throughput maior que os 300 req/min do /contacts (por exemplo, importação inicial de uma base grande), fale com a gente em contato@wevi.chat. Podemos liberar caso a caso ou recomendar import via CSV pela UI.
Dois baldes
Cada limite é contado por chave e, em paralelo, por organização, com cinco vezes o valor. O balde mais apertado é o que vale e o que aparece nos headers X-RateLimit-*. Assim, criar dez chaves não multiplica o teto por dez.
A contagem fica no banco. Em rajadas, ela pode ficar alguns hits atrás do real por um instante, porque a autorização é guardada por 30 segundos na instância que atendeu a chamada.
Próximo
Códigos de erro