Mensagens
Envie uma mensagem de WhatsApp a partir de um canal conectado. Mensagens no sentido de recebimento chegam como webhooks message.received; não existe endpoint de "listar inbox" — webhooks são o caminho de leitura.
Enviar uma mensagem
O canal precisa estar connected. Enviar enquanto está pending / qr / disconnected retorna 409 not_connected.
| Field | Type | Required | Notes |
|---|
O corpo é uma união discriminada por type. Formatos válidos:
// text
{
"to": "5511999999999",
"body": { "type": "text", "text": "hello" }
}
// image
{
"to": "5511999999999",
"body": { "type": "image", "media_url": "https://...", "caption": "look" }
}
// audio
{
"to": "5511999999999",
"body": { "type": "audio", "media_url": "https://..." }
}
// document
{
"to": "5511999999999",
"body": { "type": "document", "media_url": "https://...", "filename": "invoice.pdf" }
}
// sticker (WebP — estático ou animado)
{
"to": "5511999999999",
"body": { "type": "sticker", "media_url": "https://example.com/sticker.webp" }
}Stickers precisam ser WebP. mime_type é opcional e usa image/webp por padrão.
to é um MSISDN — formato internacional sem + na frente. Aceitamos JIDs de grupo (...@g.us) por completude, mas a maioria dos fluxos é 1:1.
curl -sX POST "$WHATISUP_API/v1/channels/inst_01J.../messages" \
-H "Authorization: Bearer $WHATISUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","body":{"type":"text","text":"hi"}}'| Field | Type | Required | Notes |
|---|---|---|---|
| message_id | string | required | |
| client_ref | string | required · nullable | |
| status | `sent` \| `queued` | required |
A resposta confirma que a mensagem foi entregue ao socket do WhatsApp. O estado de entrega final chega como um webhook message.delivered separado (ou message.failed em falha terminal). Use o message_id para correlacionar.
O que você não vê nesta API
- Sem endpoint GET para mensagens. Mensagens de entrada chegam como webhooks e são o registro canônico. Não as bufferizamos no servidor além do necessário para retentativa do webhook.
- Sem envio em massa. Faça loop na API; o limitador de requisições por cliente (Chaves de API → Limite de requisições) é o seu throttle. Batching estilo Stripe está no roadmap.
- Sem "agendar envio". Agende do seu lado e nos chame na hora de disparar.
O protocolo do WhatsApp Web não expõe "usuário abriu a mensagem" de volta ao
remetente da mesma forma que a Cloud API oficial faz. Emitimos um webhook
message.delivered quando o lado do WhatsApp confirma o recebimento, mas
paridade com confirmação de leitura não é algo que conseguimos oferecer.