Enviar mensajes
Envía plantillas, textos y archivos por WhatsApp desde tu sistema, uno por destinatario.
Todos los envíos usan POST https://api.whapi.chat/waba-api/messages/send. Cada request envía un WhatsApp a una persona: para un envío masivo, haz un request por destinatario.
¿Plantilla o texto libre?
WhatsApp solo permite mensajes libres dentro de las 24 horas siguientes al último mensaje del cliente. Fuera de esa ventana, solo puedes enviar plantillas aprobadas.
| Plantilla | Texto o archivo | |
|---|---|---|
| Cuándo | Primer contacto, avisos, campañas | Respuestas en una conversación activa |
| Ventana de 24 horas | No la necesita | Obligatoria |
| Campos | template | body y/o un archivo en medias |
Si envías texto fuera de la ventana, la respuesta es 403 con code: waba_session_window_expired. En ese caso, usa una plantilla.
Enviar una plantilla
Indica el nombre, el idioma y el valor de cada variable. Con variables por nombre, cada parámetro lleva parameter_name:
curl https://api.whapi.chat/waba-api/messages/send \
--header 'Authorization: Bearer TU_CLAVE' \
--header 'Content-Type: application/json' \
--data '{
"wabaPhoneNumberId": 3,
"number": "51987654321",
"template": {
"name": "acceso_postulante",
"language": "es",
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "parameter_name": "correo_postulante", "text": "[email protected]" },
{ "type": "text", "parameter_name": "contrasena_postulante", "text": "Temp1234" }
]
}
]
}
}'
Con variables por posición ({{1}}, {{2}}), omite parameter_name y envía los parámetros en orden.
number es el teléfono del destinatario con código de país y solo dígitos. wabaPhoneNumberId solo es obligatorio si tienes más de una línea.
Plantillas con imagen, video o PDF en el encabezado
Si la plantilla lleva un archivo en el encabezado, tienes tres opciones:
- Adjuntarlo: envía el request como
multipart/form-data, con el archivo enmediasytemplatecomo texto JSON. - Pasar un enlace en
template.components:{ "type": "header", "parameters": [ { "type": "document", "document": { "link": "https://tu-sitio.com/cotizacion.pdf" } } ] } - Usar el archivo predeterminado que se guardó al crear la plantilla, con
"useDefaultHeaderMedia": true.
Si no envías ninguno, la respuesta es 400 con code: waba_template_header_media_missing. El campo hasDefault indica si la plantilla tiene un archivo predeterminado que podrías usar.
Enviar texto
curl https://api.whapi.chat/waba-api/messages/send \
--header 'Authorization: Bearer TU_CLAVE' \
--header 'Content-Type: application/json' \
--data '{
"number": "51987654321",
"body": "Gracias por escribirnos, ¿en qué te ayudamos?"
}'
Enviar un archivo
curl https://api.whapi.chat/waba-api/messages/send \
--header 'Authorization: Bearer TU_CLAVE' \
--form number=51987654321 \
--form 'body=Te envío la cotización' \
--form [email protected]
Se envía un archivo por request.
La respuesta
{
"wamid": "wamid.HBgMNTE5ODc2NTQzMjEVAgASGBQzQUYxRjQ",
"ticketId": 42,
"contactId": 18,
"leadId": 9,
"wabaPhoneNumberId": 3,
"mode": "template",
"headerMediaSource": null
}
- Un
200significa que Meta aceptó el mensaje, no que llegó. La entrega se confirma después por el webhookwaba.message.status(ver Recibir mensajes y estados). - Guarda el
wamid: es el id con el que llegan esos estados. - El mensaje queda en Whapi como si lo hubiera enviado un agente. Si el número no existía, se crean el contacto, el ticket y el lead.
Errores frecuentes
code | Qué pasó | Qué hacer |
|---|---|---|
waba_session_window_expired | Texto o archivo fuera de la ventana de 24 horas. | Usa una plantilla. |
waba_template_not_found | Meta no encuentra la plantilla aprobada en ese idioma. | Revisa name y language con GET /templates. |
waba_template_params_invalid | Los parámetros no coinciden con la plantilla. | Compara con variables de la plantilla. |
waba_invalid_recipient | El número no tiene WhatsApp o no se le puede entregar. | Verifica el número. |
waba_phone_id_required | Tienes varias líneas y no indicaste cuál. | Envía wabaPhoneNumberId. |
waba_ambiguous_contact | Hay varios contactos con ese teléfono en Whapi. | Unifícalos en Whapi. |
Todos los campos y errores: referencia de envío.