WhatsApp API v2 Reference
Documentacao interativa gerada a partir da spec OpenAPI 3.1. Clique em qualquer endpoint para ver parâmetros, exemplos de request e response. Copie com um clique.
O usuário abre o WhatsApp do celular, vai em Configurações › Aparelhos conectados › Conectar aparelho e escaneia o QR Code exibido pela API. A cada chamada de /iniciar um novo QR Code e gerado (validade ~60s, renova automaticamente).
POST /instancia/criar
POST /{id}/iniciar
GET /{id}/qrcode
GET /{id}/status
Exemplo completo em JavaScript
O parceiro envia o número de telefone do cliente. A API inicia a sessão e solicita o código ao WhatsApp. O cliente digita o código manualmente no celular: Configurações › Aparelhos conectados › Conectar com código de telefone. O código expira em 120 segundos.
POST /{id}/solicitar-pareamento
body: {"phone":"5511999999999"}
start-session
"W4NQJMRD" (8 chars)
Config › Aparelhos › Conectar com código
Formato do telefone
O telefone deve conter DDI + DDD + número, apenas dígitos, 10 a 15 caracteres. Regex validado: ^\d{10,15}$.
Exemplo completo em JavaScript (com polling)
Troubleshooting
• Pairing Code: integracoes server-to-server, onboarding remoto (sem camera), apps mobile que mandam o código via push.
• QR Code: onboarding presencial, web apps com camera, fluxo manual.
Importa uma sessão que já foi pareada antes. A sessão conecta automaticamente após a importacao, sem precisar de QR Code ou pairing code.
POST /{id}/importar-sessão
sem QR Code
não precisa /iniciar
Exemplo completo em JavaScript
Exemplo em PHP (Laravel)
Troubleshooting
QR Code vs Pairing Code vs Importar Sessão
Configure via PUT /whatsapp/instancia/{id}/configuracao. A plataforma envia POST para sua URL com Content-Type: application/json, timeout 10s.
URLs de webhook (roteamento)
Bloqueio por tipo de mensagem (filtros)
Você pode impedir que certos tipos de mensagem disparem o webhook. Util para ignorar stickers, áudios longos, localizações, etc. Configure o campo tipos_envio dentro de config_json (via PUT /whatsapp/instancia/{id}/configuracao).
O campo tipos_envio recebe um array de tipos. Toda mensagem cujo tipo esteja nesse array será salva no banco (com status skipped) mas não disparará webhook. Comportamento idêntico ao painel de configuração da instância.
tipo do payload (em minúsculas: text, image, etc). Não confunda com os nomes em maiúsculas usados na API v1 (MENSAGEM_ENVIADA, AUDIO_RECEBIDO). Na v2 os valores são os mesmos do campo tipo retornado no webhook.
"tipos_envio": [] para remover todos os bloqueios e voltar a receber todos os tipos via webhook. As mensagens bloqueadas continuam sendo salvas no banco e podem ser consultadas via GET /whatsapp/mensagens.
Eventos de webhook
O campo from_me indica a direção. O campo status indica o estado atual (pending, sent, delivered, read, played, failed). Em replies, os campos quoted_message_id e quoted_participant identificam a mensagem original.
Exemplo: webhook message_status (receipt)
Exemplo: webhook message_received com reply (quoted)
Valores de status (campo status)
Sistema de retry
Retries acontecem em 1min, 5min e 30min em caso de falha (total 4 tentativas em ~36min). Após falha na 4a tentativa: marca erro permanente.
Exemplo: receptor de webhook em Node.js (Express)
Exemplo: receptor em PHP (Laravel)
Configure via PUT /whatsapp/instancia/{id}/configuracao.
salvar_mensagens: false quando o cliente não quiser que as conversas sejam armazenadas (LGPD/compliance). O webhook continua funcionando — apenas o banco não persiste as mensagens recebidas.
Relatos indicam que números novos estão sendo banidos logo no primeiro envio. Antes de começar a disparar mensagens em massa, aqueça a conta:
- Interaja de forma orgânica e gradual por alguns dias (conversas reais, respostas, grupos).
- Adicione foto de perfil, bio e nome configurados.
- Converse com contatos que já tem seu número salvo.
- Evite o primeiro envio sendo uma campanha em massa.
- Não envie muitas mensagens de uma vez. Distribua os envios ao longo do dia.
- Tenha cuidado redobrado com números estrangeiros (DDI diferente do seu), pois isso aumenta significativamente o risco de restrições.
- Varie o conteúdo. Mensagens idênticas repetidas disparam alertas.
- Priorize contatos que já interagiram com você (opt-in).
Se o número tomou restrição, aguarde um periodo de descanso antes de voltar a enviar. Embora deixar o número parado por ~15 dias ajude, o foco principal deve ser evitar o comportamento que causou o banimento inicial.
- Pare os envios em massa imediatamente.
- Deixe a conta em descanso por pelo menos 7 a 15 dias.
- Quando retornar, recomece de forma lenta e orgânica (aquecimento novamente).
- Revise o volume, horários e tipos de mensagens que estavam sendo enviados.
- Se o banimento se repetir, considere trocar o número e começar do zero com aquecimento adequado.