Antes de enviar
O WhatsApp tem duas regras da Meta que a API aplica igual à tela:
- Janela de 24 h: até 24 h depois da última mensagem do contato, dá para mandar texto, botões ou lista. A conversa mostra isso em
window.openewindow.expires_at. - Fora da janela, só template aprovado (
GET /v1/templates?status=approved).
Quem pediu para sair (opt-out) não recebe template; responde-se só se ele escrever de novo.
Texto
curl -X POST https://api.converzap.com/v1/conversations/CONVERSA_ID/messages \
-H "Authorization: Bearer czk_live_SUA_CHAVE" \
-H "Idempotency-Key: 6c1f0e2a-5b7d-4c1e-9b1a-1f2e3d4c5b6a" \
-H "Content-Type: application/json" \
-d '{ "type": "text", "text": "Oi, Ana! Seu pedido saiu para entrega." }'
Template (fora da janela)
{
"type": "template",
"template": {
"name": "lembrete_consulta",
"language": "pt_BR",
"params": { "body": ["Ana", "amanhã às 15h"] }
}
}
Variáveis: body como lista ({{1}}, {{2}}…) ou objeto (nomeadas: { "nome": "Ana" }), header igual, buttons: { "0": "sufixo-da-url" }. Também aceita template.id no lugar de nome + idioma.
Botões e lista
{
"type": "interactive",
"interactive": {
"type": "buttons",
"body": "Confirma a consulta de amanhã?",
"buttons": [{ "id": "sim", "title": "Confirmo" }, { "id": "nao", "title": "Remarcar" }]
}
}
A resposta do contato chega como mensagem de texto com o título do botão (e no webhook message.received).
O que acontece ao enviar
- Quem envia vira o responsável da conversa, se ela não tinha um.
- O agente de IA do número registra a fala humana e pausa, se estiver configurado para isso.
- A mensagem aparece na caixa de entrada como enviada pelo usuário da chave.
Erros comuns
| code | O que fazer |
|---|---|
outside_24h_window | Use um template aprovado. |
opt_out | O contato pediu para sair; espere ele escrever. |
template_invalid | Nome/idioma errado ou template não aprovado para este número. |
template_param_missing | Falta uma variável; o detail diz qual. |
number_disconnected / number_blocked | Número desconectado ou travado pela Meta; veja a Saúde do WhatsApp no app. |
meta_error | A Meta recusou; o detail traz a mensagem dela. |
Sempre envie Idempotency-Key: se a rede cair e você repetir, a mensagem não sai duas vezes.