En este artículo, examinaremos a fondo el proceso de enviar, editar y eliminar mensajes a través de la API de Wazzup.
Envío de mensajes
Para enviar mensajes es necesario hacer una solicitud:
POST https://api.wazzup24.com/v3/message
En el cuerpo de la solicitud debes pasar los parámetros del mensaje con los datos de autorización en el encabezado.
Parámetros de solicitud
Parámetros de Solicitud
Los parámetros obligatorios están marcados con un asterisco (*)
Parámetro | Tipo | Descripción |
channelId* | String | ID del canal (uuidv4) a través del cual se enviará el mensaje. |
chatType* | String | Tipo de mensajería. Valores disponibles:
|
chatId | String | ID de chat (cuenta del contacto en el mensajero):
|
text | String | Texto del mensaje. Es obligatorio si no se especifica el contentUri. No se pueden enviar tanto el texto como el contentUri al mismo tiempo. Restricciones:
|
contentUri | String | Un enlace al archivo a enviar. Es obligatorio si no se especifica texto. El contenido debe ser descargado a través de un enlace sin redirecciones. Se intentará descargar el contenido tan pronto como se reciba la solicitud, es decir, se pueden usar enlaces de corta duración. Puede haber restricciones sobre el tipo y el tamaño del contenido, específicas de cada mensajero. No se puede transmitir tanto el texto como el contentUri al mismo tiempo. |
refMessageId | String | Id del mensaje a citar. |
crmUserId | String | ID del usuario de CRM especificado con los usuarios CRUD. Si se especifica, y si dicho usuario ya existe, guardaremos su ID y nombre como al enviar mediante iframe. No funciona al conectarse a través de la API Sidecar. |
crmMessageId | String | Identificador de mensaje en el CRM. Necesario para que el enrutamiento sea idempotente. |
username | String | Solo para Telegram. Nombre de usuario del contacto de Telegram, sin el símbolo "@" al inicio. Puede usarse al enviar mensajes a través de Telegram si no se conoce el chatId. |
phone | String | Solo para Telegram. Número de teléfono del contacto en formato internacional, sin el signo "+" ni otros símbolos, solo números, incluyendo el código de país correspondiente. Puede usarse al enviar mensajes a través de Telegram si no se conoce el chatId. |
clearUnanswered | Boolean | Indica si se debe reiniciar el contador de mensajes no respondidos. Especifica "false" para evitar que el mensaje restablezca el contador. Por ejemplo, útil en automatizaciones, para que el usuario del CRM reciba una notificación de un nuevo mensaje entrante, incluso si el cliente ha enviado una respuesta automática. Si no se especifica nada, el mensaje saliente reiniciará el contador. |
templateId | String | Código de plantilla WABA. |
templateValues | Array de String | Valores para rellenar las variables en la plantilla. |
buttonsObject | Objeto | Botones adjuntos a un mensaje. Se pueden utilizar para trabajar con plantillas WABA y con mensajes interactivos de WABA. Un mensaje interactivo es un mensaje con botones, que puede enviarse dentro de una conversación activa de 24 horas con el cliente desde el canal WABA. Una plantilla WABA es una plantilla moderada por Meta. Se utilizan para iniciar una conversación de 24 horas. Al trabajar con plantillas WABA, el campo buttonsObject es útil solo si deseas asociar un payload a los botones. No necesitas especificar el texto de los botones que se enviarán con la plantilla WABA. |
buttonsObject.buttons | Object[ ] | No se permiten más de 10 botones. Si el array contiene más de 10 botones, se tomarán únicamente los primeros 10. |
buttonsObject.buttons.text | String | Necesario para trabajar con mensajes interactivos. Texto del botón, máximo 20 caracteres. |
buttonsObject.buttons.type | String | Tipo de botón. Necesario para mensajes interactivos. Actualmente solo se admite el formato "text", por lo tanto, especifica el tipo como "text". |
buttonsObject.payload | String | Payload de las plantillas y de los botones de mensajes interactivos. |
Si el mensaje ya fue enviado, cualquier otra solicitud con el mismo crmMessageId no se enviará, y se devolverá el error:
400 Bad Request { error: 'repeatedCrmMessageId', description: 'Ya has enviado un mensaje con el mismo crmMessageId' }
Ejemplos de solicitud
Mensaje regular
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "e0629e11-0f67-4567-92a9-2237e91ec1b9", refMessageId: "61e5a375-1760-452f-ad73-5318844ffc4f", crmUserId: "string-user-id", crmMessageId: "string-crm-message-id", chatId: "string-chat-id", chatType: "whatsapp", text: "message text" }, });
Plantilla WABA
Se solicita el envío de una plantilla WABA con tres botones. Cada uno tiene una carga útil.
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "24197d5f-06de-421f-8576-9f6e6cb67f28", chatType: "whatsapp", chatId: "79994621848", templateId: "6201005a-9a6f-486f-bdd5-e6cb86c76ddb", templateValues: ["value"] buttonsObject: { buttons: [ { payload: "button_payload 1" }, { payload: "button_payload 2" }, { payload: "button_payload 3" } ] } }, });
La solicitud para las plantillas WABA con botones no requiere el texto del botón. Estas son moderadas junto con el texto principal de la plantilla, por lo que los botones no pueden ser cambiados.
buttonsObject solo es útil si necesitas especificar una carga útil (payload) para los botones.
Mensaje interactivo de WABA
En esta solicitud, enviamos un mensaje interactivo con tres botones: "Sí", "No" y "Quizás". Estos botones no tienen carga útil.
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "e0629e11-0f67-4567-92a9-2237e91ec1b9", refMessageId: "61e5a375-1760-452f-ad73-5318844ffc4f", crmUserId: "string-user-id", crmMessageId: "string-crm-message-id", chatId: "string-chat-id", chatType: "whatsapp", text: "message text", buttonsObject: { buttons: [ {text: "Yes", type: "text"}, {text: "No", type: "text"}, {text: "Maybe", type: "text"} ] } }, });
Respuesta
Si envías una plantilla sin payload a través de la API, en el webhook de mensaje de respuesta se enviará el texto del botón correspondiente. Si envías un mensaje interactivo sin payload, se enviará el número de serie del botón, comenzando desde 0.
Parámetro | Tipo | Descripción |
messageId | String | Identificador del mensaje.
Solo aparece cuando code=OK |
chatId | String | ID del chat.
Solo aparece cuando code=OK |
Ejemplo de respuesta:
HTTP/1.1 201 OK { "messageId": "f66c53a6-957a-46b2-b41b-5a2ef4844bcb", "chatId": "79999999999" }
Errores al enviar mensajes
1. Valores de parámetros inválidos
Si un parámetro no cumple con los requisitos (por ejemplo, channelId no tiene formato UUID, chatId no es un string o chatType no corresponde a los valores permitidos), se devolverá:
{ "status": 400, "requestId": "7ca68797d127735e72b066b0080e2cc0", "error": "INVALID_MESSAGE_DATA", "description": "Los datos del mensaje no son válidos", "data": { "fields": ["channelId"] } }
Solución: Verifica que los valores de los parámetros sean correctos. El array data.fields indicará cuál tiene el error.
2. Incompatibilidad entre tipo de transporte y canal
Si se especifica un channelId con un tipo de transporte, pero el chatType pertenece a otro transporte, se devolverá:
{ "status": 400, "requestId": "21a9be7692d378b0270e7fc1d993381a", "error": "WRONG_TRANSPORT", "description": "No puedes enviar un mensaje de WhatsApp a un chat de VK", "data": { "channelId": "dffa1c7b-6db8-4b8f-b559-91166aba879e", "transport": "whatsapp", "chatType": "vk" } }
Solución: Asegúrate de que chatType coincida con el tipo de transporte del canal especificado.
3. Reutilización de crmMessageId
Si se incluye un crmMessageId que ya fue utilizado en los últimos 60 segundos, se devolverá:
{ "status": 400, "requestId": "c1005276e8a2b5aa23fcc94407d39f49", "error": "REPEATED_CRM_MESSAGE_ID", "description": "Ya has enviado un mensaje con el mismo crmMessageId", "data": { "crmMessageId": "1" } }
Solución: Usa valores únicos de crmMessageId para cada mensaje. El sistema verifica duplicados dentro de una ventana de 60 segundos.
Gestión de mensajes
Una vez enviado el mensaje, se puede editar o eliminar, siempre y cuando el canal lo soporte.
Edición de mensajes
Wazzup permite editar mensajes enviados. Puedes modificar el texto o el archivo adjunto, pero no ambos al mismo tiempo.
PATCH https://api.wazzup24.com/v3/message/:messageId
Incluye la clave API en el encabezado de la solicitud:
"Authorization": "Bearer {apiKey|sidecarApiKey}"
Cómo editar un mensaje:
- Especifica el nuevo texto en el campo text.
- Para reemplazar un archivo adjunto, usa contentUri.
- No se pueden cambiar texto y archivo adjunto a la vez.
Parámetro | Tipo | Descripción |
messageId | String | Identificador del mensaje (en la URL) |
crmUserId | String | ID del usuario CRM, especificado con CRUD de usuarios |
text | String | Texto del mensaje. Obligatorio si no se usa contentUri |
contentUri | String | URL del archivo a enviar. Obligatorio si no se usa text |
Ejemplo para mensajes de texto:
curl --location \ --request PATCH 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}' \ --header 'Content-Type: application/json' \ --data '{ "text": "Texto actualizado del mensaje", "crmUserId": "2e0df379-0e3c-470f-9b36-06b9e34c3bdb" }'
Ejemplo para mensajes con archivos adjuntos:
curl --location \ --request PATCH 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}' \ --header 'Content-Type: application/json' \ --data '{ "contentUri": "https://example.com/image.png", "crmUserId": "2e0df379-0e3c-470f-9b36-06b9e34c3bdb" }'
Eliminación de mensajes
Para eliminar un mensaje, utiliza:
DELETE https://api.wazzup24.com/v3/message/:messageId
Incluye la clave API en el encabezado:
"Authorization": "Bearer {apiKey|sidecarApiKey}"
Ejemplo de eliminación:
curl --location \ --request DELETE 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}'
Errores al enviar, editar y eliminar mensajes
Código de error | Descripción |
BALANCE_IS_EMPTY | El saldo de suscripción de WABA se ha agotado. |
MESSAGE_WRONG_CONTENT_TYPE | Tipo de contenido no válido. Aparece si no se pudo detectar el tipo de contenido o no es compatible. |
MESSAGE_ONLY_TEXT_OR_CONTENT | El mensaje puede contener texto o contenido. No puedes enviar texto y contenido a WhatsApp e Instagram al mismo tiempo. |
MESSAGE_NOTHING_TO_SEND | No se encontró ningún texto del mensaje. |
MESSAGE_TEXT_TOO_LONG | La longitud del mensaje de texto supera los 10 000 caracteres. |
MESSAGES_TOO_LONG_INSTAGRAM | El texto del mensaje de Instagram supera los 10.000 caracteres. |
MESSAGES_TOO_LONG_TELEGRAM | El texto del mensaje de Telegram supera los 4096 caracteres. |
MESSAGES_TOO_LONG_WABA | El texto del mensaje WABA es demasiado largo. El máximo es de 1024 caracteres para el título y 4096 para el texto principal. |
MESSAGES_CONTENT_CAN_NOT_BE_BLANK | Un archivo con contenido no puede estar vacío. Ocurre al enviar un mensaje que no es de texto y al que no se ha adjuntado ningún contenido. |
MESSAGES_CONTENT_SIZE_EXCEEDED | El contenido excede el tamaño permitido de 10 MB. |
MESSAGES_TEXT_CAN_NOT_BE_BLANK | El mensaje de texto no puede estar vacío. |
CHANNEL_NOT_FOUND | No se encuentra en la integración el canal por el cual se envía el mensaje. |
CHANNEL_BLOCKED | El canal por el cual se envía el mensaje está apagado. |
CHANNEL_WAPI_REJECTED | El canal WABA está bloqueado. |
MESSAGE_DOWNLOAD_CONTENT_ERROR | No se pudo descargar el contenido del enlace especificado. |
MESSAGES_NOT_TEXT_FIRST | En la tarifa “Inbox” no es posible escribir primero. |
MESSAGES_IS_SPAM | Wazzup calificó este mensaje como spam. |
VALIDATION_ERROR | Error de validación del parámetro pasado a la consulta. |
CHANNEL_NO_MONEY | El canal no es pago y tiene el estado de "No pagado". |
MESSAGE_CHANNEL_UNAVAILABLE | El canal desde el que se envía el mensaje no está disponible. El canal tiene el estado "Teléfono no disponible" o "Espera un minuto". |
MESSAGES_ABNORMAL_SEND | El tipo de chat no coincide con la fuente del contacto. Por ejemplo, este error puede ocurrir si intentas enviar un mensaje desde un canal de WhatsApp a un contacto de Instagram. |
MESSAGES_INVALID_CONTACT_TYPE | El tipo de chat no coincide con la fuente del contacto de Instagram. Por ejemplo, este error puede ocurrir si estás intentando enviar un mensaje desde un canal de Instagram a un contacto de WhatsApp. |
MESSAGES_CAN_NOT_ADD | El mensaje no se ha enviado. Se ha producido un error inesperado en el servidor. |
MESSAGES_CONTENT_SIZE_EXCEEDED_WABA | El contenido supera el tamaño permitido. En Telegram, el tamaño máximo de una foto es de 5 MB y, para otros contenidos, de 16 MB. |
MESSAGES_CONTENT_SIZE_EXCEEDED_TELEGRAM | El contenido supera el tamaño permitido. En Telegram, el tamaño máximo de una foto es de 5 MB y, para otros contenidos, de 20 MB. |
MESSAGES_TOO_LONG_VIBER | El texto del mensaje de Viber supera los 6999 caracteres. |
MESSAGES_TOO_LONG_WABA_HEADER | El texto del título de la plantilla WABA supera los 60 caracteres. |
MESSAGES_TOO_LONG_WABA_TEMPLATE | El texto de la plantilla WABA supera los 1024 caracteres. |
REFERENCE_MESSAGE_NOT_FOUND | Se produce un error al citar si no se puede encontrar el mensaje al que se adjunta la cita. Verifica que el identificador del mensaje recibido desde Wazzup esté siendo pasado correctamente como refId. |
UNKNOWN_ERROR | Error desconocido. Contacta con el servicio de asistencia. |
UNKNOWN_ERROR_WITH_TRACE_ID | Error desconocido. Contáctanos para obtener ayuda con el ID de seguimiento del error. |
MESSAGES_EDITING_TIME_EXPIRED | El tiempo de edición del mensaje ha expirado. El mensaje solo se puede editar dentro de un plazo determinado tras su envío. |
MESSAGES_CONTAIN_BUTTONS | El mensaje contiene botones y no se puede editar. |
MESSAGES_ONLY_TEXT_OR_CONTENT | Un mensaje solo puede contener texto o un archivo adjunto. No se pueden enviar ambos simultáneamente. |
CHANNEL_INVALID_TRANSPORT_FOR_EDITING | El canal no admite la edición de mensajes. |
CHANNEL_INVALID_TRANSPORT_FOR_CONTENT_EDITING | El canal no admite la edición del contenido de los mensajes (por ejemplo, archivos adjuntos). |
CHAT_NO_ACCESS | No hay acceso al chat especificado. Revisa la configuración de acceso. |
MESSAGES_NOT_FOUND | El mensaje no se encontró o no contiene ningún contenido. |
CHANNEL_LIMIT_EXCEEDED | Se ha superado el límite de diálogos activos para el canal. |
MESSAGES_DELETION_TIME_EXPIRED | El tiempo de eliminación del mensaje ha expirado. El mensaje solo se puede eliminar dentro de un plazo determinado después de su envío. |
CHANNEL_INVALID_TRANSPORT_FOR_DELETION | El canal no admite la eliminación de mensajes. |
TEMPLATE_REJECTED | Meta ha restringido la plantilla. Prueba con otra o espera a recibir un mensaje. |
BAD_CONTACT | Mensaje no enviado. Es posible que el número no esté en WhatsApp o use una versión antigua. Inténtalo más tarde. |