Documentación / Completo
Plantillas con imagen, documento y botones
POST /v1/messages
¿Programás con IA? Conectala a tu cuenta por MCP: revisa tu configuración, crea webhooks y plantillas con tu confirmación y te escribe el código. Ver cómo →
Mandá una plantilla rica sin armar los components de Meta. En POST /v1/messages con type: "template", en vez de components podés mandar tres campos y Connect arma el resto, exacto:
- header — { "type": "document", "link": "https://…/A-1042.pdf", "filename": "Factura A-1042.pdf" }. También image y video (con mediaId o link), text ({ "type": "text", "text": "…" }) y location (latitude, longitude, name, address). filename es sólo para documentos: es el nombre que ve el contacto.
- body — una lista para {{1}}, {{2}}… (["María", "A-1042"]) o, si la plantilla usa variables con nombre, un objeto ({ "nombre": "María" }).
- buttons — los botones que llevan un valor: url → text (el final de la URL dinámica), copy_code → code, quick_reply → payload (vuelve en el message.received cuando el contacto lo toca). La posición (index) la deducimos de la plantilla aprobada; si todavía no la sincronizamos, mandala vos (desde 0).
Los errores llegan todos juntos y antes de Meta. Si conocemos la plantilla, comprobamos cuántas variables tiene, sus nombres, sus botones y el tipo de encabezado: 400 TEMPLATE_SEND_INVALID con details.errors[], cada uno con su field (la ruta en tu JSON) y el mensaje en tu idioma. No se manda nada a Meta.
El recorrido: creá la plantilla (con archivo o botones: POST /v1/templates, ver «Crear plantillas con imagen, documento y botones») → POST /v1/templates/sync → esperá el webhook template.status_changed con APPROVED → mandala como arriba → seguí el envío con GET /v1/messages/{id} o los 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 sigue funcionando igual. Mandá uno de los dos, no ambos.
Media suelta (dentro de las 24 h): type image, document, video, audio o sticker (WEBP, sin texto), con link o id (también mediaId).
Si Meta pausa o deshabilita la plantilla por su calidad, el mensaje falla con TEMPLATE_PAUSED o TEMPLATE_DISABLED y no se reintenta.
El enlace tiene que ser https y apuntar directo al archivo (un enlace de «compartir» de Drive no sirve). Límites de Meta: documento 100 MB, imagen 5 MB, video 16 MB.