Skip to main content
O contrato multicanal é a camada neutra da API: os mesmos três endpoints falam com WhatsApp e com Telegram, e com os canais que vierem depois. O canal não aparece na URL nem no corpo — ele vem da conta que você escolhe como remetente.
A API de WhatsApp continua existindo e não muda. Ela é a camada específica do canal, com o que só o WhatsApp tem. Quem já integrou com ela não precisa migrar.
Esta página explica as regras do contrato. Os três endpoints estão descritos campo a campo, com playground para testar, na referência da API.

O que esta fase ainda não faz

Não inicia conversa. Todo envio exige uma conversa já existente com o destinatário. Se não houver, a resposta é 409 NO_OPEN_CONVERSATION.
Não envia modelo de mensagem. Como o modelo é o único jeito de falar com quem está fora da janela de atendimento no WhatsApp, iniciar conversa chega junto com o endpoint de modelo, numa fase seguinte.
Os tipos aceitos agora são text, image, document, audio e video.
SMS não faz parte deste contrato. Ele é de mão única — não tem conta de canal nem conversa — e um contrato cujo remetente é uma conta e cuja regra é responder a conversas existentes não consegue descrevê-lo com honestidade. Ele entra quando essas duas peças existirem.

Listar os canais conectados

É por aqui que se começa: o id de cada conta é o que vai em channel_id no envio.
O bloco capabilities descreve o que aquele canal aceita. Vale ler antes de montar o envio: ele é a mesma fonte que o servidor consulta para aceitar ou recusar. provider_identifier é o identificador na plataforma de origem — o phone_number_id da Meta, por exemplo. Serve para conferência humana; não é o que vai no envio.

Enviar mensagem

string
required
O id da conta de canal, vindo de GET /v1/channels. É ele que define o canal.
string
Identificador do contato na WizeBot. Use este ou to, nunca os dois.
string
Endereço nativo no canal — telefone no WhatsApp, identificador de chat no Telegram.
string
default:"text"
Um de text, image, document, audio, video.
string
Texto da mensagem. Obrigatório quando type é text.
string
URL pública da mídia. Obrigatório nos tipos de mídia.
string
Legenda da mídia, onde o canal a aceita.
string
default:"document"
Nome do arquivo, para document.
string
Seu identificador do envio. Ver Idempotência.
Resposta

As duas formas de destinatário

Por contact_id o endereço é resolvido pela identidade que o contato tem naquele canal. Um contato que existe na sua base mas nunca falou pelo Telegram não tem endereço de Telegram — e a resposta diz isso, com 422 RECIPIENT_NOT_ON_CHANNEL, em vez de fingir que o contato não existe. Por to o endereço vai direto ao canal. No WhatsApp o número é normalizado antes de casar com a base, então +55 11 99999-9999 e 5511999999999 levam ao mesmo lugar.
Se o endereço tiver forma inequívoca de outro canal — um + de telefone numa conta de Telegram, um @usuario numa conta de WhatsApp — a resposta é 400 CHANNEL_MISMATCH. Uma sequência de dígitos sem sinal não é considerada telefone: identificador de chat do Telegram também é numérico.

Quando o canal não faz o que você pediu

Esse status é diferente do 400. 400 quer dizer “corrija o pedido”; 422 quer dizer “o pedido está correto e este canal não atende”. O corpo traz o que o canal suporta, para você não precisar consultar a documentação em tempo de execução:

Idempotência

client_message_id é o seu identificador do envio. Duas requisições com o mesmo valor viram um envio só — é o que torna seguro repetir depois de um timeout, sem o destinatário receber a mensagem duas vezes. Escolha um valor estável e ligado ao seu domínio (o número do pedido, o id da notificação), não um aleatório por tentativa. Sem o campo, cada requisição é um envio novo.

Consultar o status

O 201 do envio diz que a mensagem foi aceita para envio, não que chegou. A entrega se confirma aqui — é o único jeito de saber.

Erros

Os códigos e as mensagens de erro são em inglês, como o resto do contrato.