RexZapREXZAPAPI Docs Site Painel

Documentação da API

API REST para integrar o WhatsApp ao seu sistema: provisione números, envie e receba mensagens e mídias, e receba eventos por webhook.

Visão geral

Todas as requisições usam a base URL abaixo e retornam JSON. Há dois conjuntos de rotas: as da conta (provisionar/gerenciar números, autenticadas pela chave da conta) e as da instância (enviar/receber, no padrão de mercado, autenticadas pelo Client-Token).

Base URL

https://api.rexzap.rexsuite.com
Cada número conectado é uma instância, identificada por id + token na URL. O Client-Token é da sua conta e vai no header das rotas de instância.

Autenticação

Não há login por OAuth: cada conjunto de rotas usa um cabeçalho próprio.

HeaderUso
X-RexZap-AccountChave de API da conta. Autentica as rotas /provisionar*. Gere/veja no painel (card “API do seu sistema”).
Client-TokenToken da conta. Vai no header de toda rota de instância (/instances/...).

Início rápido

Em quatro passos: provisione um número, mostre o QR, espere conectar e envie.

# 1) provisione um número (retorna id, token, clientToken e a URL do QR)
curl -X POST https://api.rexzap.rexsuite.com/provisionar \
  -H "X-RexZap-Account: SUA_CHAVE_DA_CONTA"

# 2) pegue o QR (data:image/png;base64,...) e exiba no seu sistema
curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/qr-code/image \
  -H "Client-Token: {clientToken}"

# 3) verifique a conexão até status = conectado
curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/status \
  -H "Client-Token: {clientToken}"

# 4) envie a primeira mensagem
curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-text \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","message":"olá 👋"}'

Provisionar números

Rotas da conta — header X-RexZap-Account. Seu sistema cria e gerencia números sem entrar no painel.

POST/provisionar
Cria um número novo. Retorna as credenciais da instância e a URL do QR.

Resposta 200

{
  "id": "34DEA54FF15492214CB8FAD5470C62F8",
  "token": "9E8937994C27C132E835A0680B194C21",
  "clientToken": "92912E057CE1...",
  "status": "desconectado",
  "qrCodeUrl": "/instances/{id}/token/{token}/qr-code/image",
  "statusUrl": "/instances/{id}/token/{token}/status"
}

Erros

401 chave inválida · 402 sem assinatura ativa · 409 cota esgotada

GET/provisionar/numeros
Lista os números da conta.

Resposta 200

[
  { "id": "...", "token": "...", "clientToken": "...",
    "numero": "5544999999999", "perfilNome": "Maria", "status": "conectado" }
]
DELETE/provisionar/numeros/{id}
Remove um número da conta (desconecta e libera a cota).

Resposta 200

{ "ok": true }

Cota

GET/provisionar/cota
Uso x limite de números da conta.

Resposta 200

{ "used": 1, "limit": 10, "active": true, "status": "active" }

Enviar texto

Rotas de instância — path /instances/{id}/token/{token} + header Client-Token. A resposta de envio traz os ids da mensagem.

POST/instances/{id}/token/{token}/send-text

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
message reqstringTexto da mensagem. Aceita quebras de linha (envie como \n escapado no JSON).
mentionedstring[]Números a mencionar (só dígitos, com DDI). Use @número no texto para o destaque aparecer. Em grupo, marca os membros citados. Opcional.
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar imagem

POST/instances/{id}/token/{token}/send-image

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
image reqstringURL pública ou base64 (data URI) da imagem.
captionstringLegenda (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar documento

POST/instances/{id}/token/{token}/send-document/{extension}
{extension} na URL = extensão do arquivo (ex.: pdf).

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
document reqstringURL pública ou base64 (data URI) do arquivo.
fileNamestringNome do arquivo (opcional).
captionstringLegenda (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }
Os três campos trazem o MESMO valor: o id da fila (zaap) gerado na hora. O envio é assíncrono, então o id real da mensagem no WhatsApp não sai aqui — ele chega depois no webhook de status (MessageStatusCallback, campo ids) e no de envio (DeliveryCallback, campo messageId). Vale para todos os send-*. Esses dois callbacks trazem também o zaapId — use-o para casar o retorno do send (zaap) com o id real do WhatsApp.

Enviar áudio

POST/instances/{id}/token/{token}/send-audio

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
audio reqstringURL pública ou base64 (data URI) do áudio.
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar vídeo

POST/instances/{id}/token/{token}/send-video

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
video reqstringURL pública ou base64 (data URI) do vídeo.
captionstringLegenda (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Envia um texto com prévia de link (título, descrição e imagem do site quando disponível).

POST/instances/{id}/token/{token}/send-link

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
linkUrl reqstringURL que gera a prévia do link (título, descrição e imagem do site).
messagestringTexto enviado junto do link (opcional). Aparece acima da prévia.
titlestringTítulo da prévia (opcional).
linkDescriptionstringDescrição da prévia (opcional).
imagestringURL ou base64 da miniatura da prévia (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-link \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","linkUrl":"https://rexzap.rexsuite.com","message":"Veja:","title":"RexZap","linkDescription":"API de WhatsApp"}'

Enviar localização

POST/instances/{id}/token/{token}/send-location

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
latitudenumberLatitude em graus decimais. A API não valida, mas envie junto com a longitude (sem isso, o pino vai em 0,0).
longitudenumberLongitude em graus decimais.
titlestringNome do local (opcional).
addressstringEndereço do local (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar contato

POST/instances/{id}/token/{token}/send-contact

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
contactName reqstringNome do contato a compartilhar.
contactPhone reqstringNúmero do contato a compartilhar (só dígitos, com DDI).
contactBusinessDescriptionstringNome comercial do contato (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar figurinha

POST/instances/{id}/token/{token}/send-sticker
A figurinha deve estar no formato webp.

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
sticker reqstringURL pública ou base64 (data URI) da figurinha (webp).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Enviar GIF

POST/instances/{id}/token/{token}/send-gif
O GIF é enviado como vídeo em loop (formato mp4).

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
gif reqstringURL pública ou base64 (data URI) do GIF/vídeo (mp4).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.
delayTypingnumberSegundos mostrando 'digitando...' antes de enviar (0-15, opcional).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Reagir a mensagem

Envia uma reação (emoji) a uma mensagem existente. Passa pela fila como os demais envios.

POST/instances/{id}/token/{token}/send-reaction

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
messageId reqstringID da mensagem que vai receber a reação.
reaction reqstringEmoji da reação (ex.: 👍).
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-reaction \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","messageId":"3EB0...","reaction":"👍"}'

Remover reação

Remove a reação previamente enviada a uma mensagem (envia uma reação vazia).

POST/instances/{id}/token/{token}/send-remove-reaction

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
messageId reqstringID da mensagem cuja reação será removida.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Marcar como lida

Marca uma mensagem recebida como lida (os ticks azuis no aparelho do contato).

POST/instances/{id}/token/{token}/read-message

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
messageId reqstringID da mensagem a marcar como lida.

Resposta 200

{ "value": true }

Apagar mensagem

Apaga uma mensagem para todos (deletar para todos). Os parâmetros vão na query string.

DELETE/instances/{id}/token/{token}/messages?messageId={messageId}&phone={phone}&owner={owner}

Parâmetros

CampoTipoDescrição
messageId reqstringID da mensagem a apagar.
phone reqstringNúmero da conversa onde está a mensagem (só dígitos, com DDI).
ownerbooleanIndica se a mensagem é sua (true) ou do contato (false). Opcional.

Resposta 200

{ "value": true }

Exemplo

curl -X DELETE "https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/messages?messageId=3EB0...&phone=5544999999999&owner=true" \
  -H "Client-Token: {clientToken}"

Encaminhar mensagem

Encaminha uma mensagem existente para outro número. Passa pela fila como os demais envios.

POST/instances/{id}/token/{token}/forward-message

Body

CampoTipoDescrição
phone reqstringNúmero de destino para onde encaminhar (só dígitos, com DDI).
messageId reqstringID da mensagem a encaminhar.
messagePhone reqstringNúmero da conversa de origem onde está a mensagem (só dígitos, com DDI).
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Botões de ação (beta)

Envia uma mensagem com botões de ação (abrir link, ligar ou resposta rápida). Passa pela fila como os demais envios.

Recurso experimental (beta). Mensagens interativas (botões e listas) são restritas pela Meta em contas não oficiais: podem não ser entregues, parar de funcionar sem aviso e até sinalizar o número. Teste em um número descartável antes de usar em produção. Ficam atrás de uma flag (desligada por padrão): com a flag desligada, retornam 400 { "error": "recurso beta desabilitado" }.
POST/instances/{id}/token/{token}/send-button-actions

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
message reqstringTexto principal da mensagem (corpo).
titlestringTítulo exibido acima do texto (opcional).
footerstringRodapé exibido abaixo dos botões (opcional).
buttonActions reqobject[]Lista de botões de ação. Cada item: type (url, call ou reply), label (texto do botão), url (quando url), phone (quando call) e id (opcional).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-button-actions \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","message":"Como podemos ajudar?","buttonActions":[{"type":"url","label":"Abrir site","url":"https://rexzap.rexsuite.com"},{"type":"reply","label":"Falar com humano"}]}'

Lista de botões (beta)

Envia uma mensagem com botões de resposta rápida (o contato toca um botão e a resposta volta como mensagem). Passa pela fila como os demais envios.

Recurso experimental (beta). Mensagens interativas (botões e listas) são restritas pela Meta em contas não oficiais: podem não ser entregues, parar de funcionar sem aviso e até sinalizar o número. Teste em um número descartável antes de usar em produção. Ficam atrás de uma flag (desligada por padrão): com a flag desligada, retornam 400 { "error": "recurso beta desabilitado" }.
POST/instances/{id}/token/{token}/send-button-list

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
message reqstringTexto principal da mensagem (corpo).
titlestringTítulo exibido acima do texto (opcional).
footerstringRodapé exibido abaixo dos botões (opcional).
buttonList reqobjectObjeto com a propriedade buttons (lista). Cada botão: label (texto exibido) e id (opcional, retornado quando o contato toca).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-button-list \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","message":"Escolha uma opção:","buttonList":{"buttons":[{"id":"1","label":"Suporte"},{"id":"2","label":"Vendas"}]}}'

Lista de opções (beta)

Envia uma mensagem com um menu de lista (o contato abre a lista e escolhe uma opção). Passa pela fila como os demais envios.

Recurso experimental (beta). Mensagens interativas (botões e listas) são restritas pela Meta em contas não oficiais: podem não ser entregues, parar de funcionar sem aviso e até sinalizar o número. Teste em um número descartável antes de usar em produção. Ficam atrás de uma flag (desligada por padrão): com a flag desligada, retornam 400 { "error": "recurso beta desabilitado" }.
POST/instances/{id}/token/{token}/send-option-list

Body

CampoTipoDescrição
phone reqstringNúmero do destinatário (só dígitos, com DDI).
message reqstringTexto principal da mensagem (corpo).
titlestringTítulo exibido acima do texto (opcional).
footerstringRodapé exibido abaixo dos botões (opcional).
optionList reqobjectObjeto com title (título da lista), buttonLabel (texto do botão que abre a lista) e options (lista). Cada opção: title (texto), description (subtexto, opcional) e id (opcional, retornado quando o contato escolhe).
messageIdstringID de uma mensagem para responder (reply/citação). Opcional.
delayMessagenumberSegundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/send-option-list \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","message":"Escolha um setor:","optionList":{"title":"Setores","buttonLabel":"Ver opções","options":[{"id":"sup","title":"Suporte","description":"Ajuda técnica"},{"id":"ven","title":"Vendas"}]}}'

Listar fila

Mensagens ainda na fila de envio (aguardando o delay/aquecimento). Cada item traz o zaapId usado para remover.

GET/instances/{id}/token/{token}/queue
Lista os itens pendentes/em envio da instância.

Resposta 200

[
  { "zaapId": "...", "phone": "5544999999999",
    "type": "text", "message": "olá 👋",
    "scheduled": "2024-06-10T12:00:00+00:00" }
]
type é o tipo do envio (text, image, link, etc.), message é o conteúdo enfileirado (texto, URL/base64 ou JSON do tipo) e scheduled é a data/hora ISO-8601 em que o item sai da fila. Para contar sem listar, use ?count=true{ "value": 3 }.

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/queue \
  -H "Client-Token: {clientToken}"

Limpar fila

DELETE/instances/{id}/token/{token}/queue
Remove todos os itens ainda pendente da instância. Itens já em envio não são afetados.

Resposta 200

{ "value": true }

Remover da fila

DELETE/instances/{id}/token/{token}/queue/{zaapid}
{zaapid} na URL = o zaapId retornado no envio (ou em /queue). Só remove se ainda estiver pendente.

Resposta 200

{ "value": true }

Status de texto

Publica um status (story) de texto no status@broadcast. Visível a todos os contatos que têm o número salvo. É síncrono (não passa pela fila): publica direto e os três campos da resposta trazem o MessageId real da publicação.

POST/instances/{id}/token/{token}/send-text-status

Body

CampoTipoDescrição
message reqstringTexto do status. Aceita quebras de linha (envie como \n escapado no JSON).

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Status de imagem

Publica um status (story) de imagem no status@broadcast. Visível a todos os contatos que têm o número salvo. É síncrono (não passa pela fila): publica direto e os três campos da resposta trazem o MessageId real da publicação.

POST/instances/{id}/token/{token}/send-image-status

Body

CampoTipoDescrição
image reqstringURL pública ou base64 (data URI) da imagem.

Resposta 200

{ "zaapId": "...", "messageId": "...", "id": "..." }

Número existe no WhatsApp

Verifica se um número tem conta no WhatsApp antes de enviar.

GET/instances/{id}/token/{token}/phone-exists/{phone}
{phone} na URL = número a verificar (só dígitos, com DDI).

Resposta 200

{ "exists": true, "phone": "5544999999999", "outputPhone": "5544999999999" }

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/phone-exists/5544999999999 \
  -H "Client-Token: {clientToken}"

Foto de perfil

GET/instances/{id}/token/{token}/profile-picture?phone={phone}
URL da foto de perfil do contato. Vem null se o contato não tiver foto ou se ela estiver oculta na privacidade.

Resposta 200

{ "link": "https://...whatsapp.net/...jpg" }
{ "link": null }

Listar contatos

Lista os contatos com quem o número já conversou. Não é a agenda inteira do aparelho — só quem trocou mensagens com esta instância. Paginado.

GET/instances/{id}/token/{token}/contacts?page={page}&pageSize={pageSize}
page (a partir de 1) e pageSize (padrão 50) na query são opcionais.

Resposta 200

[
  { "phone": "5544999999999", "name": "Maria" }
]

Exemplo

curl "https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/contacts?page=1&pageSize=50" \
  -H "Client-Token: {clientToken}"

Dados do contato

GET/instances/{id}/token/{token}/contacts/{phone}
{phone} na URL = número do contato (só dígitos, com DDI).

Resposta 200

{
  "phone": "5544999999999",
  "name": "Maria",
  "exists": true
}

Listar chats

Lista as conversas (chats) da instância — uma por número que já trocou mensagens. Mesma semântica de contatos: não inclui conversas sem histórico nesta instância. Paginado.

GET/instances/{id}/token/{token}/chats?page={page}&pageSize={pageSize}
page (a partir de 1) e pageSize (padrão 50) na query são opcionais.

Resposta 200

[
  { "phone": "5544999999999", "name": "Maria",
    "lastMessageText": "até amanhã", "lastMessageTime": 1718000000000,
    "unread": 0, "archived": false }
]
lastMessageTime é epoch em ms. unread e archived vêm fixos (0 / false) nesta lista; o estado real de leitura/arquivamento é alterado por modify-chat.

Exemplo

curl "https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/chats?page=1&pageSize=50" \
  -H "Client-Token: {clientToken}"

Mensagens do chat

Histórico de mensagens de uma conversa, da mais recente para a mais antiga. Use lastMessageId para paginar (cursor).

GET/instances/{id}/token/{token}/chat-messages/{phone}?amount={amount}&lastMessageId={lastMessageId}
{phone} na URL = número da conversa. amount (padrão 50) e lastMessageId (continuar a partir desta mensagem) na query são opcionais.

Resposta 200

[
  { "phone": "5544999999999", "fromMe": false,
    "tipo": "text", "texto": "oi", "messageId": "3EB0...",
    "status": "RECEIVED", "momment": 1718000000000,
    "midiaUrl": null, "midiaMime": null, "midiaNome": null }
]
Campos: tipo (text, image, audio, video, document, sticker, reaction, location, contact…), texto (texto ou resumo), momment (epoch ms), status (RECEIVED, SENT, READ…). Para mídia, midiaUrl é o link proxy estável do RexZap (null quando não há), com midiaMime e midiaNome.

Exemplo

curl "https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/chat-messages/5544999999999?amount=20" \
  -H "Client-Token: {clientToken}"

Dados do chat

GET/instances/{id}/token/{token}/chat/{phone}
{phone} na URL = número da conversa (só dígitos, com DDI). Retorna 404 se não houver mensagens dessa conversa nesta instância.

Resposta 200

{
  "phone": "5544999999999",
  "name": "Maria",
  "lastMessageTime": 1718000000000,
  "messagesCount": 42
}

Modificar chat

Arquiva, desarquiva, marca como lida/não lida ou apaga uma conversa. A ação delete é destrutiva (apaga a conversa) — use com cuidado.

POST/instances/{id}/token/{token}/modify-chat

Body

CampoTipoDescrição
phone reqstringNúmero da conversa (só dígitos, com DDI).
action reqstringAção a aplicar: archive, unarchive, read, unread ou delete.

Resposta 200

{ "value": true }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/modify-chat \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone":"5544999999999","action":"archive"}'

Criar grupo

Cria um grupo e adiciona os participantes informados. O número conectado entra como administrador. Os grupos usam id@g.us; nas rotas de grupo seguintes, envie esse id no campo groupId (com o sufixo @g.us, como retornado aqui).

POST/instances/{id}/token/{token}/create-group

Body

CampoTipoDescrição
groupName reqstringNome do grupo a criar.
phones reqstring[]Números dos participantes a adicionar (só dígitos, com DDI).

Resposta 200

{ "groupId": "120363000000000000@g.us", "invitationLink": null }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/create-group \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"groupName":"Equipe RexZap","phones":["5544999999999","5544988888888"]}'

Alterar nome do grupo

POST/instances/{id}/token/{token}/update-group-name
Requer que o número conectado seja administrador do grupo.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
groupName reqstringNovo nome do grupo.

Resposta 200

{ "value": true }

Alterar foto do grupo

POST/instances/{id}/token/{token}/update-group-photo
Requer que o número conectado seja administrador do grupo. Aplicação é best-effort: o WhatsApp pode recusar a imagem (formato/tamanho).

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
groupPhoto reqstringURL pública ou base64 (data URI) da nova foto (imagem quadrada).

Resposta 200

{ "value": true }

Alterar descrição do grupo

POST/instances/{id}/token/{token}/update-group-description
Requer que o número conectado seja administrador do grupo.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
groupDescriptionstringNova descrição do grupo (vazio limpa a descrição).

Resposta 200

{ "value": true }

Configurações do grupo

Controla quem pode enviar mensagens e quem pode editar os dados do grupo (nome, foto, descrição). Requer administrador.

POST/instances/{id}/token/{token}/update-group-settings

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
adminOnlyMessagebooleantrue = só administradores enviam mensagens. Opcional.
adminOnlySettingsbooleantrue = só administradores editam os dados do grupo (nome, foto, descrição). Opcional.

Resposta 200

{ "value": true }

Adicionar participante

POST/instances/{id}/token/{token}/add-participant
Adiciona um ou mais números ao grupo. Requer administrador.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
phones reqstring[]Números a adicionar/remover/promover (só dígitos, com DDI).

Resposta 200

{ "value": true }

Remover participante

POST/instances/{id}/token/{token}/remove-participant
Remove um ou mais números do grupo. Requer administrador.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
phones reqstring[]Números a adicionar/remover/promover (só dígitos, com DDI).

Resposta 200

{ "value": true }

Promover a admin

POST/instances/{id}/token/{token}/add-admin
Promove um ou mais participantes a administrador. Requer administrador.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
phones reqstring[]Números a adicionar/remover/promover (só dígitos, com DDI).

Resposta 200

{ "value": true }

Rebaixar admin

POST/instances/{id}/token/{token}/remove-admin
Rebaixa um ou mais administradores para participante comum. Requer administrador.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).
phones reqstring[]Números a adicionar/remover/promover (só dígitos, com DDI).

Resposta 200

{ "value": true }

Sair do grupo

POST/instances/{id}/token/{token}/leave-group
O número conectado sai do grupo.

Body

CampoTipoDescrição
groupId reqstringID do grupo (id@g.us).

Resposta 200

{ "value": true }

Dados do grupo

Retorna os metadados do grupo: nome, descrição, dono, participantes e quem é administrador.

GET/instances/{id}/token/{token}/group-metadata/{phone}
{phone} na URL = ID do grupo (id@g.us).

Resposta 200

{
  "phone": "120363000000000000",
  "subject": "Equipe RexZap",
  "description": "Grupo da equipe",
  "owner": "5544999999999",
  "participants": [
    { "phone": "5544999999999", "isAdmin": true, "isSuperAdmin": true },
    { "phone": "5544988888888", "isAdmin": false, "isSuperAdmin": false }
  ]
}

Dados por convite

Lê os metadados de um grupo a partir do link de convite, sem precisar fazer parte dele.

GET/instances/{id}/token/{token}/group-invitation-metadata?url={url}
{url} = link de convite do grupo (https://chat.whatsapp.com/...).

Resposta 200

{
  "phone": "120363000000000000",
  "subject": "Equipe RexZap",
  "description": "Grupo da equipe",
  "owner": "5544999999999",
  "participants": [
    { "phone": "5544999999999", "isAdmin": true, "isSuperAdmin": true }
  ]
}

Exemplo

curl "https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/group-invitation-metadata?url=https://chat.whatsapp.com/ABC123" \
  -H "Client-Token: {clientToken}"

Status

GET/instances/{id}/token/{token}/status
Estado da conexão do número (formato compatível PlugzAPI). error é sempre string — vazia quando conectado.

Resposta 200

{ "connected": true, "session": true, "error": "", "smartphoneConnected": true }
{ "connected": false, "session": false, "error": "You are not connected.", "smartphoneConnected": false }

Dados do aparelho

GET/instances/{id}/token/{token}/device
Info do aparelho conectado (compatível PlugzAPI). O motor Baileys não expõe os dados de hardware, então os campos dentro de device vêm como string vazia.

Resposta 200

{
  "phone": "5544999999999", "imgUrl": null,
  "device": { "wa_version": "", "mcc": "", "mnc": "",
    "os_version": "", "device_manufacturer": "", "device_model": "",
    "osbuildnumber": "", "platform": "" }
}

Alterar nome do perfil

Altera o nome de exibição (perfil) do número conectado.

PUT/instances/{id}/token/{token}/update-name

Body

CampoTipoDescrição
value reqstringNovo nome de exibição do perfil.

Resposta 200

{ "value": true }

Exemplo

curl -X PUT https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/update-name \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"value":"Atendimento RexZap"}'

Alterar foto do perfil

Altera a foto de perfil do número conectado. Aplicação é best-effort: o WhatsApp pode recusar a imagem (formato/tamanho) e a foto pode não trocar mesmo com resposta de sucesso.

PUT/instances/{id}/token/{token}/profile-picture

Body

CampoTipoDescrição
value reqstringURL pública ou base64 (data URI) da nova foto (imagem quadrada).

Resposta 200

{ "value": true }

Leitura automática

Liga/desliga a marcação automática como lida das mensagens recebidas (ticks azuis).

PUT/instances/{id}/token/{token}/update-auto-read-message

Body

CampoTipoDescrição
value reqbooleantrue marca toda mensagem recebida como lida automaticamente; false desativa.

Resposta 200

{ "value": true }

Rejeitar chamadas

Liga/desliga a rejeição automática de chamadas recebidas (voz e vídeo). A rejeição é best-effort: depende do comportamento do WhatsApp e pode variar.

PUT/instances/{id}/token/{token}/update-call-reject-auto

Body

CampoTipoDescrição
value reqbooleantrue rejeita automaticamente as chamadas recebidas; false desativa.

Resposta 200

{ "value": true }

Mensagem de chamada rejeitada

Define o texto enviado automaticamente ao contato quando uma chamada é rejeitada (requer a rejeição automática ligada).

PUT/instances/{id}/token/{token}/update-call-reject-message

Body

CampoTipoDescrição
valuestringTexto enviado ao contato após rejeitar a chamada (vazio limpa a mensagem).

Resposta 200

{ "value": true }

QR Code

GET/instances/{id}/token/{token}/qr-code/image
QR para parear o WhatsApp, como data URI PNG. Faça poll até o status virar conectado. Enquanto não há QR (sessão já conectada ou ainda gerando), value vem null.

Resposta 200

{ "value": "data:image/png;base64,iVBORw0KG..." }
{ "value": null }

QR Code (texto)

GET/instances/{id}/token/{token}/qr-code
Mesmo QR da rota /qr-code/image, mas como string PNG em base64 (data URI), para você renderizar do seu jeito. Vem null enquanto não há QR (sessão já conectada ou ainda gerando).

Resposta 200

{ "value": "data:image/png;base64,iVBORw0KG..." }
{ "value": null }

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/qr-code \
  -H "Client-Token: {clientToken}"

Restaurar sessão

GET/instances/{id}/token/{token}/restore-session
Tenta restabelecer a conexão de um número já pareado, sem novo QR. Use quando o status cair para reconectar com a sessão existente.

Resposta 200

{ "value": true }

Reiniciar / Desconectar

GET/instances/{id}/token/{token}/restart
Reinicia a sessão (gera novo QR se preciso).

Resposta 200

{ "value": true }
GET/instances/{id}/token/{token}/disconnect
Encerra a sessão do número.

Resposta 200

{ "value": true }

Configurar webhooks

Defina as URLs que receberão os eventos. Rotas PUT de instância, body { "value": "https://sua-app/webhook" }.

PUTDispara quando
/update-webhook-receivedMensagem recebida.
/update-webhook-received-deliveryRecebidas + enviadas pelo próprio número.
/update-webhook-message-statusMudança de status da mensagem.
/update-webhook-connectedNúmero conectou.
/update-webhook-disconnectedNúmero desconectou.

Webhook ao enviar

PUT/instances/{id}/token/{token}/update-webhook-delivery
Define a URL que recebe um POST sempre que o próprio número envia uma mensagem (saída da fila). Distinto de /update-webhook-received-delivery, que trata mensagens recebidas. Body com a URL; envie string vazia para desligar.

Body

CampoTipoDescrição
value reqstringURL do seu endpoint (https). String vazia desliga o webhook.

Resposta 200

{ "value": true }

Webhook de presença

PUT/instances/{id}/token/{token}/update-webhook-chat-presence
Define a URL que recebe um POST quando muda a presença de um contato no chat (digitando, gravando áudio, online/offline). Body com a URL; envie string vazia para desligar.

Body

CampoTipoDescrição
value reqstringURL do seu endpoint (https). String vazia desliga o webhook.

Resposta 200

{ "value": true }

Eventos recebidos

O RexZap faz POST na sua URL com estes formatos.

Mensagem de texto

Todo ReceivedCallback traz os campos de topo abaixo e mais um objeto conforme o tipo da mensagem. senderLid é o @lid do remetente (quando houver). senderPhoto e photo vêm null no momento.

{
  "waitingMessage": false, "isGroup": false,
  "instanceId": "...", "messageId": "...",
  "phone": "5544999999999", "senderLid": null, "fromMe": false,
  "momment": 1718000000000, "status": "RECEIVED",
  "chatName": "Maria", "senderPhoto": null, "senderName": "Maria",
  "participantPhone": null, "photo": null, "broadcast": false,
  "type": "ReceivedCallback",
  "text": { "message": "olá" }
}
Quando a mensagem recebida é uma resposta (citação) a outra, vem também "referenceMessageId": "<id da mensagem citada>" (logo antes de type).

Mídia (imagem, áudio, vídeo, documento, sticker)

Mesma estrutura, com um objeto por tipo. A URL é um link estável do RexZap (o arquivo fica em armazenamento privado).

{
  "type": "ReceivedCallback", "status": "RECEIVED", "instanceId": "...",
  "phone": "...", "fromMe": false, "momment": 1718000000000, "broadcast": false,
  "image":    { "imageUrl": "https://api.rexzap.rexsuite.com/media/...", "caption": "...", "mimeType": "image/jpeg" },
  "audio":    { "audioUrl": "...", "mimeType": "audio/ogg" },
  "video":    { "videoUrl": "...", "caption": "...", "mimeType": "video/mp4" },
  "document": { "documentUrl": "...", "mimeType": "application/pdf", "fileName": "nota.pdf" },
  "sticker":  { "stickerUrl": "...", "mimeType": "image/webp" }
}

Reação

Quando reagem a uma mensagem. referencedMessage aponta a mensagem reagida.

{
  "type": "ReceivedCallback", "status": "RECEIVED", "instanceId": "...", "messageId": "...",
  "phone": "...", "fromMe": false, "momment": 1718000000000,
  "reaction": {
    "value": "❤️", "time": 1718000000000,
    "referencedMessage": { "messageId": "3EB0...", "fromMe": true, "phone": "5544999999999", "participant": null }
  }
}

Localização

{ "type": "ReceivedCallback", "instanceId": "...", "phone": "...", "fromMe": false,
  "location": { "longitude": -38.5014, "latitude": -3.7319, "address": "Rua X, 123", "url": "" } }

Contato

{ "type": "ReceivedCallback", "instanceId": "...", "phone": "...", "fromMe": false,
  "contact": { "displayName": "Cesar", "vCard": "BEGIN:VCARD...END:VCARD", "phones": ["5544999999999"] } }

Resposta de botão / lista

Quando o contato clica num botão ou seleciona um item de lista.

{ ..., "buttonsResponseMessage": { "buttonId": "1", "message": "Ótimo" } }
{ ..., "listResponseMessage": { "message": "...", "title": "...", "selectedRowId": "1" } }

Status / conexão

{ "type": "MessageStatusCallback", "instanceId": "...", "status": "SENT", "ids": ["<id real>"], "zaapId": "<id da fila>", "phone": "...", "momment": 1718000000000 }
{ "type": "ConnectedCallback", "instanceId": "...", "momment": 1718000000000 }
{ "type": "DisconnectedCallback", "instanceId": "...", "momment": 1718000000000 }
O MessageStatusCallback emite SENT (saiu da fila), RECEIVED (entregue ao destinatário), READ (lido) e PLAYED (áudio ouvido), conforme os recibos do WhatsApp. Cada um traz o zaapId e o id real em ids.

Ao enviar (DeliveryCallback)

Disparado quando o próprio número envia uma mensagem (saída da fila), na URL de /update-webhook-delivery.

{
  "type": "DeliveryCallback",
  "instanceId": "...", "messageId": "<id real>", "zaapId": "<id da fila>",
  "phone": "5544999999999",
  "momment": 1718000000000
}

Presença no chat (ChatPresenceCallback)

Disparado quando muda a presença de um contato no chat, na URL de /update-webhook-chat-presence. O campo status assume composing (digitando), recording (gravando áudio), available (online), unavailable (offline) ou paused (parou de digitar).

{
  "type": "ChatPresenceCallback", "instanceId": "...",
  "phone": "5544999999999",
  "status": "composing",
  "momment": 1718000000000
}

Criar produto

Requer conta WhatsApp Business. Os recursos de catálogo e etiquetas só funcionam em números vinculados a uma conta Business. As etiquetas (tags) exigem, além disso, o WhatsApp Business Multi-Devices. Esta seção fica atrás de uma flag (desligada por padrão): com a flag desligada, as rotas retornam 400 { "error": "recurso business desabilitado" }. As respostas de catálogo/produto/etiquetas são repassadas cruas do motor WhatsApp Business — os campos dependem do WhatsApp e podem variar; os exemplos abaixo são ilustrativos.

Cria um produto no catálogo do número conectado (conta Business).

POST/instances/{id}/token/{token}/products

Body

CampoTipoDescrição
name reqstringNome do produto.
pricenumberPreço do produto (na moeda de currency). Opcional na API, mas exigido pelo WhatsApp.
currencystringCódigo da moeda ISO 4217 (ex.: BRL). Opcional.
descriptionstringDescrição do produto (opcional).
imagesstring[]URLs públicas ou base64 (data URI) das imagens do produto (opcional).
urlstringLink externo do produto (opcional).
retailerIdstringSKU/código interno do produto (opcional).
isHiddenbooleantrue oculta o produto do catálogo (opcional).

Resposta 200

{ "id": "7100...", "name": "Camiseta RexZap", "currency": "BRL", "isHidden": false }

Exemplo

curl -X POST https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/products \
  -H "Client-Token: {clientToken}" \
  -H "Content-Type: application/json" \
  -d '{"name":"Camiseta RexZap","price":59.9,"currency":"BRL"}'

Catálogo próprio

Lista os produtos do catálogo do número conectado (conta Business).

GET/instances/{id}/token/{token}/catalogs

Resposta 200

{
  "products": [
    { "id": "7100...", "name": "Camiseta RexZap", "currency": "BRL" }
  ]
}

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/catalogs \
  -H "Client-Token: {clientToken}"

Catálogo de um número

Lista os produtos do catálogo de outro número (conta Business).

GET/instances/{id}/token/{token}/catalogs/{phone}
{phone} na URL = número do dono do catálogo (só dígitos, com DDI).

Resposta 200

{
  "products": [
    { "id": "7100...", "name": "Camiseta", "currency": "BRL" }
  ]
}

Dados do produto

GET/instances/{id}/token/{token}/products/{productId}
{productId} na URL = ID do produto (retornado em /products ou /catalogs).

Resposta 200

{
  "id": "7100...",
  "name": "Camiseta RexZap",
  "currency": "BRL",
  "description": "...",
  "isHidden": false
}

Excluir produto

DELETE/instances/{id}/token/{token}/products/{productId}
{productId} na URL = ID do produto a excluir do catálogo.

Resposta 200

{ "value": true }

Listar etiquetas

Lista as etiquetas (tags) da conta. Só WhatsApp Business Multi-Devices.

GET/instances/{id}/token/{token}/tags

Resposta 200

[
  { "id": "1", "name": "Novo cliente", "color": 0 }
]

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/tags \
  -H "Client-Token: {clientToken}"

Adicionar etiqueta ao chat

Aplica uma etiqueta a uma conversa. Só WhatsApp Business Multi-Devices.

PUT/instances/{id}/token/{token}/chats/{phone}/tags/{tag}/add
{phone} = número da conversa (só dígitos, com DDI). {tag} = ID da etiqueta (de /tags).

Resposta 200

{ "value": true }

Exemplo

curl -X PUT https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/chats/5544999999999/tags/1/add \
  -H "Client-Token: {clientToken}"

Remover etiqueta do chat

Remove uma etiqueta de uma conversa. Só WhatsApp Business Multi-Devices. Por compatibilidade com a PlugzAPI, esta rota usa o método GET.

GET/instances/{id}/token/{token}/chats/{phone}/tags/{tag}/remove
{phone} = número da conversa (só dígitos, com DDI). {tag} = ID da etiqueta (de /tags).

Resposta 200

{ "value": true }

Exemplo

curl https://api.rexzap.rexsuite.com/instances/{id}/token/{token}/chats/5544999999999/tags/1/remove \
  -H "Client-Token: {clientToken}"

Erros

Todo erro vem como JSON { "error": "motivo" } com o status HTTP correspondente. Antes de qualquer send-*, o número precisa estar com status conectado; caso contrário a resposta é 400 { "error": "disconnected" }.

CódigoSignificado
400Número desconectado, parâmetro obrigatório ausente/inválido, ou recurso beta/business desabilitado.
401Credencial inválida (Client-Token ou chave da conta).
402Sem assinatura ou isenção ativa.
404Recurso não encontrado (ex.: chat sem histórico nesta instância).
409Cota de números esgotada.
Precisa das credenciais de um número? Elas aparecem no painel, na tela do número (Base URL, Instância, Token, Client-Token).