Limites, planos e cotas
Rate limit
Três limites se somam, do mais amplo ao mais estreito. Uma chamada precisa passar por todos.
| Limite | Alcance | Contado por | Teto |
|---|---|---|---|
| Global | todos os endpoints | sua chave de API; sem chave reconhecida, o endereço IP | 300/min (RATE_LIMIT_GLOBAL_MAX) |
| Por tenant | tudo em /api/v1 |
sua chave de API | o do seu plano |
| Por envio | os dois endpoints de envio | sua chave de API | 30/min (RATE_LIMIT_MESSAGE_MAX) |
O teto por tenant é o do seu plano, e não está listado aqui de propósito: ele vive no banco de
dados, muda sem que esta página saiba, e a relação atual está na página de planos do painel
(/billing). Quando o tenant não tem plano associado, vale o default RATE_LIMIT_API_MAX
(60/min).
Os baldes são independentes: um envio consome do balde de envio e do balde do tenant. Na prática, quem barra primeiro é o mais estreito dos três.
Se a chave de API não for reconhecida (inexistente, errada, revogada ou vencida), os baldes passam a ser contados por IP: você não ganha cota extra mandando chave inválida.
Ao estourar qualquer um deles, a resposta é 429:
{
"error": true,
"code": "RATE_LIMITED",
"message": "Muitas requisições. Tente novamente em 59s.",
"retryAfter": 59
}
O retryAfter vem em segundos, e vale respeitá-lo: insistir antes disso mantém você no limite.
Os cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset acompanham as
respostas e permitem antecipar o bloqueio.
Um detalhe que importa se você roda atrás de NAT ou em contêineres: na /api/v1, com a chave
reconhecida, os três limites seguem a sua conta, e não o IP. Todos os seus processos dividem a
mesma cota, saiam de onde saírem, e outra conta que sai pelo mesmo IP não gasta a sua. Sem chave
reconhecida, o limite global é por IP.
Limites do WhatsApp
Independentes dos nossos, e mais consequentes: o WhatsApp tem mecanismos próprios de detecção de abuso, e disparos em massa podem levar ao banimento do número. Nenhuma configuração da nossa API protege contra isso.
Na prática: espace os envios, evite mandar a mesma mensagem para muitos números em sequência, e prefira números que já tenham histórico de conversa. Um número banido não volta.
Recursos que dependem do plano
Três endpoints exigem uma funcionalidade específica:
| Endpoint | Funcionalidade |
|---|---|
POST /instances/{id}/messages/queue/send |
message_queue |
GET /messages/search |
search_messages |
GET /messages/conversation/{phone} e GET /messages/contacts |
conversation_history |
Sem ela, a resposta é 403 com o nome da funcionalidade em feature:
{
"success": false,
"error": {
"code": "PLAN_FEATURE_NOT_ALLOWED",
"feature": "message_queue",
"planCode": "basic"
}
}
O assistente de IA (servidor MCP) também depende do plano: a consulta exige mcp, e o envio, a
fila e as etiquetas pelo assistente exigem mcp_escrita. Além dos limites desta página, o envio
pelo assistente tem um teto de 200 por dia por conta. Detalhes em
Assistentes de IA.
Por que este guia não traz uma tabela de plano × recurso: essa configuração vive no banco de
dados e já foi ajustada mais de uma vez. Uma tabela aqui envelheceria em silêncio, exatamente o
problema que esta documentação existe para evitar. A relação atual está na página de planos do
painel (/billing).
Cota de instâncias
Criar instância consome cota. Ao estourar, POST /instances devolve 403.
Para saber onde você está antes de tentar, use GET /api/v1/status, que traz a contagem atual:
{ "instances": { "total": 3, "connected": 2 } }
O campo connected conta as que estão realmente conectadas ao WhatsApp neste momento,
instâncias criadas mas nunca pareadas contam em total e continuam ocupando cota. Se você bateu
no limite sem entender por quê, procure instâncias órfãs e remova-as com
DELETE /instances/{id}.
Assinatura
Sem assinatura ativa (ou período de avaliação em curso), toda a API v1 devolve 403, inclusive
envio e consulta nas instâncias que já existem. A exceção é GET /status, que continua
respondendo para você descobrir o motivo do bloqueio.
| Código | Quando |
|---|---|
SUBSCRIPTION_EXPIRED |
A assinatura venceu |
TRIAL_EXPIRED |
O período de avaliação acabou |
SUBSCRIPTION_REQUIRED |
A conta não tem plano |
Se a verificação do plano falhar por instabilidade do nosso lado, a resposta é 503 com o código
PLAN_CHECK_UNAVAILABLE. Esse não é um bloqueio: tente de novo em instantes.
Instalações em modo cliente único
Numa instalação dedicada a um único cliente, não há cobrança nem planos, e todos os gates acima
são desligados. Os 403 de plano simplesmente não acontecem, e todos os recursos ficam
disponíveis. Os limites de rate limit continuam valendo.
Guia verificado em 05/08/2026 contra a API v1.