Webhook de contactos
Reciba en su servidor cada contacto que ingresa por WhatsApp, junto con sus tags y su etapa del embudo, en tiempo real y mediante eventos firmados.
Introducción
El webhook de contactos permite integrar Intely con cualquier sistema externo (CRM, ERP, base de datos propia). Una vez activado, Intely envía una solicitud POST con un documento JSON a la URL configurada cada vez que se crea un contacto o cambian sus tags o su etapa del embudo.
Cada solicitud está firmada con HMAC-SHA256 utilizando un secreto exclusivo de su cuenta, lo que permite verificar que el evento fue emitido por Intely. La integración completa consiste en los cinco pasos descriptos a continuación.
Publique un endpoint HTTPS
Implemente en su servidor una ruta que acepte solicitudes POST con cuerpo JSON. Requisitos:
- La URL debe ser pública y utilizar
https://. No se aceptan direcciones internas ni redes privadas. - Debe responder con un código
2xxen menos de 5 segundos. Si el procesamiento del evento es costoso, encole el trabajo y responda de inmediato. - Conserve acceso al cuerpo crudo del request (antes de parsear el JSON): es necesario para verificar la firma en el paso 3.
Configure el webhook en el dashboard
- Ingrese al dashboard de Intely y diríjase a
Agente → Integraciones → Webhook. - Ingrese la URL de su endpoint y active la opción Habilitado.
- Al guardar por primera vez, se genera el secreto de firma (
whsec_...). Almacénelo de forma segura, por ejemplo en una variable de entorno: se muestra una única vez y no puede recuperarse. Si lo pierde o se ve comprometido, utilice la opción Rotar secreto, que genera uno nuevo e invalida el anterior de inmediato.
Verifique la firma de cada evento
Cada solicitud incluye los siguientes encabezados:
POST /su-endpoint HTTP/1.1
Content-Type: application/json
User-Agent: Intely-Webhooks/1.0
X-Intely-Event: contact.updated
X-Intely-Delivery-Id: 5f0c2f9a-1b7e-4c3d-9a52-8f4e6d2b1c0a
X-Intely-Signature: t=1783558800,v1=a1b2c3d4e5f6...La firma del header X-Intely-Signature se calcula como HMAC-SHA256(secreto, "{t}.{cuerpo}"), donde t es el timestamp Unix del envío y cuerpo es el cuerpo crudo del request. Para validarla:
- Extraiga
tyv1del header. - Calcule el HMAC-SHA256 de la cadena
{t}.{cuerpo}con su secreto y codifíquelo en hexadecimal. - Compare el resultado con
v1mediante una comparación en tiempo constante. - Rechace el evento si el timestamp difiere en más de 5 minutos de la hora actual (protección contra ataques de repetición).
import hashlib, hmac, time
def verificar_firma(header_firma: str, cuerpo: str, secreto: str) -> bool:
"""Valida el header X-Intely-Signature sobre el cuerpo crudo del request."""
partes = dict(p.split("=") for p in header_firma.split(","))
timestamp, firma_recibida = partes["t"], partes["v1"]
firma_esperada = hmac.new(
secreto.encode(),
f"{timestamp}.{cuerpo}".encode(),
hashlib.sha256,
).hexdigest()
# Comparación en tiempo constante + ventana de tolerancia de 5 minutos
if not hmac.compare_digest(firma_esperada, firma_recibida):
return False
return abs(time.time() - int(timestamp)) <= 300El mismo procedimiento puede implementarse en cualquier lenguaje con soporte de HMAC-SHA256. Toda solicitud con firma inválida debe descartarse con un código 401.
Procese los eventos
Se emiten dos tipos de evento:
| Evento | Cuándo se envía |
|---|---|
| contact.created | Un contacto nuevo escribe por primera vez. |
| contact.updated | Cambian los tags o la etapa del contacto. |
Ambos comparten la misma estructura:
{
"version": 1,
"event": "contact.updated",
"sent_at": "2026-07-14T20:00:00+00:00",
"data": {
"id": 12345,
"platform": "whatsapp",
"name": "Juan Pérez",
"phone": "5491122334455",
"tags": [
{ "id": 7, "name": "interesado" },
{ "id": 12, "name": "departamento" }
],
"stage": { "id": 4, "name": "Calificado" },
"source_type": "whatsapp_ad",
"created_at": "2026-07-14T19:58:00+00:00"
}
}| Campo | Descripción |
|---|---|
| data.id | Identificador único del contacto en Intely. Utilícelo como clave para el upsert en su sistema. |
| data.platform | Canal de origen: whatsapp o instagram. |
| data.name | Nombre del contacto, según su perfil de WhatsApp. |
| data.phone | Teléfono en formato internacional, sin el signo +. |
| data.tags | Tags vigentes del contacto: lista de objetos { id, name }. |
| data.stage | Etapa actual del embudo: objeto { id, name }. |
| data.source_type | Origen del contacto: whatsapp_ad, whatsapp_post o whatsapp_direct. |
| data.created_at | Fecha de creación del contacto (ISO 8601, UTC). |
null ni listas vacías.Cada evento contiene el estado completo y actual del contacto, no un diferencial. Se recomienda realizar un upsert por data.id y conservar la última versión recibida.
Realice una prueba
Desde Agente → Integraciones → Webhook, utilice el botón Enviar evento de prueba. Intely enviará un evento firmado con datos ficticios que incluye el campo "test": true dentro de data, de modo que pueda distinguirlo de los eventos reales. Si su endpoint responde 2xx, la integración queda operativa y los eventos comenzarán a llegar automáticamente.
Referencia: política de entrega
| Aspecto | Comportamiento |
|---|---|
| Timeout | 5 segundos por intento. |
| Reintentos | Hasta 3 intentos con backoff exponencial, ante errores de red o respuestas 5xx / 429. |
| Respuestas 3xx / 4xx | No se reintentan. No se siguen redirecciones. |
| Idempotencia | El header X-Intely-Delivery-Id identifica cada entrega; utilícelo para descartar duplicados generados por los reintentos. |
| Orden | No se garantiza el orden de llegada. Ante eventos del mismo contacto, conserve el de sent_at más reciente. |
| Seguridad | Firma HMAC-SHA256 por evento, con timestamp para prevenir ataques de repetición. El secreto puede rotarse desde el dashboard en cualquier momento. |
¿Necesita ayuda?
Nuestro equipo puede acompañarlo durante todo el proceso de integración.
Contactar al equipo