---
title: "Enviar una plantilla HSM aprobada por WhatsApp. Con ?dry_run=true valida la plantilla y devuelve el mensaje resuelto sin enviarlo."
method: POST
path: "/channels/{channelId}/whatsapp/send-template"
tags: ["Channels"]
---

# Enviar una plantilla HSM aprobada por WhatsApp. Con ?dry_run=true valida la plantilla y devuelve el mensaje resuelto sin enviarlo.

`POST /channels/{channelId}/whatsapp/send-template`

## Request

- Base URL: `https://api.met.meteor.com.co/api/v1`
- URL: `https://api.met.meteor.com.co/api/v1/channels/{channelId}/whatsapp/send-template`
- Auth: one of:
  - `bearer` (a scheme the document does not define)
  - HTTP bearer

La **única forma de escribirle primero a alguien** o de retomar una conversación pasadas 24 horas del último mensaje del contacto: fuera de esa ventana WhatsApp solo entrega plantillas aprobadas. El `name`, el `language` y los `components` que pide salen de `GET /channels/{channelId}/templates`.

## Path parameters

- `channelId` string, required

## Query parameters

- `dry_run` string, required

## Request body

- SendWhatsappTemplateDto
  - `components` object[]: Components de la plantilla (header/body/buttons con sus parameters), tal como los define Meta.
  - `contact_id` number, required: ID del contacto destinatario.
  - `language` string, required: Código de idioma de la plantilla (ISO + variante). Meta es estricto: 'es', 'es_CO', 'en_US'.
  - `purpose` 'authentication': Excepción OTP habilitada únicamente para AveOnline (workspace 60). Exige una plantilla APPROVED/AUTHENTICATION en la cuenta emisora. No reactiva el piloto ni modifica la atención humana; mantiene bloqueos y permisos. Omitido conserva el comportamiento normal.
  - `sender_line_id` string: Línea desde la que se envía: su `phone_number_id` de Meta, tal como lo devuelve `GET /channels/{channelId}/whatsapp/lines`. Omitido = la línea por la que el contacto escribió por última vez o, si nunca escribió, la del canal. Tiene que ser una línea activa del workspace: si no lo es, el envío falla en vez de salir por otro número. La plantilla tiene que existir en la cuenta (WABA) de esa línea.
  - `template_name` string, required: Nombre exacto de la plantilla HSM aprobada en Meta.

## Response `201`

Envío real: `{success, wa_message_id}`. Con `?dry_run=true`: `{dry_run, would_send}` con la plantilla resuelta y sin enviar nada.

- object: Sobre en el que viaja toda respuesta correcta de la API. El recurso está en `data`. Los SDKs oficiales lo desenvuelven por ti; un cliente hecho a mano tiene que leer `.data`.
  - `success` true, required: Siempre `true` en una respuesta 2xx.
  - `data` union, required
    - WhatsappSendResponseDto
      - `success` number, required: Siempre `true`. Un envío que WhatsApp rechaza no devuelve este cuerpo: sale por el catálogo de errores con `400`.
      - `wa_message_id` string: ID del mensaje que asignó WhatsApp (`wamid.…`). Es la llave con la que llegan después los estados de entrega por webhook. Puede venir ausente si Meta aceptó el envío sin devolver el id.
    - WhatsappTemplateDryRunResponseDto
      - `dry_run` number, required: Siempre `true`: distingue esta respuesta de la de un envío real.
      - `would_send` WhatsappTemplateDryRunPayloadDto, required
        - `phone_number_id` string, required: Línea de WhatsApp por la que saldría el mensaje. Es un identificador de la cuenta de Meta; **no** es una credencial y el `access_token` nunca se devuelve.
        - `recipient` string: Identificador del destinatario cuando no tenemos su teléfono (business-scoped user ID de Meta). Es específico de nuestra cuenta: el mismo usuario tiene otro identificador en otro negocio.
        - `template` WhatsappTemplateDryRunTemplateDto, required
          - `components` object[]: Los `components` que mandaste, tal cual. Ausente si no mandaste ninguno.
          - `language` string, required: Código de idioma de la plantilla (`es`, `es_CO`, `en_US`).
          - `name` string, required: Nombre de la plantilla HSM aprobada.
        - `to` string: Número destino resuelto del contacto, en formato Meta (sin `+`). Ausente cuando el contacto adoptó un username de WhatsApp y Meta ya no expone su número: en ese caso viene `recipient` en su lugar. Siempre llega uno de los dos, nunca los dos a la vez.

## Other responses

- `400`: La request no es válida: un campo no pasa validación, falta un parámetro requerido o el recurso no admite la transición solicitada.
- `401`: API key ausente, inválida, revocada o expirada — o el workspace está bloqueado.
- `403`: La key está autenticada pero no puede ejecutar esta operación: scope faltante, capacidad deshabilitada, modo test restringido o recurso fuera de su cartera.
- `404`: El recurso no existe o no está disponible dentro del alcance de la key. No revela la existencia de recursos de otros tenants.
- `409`: La operación entra en conflicto con el estado actual o con un Idempotency-Key en uso. No reintentes con el mismo key y un body distinto.
- `429`: Se superó el límite por minuto de la key o la cuota del plan. Respeta `Retry-After`; el SDK ya reintenta solo.
- `500`: Error del servidor o del Met que ejecutaba. El SDK reintenta los 5xx con backoff.

---

[API](https://skmtc.dev/meteor/apis/met-public-api.md) · [All operations](https://skmtc.dev/meteor/apis/met-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meteor/apis/met-public-api/revisions/5d9ca294295c?raw)
