POST /send-conversation-message
Envia texto e/ou imagem (ou outro tipo de mídia) dentro de uma conversa de WhatsApp já existente. Diferente de `POST /send-message`, a mensagem enviada aqui é gravada na linha do tempo da conversa: aparece no inbox do atendimento e entra no histórico que o agente de IA usa como contexto na próxima resposta.
Use este endpoint quando o resultado de um processo assíncrono (uma automação no n8n, um workflow de geração de imagem, um sistema externo qualquer) precisa ser entregue de volta numa conversa que já estava em andamento.
| Campo | Valor |
|---|---|
| URL | https://api.wevi.chat/functions/v1/send-conversation-message |
| Método | POST |
| Auth | Authorization: Bearer wevi_... (API key) |
| Content-Type | application/json |
| Rate limit | 60 req/min por API key |
| Plano necessário | Pro ou Ultra |
Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
conversation_id |
string (uuid) | condicional | ID da conversa. É o mesmo conversation_id que a Wevi envia automaticamente (dentro de _wevi.conversation_id) quando um agente dispara uma ação customizada pro seu sistema — use-o de volta aqui pra responder na mesma conversa. |
connection_id |
string (uuid) | condicional | Alternativa a conversation_id: ID da conexão WhatsApp. Use junto com to quando seu sistema só sabe o telefone do contato. |
to |
string | condicional | Telefone do contato (com ou sem +55). Obrigatório se usar connection_id em vez de conversation_id. |
text |
string | condicional | Texto da mensagem. Se enviado junto com media, vira a legenda (exceto em áudio). |
media |
objeto | condicional | Mídia a enviar. Veja campos abaixo. |
media.url |
string (URL) | condicional | URL pública do arquivo. Use media.url OU media.base64, não precisa dos dois. |
media.base64 |
string | condicional | Conteúdo do arquivo em base64 (com ou sem o prefixo data:image/png;base64,...). Não precisa hospedar o arquivo em lugar nenhum, o Wevichat sobe automaticamente. Útil quando seu sistema (ex: um workflow no n8n) já tem os bytes do arquivo em mãos e não tem onde hospedar. |
media.type |
string | sim, se media |
image, audio, video ou document. |
media.mime_type |
string | sim, se media |
Ex: image/png, application/pdf. |
media.name |
string | não | Nome do arquivo (usado em document). |
idempotency_key |
string | não | Evita duplicação em retries. |
É preciso informar conversation_id OU (connection_id + to). É preciso informar text e/ou media. Dentro de media, é preciso informar url OU base64.
Exemplos
Respondendo numa conversa já existente, com o conversation_id recebido de volta na ação customizada:
curl -X POST https://api.wevi.chat/functions/v1/send-conversation-message \
-H "Authorization: Bearer wevi_abc123..." \
-H "Content-Type: application/json" \
-d '{
"conversation_id": "conversa-uuid",
"text": "Prontinho! Aqui está sua imagem.",
"media": {
"url": "https://exemplo.com/resultado.png",
"type": "image",
"mime_type": "image/png"
}
}'
Sem conversation_id, só com telefone:
curl -X POST https://api.wevi.chat/functions/v1/send-conversation-message \
-H "Authorization: Bearer wevi_abc123..." \
-H "Content-Type: application/json" \
-d '{
"connection_id": "conn-uuid",
"to": "+5511999999999",
"text": "Sua imagem ficou pronta!"
}'
Enviando a imagem em base64, sem hospedar em lugar nenhum (ex: n8n com o resultado ainda em memória, como Binary Data):
{
"conversation_id": "conversa-uuid",
"text": "Prontinho! Aqui está sua imagem.",
"media": {
"base64": "iVBORw0KGgoAAAANSUhEUgAA...",
"type": "image",
"mime_type": "image/png"
}
}
No n8n, se o resultado vier como binary data de um nó anterior, use uma expressão tipo {{ $binary.data.data }} (ou o node Extract From File / Move Binary Data configurado pra base64) pra pegar a string e colocar em media.base64.
Resposta
Sucesso (200)
{
"id": "mensagem-uuid",
"wamid": "wamid.HBgN...",
"status": "sent"
}
Erros HTTP
| Status | error |
|---|---|
| 400 | conversation_id or (connection_id and to) is required, text or media is required, erros de validação de media |
| 401 | Invalid API key |
| 402 | plan_limit_exceeded |
| 404 | Conversation not found, Connection not found, Not a WhatsApp conversation |
| 429 | Too many requests |
| 500 | WhatsApp API error (a mensagem não é gravada na conversa se o envio falhar), Failed to upload media (erro ao subir o media.base64 pro storage) |
Como funciona o fluxo de processos demorados (n8n e afins)
Um caso comum: um agente do WhatsApp dispara uma ação customizada (webhook) pra um workflow no n8n que demora minutos pra terminar (ex: gerar uma imagem com IA). O n8n deve responder rápido (200) pra ação customizada assim que o workflow começa, sem esperar terminar, e continuar processando em background. Quando o resultado ficar pronto, o próprio n8n chama send-conversation-message usando o conversation_id que recebeu no payload original (dentro de _wevi.conversation_id), entregando o resultado na mesma conversa.
Quando usar
- Entregar o resultado de um processo assíncrono (geração de imagem, processamento de arquivo, integração demorada) de volta numa conversa que já estava em andamento.
- Continuar um atendimento a partir de um sistema externo, mantendo o histórico e o contexto da IA íntegros.
Pra um envio avulso que não precisa aparecer na timeline da conversa (ex: campanha, notificação isolada), use `/send-message` ou `/send-template`.