Plantillas
Lista, crea y consulta plantillas de WhatsApp, el único tipo de mensaje que puedes enviar a alguien que no te escribió en las últimas 24 horas.
Una plantilla es un mensaje que Meta revisa y aprueba antes de que puedas usarlo. Es obligatoria para escribir a un cliente que no te envió un mensaje en las últimas 24 horas: confirmaciones, recordatorios, campañas o el primer contacto desde tu CRM.
Todas las rutas de esta guía empiezan con https://api.whapi.chat/waba-api.
Elegir la línea
Si tu empresa tiene más de una línea de WhatsApp Business API, indica cuál usar con wabaPhoneNumberId. Ese es el id que devuelve GET /phone-numbers:
curl https://api.whapi.chat/waba-api/phone-numbers \
--header 'Authorization: Bearer TU_CLAVE'
Con una sola línea activa, puedes omitirlo.
Listar plantillas
curl 'https://api.whapi.chat/waba-api/templates?wabaPhoneNumberId=3' \
--header 'Authorization: Bearer TU_CLAVE'
Por defecto solo devuelve las APPROVED. Usa status=all para verlas todas, o una lista como status=APPROVED,PENDING.
Cada plantilla trae dos campos pensados para tu interfaz:
preview: los textos del encabezado, cuerpo, pie y botones, con las variables sin reemplazar. Sirve para mostrarla en un selector.variables: lo que tienes que completar al enviarla.bodylista las variables en orden ("1","2"o su nombre) yheaderFormatindica si el encabezado lleva imagen, video o documento.
Crear una plantilla
Envía el texto con las variables entre llaves dobles y un ejemplo de cada una. Meta exige los ejemplos para revisarla.
Variables por nombre:
curl https://api.whapi.chat/waba-api/templates \
--header 'Authorization: Bearer TU_CLAVE' \
--header 'Content-Type: application/json' \
--data '{
"name": "acceso_postulante",
"language": "es",
"category": "UTILITY",
"body": "Hola, tu correo es {{correo_postulante}} y tu contraseña temporal es {{contrasena_postulante}}.",
"examples": {
"correo_postulante": "[email protected]",
"contrasena_postulante": "Temp1234"
}
}'
Variables por posición: usa {{1}}, {{2}}… y pasa examples como lista, en el mismo orden. No mezcles los dos estilos en un mismo texto.
| Campo | Reglas |
|---|---|
name | Minúsculas, números y _. |
language | Código de idioma de Meta: es, es_PE, en_US… |
category | UTILITY (por defecto), MARKETING o AUTHENTICATION. Las de autenticación necesitan components en el formato de Meta. |
header, footer, buttons | Opcionales. header puede ser { "type": "TEXT", "text": "…" }. |
La respuesta es 201 con status: "PENDING": Meta todavía no la revisó.
Encabezado con imagen, video o PDF
Envía el request como multipart/form-data y adjunta el archivo de ejemplo en headerMedia. Los campos que son objetos (examples, buttons) van como texto JSON:
curl https://api.whapi.chat/waba-api/templates \
--header 'Authorization: Bearer TU_CLAVE' \
--form name=envio_cotizacion \
--form language=es \
--form 'body=Hola {{1}}, te enviamos tu cotización.' \
--form 'examples=["Ana"]' \
--form [email protected]
Ese archivo también queda como archivo predeterminado del encabezado: puedes reutilizarlo al enviar la plantilla con useDefaultHeaderMedia: true (ver Enviar mensajes). Para cambiarlo después, usa PUT /templates/{name}/header-media.
Saber si Meta la aprobó
La revisión suele tardar de minutos a unas horas. Tienes dos formas de enterarte:
- Consultar:
GET /templates/{name}devuelve la plantilla en cualquier estado. Revisastatushasta que seaAPPROVEDoREJECTED. - Recibir un aviso: configura un webhook con el evento
waba.template.status. Llega cuando Meta aprueba, rechaza o pausa la plantilla, con el motivo enreasonsi lo hay. Ver Configurar webhooks.
Eliminar una plantilla
curl --request DELETE https://api.whapi.chat/waba-api/templates/acceso_postulante \
--header 'Authorization: Bearer TU_CLAVE'
Elimina la plantilla en Meta en todos sus idiomas y no se puede deshacer.
Todos los campos y errores: referencia de plantillas.