Skip to content
WhatIsUp.dev

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.

O envio é assíncrono — a API retorna na hora, o estado de entrega volta como um webhook.

Enviar uma mensagem

POST/v1/channels/:id/messagesBearer · API key

O canal precisa estar connected. Enviar enquanto está pending / qr / disconnected retorna 409 not_connected.

Schema · Request body
FieldTypeRequiredNotes

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"}}'
Schema · Response
FieldTypeRequiredNotes
message_idstringrequired
client_refstringrequired · 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.