WABA API

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. body lista las variables en orden ("1", "2" o su nombre) y headerFormat indica 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.

CampoReglas
nameMinúsculas, números y _.
languageCódigo de idioma de Meta: es, es_PE, en_US…
categoryUTILITY (por defecto), MARKETING o AUTHENTICATION. Las de autenticación necesitan components en el formato de Meta.
header, footer, buttonsOpcionales. 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. Revisa status hasta que sea APPROVED o REJECTED.
  • Recibir un aviso: configura un webhook con el evento waba.template.status. Llega cuando Meta aprueba, rechaza o pausa la plantilla, con el motivo en reason si 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.