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
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.
| Header | Uso |
|---|---|
X-RexZap-Account | Chave de API da conta. Autentica as rotas /provisionar*. Gere/veja no painel (card “API do seu sistema”). |
Client-Token | Token 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.
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
Resposta 200
[
{ "id": "...", "token": "...", "clientToken": "...",
"numero": "5544999999999", "perfilNome": "Maria", "status": "conectado" }
]
Resposta 200
{ "ok": true }Cota
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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| message req | string | Texto da mensagem. Aceita quebras de linha (envie como \n escapado no JSON). |
| mentioned | string[] | 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. |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar imagem
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| image req | string | URL pública ou base64 (data URI) da imagem. |
| caption | string | Legenda (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar documento
{extension} na URL = extensão do arquivo (ex.: pdf).Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| document req | string | URL pública ou base64 (data URI) do arquivo. |
| fileName | string | Nome do arquivo (opcional). |
| caption | string | Legenda (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
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
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| audio req | string | URL pública ou base64 (data URI) do áudio. |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar vídeo
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| video req | string | URL pública ou base64 (data URI) do vídeo. |
| caption | string | Legenda (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar link
Envia um texto com prévia de link (título, descrição e imagem do site quando disponível).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| linkUrl req | string | URL que gera a prévia do link (título, descrição e imagem do site). |
| message | string | Texto enviado junto do link (opcional). Aparece acima da prévia. |
| title | string | Título da prévia (opcional). |
| linkDescription | string | Descrição da prévia (opcional). |
| image | string | URL ou base64 da miniatura da prévia (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos 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
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| latitude | number | Latitude em graus decimais. A API não valida, mas envie junto com a longitude (sem isso, o pino vai em 0,0). |
| longitude | number | Longitude em graus decimais. |
| title | string | Nome do local (opcional). |
| address | string | Endereço do local (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar contato
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| contactName req | string | Nome do contato a compartilhar. |
| contactPhone req | string | Número do contato a compartilhar (só dígitos, com DDI). |
| contactBusinessDescription | string | Nome comercial do contato (opcional). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar figurinha
webp.Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| sticker req | string | URL pública ou base64 (data URI) da figurinha (webp). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos mostrando 'digitando...' antes de enviar (0-15, opcional). |
Resposta 200
{ "zaapId": "...", "messageId": "...", "id": "..." }
Enviar GIF
mp4).Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| gif req | string | URL pública ou base64 (data URI) do GIF/vídeo (mp4). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos de espera antes de enviar (0-15, opcional). Sem isso, usa o delay padrão da conta. |
| delayTyping | number | Segundos 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| messageId req | string | ID da mensagem que vai receber a reação. |
| reaction req | string | Emoji da reação (ex.: 👍). |
| delayMessage | number | Segundos 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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| messageId req | string | ID da mensagem cuja reação será removida. |
| delayMessage | number | Segundos 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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| messageId req | string | ID 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.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| messageId req | string | ID da mensagem a apagar. |
| phone req | string | Número da conversa onde está a mensagem (só dígitos, com DDI). |
| owner | boolean | Indica 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número de destino para onde encaminhar (só dígitos, com DDI). |
| messageId req | string | ID da mensagem a encaminhar. |
| messagePhone req | string | Número da conversa de origem onde está a mensagem (só dígitos, com DDI). |
| delayMessage | number | Segundos 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.
400 { "error": "recurso beta desabilitado" }.Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| message req | string | Texto principal da mensagem (corpo). |
| title | string | Título exibido acima do texto (opcional). |
| footer | string | Rodapé exibido abaixo dos botões (opcional). |
| buttonActions req | object[] | 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). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos 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.
400 { "error": "recurso beta desabilitado" }.Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| message req | string | Texto principal da mensagem (corpo). |
| title | string | Título exibido acima do texto (opcional). |
| footer | string | Rodapé exibido abaixo dos botões (opcional). |
| buttonList req | object | Objeto com a propriedade buttons (lista). Cada botão: label (texto exibido) e id (opcional, retornado quando o contato toca). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos 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.
400 { "error": "recurso beta desabilitado" }.Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número do destinatário (só dígitos, com DDI). |
| message req | string | Texto principal da mensagem (corpo). |
| title | string | Título exibido acima do texto (opcional). |
| footer | string | Rodapé exibido abaixo dos botões (opcional). |
| optionList req | object | Objeto 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). |
| messageId | string | ID de uma mensagem para responder (reply/citação). Opcional. |
| delayMessage | number | Segundos 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.
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
pendente da instância. Itens já em envio não são afetados.Resposta 200
{ "value": true }Remover da fila
{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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| message req | string | Texto 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| image req | string | URL 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.
{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
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.
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
{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.
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).
{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 }
]
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
{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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| phone req | string | Número da conversa (só dígitos, com DDI). |
| action req | string | Açã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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupName req | string | Nome do grupo a criar. |
| phones req | string[] | 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
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| groupName req | string | Novo nome do grupo. |
Resposta 200
{ "value": true }
Alterar foto do grupo
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| groupPhoto req | string | URL pública ou base64 (data URI) da nova foto (imagem quadrada). |
Resposta 200
{ "value": true }
Alterar descrição do grupo
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| groupDescription | string | Nova 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| adminOnlyMessage | boolean | true = só administradores enviam mensagens. Opcional. |
| adminOnlySettings | boolean | true = só administradores editam os dados do grupo (nome, foto, descrição). Opcional. |
Resposta 200
{ "value": true }
Adicionar participante
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| phones req | string[] | Números a adicionar/remover/promover (só dígitos, com DDI). |
Resposta 200
{ "value": true }
Remover participante
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| phones req | string[] | Números a adicionar/remover/promover (só dígitos, com DDI). |
Resposta 200
{ "value": true }
Promover a admin
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| phones req | string[] | Números a adicionar/remover/promover (só dígitos, com DDI). |
Resposta 200
{ "value": true }
Rebaixar admin
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID do grupo (id@g.us). |
| phones req | string[] | Números a adicionar/remover/promover (só dígitos, com DDI). |
Resposta 200
{ "value": true }
Sair do grupo
Body
| Campo | Tipo | Descrição |
|---|---|---|
| groupId req | string | ID 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.
{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.
{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
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
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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| value req | string | Novo 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| value req | string | URL 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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| value req | boolean | true 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.
Body
| Campo | Tipo | Descrição |
|---|---|---|
| value req | boolean | true 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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| value | string | Texto enviado ao contato após rejeitar a chamada (vazio limpa a mensagem). |
Resposta 200
{ "value": true }
QR Code
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)
/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
Resposta 200
{ "value": true }Reiniciar / Desconectar
Resposta 200
{ "value": true }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" }.
| PUT | Dispara quando |
|---|---|
/update-webhook-received | Mensagem recebida. |
/update-webhook-received-delivery | Recebidas + enviadas pelo próprio número. |
/update-webhook-message-status | Mudança de status da mensagem. |
/update-webhook-connected | Número conectou. |
/update-webhook-disconnected | Número desconectou. |
Webhook ao enviar
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
| Campo | Tipo | Descrição |
|---|---|---|
| value req | string | URL do seu endpoint (https). String vazia desliga o webhook. |
Resposta 200
{ "value": true }
Webhook de presença
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
| Campo | Tipo | Descrição |
|---|---|---|
| value req | string | URL 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á" }
}
"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 }
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
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).
Body
| Campo | Tipo | Descrição |
|---|---|---|
| name req | string | Nome do produto. |
| price | number | Preço do produto (na moeda de currency). Opcional na API, mas exigido pelo WhatsApp. |
| currency | string | Código da moeda ISO 4217 (ex.: BRL). Opcional. |
| description | string | Descrição do produto (opcional). |
| images | string[] | URLs públicas ou base64 (data URI) das imagens do produto (opcional). |
| url | string | Link externo do produto (opcional). |
| retailerId | string | SKU/código interno do produto (opcional). |
| isHidden | boolean | true 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).
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).
{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
{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
{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.
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.
{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.
{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ódigo | Significado |
|---|---|
400 | Número desconectado, parâmetro obrigatório ausente/inválido, ou recurso beta/business desabilitado. |
401 | Credencial inválida (Client-Token ou chave da conta). |
402 | Sem assinatura ou isenção ativa. |
404 | Recurso não encontrado (ex.: chat sem histórico nesta instância). |
409 | Cota de números esgotada. |
