Documentação / Completo
Modelos com imagem, documento e botões
POST /v1/messages
Programa com IA? Conecte-a à sua conta por MCP: ela revisa sua configuração, cria webhooks e modelos com sua confirmação e escreve o código. Veja como →
Envie um modelo rico sem montar os components da Meta. Em POST /v1/messages com type: "template", em vez de components você pode enviar três campos e o Connect monta o resto, exato:
- header — { "type": "document", "link": "https://…/A-1042.pdf", "filename": "Fatura A-1042.pdf" }. Também image e video (com mediaId ou link), text ({ "type": "text", "text": "…" }) e location (latitude, longitude, name, address). filename vale só para documentos: é o nome que o contato vê.
- body — uma lista para {{1}}, {{2}}… (["Maria", "A-1042"]) ou, se o modelo usa variáveis com nome, um objeto ({ "nome": "Maria" }).
- buttons — os botões que levam um valor: url → text (o final da URL dinâmica), copy_code → code, quick_reply → payload (volta no message.received quando o contato toca). A posição (index) deduzimos do modelo aprovado; se ainda não sincronizamos, envie você (a partir de 0).
Os erros chegam todos juntos e antes da Meta. Se conhecemos o modelo, conferimos quantas variáveis tem, seus nomes, seus botões e o tipo de cabeçalho: 400 TEMPLATE_SEND_INVALID com details.errors[], cada um com seu field (o caminho no seu JSON) e a mensagem no seu idioma. Nada é enviado à Meta.
O percurso: crie o modelo (com arquivo ou botões: POST /v1/templates, veja «Criar modelos com imagem, documento e botões») → POST /v1/templates/sync → espere o webhook template.status_changed com APPROVED → envie como acima → acompanhe com GET /v1/messages/{id} ou os webhooks message.sent / delivered / read / failed.
curl -X POST https://api.waiaconnect.com/v1/messages \
-H "Authorization: Bearer wc_live_YOUR_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to":"5493511234567","type":"template","template":{"name":"envio_factura","language":"es","header":{"type":"document","link":"https://your-server.example/invoices/A-1042.pdf","filename":"Factura A-1042.pdf"},"body":["María","A-1042"],"buttons":[{"type":"url","text":"A-1042"}]}}'
# header: image | video | document (mediaId OR link; filename = documents only) | text | location
# body: ["v1","v2"] for {{1}},{{2}} — or {"name":"v1"} for named {{variables}}
# buttons: url → text (the URL suffix) · copy_code → code · quick_reply → payload
# Every mistake comes back at once: 400 TEMPLATE_SEND_INVALID, details.errors[].fieldcomponents continua funcionando igual. Envie um ou outro, não os dois.
Mídia avulsa (dentro das 24 h): type image, document, video, audio ou sticker (WEBP, sem legenda), com link ou id (também mediaId).
Se a Meta pausar ou desativar o modelo pela qualidade, a mensagem falha com TEMPLATE_PAUSED ou TEMPLATE_DISABLED e não é reenviada.
O link precisa ser https e apontar direto para o arquivo (um link de «compartilhar» do Drive não serve). Limites da Meta: documento 100 MB, imagem 5 MB, vídeo 16 MB.