/templates
Consulta os templates de WhatsApp da organização e sincroniza o que mudou na Meta.
Escopo necessário: agents:read para ler, agents:write para sincronizar. Limite: 60 requisições por minuto.
Endpoints
| Método | Rota | Faz |
|---|---|---|
| GET | /templates |
Lista, com filtros |
| GET | /templates/{id} |
Um template, pelo id da Wevichat ou pelo Meta ID |
| POST | /templates/sync |
Puxa da Meta status e textos atualizados |
| POST | /templates |
Cria e submete um template à aprovação da Meta |
| DELETE | /templates/{id} |
Apaga na Meta e aqui |
Filtros da lista
| Parâmetro | Exemplo | Descrição |
|---|---|---|
connection_id |
uuid | Templates de um número |
status |
APPROVED |
APPROVED, PENDING, REJECTED, PAUSED, DISABLED |
category |
MARKETING |
MARKETING, UTILITY ou AUTHENTICATION |
name |
reativa_teste |
Nome exato |
Descobrir quantas variáveis um template pede
body_variables diz quantos itens body_params espera no envio. É a dúvida número um de quem dispara template pela API.
curl "https://api.wevi.chat/functions/v1/templates?status=APPROVED" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
const res = await fetch("https://api.wevi.chat/functions/v1/templates?status=APPROVED", {
headers: { Authorization: "Bearer wevi_SUA_CHAVE" },
});
const { data } = await res.json();
for (const t of data) {
console.log(`${t.name}: ${t.body_variables} variável(is)`);
}
Objeto do template
{
"id": "dddd0000-0000-4000-8000-0000000000b2",
"meta_id": "861158853461723",
"name": "promocao_clareamento",
"category": "MARKETING",
"language_code": "pt_BR",
"status": "APPROVED",
"connection_id": "dddd0000-...",
"header": null,
"body": "Oi {{1}}! Este mês o clareamento está com condição especial.",
"footer": null,
"buttons": [],
"carousel_cards": null,
"body_variables": 1,
"rejection_reason": null,
"created_at": "2026-06-20T10:00:00Z",
"updated_at": "2026-06-21T09:12:00Z"
}
Sincronizar com a Meta
Template aprovado, rejeitado ou pausado do lado da Meta só reflete aqui depois de uma sincronização. O painel faz isso quando você abre a tela de Templates; pela API você chama quando quiser.
curl -X POST "https://api.wevi.chat/functions/v1/templates/sync" \
-H "Authorization: Bearer wevi_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"connection_id":"dddd0000-0000-4000-8000-0000000000aa"}'
Resposta:
{ "ok": true, "imported": 2, "updated": 7, "total": 9 }
imported são templates que existiam só na Meta e passaram a existir aqui. updated são os que já existiam e tiveram status ou texto atualizados.
Erros
| Status | error |
Quando |
|---|---|---|
| 400 | missing_connection_id |
Faltou connection_id no corpo |
| 404 | template_not_found |
Id ou Meta ID não existe nesta organização |
| 404 | connection_not_found |
connection_id não é desta organização |
| 422 | connection_without_waba |
A conexão não tem WABA, então não há o que sincronizar |
| 422 | meta_sync_failed |
A Meta recusou a chamada; a mensagem dela vem em message |
Criar um template
curl -X POST "https://api.wevi.chat/functions/v1/templates" \
-H "Authorization: Bearer wevi_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"connection_id": "dddd0000-...",
"name": "confirmacao_pedido",
"category": "UTILITY",
"language_code": "pt_BR",
"body_text": "Oi {{1}}! Seu pedido {{2}} foi confirmado.",
"footer_text": "Loja Exemplo"
}'
O nome só aceita minúsculas, números e underline. A Meta analisa e responde em minutos ou horas: acompanhe o status por GET /templates ou assine o webhook template.status_changed, que avisa quando aprova ou rejeita.
Categoria MARKETING costuma demorar mais e ser recusada com mais frequência que UTILITY. Se o conteúdo é transacional, declare como utilidade.
Apagar
curl -X DELETE "https://api.wevi.chat/functions/v1/templates/{id}" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
Aceita o id da Wevichat ou o Meta ID. Apagar remove o template da sua conta na Meta: campanha que dependia dele para de funcionar.
Próximo
Metadados da organização