Todos os caminhos desta documentação são relativos à base URL abaixo.
Por exemplo, POST /session/{number}/send-message corresponde a https://wpp.dw.hml.2wa.com.br/session/{number}/send-message.
Todas as rotas exigem o header x-api-key com uma API Key ativa.
Gerencie suas API Keys na página API Keys.
Todas as rotas possuem limite de requisições por minuto. Quando excedido, a API retorna 429 Too Many Requests.
| Header | Descrição |
|---|---|
| X-RateLimit-Limit | Limite de requisições por minuto da sua conta |
| X-RateLimit-Remaining | Requisições restantes na janela atual |
| X-RateLimit-Reset | Timestamp (Unix) quando a janela reseta |
O limite padrão é 60 req/min. Caso precise de mais, contate o administrador.
POST /session/connect — Inicia uma nova conexão e retorna um tempIdGET /session/pending/{tempId}/qr — Obtenha o QR code para escanearPOST /session/pending/{tempId}/pairing-code — Obtenha um código numérico de 8 caracteres para vincular sem QRGET /session/pending/{tempId}/status — Monitore até conectar; a resposta incluirá o phone_numberInicia uma nova conexão WhatsApp. Retorna um ID temporário para acompanhar o processo.
| Campo | Tipo | Descrição |
|---|---|---|
| webhookUrl | string | URL para receber eventos via webhook |
| displayName | string | Nome de exibição do número |
| proxyHost | string | Host do proxy |
| proxyPort | integer | Porta do proxy |
| proxyUser | string | Usuário do proxy |
| proxyPass | string | Senha do proxy |
| proxyType | string | http ou socks5 (padrão: http) |
Retorna o QR code da sessão pendente como imagem base64.
Faça polling a cada 2-3 segundos até obter o QR. Se status: false, o QR ainda não está pronto.
Alternativa ao QR code. Retorna um código numérico de 8 caracteres para vincular o dispositivo. No celular, vá em Dispositivos Vinculados > Vincular com número de telefone e insira o código.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| phoneNumber | string | Sim | Número do telefone a vincular (ex: 5511999998888) |
O código expira em ~60 segundos. Pode solicitar novo código na mesma sessão. Nota: após solicitar pairing code, o QR code não será mais emitido naquela sessão.
Monitora o status da conexão pendente. Quando conectado, retorna o número de telefone.
O tempId expira após 5 minutos se não for escaneado.
Todas usam o número de telefone como identificador (ex: 5511999998888).
Lista todos os números conectados da sua conta com status em tempo real.
Retorna o status da sessão de um número específico.
Envia uma mensagem de texto.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| to | string | Sim | Número destino (ex: 5511999998888) |
| message | string | Sim | Texto da mensagem |
| humanMode | boolean | Não | Simula comportamento humano antes do envio (marca como lido, digitando..., delay aleatorio) |
O messageId pode ser usado para rastrear o status de entrega via GET /session/{number}/messages/{messageId}/status.
Envia arquivo. Aceita dois formatos: upload (multipart/form-data) ou base64 (application/json).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| to | string | Sim | Número destino |
| file | file | Sim | Arquivo a enviar |
| caption | string | Não | Texto de legenda (imagens, vídeos, documentos) |
| sendAudioAsVoice | boolean | Não | Enviar áudio como mensagem de voz |
| humanMode | boolean | Não | Simula comportamento humano antes do envio (marca como lido, digitando..., delay aleatorio) |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| to | string | Sim | Número destino |
| base64 | string | Sim | Conteúdo do arquivo em base64 |
| filename | string | Sim | Nome do arquivo (ex: foto.jpg) |
| mimetype | string | Sim | Tipo MIME (ex: image/jpeg) |
| caption | string | Não | Texto de legenda (imagens, vídeos, documentos) |
| sendAudioAsVoice | boolean | Não | Enviar áudio como mensagem de voz |
| humanMode | boolean | Não | Simula comportamento humano antes do envio (marca como lido, digitando..., delay aleatorio) |
Consulta o status de entrega de uma mensagem enviada, usando o messageId retornado por send-message ou send-media.
O status evolui conforme o WhatsApp confirma a entrega. Cada mudança também dispara o webhook message_status_updated.
| Status | Significado |
|---|---|
| sent | Mensagem enviada pelo gateway |
| server | Recebida pelo servidor do WhatsApp |
| delivered | Entregue no aparelho do destinatário |
| read | Lida pelo destinatário |
| failed | Falha no envio |
Retorna 404 se o messageId não for encontrado para esse número.
Lista os contatos do WhatsApp conectado (exclui grupos @g.us).
Retorna detalhes de um contato específico, incluindo foto de perfil. O contactId é o JID do contato (ex.: 5521988887777@s.whatsapp.net).
profilePicUrl é null quando o contato não tem foto ou não permite a visualização.
Lista as conversas em memória do WhatsApp conectado.
Retorna detalhes de uma conversa com as últimas mensagens.
| Param | Tipo | Padrão | Descrição |
|---|---|---|---|
| limit | integer | 10 | Quantidade de mensagens |
| mediaBase64 | boolean | false | Incluir mídia como base64 |
Com mediaBase64=true, cada mensagem que possui mídia inclui o campo mediaBase64 com o conteúdo do arquivo.
Faz download da mídia de uma mensagem específica.
Desconecta e remove o número da sua conta. Faz logout do WhatsApp.
Agende disparos para um horário futuro. No horário, a mensagem é enviada automaticamente, gerando o mesmo registro de status (messages/{messageId}/status) e os mesmos webhooks de entrega/leitura de um envio imediato.
Agenda uma mensagem de texto para envio futuro.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| to | string | Sim | Número destino (ex: 5511999998888) |
| message | string | Sim | Texto da mensagem |
| scheduledAt | string | Sim | Data/hora futura em ISO 8601. O fuso segue o valor enviado: Z significa UTC; para horário de Brasília use o offset -03:00 (ex: 2026-06-26T14:08:00-03:00) |
| humanMode | boolean | Não | Simula comportamento humano antes do envio |
| retryIfOffline | boolean | Não | Se o número estiver offline no horário, mantém tentando dentro da janela de retentativa |
| retryWindowMinutes | integer | Não | Janela de retentativa em minutos após o horário (padrão 30). Depois disso, marca como falho |
Agenda o envio de uma mídia. Aceita upload (multipart/form-data) ou base64 (application/json). Tamanho máximo: 16MB.
send-media)| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| to | string | Sim | Número destino |
| file | file | Sim* | Arquivo (multipart) — ou use base64/filename/mimetype |
| base64 / filename / mimetype | string | Sim* | Mídia em base64 (alternativa ao upload) |
| scheduledAt | string | Sim | Data/hora futura em ISO 8601. O fuso segue o valor enviado: Z = UTC; para Brasília use o offset -03:00 |
| caption | string | Não | Legenda |
| sendAudioAsVoice | boolean | Não | Enviar áudio como mensagem de voz |
| humanMode / retryIfOffline / retryWindowMinutes | - | Não | Mesmas opções de schedule-message |
Lista os agendamentos da sua conta (paginado).
| Param | Tipo | Descrição |
|---|---|---|
| status | string | Filtra por pending, processing, sent, failed ou cancelled |
| number_id | integer | Filtra por número de origem |
| limit / offset | integer | Paginação (padrão 50 / 0) |
Retorna um agendamento específico.
| Campo | Descrição |
|---|---|
| id | Identificador do agendamento |
| type | text ou media |
| to_number | Número destino |
| message | Texto (ou legenda, no caso de mídia) |
| scheduled_at | Data/hora programada do disparo |
| status | Estado atual (ver abaixo) |
| retry_if_offline / retry_until | Configuração e prazo da retentativa |
| attempts | Quantas vezes o envio foi tentado |
| message_id | ID da mensagem gerada (preenchido após o envio) |
| error_message | Motivo da falha, quando status = failed |
| sent_at | Quando foi efetivamente enviado |
| Status | Significado |
|---|---|
| pending | Aguardando o horário do disparo |
| processing | Em processamento pelo worker |
| sent | Enviado com sucesso (use message_id para acompanhar a entrega) |
| failed | Falhou definitivamente (ver error_message) |
| cancelled | Cancelado antes do disparo |
Retorna o histórico de status do agendamento, em ordem cronológica. Cada transição registra o motivo, ajudando a entender por que um disparo falhou ou foi reagendado.
logs| Campo | Descrição |
|---|---|
| status | Evento da transição (ver abaixo) |
| message | Detalhe ou motivo do evento (ex.: mensagem de erro) |
| attempt | Número da tentativa de envio no momento do evento |
| created_at | Quando o evento ocorreu |
| Evento | Significado |
|---|---|
| created | Agendamento criado |
| processing | Reservado pelo worker para envio |
| sent | Enviado com sucesso |
| requeued | Voltou para a fila (número offline com retentativa ativa, ou reinício do worker) |
| failed | Falhou (ver message com o motivo) |
| cancelled | Cancelado antes do disparo |
Cancela um agendamento. Apenas agendamentos com status pending podem ser cancelados.
Histórico paginado das chamadas feitas à API pela sua conta.
| Param | Tipo | Padrão | Descrição |
|---|---|---|---|
| limit | integer | 50 | Quantidade de registros |
| offset | integer | 0 | Deslocamento para paginação |
| startDate | string | - | Data inicial (ISO 8601) |
| endDate | string | - | Data final (ISO 8601) |
Resumo de uso no período: total de chamadas, endpoints mais usados e contagem de mensagens por status.
| Param | Tipo | Descrição |
|---|---|---|
| startDate | string | Data inicial (ISO 8601) |
| endDate | string | Data final (ISO 8601) |
Histórico das tentativas de entrega de webhook de um número, com payload, status HTTP, tentativa e erro.
| Param | Tipo | Padrão | Descrição |
|---|---|---|---|
| limit | integer | 50 | Quantidade de registros |
| offset | integer | 0 | Deslocamento para paginação |
Quando configurado, o sistema envia eventos para a URL de webhook via POST.
Toda requisição de webhook inclui o header X-Webhook-Signature com uma assinatura HMAC-SHA256. Use o webhook_secret disponível na página API Keys para validar a autenticidade.
Se a entrega falhar, o sistema faz até 3 tentativas com backoff: imediato, 5s, 30s, 120s. Todas as tentativas são registradas e visíveis em GET /session/{number}/webhook-logs.
Enviado a cada confirmação de entrega de uma mensagem que você enviou. O campo status pode ter os seguintes valores:
| status | Significado |
|---|---|
| server | Recebida pelo servidor do WhatsApp |
| delivered | Entregue no aparelho do destinatário |
| read | Lida pelo destinatário |
O estado inicial sent é registrado no momento do envio e não gera webhook. Para consultar o status atual de uma mensagem a qualquer momento, use GET /session/{number}/messages/{messageId}/status.
Enviado ao clicar em "Testar Webhook" no painel. Use para validar que a URL está acessível e a assinatura HMAC está correta.
Enviado sempre que o número desconecta, seja por logout ou por queda temporária (perda de conexão, reinício, etc). O campo reason diferencia os casos:
| reason | Descrição |
|---|---|
| logged_out | O usuário fez logout do WhatsApp (sessão encerrada permanentemente) |
| disconnected | Desconexão temporária (queda de rede, reinício). O sistema tentará reconectar automaticamente |
Enviado quando um disparo agendado é entregue com sucesso. O messageId permite acompanhar o status (entregue/lido) pelos eventos message_status_updated.
Enviado quando um disparo agendado falha definitivamente (número não existe no WhatsApp, ou offline após esgotar a janela de retentativa).
| Código | Descrição |
|---|---|
400 | Requisição inválida (parâmetros faltando ou sessão não pronta) |
403 | API Key inválida ou conta inativa |
404 | Número não encontrado ou sessão pendente expirada |
429 | Rate limit excedido — muitas requisições. Verifique os headers X-RateLimit-* |
500 | Erro interno do servidor |