Início › Documentação

Documentação da API de WhatsApp do zapon

O zapon é uma API REST de WhatsApp. Você conecta um número lendo um QR Code, recebe um token para aquele número e passa a enviar e receber mensagens por requisições HTTP, de qualquer linguagem. Não há biblioteca para instalar e não há processo seu para manter rodando.

São 49 endpoints na base https://api.zapon.dev — 23 em /chat, 18 em /group e 8 em /user —, 38 eventos de webhook e um conjunto de travas de proteção do número que o servidor cumpre sozinho. Esta página cobre o caminho completo: autenticação, primeiro envio, as formas de mensagem disponíveis, recebimento por webhook, grupos, erros e o que preserva o número. A referência interativa, com todos os schemas, está em /api-doc.html.

Fora da API, o mesmo número atende por dois caminhos que não exigem código: o chatbot de menus com botões, montado no painel por uma entrevista guiada, e o conector MCP, que liga o número a assistentes de IA — Claude, ChatGPT em modo desenvolvedor, Codex CLI e Gemini CLI (o aplicativo web do Gemini ainda não suporta o protocolo).

Começar em três passos

Como faço o primeiro envio pela API do zapon?

São três passos e nenhum deles exige instalar nada. Você cria a conta, conecta um número lendo o QR Code no painel e usa o token daquela conexão no header da requisição. O trial de 14 dias só começa a contar na primeira conexão, então criar a conta hoje não gasta dia de teste.

1. Crie a conta. Cadastro em zapon.dev, sem cartão de crédito. O painel e esta documentação ficam disponíveis na hora.

2. Conecte um número. No painel, crie uma conexão. Abra o WhatsApp do número em Aparelhos conectados → Conectar aparelho e leia o QR Code. Se preferir não usar a câmera, a conexão também aceita código de pareamento. Assim que o número entra no ar, o painel passa a mostrar o estado da conexão, atualizado a cada 10 segundos enquanto a página estiver aberta.

3. Copie o token e chame a API. Cada conexão tem o próprio token, isolado das demais. É ele que autentica todas as chamadas daquele número.

Autenticação

Como autenticar na API de WhatsApp do zapon?

A autenticação é por header token, com o token da conexão que você quer usar. Não há OAuth, não há troca de chave e não existe header Authorization: é o token do número, direto. A base da API é https://api.zapon.dev.

token: SEU_TOKEN_DA_CONEXAO
Content-Type: application/json

O token identifica um número, não a sua conta. Se você tem cinco números conectados, tem cinco tokens, e cada um só alcança o próprio número. É esse isolamento que permite atender vários clientes na mesma conta sem que o tráfego de um encoste no do outro.

Guarde o token no servidor. Ele dá acesso de envio ao número. Nunca coloque o token em código de front-end, em repositório público ou em coleção compartilhada. Se ele vazar, gere um novo pelo painel.

Primeiro envio

Como enviar uma mensagem de texto pelo WhatsApp via API?

Envio de texto é um POST para /chat/send/text com dois campos obrigatórios: Phone, o número do destinatário com código do país e DDD, e Body, o conteúdo da mensagem. A resposta traz o identificador da mensagem, que você pode guardar para casar com os eventos de entrega e leitura depois.

cURL

curl -X POST https://api.zapon.dev/chat/send/text \
  -H "token: SEU_TOKEN_DA_CONEXAO" \
  -H "Content-Type: application/json" \
  -d '{
    "Phone": "5511999999999",
    "Body": "Olá! Sua consulta está confirmada para amanhã às 14h."
  }'

Node.js

const resposta = await fetch("https://api.zapon.dev/chat/send/text", {
  method: "POST",
  headers: {
    token: process.env.ZAPON_TOKEN,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    Phone: "5511999999999",
    Body: "Olá! Sua consulta está confirmada para amanhã às 14h.",
  }),
});

const dados = await resposta.json();
console.log(dados);

Python

import os, requests

resposta = requests.post(
    "https://api.zapon.dev/chat/send/text",
    headers={"token": os.environ["ZAPON_TOKEN"]},
    json={
        "Phone": "5511999999999",
        "Body": "Olá! Sua consulta está confirmada para amanhã às 14h.",
    },
    timeout=30,
)
print(resposta.json())

Que formato o número de telefone precisa ter?

Use o número com código do país, DDD e o número, apenas dígitos: 5511999999999. Sem +, sem espaço, sem parêntese e sem traço. Para enviar a um grupo, use o identificador do grupo no lugar do telefone — a lista de grupos vem em GET /group/list.

Campos opcionais do envio de texto

CampoPara que serve
LinkPreviewGera a prévia visual quando a mensagem tem link. Vem desligado por padrão.
IdIdentificador da mensagem definido por você, útil para conciliar com o seu banco.
ContextInfoResponde a uma mensagem específica, citando-a — informe o identificador da mensagem original.

As 13 formas de envio

O que dá para enviar pela API de WhatsApp do zapon?

São 13 endpoints de envio, um por tipo de conteúdo, todos com o mesmo padrão de autenticação e o mesmo campo Phone. Além deles, existem endpoints para reagir, marcar como lido, sinalizar digitação, editar e apagar mensagem.

EndpointEnvia
POST /chat/send/textMensagem de texto
POST /chat/send/imageImagem, com legenda opcional
POST /chat/send/videoVídeo
POST /chat/send/audioÁudio e mensagem de voz
POST /chat/send/documentDocumento (PDF, planilha, qualquer arquivo)
POST /chat/send/stickerFigurinha
POST /chat/send/locationLocalização com coordenadas
POST /chat/send/contactCartão de contato
POST /chat/send/pollEnquete com opções
POST /chat/send/buttonsMensagem com botões de resposta
POST /chat/send/listLista de opções selecionáveis
POST /chat/send/templateMensagem em formato de template
POST /chat/send/editEdição de uma mensagem já enviada

E as ações sobre conversas e mensagens:

EndpointFaz
POST /chat/reactReage a uma mensagem com emoji
POST /chat/markreadMarca mensagens como lidas
POST /chat/presenceSinaliza "digitando" ou "gravando áudio"
POST /chat/deleteApaga uma mensagem enviada
GET /chat/historyRecupera o histórico de uma conversa
POST /chat/downloadimageBaixa a mídia de uma mensagem recebida (há um endpoint por tipo)

Botões e listas valem a pena?

Valem quando você precisa de resposta estruturada. Em vez de pedir para o cliente digitar "1" para confirmar, você manda botões e ele toca. A resposta chega no seu webhook já identificando qual botão foi tocado, o que elimina toda a interpretação de texto livre — e elimina junto os erros de digitação que travam fluxos automatizados. Além da resposta rápida, o mesmo endpoint monta botão que abre um link ("type": "cta_url"), botão que abre o discador ("type": "cta_call") e botão que copia um código ("type": "copy") — e os tipos convivem na mesma mensagem. O toque em resposta rápida volta no webhook; os outros três agem no aparelho de quem recebe.

Receber mensagens (webhook)

Como receber no meu sistema as mensagens que chegam no WhatsApp?

Você configura, no painel, uma URL pública para cada conexão e marca quais eventos quer receber. A partir daí, cada evento vira um POST do zapon para a sua URL, com o conteúdo completo — a mensagem chega inteira no corpo, você não precisa fazer uma segunda chamada para descobrir o que o cliente escreveu.

Sua URL precisa apenas aceitar POST e responder rápido. Pode ser o seu backend, um fluxo do n8n, um cenário do Make ou qualquer endpoint HTTP acessível pela internet.

Recebendo o webhook em Node.js

import express from "express";

const app = express();
app.use(express.json());

app.post("/webhook-whatsapp", (req, res) => {
  // Responda primeiro, processe depois: o handler precisa ser rápido.
  res.sendStatus(200);

  const evento = req.body;
  console.log("evento recebido:", evento);

  // Aqui entra a sua regra: gravar no banco, disparar o fluxo,
  // acordar o atendente, o que o seu sistema precisar.
});

app.listen(3000);
Responda 200 antes de processar. Se o seu endpoint demora para responder porque está fazendo trabalho pesado, a entrega pode ser considerada falha. Aceite o evento, devolva 200 e faça o processamento em segundo plano.

Preciso de servidor próprio para receber?

Para enviar, não. Para receber, você precisa de uma URL pública que aceite POST — e ela não precisa ser um servidor seu. Um webhook de n8n ou um cenário do Make resolvem, e é o arranjo mais comum entre quem usa o zapon sem escrever backend.

Eventos disponíveis

Quais eventos o webhook do zapon entrega?

São 38 eventos, organizados nas mesmas seis categorias que o painel usa: mensagens, conexão, presença, grupos e contatos, chamadas e sincronização. Você escolhe, por conexão, quais quer receber — marcar só o que o seu fluxo usa reduz ruído no seu endpoint e facilita a depuração. O identificador da tabela abaixo é o valor exato que chega no campo de tipo do evento.

O QR Code não é evento de webhook. Ele aparece na tela de conexão do painel, não na sua URL. E o recibo de entrega e leitura chama ReadReceipt — não existe evento Receipt. Marcar um nome que não está nesta lista não gera erro, gera silêncio.
CategoriaEventoNome no painelQuando dispara
MensagensMessageMensagensMensagens recebidas e enviadas pela conexão.
MensagensReadReceiptConfirmações de entrega e leituraStatus de entrega e leitura das mensagens.
MensagensUndecryptableMessageMensagem não decifradaChegou uma mensagem que não pôde ser lida (problema de chave).
MensagensMediaRetryReenvio de mídiaO WhatsApp reenviou uma mídia que falhou.
MensagensFBMessageMensagem do Facebook/MessengerMensagem vinda da integração com o Messenger.
ConexãoConnectedConexão estabelecidaO número conectou e está online.
ConexãoDisconnectedConexão caiuO número perdeu a conexão (pode reconectar sozinho).
ConexãoConnectFailureFalha de conexãoA tentativa de conectar falhou.
ConexãoLoggedOutNúmero desconectado (logout)O número foi deslogado e precisa reler o QR Code.
ConexãoTemporaryBanBanimento temporárioO WhatsApp aplicou um bloqueio temporário ao número.
ConexãoStreamErrorErro de conexãoFalha no canal de comunicação com o WhatsApp.
ConexãoClientOutdatedVersão desatualizadaO WhatsApp recusou a versão do cliente.
ConexãoKeepAliveTimeoutSem resposta do WhatsAppO canal parou de responder (pode cair em seguida).
ConexãoKeepAliveRestoredCanal restabelecidoA comunicação voltou ao normal após falhas.
ConexãoPrivacySettingsPrivacidade alteradaAs configurações de privacidade do seu número mudaram.
ConexãoPairSuccessPareamento concluídoO QR Code foi lido e o número pareou com sucesso.
ConexãoPairErrorFalha no pareamentoA leitura do QR Code ou o pareamento falhou.
PresençaPresencePresença (online/offline)Um contato ficou online ou offline.
PresençaChatPresenceDigitandoUm contato começou ou parou de digitar.
Grupos e contatosGroupInfoAtualização de grupoMudança em um grupo (nome, participantes, etc.).
Grupos e contatosJoinedGroupEntrou em um grupoO número entrou ou foi adicionado a um grupo.
Grupos e contatosPictureFoto de perfil alteradaUm contato ou grupo trocou a foto.
Grupos e contatosBlocklistChangeBloqueio/desbloqueioUm contato foi bloqueado ou desbloqueado.
Grupos e contatosBlocklistLista de bloqueios sincronizadaA lista completa de bloqueados foi recebida.
Grupos e contatosIdentityChangeChave de segurança mudouO contato trocou de aparelho ou reinstalou o WhatsApp.
Grupos e contatosUserAboutRecado alteradoUm contato mudou o recado do perfil.
Grupos e contatosNewsletterJoinEntrou em um canalSeu número passou a seguir um canal.
Grupos e contatosNewsletterLeaveSaiu de um canalSeu número deixou de seguir um canal.
Grupos e contatosNewsletterMuteChangeCanal silenciadoUm canal foi silenciado ou reativado.
Grupos e contatosNewsletterLiveUpdateTransmissão em canalAtualização ao vivo de um canal.
ChamadasCallOfferChamada recebidaO número recebeu uma chamada de voz ou vídeo.
ChamadasCallAcceptChamada atendidaUma chamada foi aceita.
ChamadasCallTerminateChamada encerradaUma chamada foi finalizada.
ChamadasCallOfferNoticeAviso de chamadaNotificação de chamada (grupo ou aviso do servidor).
ChamadasCallRelayLatencyQualidade da chamadaMedição de latência da chamada (avançado).
SincronizaçãoHistorySyncSincronização de históricoLotes de mensagens antigas sincronizadas.
SincronizaçãoOfflineSyncCompletedSincronização offline concluídaTerminou de receber o que chegou enquanto estava offline.
SincronizaçãoOfflineSyncPreviewPrévia da sincronização offlineResumo do que será sincronizado.

Como sei que a conexão caiu?

Marque os eventos Disconnected e LoggedOut. O primeiro indica queda de conexão, que muitas vezes se resolve sozinha. O segundo significa que o WhatsApp encerrou a sessão do aparelho e um novo QR Code precisa ser lido — nesse caso, o token da conexão continua o mesmo, os webhooks continuam apontando para a sua URL e nada muda no seu código.

Grupos

Dá para administrar grupos de WhatsApp pela API?

Sim. São 18 endpoints de grupo, cobrindo criação, entrada e saída, administração de participantes, link de convite e configurações da conversa. Para enviar mensagem a um grupo, use o identificador do grupo no campo Phone dos mesmos endpoints de envio.

EndpointFaz
GET /group/listLista os grupos do número
POST /group/createCria um grupo
GET /group/infoDetalhes de um grupo
POST /group/updateparticipantsAdiciona, remove, promove ou rebaixa participantes
GET /group/invitelinkObtém ou renova o link de convite
POST /group/joinEntra em um grupo por link
POST /group/leaveSai do grupo
POST /group/name · /topic · /photoAltera nome, descrição e foto
POST /group/announce · /locked · /ephemeralSó administradores falam, trava edição, mensagens temporárias
POST /group/joinapprovalmodeExige aprovação para entrar
GET /group/requestparticipantsLista pedidos de entrada pendentes
POST /group/updaterequestparticipantsAprova ou recusa pedidos de entrada
POST /group/inviteinfoConsulta os dados de um grupo a partir do link de convite
POST /group/photo/removeRemove a foto do grupo

Contatos e perfil

Como verificar se um número tem WhatsApp antes de enviar?

Use POST /user/check com os números que você quer verificar. Isso evita disparar para número que não existe no WhatsApp, o que além de desperdiçar chamada é um padrão de uso que aumenta o risco para o seu número. São 8 endpoints em /user:

EndpointFaz
POST /user/checkVerifica se os números têm WhatsApp
POST /user/infoInformações públicas de um contato
POST /user/avatarFoto de perfil de um contato
GET /user/contactsLista de contatos do número
POST /user/presenceDefine a presença do seu número
POST /user/block · /unblockBloqueia e desbloqueia um contato
GET /user/lid/{phone}Descobre o identificador interno (LID) de um número

Erros e respostas

O que a API devolve quando algo dá errado?

As respostas seguem o padrão HTTP. Vale tratar cada faixa de forma diferente no seu código, porque a ação necessária muda: token errado é problema de configuração, número desconectado é problema de operação, e erro do servidor merece nova tentativa.

CódigoSignificaO que fazer
200Requisição aceitaGuarde o identificador da mensagem para conciliar com os eventos de entrega
400Corpo inválidoConfira campos obrigatórios e o formato do número (só dígitos, com país e DDD)
401Token ausente ou inválidoVerifique o header token e se ele é o da conexão certa
404Endpoint inexistenteConfira o caminho na referência
429Cota do dia esgotada para aquele númeroAguarde a renovação indicada em X-Zapon-Cota-Renova e distribua a régua pelos próximos dias
500Erro ao processarFrequentemente a conexão está fora do ar: verifique o estado no painel e tente de novo

Meu envio retornou erro e o número está conectado. E agora?

Confira nesta ordem: o número do destinatário está no formato correto e tem WhatsApp (POST /user/check); o token é o da conexão que você pretende usar; e o corpo da requisição tem os campos obrigatórios daquele tipo de envio. A referência interativa em /api-doc.html mostra o schema de cada endpoint, com os campos obrigatórios marcados.

Preservar o número

O WhatsApp pode bloquear o número usado na API?

Pode, e isso vale para qualquer API de WhatsApp, oficial ou não. O bloqueio é uma decisão do WhatsApp sobre o número, e ninguém que venda integração controla essa decisão. Quem promete que o número nunca será bloqueado não está sendo honesto.

O que existe é um conjunto de práticas que reduzem o risco, e elas têm mais a ver com o padrão de uso do que com o volume. Duas dessas práticas o zapon já cumpre por você, do lado do servidor — você não precisa programar fila, sleep nem contador.

O que o zapon já faz sozinho para proteger o número?

Pausa de 8 a 20 segundos entre os envios. As mensagens de um mesmo número saem espaçadas por um intervalo aleatório dentro dessa faixa, cumprido pelo servidor. Se você disparar cem chamadas de uma vez, elas entram na fila daquele número e saem no ritmo certo — o seu código pode continuar simples.

Cota de 300 mensagens por dia, por número. Cerca de 9.000 por mês. É um teto de proteção, não comercial: o preço continua sendo por número conectado, sem cobrança por mensagem. Ao estourar a cota, a API responde 429 até a renovação do dia.

Toda resposta da API traz o estado da cota nos cabeçalhos, o que permite acompanhar o consumo sem nenhuma chamada extra:

CabeçalhoTraz
X-Zapon-Cota-LimiteO teto do dia para aquele número
X-Zapon-Cota-UsadoQuantas mensagens já saíram no dia
X-Zapon-Cota-RestanteQuantas ainda cabem
X-Zapon-Cota-RenovaQuando a cota volta ao zero

Além dos cabeçalhos, você recebe aviso ao cruzar 80%, 90%, 95% e 100% da cota — dá tempo de segurar a régua antes de a fila travar, em vez de descobrir o teto no primeiro 429.

O que continua sendo decisão sua?

Mande para quem espera receber. Mensagem para quem não pediu contato é a causa mais comum de denúncia, e denúncia é o que pesa. Um cliente que acabou de marcar uma consulta espera a confirmação; uma lista comprada não espera nada.

Verifique antes de enviar. Uma sequência de envios para números que não existem no WhatsApp é um sinal ruim. O endpoint /user/check existe para isso.

Dê saída. Ofereça uma forma simples de parar de receber, e respeite quando alguém pedir. Isso reduz denúncia e é o que a legislação de proteção de dados espera de você.

Aqueça número novo. Um número recém-criado que começa disparando em volume chama atenção. Comece devagar e aumente gradualmente.

Use um número dedicado no teste. Antes de mover a operação inteira, valide com um número que não seja crítico para o seu negócio. O teste do zapon não pede cartão exatamente para permitir isso.

Perguntas frequentes

Preciso instalar alguma biblioteca?

Não. O zapon é uma API REST em nuvem: qualquer linguagem que faça requisição HTTP consegue usar. Se a sua linguagem manda um POST com header e JSON, ela fala com o zapon.

Quantos números posso conectar na mesma conta?

Quantos você precisar. Cada número é uma conexão independente, com token e webhook próprios, e custa R$ 27 por mês. Não existe degrau de plano ao adicionar mais números.

Existe cobrança por mensagem?

Não. O preço é por número conectado, R$ 27 por mês, sem cobrança por mensagem. O que existe é uma cota de proteção de 300 mensagens por dia para cada número, com aviso em 80%, 90%, 95% e 100% e resposta 429 ao estourar.

Como é a cobrança e o que acontece se o pagamento atrasar?

A assinatura é no cartão de crédito, pela Stripe, R$ 27 por mês por número conectado, sem taxa de setup e sem fidelidade. Se um pagamento falhar, há 3 dias de tolerância e o corte acontece no quarto dia. A configuração inteira fica preservada — conexões, tokens, webhooks e chatbot voltam exatamente como estavam assim que o pagamento é regularizado.

Preciso de conta comercial verificada ou aprovação prévia?

Não. A conexão é feita com o WhatsApp do número, lendo o QR Code, como quando você usa o WhatsApp Web. Não há processo de aprovação para atravessar.

O que acontece se a conexão cair?

O painel mostra o estado real da conexão, atualizado a cada 10 segundos enquanto a página está aberta, e você pode receber os eventos Disconnected e LoggedOut no seu webhook. Quando o WhatsApp exige nova autenticação, basta reler o QR Code: o token continua o mesmo, os webhooks continuam configurados e o seu código não muda.

Como funciona o período de teste?

São 14 dias grátis, sem cartão de crédito, e o prazo só começa a contar na primeira conexão. Se você não assinar, a conexão simplesmente expira — não há cobrança automática.

Conecte um número e faça o primeiro envio hoje.

14 dias grátis, sem cartão. O prazo só começa quando você conectar.