POST /send-template
Envia uma mensagem WhatsApp usando um template previamente aprovado pelo Meta. Esta é a única forma de iniciar conversa fora da janela de 24h ou de mandar mensagem proativa.
| Campo | Valor |
|---|---|
| URL | https://api.wevi.chat/functions/v1/send-template |
| 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 |
Pré-requisitos
- WhatsApp conectado em Conta → WhatsApp Business. Anote o
connection_id. - Template aprovado pelo Meta: criado em WhatsApp Business → Templates, com status
APPROVED. - API key criada em Conta → Desenvolvedores → API Keys.
Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
connection_id |
string (uuid) | sim | ID da conexão WhatsApp da sua org. |
template_name |
string | sim | Nome exato do template (case-sensitive). |
to |
string | sim | Telefone destino. Aceita formato BR (com ou sem +55) ou internacional. |
language_code |
string | não | Idioma do template. Padrão: pt_BR. |
body_params |
array de strings | não | Variáveis do corpo na ordem {{1}}, {{2}}, {{3}}. |
header_image_url |
string (URL pública) | não | Pra templates com header tipo imagem. |
contact_id |
string (uuid) | não | Vincula o envio a um contato da Wevi. Permite usar variáveis dinâmicas (veja abaixo). |
idempotency_key |
string | não | Chave única pra evitar duplicação em retries. Veja erros. |
Variáveis dinâmicas em body_params
Se você passar contact_id, os body_params podem conter substituições que a Wevi resolve antes de mandar pro Meta:
| Variável | Vira |
|---|---|
{{contact_name}} |
contacts.display_name |
{{contact_phone}} |
telefone normalizado |
{{chave_custom}} |
valor de contact.custom_fields["chave_custom"] |
Exemplo: template "Olá {{1}}, seu pedido {{2}} foi confirmado.", chamando com:
{
"body_params": ["{{contact_name}}", "12345"],
"contact_id": "uuid-do-cliente"
}
vira "Olá João Silva, seu pedido 12345 foi confirmado."
Exemplos
Template simples sem variáveis
curl -X POST https://api.wevi.chat/functions/v1/send-template \
-H "Authorization: Bearer wevi_abc123..." \
-H "Content-Type: application/json" \
-d '{
"connection_id": "conn-uuid",
"template_name": "boas_vindas",
"to": "+5511999999999"
}'
await fetch("https://api.wevi.chat/functions/v1/send-template", {
method: "POST",
headers: {
"Authorization": "Bearer wevi_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
connection_id: "conn-uuid",
template_name: "boas_vindas",
to: "+5511999999999",
}),
});
Com variáveis e contact_id
curl -X POST https://api.wevi.chat/functions/v1/send-template \
-H "Authorization: Bearer wevi_abc123..." \
-H "Content-Type: application/json" \
-d '{
"connection_id": "conn-uuid",
"template_name": "pedido_confirmado",
"to": "+5511999999999",
"body_params": ["{{contact_name}}", "12345", "R$ 297,00"],
"contact_id": "contact-uuid",
"idempotency_key": "pedido-12345-confirmacao"
}'
await fetch("https://api.wevi.chat/functions/v1/send-template", {
method: "POST",
headers: {
"Authorization": "Bearer wevi_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
connection_id: "conn-uuid",
template_name: "pedido_confirmado",
to: "+5511999999999",
body_params: ["{{contact_name}}", "12345", "R$ 297,00"],
contact_id: "contact-uuid",
idempotency_key: "pedido-12345-confirmacao",
}),
});
Com header de imagem
curl -X POST https://api.wevi.chat/functions/v1/send-template \
-H "Authorization: Bearer wevi_abc123..." \
-H "Content-Type: application/json" \
-d '{
"connection_id": "conn-uuid",
"template_name": "promocao_imagem",
"to": "+5511999999999",
"header_image_url": "https://meusite.com/banner-promo.png",
"body_params": ["50%"]
}'
await fetch("https://api.wevi.chat/functions/v1/send-template", {
method: "POST",
headers: {
"Authorization": "Bearer wevi_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
connection_id: "conn-uuid",
template_name: "promocao_imagem",
to: "+5511999999999",
header_image_url: "https://meusite.com/banner-promo.png",
body_params: ["50%"],
}),
});
Resposta
Sucesso (200)
{
"id": "envio-uuid",
"wamid": "wamid.HBgN...",
"status": "sent"
}
id: ID do envio na Wevi (use em logs/idempotency).wamid: WhatsApp message ID retornado pelo Meta.status: começasent. Viradelivered,readoufailedconforme webhook do Meta atualiza.
Falha do Meta (200 mas status: "failed")
{
"id": "envio-uuid",
"status": "failed",
"error": "Template not approved in this language"
}
Casos comuns: template ainda em pending, idioma inválido, número bloqueado.
Erros HTTP
| Status | error |
|---|---|
| 400 | connection_id is required, template_name is required, to is required |
| 401 | Invalid API key |
| 402 | plan_limit_exceeded (sem WhatsApp no plano) |
| 404 | Connection not found |
| 429 | Too many requests |
Diferença pro /send-message
/send-template |
/send-message |
|
|---|---|---|
| Pra quê | Mensagem proativa, fora ou dentro da janela 24h | Resposta textual dentro da janela 24h |
| Precisa template aprovado? | Sim | Não |
| Aceita mídia? | Sim, via header_image_url |
Não (só texto) |
| Variáveis? | Sim, no body_params |
Não |
Veja `POST /send-message`.
Próximo
/send-message