Enviar Template
Envie uma mensagem a partir de um template cadastrado na instância. O endpoint detecta automaticamente o provider da instância (Meta oficial via Hub Message ou Z-API) — você não precisa informar de qual tipo é o template.
POST https://wapi.stegia.com.br/functions/v1/send-template-message
Para templates Meta, é a única forma de enviar mensagens fora da janela de 24h. O template precisa estar com meta_status = APPROVED e sincronizado (meta_template_id preenchido).
| Header | Valor |
|---|
Content-Type | application/json |
apikey | sua publishable key |
Authorization | Bearer {seu_token} |
Parâmetros do Body
| Campo | Tipo | Obrigatório | Descrição |
|---|
templateId | string (uuid) | ✅ | ID do template em message_templates |
instanceId | string | ⚠️ | ID da instância. Opcional se o template já estiver vinculado a uma única instância |
phone | string | ✅ | Destinatário (5511999999999, sem + ou formatação) |
variables | object | ❌ | Mapa de variáveis para preencher BODY, HEADER e BUTTONS |
O que vai automático (não precisa enviar)
Tudo que faz parte do template aprovado pela Meta vai automaticamente em todo envio — você não precisa repetir na requisição:
- Cabeçalho de TEXTO sem variável (ex.:
"Boas-vindas!")
- Rodapé (sempre estático)
- Botões fixos:
QUICK_REPLY, PHONE_NUMBER, URL sem variável
Se o template é totalmente estático, basta enviar templateId, instanceId e phone — o variables pode ser {} ou omitido.
O que precisa em variables
Só os elementos dinâmicos do template aprovado:
| Chave | Quando usar |
|---|
nome, telefone | Auto-preenchidas a partir do contato (sobrescritíveis) |
header | Cabeçalho de TEXTO com {{1}} ou cabeçalho de mídia (IMAGE/VIDEO/DOCUMENT) — informe a URL pública (ou { id, link }) do arquivo |
button_1, button_2, button_3 | Sufixo dinâmico de botões URL que contêm {{1}} no final (numerado pela posição do botão, 1-based) |
button_1_payload | Payload de botão QUICK_REPLY (raramente usado) |
Nomes do corpo (pedido, valor, …) ou "1", "2" | Substituem as variáveis do BODY conforme o parameter_format |
A função detecta automaticamente o parameter_format do template:
POSITIONAL → use chaves numéricas: { "1": "João", "2": "12345" }
NAMED → use os próprios nomes: { "nome": "João", "pedido": "12345" }
A Meta não permite misturar {{1}} e {{nome}} no mesmo template.
Exemplos
curl -X POST https://wapi.stegia.com.br/functions/v1/send-template-message \
-H "Content-Type: application/json" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-d '{
"templateId": "00000000-0000-0000-0000-000000000000",
"instanceId": "INSTANCE_ID",
"phone": "5511999999999",
"variables": {
"nome": "João",
"pedido": "12345",
"header": "https://cdn.exemplo.com/banner.jpg",
"button_1": "https://app.exemplo.com/track/12345"
}
}'
curl -X POST https://wapi.stegia.com.br/functions/v1/send-template-message \
-H "Content-Type: application/json" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-d '{
"templateId": "00000000-0000-0000-0000-000000000000",
"phone": "5511999999999",
"variables": { "1": "João", "2": "12345" }
}'
Template totalmente estático (sem variáveis)
curl -X POST https://wapi.stegia.com.br/functions/v1/send-template-message \
-H "Content-Type: application/json" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-d '{
"templateId": "00000000-0000-0000-0000-000000000000",
"instanceId": "INSTANCE_ID",
"phone": "5511999999999"
}'
Template Z-API (texto livre)
curl -X POST https://wapi.stegia.com.br/functions/v1/send-template-message \
-H "Content-Type: application/json" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-d '{
"templateId": "00000000-0000-0000-0000-000000000000",
"phone": "5511999999999",
"variables": { "nome": "João", "pedido": "12345" }
}'
Respostas
Sucesso (200)
{
"success": true,
"provider": "meta",
"templateId": "uuid",
"templateName": "boas_vindas",
"phone": "5511999999999",
"messageId": "wamid.HBgN..."
}
Erros
| Status | error | Quando ocorre |
|---|
| 400 | templateId and phone are required | Body inválido |
| 400 | template_not_synced_with_meta | Template Meta sem meta_template_id |
| 400 | template_not_approved | Status do template Meta ≠ APPROVED |
| 400 | missing_variables | Faltou variável (campo missing[] lista quais) |
| 400 | meta_outbound_channel_not_configured | Instância Meta sem instance_id |
| 403 | Template does not belong to this instance | instanceId divergente do template |
| 404 | Template not found / Instance not found | IDs inválidos |
| 502 | meta_template_send_failed | Falha vinda da Hub Message (campo details) |