# Enviar mensagens

> Texto, template e botões pela API, com a janela de 24 h e os erros comuns.

Fonte: https://developers.converzap.com/pt/enviar-mensagens

## 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.open` e `window.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

```bash
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)

```json
{
  "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

```json
{
  "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.
