Webhooks

En este artículo te explicamos cómo conectar webhooks, en qué formato los enviamos y qué esperamos como respuesta.

Cómo enviamos webhooks y qué esperamos a cambio

Enviamos los webhooks usando el método POST a la URI especificada. Esta puede incluir una query string.

Si tenemos tu crmKey, añadimos el encabezado: Authorization: Bearer ${crmKey}

Si no lo tenemos, no añadimos ningún encabezado de autorización.

Los webhooks contienen JSON en el cuerpo del mensaje y se incluye el encabezado: Content-Type: application/json; charset=utf-8.

El cuerpo del webhook es un objeto codificado en JSON con propiedades que corresponden a los tipos de webhook.

Un solo webhook puede contener datos de tipo messages y statuses al mismo tiempo. Los webhooks de tipo createContact y createDeal siempre contienen solo un tipo.

Esperamos recibir el código 200 OK. En algunos casos, también esperamos información específica en el cuerpo de la respuesta. El tiempo máximo de espera (timeout) es de 30 segundos.

Cómo activar los webhooks

Para suscribirte a los webhooks, debes hacer una petición:

 PATCH https://api.wazzup24.com/v3/webhooks

El cuerpo debe contener un objeto JSON con los siguientes parámetros:

Parámetro Tipo Descripción
webhooksUri String Dirección que recibirá los webhooks. Máximo 200 caracteres.
subscriptions Object Configuración de los webhooks.
subscriptions.messagesAndStatuses Boolean Webhook para mensajes nuevos y cambios de estado de mensajes salientes.

Si es necesario, especifica true; si no, false.

subscriptions.contactsAndDealsCreation Boolean Webhook sobre la creación de contactos o deals.

Si es necesario, true; si no, false.

subscriptions.channelsUpdates Boolean Webhook para cambios de estado de los canales. Si es necesario, true; si no, false.
subscriptions.templateStatus Boolean Webhook para cambios en el estado de moderación de plantillas WABA.

Si es necesario, true; si no, false.

Al conectarse a la URL especificada, se enviará una solicitud de prueba POST {test: true}, en respuesta a la cual el servidor debe devolver 200 si los webhooks se conectaron correctamente; de ​​lo contrario, un mensaje: "Solicitud de webhooks no válida. El estado de la respuesta debe ser 200".

Ejemplo de petición
 curl --location --request PATCH 'https://api.wazzup24.com/v3/webhooks' \
--header 'Authorization: Bearer w11cf3444405648267f900520d454368d27' \
--header 'Content-Type: application/json' \
--data-raw '{
"webhooksUri": "https://example.com/webhooks",
"subscriptions": {
"messagesAndStatuses": true,
"contactsAndDealsCreation": true
}
}'
Ejemplo de respuesta
 {
ok
}
Posibles errores

Además de los errores comunes en todas las rutas, pueden darse los siguientes:

Código Descripción
400 Bad Request, { error: ‘uriNotValid’, description: ‘Provided URI is not valid URI’ } Si la URI no cumple con las características formales requeridas.
400 Bad Request, { error: ‘testPostNotPassed’, description: ‘URI does not return 200 OK on test request’, data: { ‘${код ответа}’ } } Si se produjo un error al enviar la solicitud de prueba a la URL especificada.

Verificación de la dirección de recepción de webhooks

Para consultar la URL actualmente configurada para recibir webhooks, realiza la siguiente solicitud:

 GET https://api.wazzup24.com/v3/webhooks
Ejemplo de respuesta
 HTTP/1.1 200 OK
``json
{
"webhooksUri": "https://example.com/webhooks",
{ "subscriptions": {
{ "messagesAndStatuses": { "true",
{ "contactsAndDealsCreation": "true"
}
}
``

Webhook sobre nuevos mensajes

Este webhook envía un objeto JSON con la clave messages, cuyo valor es un array de objetos. Cada objeto representa un mensaje individual y contiene los siguientes parámetros:

Parámetro Tipo Descripción
messageId String (uuid4) Mensajes de guía de Wazzup
channelId String (uuid4) Identificación del canal
chatType String Valores disponibles:

  • WhatsApp: "whatsapp",
  • Viber: "viber",
  • WhatsApp group chat: "whatsgroup",
  • Instagram: "instagram",
  • Telegram: "telegram".
chatId String ID de chat (cuenta del contacto en Messenger):

  • for whatsapp and viber — only numbers, without spaces and special characters in the format 79011112233;
  • for instagram — an account without @ at the beginning;
  • for WhatsApp group chat ('whatsgroup') — it comes in webhooks of incoming messages;
  • for Telegram — Telegram GUID. Username and phone number, if any, are sent to contact.phone and contact.username.
dateTime String La hora de envío del mensaje especificada por el mensajero en el formato aaaa-mm-ddThh:mm:ss.ms
type String Tipo de mensaje:

  • ‘text‘— texto,
  • ‘image‘ — imagen,
  • ‘audio‘ — audio,
  • ‘video‘ — vídeo,
  • ‘document‘ — documento,
  • ‘vcard’ — tarjeta de contacto,
  • ‘geo‘ — geolocalización,
  • ‘wapi_template’ — plantilla WABA,
  • ‘unsupported’ — tipo no compatible,
  • ‘missing_call‘ — llamada perdida,
  • ‘unknown‘ — error desconocido.
status String Contiene solo el valor de ENUM de los "estados" del webhook:

  • 'sent' — enviado (equivale a una marca de verificación gris),
  • 'delivered' — entregado (equivale a dos marcas de verificación grises),
  • 'read' — leído (equivale a dos marcas de verificación azules),
  • 'error',
  • 'inbound' — mensaje entrante.
error Object Viene si 'estado: error'
error.error String Tipos de error:

  • 'BAD_CONTACT' — para WhatsApp y Telegram: la cuenta con este chatId no existe;
  • 'CHATID_IGSID_MISMATCH' — para Instagram: la cuenta de Instagram con este chatId no existe. El cliente podría haber cambiado el nombre del perfil;
  • 'TOO_LONG_TEXT' — el texto del mensaje es demasiado largo;
  • 'BAD_LINK' — los filtros de Instagram no permiten publicar una publicación debido a un enlace;
  • 'TOO_BIG_CONTENT' — el tamaño del archivo no debe superar los 50 MB;
  • 'SPAM' — el mensaje no se envió debido a una sospecha de spam;
  • 'TOO_MANY_EXT_REQS' — el envío se interrumpió. Hay demasiados mensajes de la cuenta;
  • 'WRONG_CONTENT' — el contenido del archivo no se ajusta a los parámetros de Instagram;
  • 'MESSAGE_CANCELLED' — el envío del mensaje se detuvo;
  • '24_HOURS_EXCEEDED' — el diálogo de WABA de 24 horas está cerrado;
  • 'COMMENT_DELETED' — el comentario en Instagram fue eliminado;
  • 'MENTION_FORBIDDEN' — el usuario etiquetado (mencionado) en el mensaje no puede ser etiquetado;
  • 'CONTENT_CONVERSION_ERROR' — el contenido no se pudo convertir;
  • 'MESSAGE_DELETED' — el mensaje fue eliminado por el remitente;
  • 'CHATID_IGSID_MISMATCH' — para Instagram: No se pudo vincular el ChatId con el IGSID;
  • '7_DAYS_EXCEEDED' — el diálogo de 7 días en Instagram fue cerrado;
  • 'COMMENT_ALREADY_PRIVATE_REPLIED' — este comentario en Instagram ya ha sido respondido en una conversación directa;
  • 'COMMENT_INVALID_FOR_PRIVATE_REPLY' — es imposible responder a este comentario en Instagram en una conversación directa.
  • 'COMMENT_CAN_BE_TEXT_ONLY' — solo puedes responder a comentarios en Instagram con formato de texto;
  • 'CANNOT_REPLY_TO_DELETED' — no puedes responder a un mensaje porque el usuario lo eliminó;
  • 'GENERAL_ERROR' — se ha producido un error. La información ya se ha enviado a los desarrolladores de Wazzup;
  • 'UNKNOWN_ERROR' — se ha producido un error desconocido. Inténtalo de nuevo más tarde;
  • 'CHANNEL_REJECTED' — el mensaje no se ha enviado porque el canal ha sido rechazado.
error.description String Descripción del error
text String Texto del mensaje. Puede que no esté presente si el mensaje tiene contenido.
contentUri String Enlace al contenido del mensaje (puede que no exista si el mensaje no contiene contenido)
authorName String Nombre del remitente, solo aparece si isEcho = true
authorId String ID del usuario en tu CRM
isEcho Boolean false si el mensaje es entrante; true si es saliente, pero enviado fuera del API (por iframe o desde el teléfono)
instPost Object Información sobre la publicación de Instagram. Se aplica cuando la publicación es un comentario de Instagram.
contact Object Información de contacto
contact.name String Nombre del contacto
contact.avatarUri String El URI del avatar del contacto. Aplica si un avatar está en Wazzup
contact.username String Solo para Telegram.

Nombre de usuario de un contacto de Telegram, sin @ al principio.

contact.phone String Solo Telegram.

Número de teléfono de contacto en formato internacional.

interactive Interactive Matriz de objetos con botones de Salesbot amoCRM adjuntos al mensaje
quotedMessage Object Contiene un objeto con los parámetros del mensaje citado

Una vista del objeto con información sobre la publicación de Instagram.

 {
id: '2430659146657243411_41370968890',
src: 'https://www.instagram.com/p/CG7b52ejyET',
sha1: 'dc8c036b4a0122bb238fc38dcb0391c125e916f2',
likes: 0,
author: 'wztestdlv',
comments: 22,
timestamp: 1603977171000,
updatedAt: 1608905897958,
authorName: '',
authorId: '798633247',
description: 'Beauty',
previewSha1: '3a55c2920912de4b6a66d24568470dd4ad367c34',
imageSrc: 'https://store.dev-wazzup24.com/dc8c036b4a0122bb238fc38dcb0391c125e916f2',
previewSrc: 'https://store.dev-wazzup24.com/3a55c2920912de4b6a66d24568470dd4ad367c34'
}

Webhook sobre actualización del estado de mensajes salientes

Este webhook envía un objeto JSON con la clave messages, cuyo valor es un array de objetos con los siguientes parámetros:

Parámetro Tipo Descripción
messageId String Mensajes de guía de Wazzup
timestamp String La hora de recepción de la información de actualización de estado
status String el estado del mensaje que se actualizó: ENUM (‘sent’|’delivered’|’read’|’error’)
error Object Opcional, aparece solo cuando 'estado': 'error'
error.error String Código de error
error.description String Descripción del error
error.[data] String Más información sobre el error
{
"messages": [
{
"messageId": "be3dc577-60c4-4fc8-83a5-8c358e0bfe15", // guid of the message whose status update we are notifying
"timestamp": "2025-02-05T06:01:07.499Z", // is the time of receiving status update information
"status": "delivered"
}
]
}

Webhooks sobre creación de nuevo contacto o trato (deal)

Wazzup envía este webhook cuando es necesario crear un contacto o trato (deal) en tu CRM. Esto sucede en tres casos:

Caso 1: En la configuración de integración, la opción "Cada nuevo cliente se asigna al primer respondedor" está activada

Un nuevo cliente escribe. Un empleado le responde. Wazzup envía un webhook sobre el nuevo contacto y la creación de un acuerdo si se cargan embudos con etapas desde el CRM.

Este webhook solo se envía si Wazzup ha recibido el ID del empleado que respondió al mensaje del nuevo cliente.

Caso 2: En la configuración de integración, está activada la opción "Los vendedores se asignan a los nuevos clientes por turnos"

Un nuevo cliente escribe. Wazzup envía un webhook sobre la creación de un nuevo contacto y trato si se cargan embudos con etapas desde CRM.

Para que los webhooks se activen en estos dos casos, debe agregar empleados a la cuenta personal y habilitar uno de ellos en la configuración de integración para activar el control deslizante "Obtener nuevos clientes".

Caso 3: El usuario hace clic en el botón "+" en la lista de "Deals" en el chat de Wazzup

Primero comprobamos si el contacto ya existe en nuestra base de datos.

Si ya existe, enviamos un webhook para iniciar la creación del acuerdo:

 { 
createDeal: { 
responsibleUserId: '1', // the id of the user who was selected in turn or was the first to respond 
contacts: ['1'] // link of the deal with a newly created contact 
source: 'auto'|'byUser', // auto - on incoming or outgoing message, byUser - by the button in the "Deals" dropdown 
}, 
}

Si el contacto no existe, primero enviamos un webhook para iniciar la creación del contacto:

 {
createContact: {
responsibleUserId: '1', // id of the user who was selected in turn or was the first to respond
name: 'contacts.name', // contact name from the contacts table
contactData: [{ chatType, chatId }],
source: 'auto'|'byUser', // auto - on incoming or outgoing message, byUser - by button
},
}

Crear el contacto y responder con 200 OK y un objeto JSON que siga el esquema esperado del endpoint de creación de contactos.

Entonces, Wazzup enviará el webhook createDeal.

El CRM debe crear el trato y responder también con 200 OK y un objeto JSON siguiendo el esquema del endpoint de creación de deals.

Webhook sobre cambio de estado del canal

Este webhook se envía cuando el estado de un canal cambia.

Parámetro Tipo Descripción
channelId String Guía de canales
state String Estado actual del canal
qr String Código QR en formato base64. Solo está presente si el estado es 'qr'
qridle String Indica que el canal fue desautorizado o el QR expiró
timestamp Integer Tiempo en milisegundos de cuándo se estableció este estado
 Ejemplo
{
    "channelsUpdates": [
        {
            "channelId": "d9e5721c-ce2b-444f-9627-60a8129d7e1f",
            "state": "qr",
            "timestamp": 1603977171000,
            "qr": "data:image/png;base64,iVBORw0KGgoAAAANS"
        }
    ]
}
Valores posibles de state (estado del canal)
Valor  Descripción Tipos de canal
active El canal está activo, todo funciona correctamente Todos
disabled El canal está desactivado temporalmente por motivos técnicos Todos
qr Es necesario escanear el código QR WhatsApp, Telegram API (tgapi)
phoneUnavailable No hay conexión con el teléfono. Es una aplicación obsoleta, pero ocasionalmente puede manifestarse si hay problemas con WhatsApp o con versiones anteriores de la aplicación en el teléfono. WhatsApp
openElsewhere  WhatsApp Web está abierto en otro lugar WhatsApp
notEnoughMoney El canal no está pagado Todos
unauthorized No autorizado. Se requiere volver a autorizar el canal Todos

Webhook sobre nuevo estado de moderación de una plantilla WABA

Parámetro Tipo Descripción
templateGuid String Guía de plantillas
name String Nombre de la plantilla
status String Estado de moderación de la plantilla
Posibles valores del status
Valor Descripción
APPROVED  Igual que "Activo" en la cuenta de Wazzup. La plantilla está aprobada por Meta y se puede usar.
PENDING  Igual que "En moderación" en la cuenta personal de Wazzup. Meta aún valida la plantilla.
REJECTED  En la cuenta personal de Wazzup: "Rechazado". La plantilla no pasó la moderación de Meta.
PAUSED  En la cuenta personal de Wazzup: "Rechazado". Los destinatarios se quejaron de la plantilla, por lo que Meta la revisa de nuevo.
DISABLED  En la cuenta personal de Wazzup: "Rechazado". La plantilla fue bloqueada tras quejas.