Notificaciones por API: leads y alertas del bot en tu servidor

Si los leads deben llegar a tu propio sistema (un CRM propio, Make, n8n, Zapier o cualquier servidor), activa API en las notificaciones del bot. Indicas una URL HTTPS y la plataforma le envía una solicitud POST con JSON: por cada lead nuevo y sus actualizaciones, cuando el bot necesita a una persona y cuando se acaban los tokens. Cada solicitud va firmada con un secreto para que tu servidor compruebe que viene de BotB2B.

Qué notificaciones llegan

eventCuándoQué contiene
lead.createdEl bot captó un lead nuevoLos contactos del cliente, un resumen y la conversación, enlaces al chat
lead.updatedEl lead recibió datos nuevos: teléfono, comentario, cambio de estadoEl mismo lead con el mismo data.lead.id: actualiza el registro en tu sistema
chat.help_neededEl bot llamó a una persona y se pausó en este chatreason: bot_asked si el bot no pudo con el diálogo, messages_limit si la conversación llegó al límite de mensajes
tokens.lowQuedan pocos tokens en el saldotokensRemaining: cuántos quedan
tokens.depletedSe acabaron los tokens: los bots dejan de responder a los clientes
tokens.bot_silentUn bot no respondió a un cliente por falta de saldo (como máximo una vez al día)integrationId e integrationName: la cuenta donde el bot no respondió
testPulsaste Probar en los ajustesUn lead de ejemplo

Los eventos de tokens se refieren al saldo de toda la cuenta, no a un bot, por eso llegan a las URL de todos los bots con API activada. Varios bots con la misma URL reciben una sola solicitud.

Cómo conectarlo

  1. 1

    Abre las notificaciones del bot

    Ve a Recepción → Bots, elige el bot y abre la pestaña Notificaciones. En la fila API pulsa Configurar notificaciones.

  2. 2

    Pega la URL del receptor

    En URL del receptor escribe la dirección que acepta solicitudes POST: el endpoint de tu CRM, un disparador webhook de Make o n8n, o un Catch Hook de Zapier. La URL debe empezar por https://.

  3. 3

    Pulsa Probar

    Se envía a la URL un lead de ejemplo con el evento test. Debajo del botón verás el código de respuesta, el tiempo y el inicio de la respuesta de tu servidor. Un código 2xx significa que funciona. No hace falta guardar la URL antes de probar.

    La prueba se puede lanzar hasta 5 veces por minuto por bot, para que la configuración nunca se convierta en una avalancha de solicitudes a un servidor ajeno.

  4. 4

    Guarda

    Pulsa Guardar: la fila API de la lista de notificaciones pasa a Notificaciones configuradas. Para dejar de enviar, pulsa Desactivar en la misma ventana.

Solo se aceptan URL HTTPS. Las direcciones internas y locales (localhost, 10.x, 192.168.x, etc.) se rechazan: el receptor debe ser accesible desde internet.

Formato de la solicitud

Método POST, cuerpo JSON en UTF-8. El tipo de notificación está en el campo event y en el encabezado X-Webhook-Event. El campo type se mantiene por compatibilidad con integraciones antiguas (lead_new, lead_update, bot_chat_have_mistake, tokens_threshold, tokens_depleted, bot_reply_no_balance, lead_test).

EncabezadoValor
Content-Typeapplication/json
X-Webhook-EventEl evento, igual que el campo event (lead.created, chat.help_needed…)
X-Webhook-DeliveryId único de la solicitud, igual que delivery_id en el cuerpo
X-Webhook-TimestampHora de envío en ISO 8601 (UTC)
X-Webhook-SignatureFirma sha256=…, abajo se explica cómo comprobarla

Lead: lead.created y lead.updated

json
{
  "event": "lead.created",
  "type": "lead_new",
  "bot_id": "c8df2a84-9b17-4bf9-9248-9cee74eaeee6",
  "data": {
    "lead": {
      "id": "9b2f6c1e-…",
      "name": "Anna",
      "phone": "+15551234567",
      "email": "[email protected]",
      "telegram_username": null,
      "city": "Austin",
      "address": null,
      "scheduled_call": null,
      "type_payment": null,
      "need_delivery": null,
      "delivery_time": null,
      "meeting_date_time_office": null,
      "meeting_date_time_client": null,
      "extended_info": null,
      "status": "NEW",
      "comment": "Wants a quote for 3 rooms"
    },
    "botChatId": 12345,
    "shortInfo": "Wants a renovation quote for three rooms, asks for a call in the evening",
    "messages": "Client: …\nBot: …",
    "linkToChat": "https://…",
    "channelUrl": "https://…"
  },
  "timestamp": "2026-09-21T12:00:00.000Z",
  "delivery_id": "3f1c2a4e-…"
}
  • data.lead.id es el mismo en lead.created y en cada lead.updated de un lead: úsalo para actualizar el registro en tu sistema.
  • Los campos que el bot no recogió llegan como null.
  • shortInfo es el resumen de la conversación y messages la transcripción: breve o completa según el ajuste del bot ¿Cómo dar formato a la notificación en Telegram?.
  • linkToChat enlaza a la conversación en el canal de origen cuando la plataforma lo ofrece.

Se necesita ayuda: chat.help_needed

json
{
  "event": "chat.help_needed",
  "type": "bot_chat_have_mistake",
  "bot_id": "c8df2a84-9b17-4bf9-9248-9cee74eaeee6",
  "data": {
    "reason": "bot_asked",
    "botId": "c8df2a84-9b17-4bf9-9248-9cee74eaeee6",
    "botChatId": 12345,
    "shortInfo": "The client asks about a custom order",
    "messages": "Client: …\nBot: …",
    "linkToChat": "https://…"
  },
  "timestamp": "2026-09-21T12:05:00.000Z",
  "delivery_id": "…"
}

El bot en este chat ya se pausó y espera a una persona: abre la conversación con linkToChat o en Chats y responde tú al cliente.

Saldo de tokens: tokens.*

json
{
  "event": "tokens.low",
  "type": "tokens_threshold",
  "bot_id": "c8df2a84-9b17-4bf9-9248-9cee74eaeee6",
  "bot_ids": [
    "c8df2a84-9b17-4bf9-9248-9cee74eaeee6",
    "5e0a7d31-…"
  ],
  "data": {
    "tokensRemaining": 50000
  },
  "timestamp": "2026-09-21T13:00:00.000Z",
  "delivery_id": "…"
}

Los eventos de tokens llegan una vez por URL: bot_ids enumera todos los bots con esta URL y bot_id es el bot cuyo secreto firmó la solicitud. Usa tokens.low para recargar a tiempo y trata tokens.depleted y tokens.bot_silent como alarmas: los clientes se quedan sin respuesta.

Verificación de la firma

El secreto de firma está en la misma ventana, en el bloque Secreto de firma (botones Mostrar y Copiar). Cada bot tiene su propio secreto. La firma es el HMAC-SHA256 de la cadena X-Webhook-Timestamp + . + el cuerpo sin procesar, con el secreto como clave, en hex y con el prefijo sha256=. Calcúlala sobre el cuerpo antes de parsear el JSON: un JSON re-serializado puede no coincidir byte a byte.

Node.js
import crypto from "node:crypto";

// rawBody: the request body as a string, BEFORE JSON.parse
function isValid(rawBody, headers, secret) {
  const expected =
    "sha256=" +
    crypto
      .createHmac("sha256", secret)
      .update(headers["x-webhook-timestamp"] + "." + rawBody)
      .digest("hex");
  const got = headers["x-webhook-signature"] || "";
  return (
    got.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected))
  );
}
Python
import hashlib, hmac

def is_valid(raw_body: bytes, headers, secret: str) -> bool:
    message = headers["X-Webhook-Timestamp"].encode() + b"." + raw_body
    expected = "sha256=" + hmac.new(secret.encode(), message, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, headers.get("X-Webhook-Signature", ""))

Para rechazar repeticiones, compara X-Webhook-Timestamp con la hora actual (por ejemplo, no más de 5 minutos) y guarda los delivery_id ya procesados.

Si el secreto se filtra, pulsa Generar nuevo: el anterior deja de funcionar al instante, así que actualízalo en tu servidor.

Entrega y respuesta de tu servidor

  • Responde con un código 2xx en 10 segundos. Haz el procesamiento pesado después de responder, en segundo plano.
  • No se siguen redirecciones: indica la URL final.
  • Los envíos fallidos no se reintentan. La notificación por API se pierde, pero los demás canales (Telegram, correo, CRM) siguen funcionando y el lead queda en Leads.
  • La API funciona junto con los demás canales, no en su lugar: puedes recibir leads en Telegram y en tu sistema a la vez.
¿Funciona con Make, n8n o Zapier?

Sí. Crea un escenario con un disparador Webhook (Catch Hook en Zapier), pega su URL HTTPS en el campo API y pulsa Probar: el lead de ejemplo aparece en el escenario y puedes mapear los campos a partir de él.

¿Varios bots pueden usar la misma URL?

Sí. bot_id indica qué bot envió la notificación. Cada bot tiene su propio secreto: verifica siempre la firma con el secreto del bot de bot_id, también en los eventos de tokens.

¿Por qué se rechaza mi URL?

Necesita https:// y un dominio accesible desde internet. Las URL con http://, localhost y las IP internas se rechazan. Para desarrollo local usa un túnel con dirección HTTPS.

¿Se puede configurar sin la interfaz?

Sí, con el servidor MCP de Recepción: la herramienta bots, acciones set_lead_webhook, test_lead_webhook y get_lead_webhook. Consulta Conectar el servidor MCP.

Notificaciones y CRMTelegram, correo, el CRM integrado y amoCRM

Ver también

Prueba BotB2B gratis

El registro toma un minuto y los tokens iniciales corren por nuestra cuenta. Configúralo todo con esta guía.

Empezar gratis