Skip to content

Enviar mensaje con plantilla

POST /api/v1/message_templates/send

Este endpoint permite enviar un mensaje utilizando una plantilla predefinida de WhatsApp. Las plantillas permiten mantener un formato estandarizado y estructurado en la comunicación, asegurando que los mensajes enviados sean consistentes y cumplan con las políticas de WhatsApp Business API.

El mensaje se envía desde un número autorizado a un destinatario específico, permitiendo personalizar su contenido mediante la inclusión de parámetros dinámicos en el cuerpo del mensaje o en su encabezado. Esto es especialmente útil para enviar notificaciones automatizadas, recordatorios, confirmaciones de citas, entre otros casos de uso.

Las respuestas que los clientes envíen pueden ser dirigidas o procesadas de diferentes formas, como una campaña o un chatbot específico, según la configuración del parámetro response_handler.

El endpoint requiere una solicitud POST con un cuerpo en formato JSON que especifique el número de origen, el destinatario, el nombre de la plantilla y los valores a reemplazar en los parámetros dinámicos. A continuación, se detalla su uso, incluyendo los parámetros requeridos, ejemplos de solicitud y la estructura de la respuesta.

ℹ Recuerda que:

La URL base para todas las solicitudes es: https://tu-dominio.c3.pe

Importante: reemplaza tu-dominio por el nombre de dominio específico que te haya proporcionado C3.

Solicitud

Cabeceras

EncabezadoTipoObligatorioDescripción
AuthorizationString✅ SíToken de autenticación (Bearer Token).
Content-TypeString✅ SíDebe ser application/json.

Cuerpo de la solicitud

AtributoTipoObligatorioDescripción
wa_numberString✅ SíNúmero de WhatsApp desde el cual se enviará el mensaje.
destinationString✅ SíNúmero de WhatsApp del destinatario.
template_nameString✅ SíNombre de la plantilla a utilizar.
header_paramObject/null❌ NoParámetro opcional que remplazará valor en el encabezado.
body_paramsArray❌ NoLista de parámetros que reemplazarán valores en el cuerpo del mensaje.
body_params.keyString✅ SíClave del parámetro en la plantilla (ejemplo: "1").
body_params.valueString✅ SíValor que reemplazará la variable en la plantilla.
media_pathString❌ NoRuta interna del archivo devuelta por /api/v1/media-upload.
response_handlerString❌ NoCAMPAIGN o CHATBOT. Define a dónde se deriva la respuesta del cliente. Por defecto: CAMPAIGN.
campaign_idInteger❌ NoID de campaña de WhatsApp C3 para procesar las respuestas, si no se determina, las respuestas serán procesadas por el Chatbot.
bot_idInteger❌ NoID del bot que debe atender la respuesta. Requerido si response_handler = CHATBOT.
sent_groupString❌ NoPalabra clave que permite agrupar los envios, es útil para posteriores usos de filtrado, ej: Masivo navidad

Adjuntos Dinámicos

⚠️ Validaciones Estrictas del media_path

Si decides proveer un archivo mediante media_path, el sistema aplicará las siguientes validaciones:

  1. Formatos: La extensión debe coincidir con el formato asignado a la plantilla en Meta:
    • Si la plantilla es DOCUMENT, sólo se acepta .pdf.
    • Si la plantilla es IMAGE, sólo se acepta .jpg, .jpeg, .png.
    • Si la plantilla es VIDEO, sólo se acepta .mp4.
    • Si la plantilla es de tipo TEXT o no admite cabeceras, la petición fallará.
  2. Seguridad: El media_path provisto debe pertenecer exclusivamente a tu equipo (uploads/team<tu_id>/). El uso de archivos de otros equipos generará un error 403.

Comportamiento del Adjunto por Defecto: Si NO proporcionas el atributo media_path, el envío buscará y utilizará de forma automática el adjunto por defecto que hayas configurado previamente en la plataforma C3, asegurando la retrocompatibilidad con las plantillas ya existentes.

Ejemplo de solicitud completa

http
POST /api/v1/message_templates/send

El cuerpo de la solicitud debe enviarse en formato JSON e incluir los siguientes campos:

json
{
  "wa_number": "5117004531",
  "destination": "51947000255",
  "template_name": "recuperacion_de_atencion",
  "header_param": {"key": "1", "value": "Karla"},
  "body_params": [
    {
      "key": "1",
      "value": "el día de ayer"
    }
  ]
}

Ejemplo de solicitud con manejo de respuesta

El siguiente ejemplo muestra cómo configurar el manejo de las respuestas del cliente mediante el parámetro response_handler.

Para derivar respuestas a un chatbot:

json
{
  "wa_number": "5117484531",
  "destination": "51925177116",
  "template_name": "promos_del_mes",
  "response_handler": "CHATBOT",
  "bot_id": 123,
  "body_params": [
    {
      "key": "1",
      "value": "Juan Pérez"
    }
  ]
}

Para derivar respuestas a una campaña:

json
{
  "wa_number": "5117484531",
  "destination": "51925177116",
  "template_name": "promos_del_mes",
  "response_handler": "CAMPAIGN",
  "campaign_id": 456,
  "body_params": [
    {
      "key": "1",
      "value": "Juan Pérez"
    }
  ]
}

Validaciones

En caso de error de validación, tendrás los siguientes:

  • response_handler con un valor distinto de CAMPAIGN/CHATBOT"El atributo response_handler debe ser CAMPAIGN o CHATBOT".
  • response_handler = "CHATBOT" sin bot_id"El atributo bot_id es requerido cuando response_handler es CHATBOT".
  • bot_id que no existe → "El bot con el ID: {bot_id} no existe!".

Ejemplo de solicitud con adjunto dinámico

El siguiente ejemplo muestra el uso de la propiedad media_path enviada previamente al servidor a través del endpoint /api/v1/media-upload.

json
{
  "wa_number": "5117484531",
  "destination": "51925177116",
  "template_name": "promos_del_mes",
  "media_path": "uploads/team1/mi_archivo_1711894400.pdf",
  "body_params": [
    {
      "key": "1",
      "value": "Juan Pérez"
    }
  ]
}

Respuesta

La API devuelve un json con la siguiente estructura.

Respuesta base 200

json
{
  "message": "La solicitud se completó con éxito!",
  "data": {
    "update_id": "msg_c3api_1748361117"
  }
}

Definición de atributos

CampoTipoDescripción
messageStringMensaje de respuesta del servidor.
data.update_idStringIdentificador único de la actualización.

Plantilla de ejemplo utilizada

json
{
  "name": "recuperacion_de_atencion",
  "status": "APPROVED",
  "category": "UTILITY",
  "components": [
    {
      "type": "HEADER",
      "format": "TEXT",
      "text": "Hola {{1}}"
    },
    {
      "type": "BODY",
      "text": "Disculpa si no pudimos responderte 😪 {{1}}. Estaremos más atentos para tu duda o pregunta."
    },
    {
      "type": "FOOTER",
      "text": "Gracias por tu comprensión."
    },
    {
      "type": "BUTTONS",
      "buttons": [
        {
          "type": "QUICK_REPLY",
          "text": "Hablar con soporte",
          "payload": "soporte"
        },
        {
          "type": "QUICK_REPLY",
          "text": "Programar una llamada",
          "payload": "programar_llamada"
        }
      ]
    }
  ],
  "id": "1242001217077846"
}

Errores generales

Código HTTPTipoCausa común
401UnauthorizedEl token de acceso no fue proporcionado en el encabezado Authorization, es inválido o ha sido revocado. Verifique que el token sea correcto y esté activo.
422Unprocessable EntityLa solicitud fue entendida, pero contiene errores semánticos que impiden su procesamiento. Esto puede deberse a:
1. Parámetros faltantes o inválidos (ej, from_date no es una fecha válida);
2. Recurso inexistente (wa_number no registrado en el sistema);
3. Violación de reglas de negocio (el rango de fechas excede el límite permitido).
500Server ErrorError interno del servidor. Intenta nuevamente más tarde o contacta soporte técnico.