Antes de empezar
- Base URL:
https://app.relevantleads.io - Formato: JSON en el cuerpo y en la respuesta. Envía
Content-Type: application/json. El cuerpo debe ser un objeto JSON (un arreglo o un valor suelto se rechaza). - Autenticación: encabezado
Authorization: Bearer <llave>. - Métodos: solo
POST. No hay CORS ni respuesta aOPTIONS: llama desde tu servidor, no desde el navegador del usuario final. - Entorno: no existe sandbox ni llaves de prueba. Todas las llaves son
rk_live_y operan sobre la cuenta real. Para probar sin arriesgar datos, usa un embudo de pruebas y leads de prueba.
1. La llave
Una persona con rol Owner o Admin la crea en Ajustes, Integraciones, API de leads, Nueva llave. Al crearla define tres cosas que viven en la llave, no en cada envío:- El embudo y etapa destino por defecto de los leads que entren con ella (tu envío puede sobrescribirlos, ver abajo).
- El origen con el que se etiquetan esos leads en Contactos, Atribución y reportes (por ejemplo “Registro web”; si no se configura, “Registro externo”).
- Su nombre, que aparece en el chat de cada lead que entra con ella.
rk_live_ seguido de 43 caracteres, 51 en total. Se muestra completa una sola vez al crearla; Relevant solo guarda un hash. Guárdala en variables de entorno o en tu gestor de secretos. Si se pierde, el administrador la revoca y crea otra.
Cada petición autenticada actualiza el Último uso de la llave (aunque después falle por validación), así que quien administra puede ver desde Relevant que tu integración ya está llamando. Una llave revocada responde 401 de inmediato.
Errores de autenticación
2. Registrar un lead
POST /api/v1/leads
Crea el contacto y su lead en el embudo destino. Si la persona ya existe, la reutiliza (ver deduplicación). Es seguro reintentar el mismo envío.
Campos del cuerpo
Los campos de texto opcionales (
external_id, email, country_code, UTMs) que exceden su máximo se recortan en silencio, no se rechazan. Solo name rechaza por longitud. Envía valores dentro de los límites para que lo que guardes coincida con lo que mandaste.
Normalización del teléfono
Relevant quita espacios, guiones, paréntesis, puntos y el+, y aplica estas reglas:
- 10 dígitos: se antepone
country_code(o52)."5512345678"se guarda como525512345678. - Empieza con
521y tiene 13 dígitos: se quita el1(formato viejo de celulares mexicanos)."5215512345678"se guarda como525512345678. - Empieza con
00: se quitan los dos ceros. - De 11 a 15 dígitos (por ejemplo 12 con lada): se guarda tal cual; se asume que ya trae código de país.
- 8 o 9 dígitos: no se guarda. La petición responde
422confields.phoneexplicando el formato (“Debe tener 10 dígitos con lada (por ejemplo “8112345678”) o incluir el código de país (por ejemplo “+528112345678”, máximo 15 dígitos).”).
phone. En un contacto que ya existía, el teléfono guardado no se reemplaza.
Destino del lead
- Por defecto: el embudo y etapa de la llave. Si la llave tiene embudo pero no etapa, la primera etapa del embudo. Si la llave no tiene embudo y el cuerpo tampoco, se crea solo el contacto (
deal_id: null). funnel_iden el cuerpo: se valida que sea de tu cuenta (404si no). La etapa por defecto de la llave se descarta.stage_iden el cuerpo: se valida que sea de tu cuenta (404si no). Si viene sinfunnel_id, el embudo es el de esa etapa.
Respuesta
201 Created cuando se creó el contacto o el lead. 200 OK cuando ambos ya existían y se reutilizaron.
deal_idesnullcuando no hubo embudo destino: se creó solo el contacto.funnel_idystage_idson el embudo y la etapa donde quedó el lead al terminar la petición (Relevant los relee después de crear o reutilizar el lead). Si una automatización con disparador “Nuevo lead en etapa” lo movió al crearse, aquí ves la etapa final, no la de entrada.- Guarda
contact_idydeal_idjunto a tu usuario:deal_idsirve para enviar eventos con precisión.
Deduplicación (idempotencia de registros)
- Si envías
external_idy ya existe un contacto con ese valor en tu cuenta, se reutiliza. - Si no envías
external_id, o no coincide con ningún contacto, se busca por los últimos 10 dígitos del teléfono dentro de tu cuenta. Si más de un contacto termina en esos dígitos, se reutiliza el más antiguo (el que tiene el historial). - En un contacto reutilizado se actualizan
nameyemailsi los mandas, y se rellenan los UTMs vacíos. Si el contacto no teníaexternal_idy ahora lo mandas, se le guarda; si ya tenía otro, conserva el que tenía (y un evento con el nuevoexternal_idno lo encontrará: usadeal_ido el teléfono). - Si el contacto ya tiene un lead abierto en el embudo destino, se reutiliza ese lead (
created_deal: false); no se tocan su título, monto ni etapa. Un segundo registro de la misma persona no es una oportunidad nueva. - Si su lead anterior ya se cerró (ganado o perdido), se crea uno nuevo.
custom_data
Se escribe en el chat del lead como una nota de sistema con el formato Datos del registro (nombre de la llave): clave: valor · clave: valor, visible para el equipo. Reglas:
- Se escribe solo cuando el lead se crea en este envío (
created_deal: true). Si el lead ya existía o no hay embudo destino,custom_datase descarta sin error. - Máximo 20 claves (las primeras, en orden), 40 caracteres por clave, 120 por valor, 600 en total. Los valores vacíos o nulos se omiten. Un valor anidado se serializa como texto JSON y se recorta a 120.
- Un arreglo en
custom_datase rechaza con422.
Qué pasa en Relevant al registrar
- El contacto y el lead se crean con el origen de la llave. El lead nace con prioridad Media, estado abierto y título igual a
name. - Sobre un lead nuevo corren las reglas de auto-asignación de la cuenta (reglas, responsable de etapa, responsable de embudo). Si asigna a alguien, esa persona recibe la notificación de lead asignado.
- Automatizaciones al crear: un lead nuevo dispara, dentro de la misma petición, las automatizaciones cuyo disparador “Nuevo lead en etapa” vigile la etapa donde entra; por eso
stage_iden la respuesta puede ser distinto del destino. Un lead reutilizado no dispara nada al registrarse de nuevo, porque no cambia de etapa. Para actuar cuando pase algo después en tu sistema, usa eventos. - No se envía ningún mensaje de WhatsApp al lead.
3. Avisar de un evento del lead
POST /api/v1/events
Úsalo cuando en tu sistema pase algo con un lead ya registrado: un pago, una activación, una cancelación. Relevant registra el evento, lo deja como nota en el chat del lead, notifica a la persona responsable y ejecuta las automatizaciones que estén escuchando ese evento en ese embudo.
Campos del cuerpo
Cómo se resuelve el evento
- Relevant localiza al lead: por
deal_idsi viene; si no, porexternal_id; si no coincide, por los últimos 10 dígitos dephone. - Toma sus leads abiertos (todos, o solo los del
funnel_idindicado). Los leads cerrados no se tocan. - Para cada lead abierto, ejecuta cada automatización activa que tenga un disparador Evento externo con ese nombre exacto y con el embudo del lead. En el editor, cada disparador de este tipo está ligado a un embudo; si la persona tiene leads abiertos en dos embudos y mandas el evento sin
funnel_id, ambos leads reciben la nota y la notificación, pero solo se ejecuta la automatización del embudo que coincide. - Deja rastro: registro del evento, nota de sistema
Evento recibido de <nombre de la llave>: <event> (<resumen del payload>)en el chat de cada lead abierto alcanzado, y notificación dentro de la app a la persona asignada a cada uno.
Respuesta
200 OK siempre que el lead exista, aunque no tenga leads abiertos o ninguna automatización lo escuche.
- Si el lead no existe:
404 not_found, confieldigual adeal_id,external_idophonesegún lo que mandaste. Regístralo primero conPOST /api/v1/leads. event_idpuede venirnullen el caso raro de que la ejecución ocurrió pero el registro del evento falló. La ejecución no se repite.
Idempotencia de eventos
- La
idempotency_keyes única por cuenta y no caduca: la misma clave meses después sigue devolviendo el resultado original. - Un reintento con una clave ya recibida responde
200conduplicate: true, eloutcomeoriginal (fired,no_automationono_open_deals) y sin el arreglodeals. No se ejecuta nada. - Si dos envíos con la misma clave llegan al mismo tiempo, el segundo recibe
409 conflict. Reintenta una vez: obtendrás el resultado original conduplicate: true. Esta protección cubre reintentos secuenciales (que es como reintentan los webhooks); si tu sistema puede mandar el mismo evento en paralelo, serializa esos envíos de tu lado.
4. Errores
Todas las respuestas de error tienen esta forma:
Orden de evaluación en ambos endpoints: autenticación (401), cuerpo (413, 400), validación (422), existencia de identificadores (404), proceso (500).
5. Límites y comportamiento
- Tamaño del cuerpo: 16 KB.
- Límite de tasa: no hay. La llave registra su último uso y puede revocarse al instante; ese es el mecanismo para detectar y cortar un abuso. Si vas a enviar volúmenes altos (miles por hora), avísanos antes a soporte@relevantleads.io.
- Recortes silenciosos:
external_ideidempotency_keya 128,emaila 254, UTMs a 500,country_codea 4 caracteres. - Plan: el registro de leads y los eventos funcionan en todos los planes. No hay validación de plan en estos endpoints.
- Sin CORS, solo POST, sin sandbox.
- Edición de llaves: una llave no se edita; para cambiar su embudo, etapa u origen, el administrador crea otra y revoca la anterior. La revocación no borra el historial de los leads que entraron con ella.
6. Buenas prácticas
- Manda siempre
external_id: hace seguros los reintentos y es lo que identifica al lead cuando envías eventos. - Guarda el
deal_idque te devuelve el registro y úsalo en los eventos: es la forma más precisa y evita ambigüedades si la persona tiene varios leads. - En eventos, manda siempre
idempotency_key; construye la clave con algo que identifique la acción de negocio (por ejemplopago-<id de tu pago>), no con la fecha y hora del envío. - Manda
country_codeexplícito si tus usuarios no son solo de México, y el teléfono con exactamente 10 dígitos o ya con lada. - Usa una llave por sistema. Si necesitas que dos sistemas cuenten como el mismo origen en reportes, dales el mismo texto de origen al crearlas.
- Antes de conectar, pide a quien administra Relevant que pruebe la automatización con el botón Probar con un lead y que te pase el nombre exacto del evento.
¿Necesitas ayuda? Escríbenos a soporte@relevantleads.io y con gusto te apoyamos.