Template com arquivo no cabeçalho
Como enviar um template oficial com documento, imagem ou vídeo no cabeçalho — uma fatura em PDF diferente para cada cliente.
https://app.syncro.chat/api/v1AuthX-API-Key: crm_SUA_CHAVE_AQUIPré-requisitos
Templates oficiais da Meta podem ter um cabeçalho de documento, imagem ou vídeo. O arquivo não faz parte do template aprovado: ele vai em cada envio, e pode ser diferente para cada destinatário.
É assim que se manda uma fatura em PDF por cliente, um comprovante, um boleto ou uma etiqueta de envio.
- O número precisa ser da API Oficial da Meta (
provider: "cloud_api"). Números conectados por QR Code não enviam templates. - O template precisa estar aprovado (
status: "APPROVED") e ter sido criado com cabeçalho de mídia. O cabeçalho é definido na criação do template, no painel — não dá para adicionar um arquivo a um template de texto. - O arquivo precisa estar numa URL pública. A Meta baixa o endereço pelos servidores dela; URL protegida por login, VPN ou IP liberado não funciona. Use um link assinado de validade longa se o arquivo for sensível.
Os limites de tamanho e de formato são os da Meta, não nossos.
Descobrir se um template exige arquivo
GET /whatsapp/templates devolve os components do template como a Meta os publica. Procure o componente HEADER e leia o format:
curl "https://app.syncro.chat/api/v1/whatsapp/templates?status=APPROVED" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true,
"data": [
{
"id": 10,
"name": "fatura_mensal",
"language": "pt_BR",
"category": "UTILITY",
"status": "APPROVED",
"variables": ["1", "2"],
"components": [
{ "type": "HEADER", "format": "DOCUMENT" },
{ "type": "BODY", "text": "Olá {{1}}, sua fatura vence em {{2}}." }
]
}
]
}
format do HEADER |
O que mandar |
|---|---|
TEXT ou ausente |
nada — o cabeçalho é texto fixo |
DOCUMENT |
header_media_url apontando para o arquivo (PDF, por exemplo) |
IMAGE |
header_media_url apontando para a imagem |
VIDEO |
header_media_url apontando para o vídeo |
Template com cabeçalho de mídia sem
header_media_urlé recusado com422antes de qualquer envio.
Enviar
O envio usa o mesmo endpoint de sempre: POST /leads/{id}/send-whatsapp-template, com permissão whatsapp:write. A tabela completa de parâmetros está lá.
Uma fatura diferente por cliente
curl -X POST https://app.syncro.chat/api/v1/leads/123/send-whatsapp-template \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"template_id": 10,
"variables": { "1": "João", "2": "30/07" },
"header_media_url": "https://seudominio.com/faturas/8842.pdf",
"header_media_filename": "Fatura-Julho-2026.pdf"
}'
{
"success": true,
"conversation_id": 99,
"message_id": 457,
"provider_msg_id": "wamid.xyz456",
"template_name": "fatura_mensal"
}
Para disparar em lote, repita a chamada por destinatário trocando o header_media_url. É o único caminho que permite um arquivo por contato — o disparo em massa do painel usa a mesma mídia para a campanha inteira.
Sobre o header_media_filename
Sem ele, o contato vê o nome que a Meta conseguir deduzir da URL — que costuma ser o identificador do arquivo. Com ele, vê o nome que você escolher:
Sem header_media_filename |
Com |
|---|---|
8842.pdf |
Fatura-Julho-2026.pdf |
Em cabeçalho IMAGE e VIDEO o campo é ignorado: a Meta não exibe nome de arquivo nesses tipos.
Variáveis
A chave é o número do {{N}} no corpo aprovado do template:
{ "variables": { "1": "João", "2": "30/07" } }
Uma lista na ordem também é aceita e equivale ao mapa acima:
{ "variables": ["João", "30/07"] }
Duas regras da Meta que valem lembrar, porque ela recusa o envio inteiro quando são violadas:
- variável não pode ir vazia;
- variável não pode conter quebra de linha.
Se o template tiver cabeçalho de texto com variável ({{1}} dentro do HEADER), passe esse valor na chave header_1, para não disputar a posição com o corpo:
{ "variables": { "header_1": "Julho", "1": "João", "2": "30/07" } }
Erros
| HTTP | Corpo | O que fazer |
|---|---|---|
422 |
skip_reason: "header_media_required", com header_format |
O template exige arquivo no cabeçalho. Mande header_media_url |
422 |
Envio de template requer instancia Cloud API. |
O número é QR Code. Use um número da API Oficial |
422 |
Lead sem telefone cadastrado. |
O lead precisa ter telefone |
502 |
Provedor retornou erro: … com raw |
A Meta recusou. O raw traz o erro original dela |
Exemplo do 422 de cabeçalho:
{
"success": false,
"message": "O template \"fatura_mensal\" tem cabecalho de document e exige `header_media_url` com a URL publica do arquivo.",
"skip_reason": "header_media_required",
"header_format": "DOCUMENT"
}
Esse erro vem antes do envio e antes de a conversa ser criada — uma integração em laço pode tentar de novo sem sujar o inbox.
O que a API não faz
- Não aceita upload do arquivo. Só URL pública; não há
multipart/form-datanem base64. O arquivo fica hospedado no seu lado. - Não envia documento fora de template.
POST /leads/{id}/send-whatsappsó aceitatype: "text"etype: "image". - Não cria templates. A criação, com o cabeçalho de mídia e o arquivo de exemplo que a Meta exige na aprovação, é feita no painel.