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", "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).
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).
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).
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).

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.
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).
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": "..." }

Status

GET/instances/{id}/token/{token}/status
Estado da conexão do número.

Resposta 200

{ "connected": true, "status": "conectado" }

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 }

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.

Eventos recebidos

O RexZap faz POST na sua URL com estes formatos.

Mensagem de texto

{
  "type": "ReceivedCallback", "status": "RECEIVED",
  "instanceId": "...", "messageId": "...",
  "phone": "5544999999999", "fromMe": false,
  "momment": 1718000000000,
  "senderName": "Maria", "chatName": "Maria",
  "participantPhone": null, "photo": null, "broadcast": false,
  "text": { "message": "olá" }
}

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" }
}

Status / conexão

{ "type": "MessageStatusCallback", "instanceId": "...", "status": "SENT", "ids": ["..."], "phone": "...", "momment": 1718000000000 }
{ "type": "ConnectedCallback", "instanceId": "...", "momment": 1718000000000 }
{ "type": "DisconnectedCallback", "instanceId": "...", "momment": 1718000000000 }
O MessageStatusCallback hoje emite apenas status: "SENT" (confirmação de envio pela API ao sair da fila). DELIVERED e READ não são emitidos.

Erros

CódigoSignificado
400Número desconectado — pareie o QR antes de enviar.
401Credencial inválida (Client-Token ou chave da conta).
402Sem assinatura ou isenção ativa.
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).