Chat.IA26 API

Documentación completa para integrar asistentes de IA en tu plataforma.

v1.0

¿Qué es Chat.IA26?

Chat.IA26 es una API que te permite agregar asistentes inteligentes a tu sistema. Gestiona conversaciones, integra con WhatsApp, crea orquestadores personalizados y automatiza la atención a clientes.

Características principales

  • API REST: Endpoints simples para crear, leer y gestionar chats
  • Webhooks: Recibe eventos en tiempo real (nuevos mensajes, cambios de estado)
  • Orquestrador visual: Componente embebible para crear flujos sin código
  • Integración WhatsApp: Conecta directamente con tus clientes
  • Sistema de logs: Auditoria completa de todas las acciones

Base URL

https://chatia26.bitnodo.net/api/v1

Autenticación

Todos los requests a la API deben incluir tu token de acceso en los headers.

Bearer Token

Incluye tu clave de acceso en el header Authorization:

HTTP Request
Authorization: Bearer sk_live_your_secret_key_here
Content-Type: application/json

Alternativa: X-API-Key

También puedes usar el header X-API-Key:

HTTP Request
X-API-Key: sk_live_your_secret_key_here
Content-Type: application/json
Importancia: Protege tu clave de acceso. Guárdala en variables de entorno del servidor, nunca en JavaScript frontend.

Quick Start

Aquí hay un ejemplo completo para crear un chat, enviar mensajes, y escuchar webhooks.

1. Crear un chat

cURL
curl -X POST https://chatia26.bitnodo.net/api/v1/chats \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_name": "Juan Pérez",
    "client_number": "+56912345678",
    "platform": "web",
    "metadata": {
      "user_id": 123,
      "source": "sitio-web"
    }
  }'

2. Response - Chat creado

JSON Response
{
  "success": true,
  "chat": {
    "id": "chat_abc123xyz",
    "client_name": "Juan Pérez",
    "client_number": "+56912345678",
    "platform": "web",
    "status": "active",
    "orchestrator_id": "orch_def456",
    "created_at": "2026-03-09T10:30:00Z",
    "updated_at": "2026-03-09T10:30:00Z",
    "metadata": {
      "user_id": 123,
      "source": "sitio-web"
    }
  }
}

3. Recibir webhook cuando hay nuevo mensaje

Configura un endpoint en tu servidor que reciba POST en:

https://miservidor.com/webhooks/chat-message

Recibirás eventos como este:

Webhook Payload
{
  "event": "chat.message_received",
  "chat_id": "chat_abc123xyz",
  "message": {
    "id": "msg_xyz789",
    "sender": "assistant",
    "text": "Hola, ¿en qué puedo ayudarte?",
    "type": "text",
    "created_at": "2026-03-09T10:30:15Z"
  },
  "timestamp": "2026-03-09T10:30:15Z"
}

Widget de Chat para Sitios Web

Usa el widget oficial de chat para incrustar el asistente comercial de chatia26 en cualquier sitio web, sin tener que implementar tu propia interfaz de chat.

1. Incluir el script del widget

Agrega este snippet dentro del <body> de tu página HTML:

HTML Snippet
<script
  src="https://chatia26.bitnodo.net/widget/chat.js"
    data-widget-token="TU_WIDGET_TOKEN"
  data-primary-color="#2563eb"
  async
></script>

2. Parámetros del widget

Configura el comportamiento y estilo del widget usando atributos data-* en el script:

Parámetro Requerido Descripción
data-widget-token Token público de widget para tu empresa/cuenta. Se genera una sola vez desde la base de datos y puedes obtenerlo vía API (GET /api/v1/users/widget-token) o desde el panel.
data-primary-color No Color principal del widget en formato HEX (ej: #2563eb). Si se omite, se usa el color por defecto.
data-position No Posición del botón de chat: bottom-right (por defecto) o bottom-left.

3. Experiencia del usuario final

Una vez incluido el script, se mostrará un botón flotante de chat en la esquina seleccionada. Al hacer clic, se abrirá una ventana de chat donde el usuario podrá conversar con el asistente comercial asociado a tu cuenta de chatia26.

Recurso: Conversaciones

Lista y gestiona las conversaciones de tu cuenta (WhatsApp, widget, Telegram, etc.). Filtra por plataforma u otros campos directamente en tu sistema.

Listar todas las conversaciones

GET /index.php?route=conversaciones

Devuelve todas las conversaciones de tu cuenta con paginación. Acepta también route=chats o route=conversations.

Parámetros Query

Parámetro Tipo Descripción
page integer Número de página (default: 1)
per_page integer Resultados por página (default: 20, máximo: 100)
estado string Opcional. Filtrar por estado: activa, finalizada, pausada, transferida
plataforma string Opcional. Filtrar por plataforma: whatsapp, api_directa, telegram, facebook
cliente_telefono string Opcional. Buscar por teléfono (búsqueda parcial)
fecha_desde string Opcional. Conversaciones iniciadas desde esta fecha (YYYY-MM-DD)
fecha_hasta string Opcional. Conversaciones iniciadas hasta esta fecha (YYYY-MM-DD)
sort string Campo de orden: fecha_ultima_actividad (default), fecha_inicio, id
order string ASC o DESC (default: ASC)

Ejemplo — todas las conversaciones

curl "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones&page=1&per_page=50&sort=fecha_ultima_actividad&order=DESC" \
  -H "Authorization: Bearer sk-TU_API_KEY"

Ejemplo — solo WhatsApp activas

curl "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones&plataforma=whatsapp&estado=activa&per_page=50" \
  -H "Authorization: Bearer sk-TU_API_KEY"

Response 200 OK

{
  "success": true,
  "message": "Conversaciones obtenidas exitosamente",
  "data": {
    "data": [
      {
        "id": 123,
        "session_id": "sess_abc123",
        "cliente_telefono": "+56912345678",
        "cliente_nombre": "Juan Pérez",
        "plataforma": "whatsapp",
        "estado": "activa",
        "fecha_inicio": "2026-03-10 09:00:00",
        "fecha_ultima_actividad": "2026-03-10 09:14:22",
        "total_mensajes": 8,
        "ultimo_mensaje": "2026-03-10 09:14:22",
        "orquestador_nombre": "Asistente SA Publicidad",
        "agente_activo_nombre": "Agente Comercial SA",
        "metadata": { "url": "https://sapublicidad.cl" }
      }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 50,
      "total": 320,
      "total_pages": 7
    }
  }
}
Nota para integradores: La API devuelve todas las plataformas juntas. Filtra en tu sistema por plataforma === 'whatsapp' (u otro valor) para mostrar solo las conversaciones que necesitas en tu panel.

Obtener una conversación específica

GET /index.php?route=conversaciones&id={id}

Obtiene todos los detalles de una conversación, incluyendo sus mensajes. También acepta route=chats.

Parámetros Query

Parámetro Tipo Descripción
id integer ID numérico de la conversación

Ejemplo

curl "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones&id=123" \
  -H "Authorization: Bearer sk-TU_API_KEY"

Response 200 OK

{
  "success": true,
  "message": "Conversación obtenida exitosamente",
  "data": {
    "id": 123,
    "usuario_id": 1,
    "orquestador_id": 5,
    "session_id": "sess_abc123",
    "cliente_telefono": "+56912345678",
    "cliente_nombre": "Juan Pérez",
    "plataforma": "whatsapp",
    "estado": "activa",
    "fecha_inicio": "2026-03-09 10:30:00",
    "fecha_ultima_actividad": "2026-03-09 11:45:32",
    "orquestador_nombre": "Asistente SA Publicidad",
    "agente_activo_nombre": "Agente Comercial SA",
    "agente_tipo": "ventas",
    "contexto_conversacion": { "inicio": "2026-03-09T10:30:00-04:00" },
    "metadata": { "url": "https://sapublicidad.cl" },
    "total_mensajes": 4,
    "mensajes": [
      {
        "id": 1,
        "conversacion_id": 123,
        "rol": "usuario",
        "contenido": "Hola, tengo una consulta",
        "tipo_contenido": "texto",
        "fecha_creacion": "2026-03-09 10:30:15",
        "agente_nombre": null,
        "agente_tipo": null,
        "metadata": null
      },
      {
        "id": 2,
        "conversacion_id": 123,
        "rol": "asistente",
        "contenido": "¡Hola! ¿En qué puedo ayudarte?",
        "tipo_contenido": "texto",
        "fecha_creacion": "2026-03-09 10:30:20",
        "agente_nombre": "Agente Comercial SA",
        "agente_tipo": "ventas",
        "metadata": null
      }
    ]
  }
}

Actualizar estado de una conversación

PATCH /index.php?route=conversaciones&id={id}

Actualiza campos de una conversación: estado, cliente_nombre, metadata, etc.

Campos actualizables

Campo Tipo Descripción
estado string activa, finalizada, pausada, transferida
cliente_nombre string Nombre del cliente
metadata object Datos adicionales en formato JSON
puntuacion_satisfaccion integer Puntuación de satisfacción (1-5)
resumen string Resumen de la conversación

Ejemplo — Pausar una conversación

curl -X PATCH "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones&id=123" \
  -H "Authorization: Bearer sk-TU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "estado": "pausada"
  }'

Response 200 OK

{
  "success": true,
  "message": "Conversación actualizada exitosamente",
  "data": {
    "id": 123,
    "cliente_telefono": "+56912345678",
    "cliente_nombre": "Juan Pérez",
    "plataforma": "whatsapp",
    "estado": "pausada",
    "fecha_ultima_actividad": "2026-03-09 12:00:00",
    "contexto_conversacion": null,
    "metadata": null
  }
}

Crear nueva conversación

POST /index.php?route=conversaciones

Crea una nueva conversación asociada a un orquestador.

Body (JSON)

Campo Tipo Requerido Descripción
orquestador_id integer ID del orquestador a utilizar
cliente_telefono string Teléfono del cliente (ej: +56912345678)
cliente_nombre string No Nombre del cliente
plataforma string No whatsapp (default), api_directa, telegram, facebook
metadata object No Datos adicionales JSON

Ejemplo

curl -X POST "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones" \
  -H "Authorization: Bearer sk-TU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "orquestador_id": 5,
    "cliente_telefono": "+56912345678",
    "cliente_nombre": "Juan Pérez",
    "plataforma": "whatsapp"
  }'

Response 201 Created

{
  "success": true,
  "message": "Conversación creada exitosamente",
  "data": {
    "id": 124,
    "usuario_id": 1,
    "orquestador_id": 5,
    "session_id": "chat_6684a1b2c3d4_1720000000",
    "cliente_telefono": "+56912345678",
    "cliente_nombre": "Juan Pérez",
    "plataforma": "whatsapp",
    "estado": "activa",
    "orquestador_nombre": "Asistente SA Publicidad"
  }
}

Enviar mensaje en una conversación

POST /index.php?route=conversaciones&id={id}&action=messages

Envía un nuevo mensaje dentro de una conversación existente.

Body (JSON)

Campo Tipo Requerido Descripción
contenido string Texto del mensaje
tipo string No recibido, enviado, sistema

Ejemplo

curl -X POST "https://chatia26.bitnodo.net/api/v1/index.php?route=conversaciones&id=123&action=messages" \
  -H "Authorization: Bearer sk-TU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contenido": "Quiero información de precios",
    "tipo": "recibido"
  }'

Recurso: Orquestrador

Un orquestrador define cómo se comporta el asistente: qué preguntas responde, cuándo escala a humano, etc. Es un JSON con la estructura del flujo conversacional.

Estructura de un Orquestrador

Un orquestrador es un JSON que describe el flujo de conversación. Ejemplo mínimo:

JSON - Orquestrador básico
{
  "name": "Asistente Ventas",
  "description": "Atiende consultas de precios y disponibilidad",
  "version": "1.0",
  "welcome_message": "Hola, soy el asistente de ventas. ¿En qué puedo ayudarte?",
  "nodes": [
    {
      "id": "node_1",
      "type": "message",
      "text": "Nuestro producto cuesta $99 por mes",
      "next_node": "node_2"
    },
    {
      "id": "node_2",
      "type": "question",
      "question": "¿Te interesa conocer más?",
      "options": [
        {
          "text": "Sí",
          "next_node": "node_3"
        },
        {
          "text": "No thanks",
          "next_node": "end_escalate"
        }
      ]
    },
    {
      "id": "node_3",
      "type": "action",
      "action": "transfer_to_agent",
      "agent_type": "sales"
    },
    {
      "id": "end_escalate",
      "type": "end"
    }
  ]
}

Tipos de nodos

Tipo Propósito Propiedades
message El asistente envía un mensaje fijo text, next_node
question Haz una pregunta con opciones question, options (cada una con text y next_node)
condition Decisión lógica basada en contexto conditions, default_node
action Ejecuta una acción (transfer, API call, etc.) action, parámetros específicos de la acción
end Finaliza el flujo -

Crear/actualizar un orquestrador

POST /orchestrators

Crea un orquestrador nuevo enviando su definición JSON.

Parámetros

Campo Tipo Descripción
name string Nombre del orquestrador
description string Descripción
configuration object JSON completo del flujo (estructura de nodos)

Ejemplo

curl -X POST https://chatia26.bitnodo.net/api/v1/orchestrators \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d @orchestrator.json

Response 201 Created

{
  "success": true,
  "orchestrator": {
    "id": "orch_abc123",
    "name": "Asistente Ventas",
    "description": "Atiende consultas de precios",
    "configuration": { ... },
    "created_at": "2026-03-09T10:30:00Z",
    "updated_at": "2026-03-09T10:30:00Z"
  }
}

Obtener un orquestrador

GET /orchestrators/{orchestrator_id}

Response 200 OK

{
  "success": true,
  "orchestrator": {
    "id": "orch_abc123",
    "name": "Asistente Ventas",
    "description": "Atiende consultas de precios",
    "configuration": {
      "name": "Asistente Ventas",
      "version": "1.0",
      "welcome_message": "Hola, soy el asistente de ventas...",
      "nodes": [ ... ]
    },
    "created_at": "2026-03-09T10:30:00Z",
    "updated_at": "2026-03-09T10:30:00Z"
  }
}

Ejemplo real: Orquestador SA Publicidad (comercial + soporte + pagos, restrictivo)

En /docs/examples/orquestador-sa-publicidad-estricto.json incluimos un ejemplo completo de orquestador real usado para una empresa (SA Publicidad), que combina tres agentes especializados: preventa comercial, soporte técnico y pagos/facturación, con políticas estrictas de tema y comportamiento.

Puedes usarlo como base para tu propia implementación importándolo directamente como configuración del orquestrador:

cURL - Importar orquestador SA Publicidad
curl -X POST https://chatia26.bitnodo.net/api/v1/orchestrators \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d @docs/examples/orquestador-sa-publicidad-estricto.json

La respuesta te devolverá el orchestrator_id (por ejemplo orch_sa_publicidad). Luego puedes:

  • Usar ese orchestrator_id al crear chats vía POST /chats para que todas las conversaciones sigan este flujo.
  • Configurarlo como orquestrador por defecto de tu cuenta para WhatsApp u otros canales.

Visual Builder - Integra en tu plataforma

El Visual Builder es un componente JavaScript que incrusta la interfaz visual para crear y editar orquestadores dentro de tu propia aplicación. Puedes usarlo de dos formas: embebiendo la app completa vía <iframe> (recomendado hoy) o mediante un módulo JS (VisualOrchestratorBuilder, próximamente).

¿Cómo funciona?

  1. Incluyes los scripts del Visual Orchestrator en tu página HTML
  2. Creas un contenedor donde se renderizará el editor
  3. Cargas la interfaz con tu token de acceso
  4. El usuario diseña el flujo visualmente dentro de tu aplicación
  5. Al guardar, obtienes el JSON que envías a la API de Chat.IA26

Modo 1: embebido vía <iframe> (recomendado)

La forma más simple y estable de integrar el Orquestador Visual en tu panel es embebiendo la app completa dentro de un <iframe>.

Autologin con token Bearer (sin contraseña)

Cuando se carga embebido, el orquestador puede saltar la pantalla de contraseña y autenticarse automáticamente usando tu token de API de Chat.IA26. Solo debes pasar el token en la URL como query string: ?token=TU_TOKEN (o ?api_token=TU_TOKEN).

HTML - Iframe con autologin
<iframe
  src="https://chatia26.bitnodo.net/visual-orchestrator/?token=TU_TOKEN_BEARER"
  style="width:100%;height:650px;border:none;border-radius:12px;overflow:hidden;background:#020617;"
></iframe>

Donde TU_TOKEN_BEARER es el mismo token que ya usas en tus llamadas a la API: Authorization: Bearer TU_TOKEN_BEARER. El orquestador valida el token llamando a GET /api/v1/users/profile y, si es válido, entra directo sin pedir contraseña.

Seguridad: solo debes usar este modo dentro de tu propio panel autenticado. No expongas el iframe ni el token en páginas públicas sin login.

Modo 2: módulo JS (VisualOrchestratorBuilder)

Si prefieres integrar el editor directamente en tu panel sin <iframe>, puedes usar el módulo JavaScript VisualOrchestratorBuilder:

HTML - Incluir en tu página
<!-- CSS del Visual Orchestrator -->
<link rel="stylesheet" href="https://chatia26.bitnodo.net/visual-orchestrator/assets/css/styles.css">

<!-- Scripts del Visual Orchestrator (sin pantalla de login) -->
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/canvas.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/elements.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/properties.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/export.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/chat-tester.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/ui.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/app.js"></script>
<script src="https://chatia26.bitnodo.net/visual-orchestrator/assets/js/builder.js"></script>

Uso básico

JavaScript
// Crear instancia del Visual Builder
const builder = new VisualOrchestratorBuilder({
    container: '#orchestrator-editor',  // ID del div donde se renderiza
    apiKey: 'sk_live_YOUR_KEY',         // Opcional (para tu propia lógica)
    apiUrl: 'https://chatia26.bitnodo.net/api/v1',
  
    // Evento cuando el usuario guarda (Ctrl+S o botón "Guardar")
    onSave: (orchestratorConfig) => {
        console.log('Orquestrador guardado (formato API):', orchestratorConfig);
        // Aquí envías el JSON a tu API o almacenamiento
        saveToDatabase(orchestratorConfig);
    },

    // Cuando cargas un orquestador existente
    onLoad: (config) => {
        console.log('Orquestrador cargado en el editor:', config);
    }
});

// Para cargar un orquestador existente desde tu API
builder.load({
    id: 'orch_abc123',
    configuration: existingOrchestratorJSON
});

Ejemplo completo en tu aplicación

Aquí está cómo integrar el Visual Builder en tu aplicación (ej: dashboard de configuración):

HTML + JavaScript completo
<!DOCTYPE html>
<html>
<head>
  <title>Mi Panel de Control</title>
  <link rel="stylesheet" href="https://chatia26.bitnodo.net/visual-orchestrator/builder.css">
</head>
<body>
  <div class="dashboard">
    <h1>Crear Asistente</h1>
    <div id="orchestrator-editor" style="height: 600px; border: 1px solid #ccc;"></div>
  </div>
  
  <script src="https://chatia26.bitnodo.net/visual-orchestrator/builder.min.js"></script>
  <script>
    // Inicializar el Visual Builder
    const builder = new VisualOrchestratorBuilder({
      container: '#orchestrator-editor',
      apiKey: localStorage.getItem('api_key'), // Tu clave de API
      apiUrl: 'https://chatia26.bitnodo.net/api/v1',
      
      // Cuando el usuario presiona "Guardar"
      onSave: async (config) => {
        try {
          // Enviar el JSON a tu servidor
          const response = await fetch('/mi-api/orchestrators', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + localStorage.getItem('auth_token')
            },
            body: JSON.stringify({
              name: config.name,
              description: config.description,
              // El JSON completo del orquestrador
              configuration: config
            })
          });
          
          if (response.ok) {
            const result = await response.json();
            alert('✓ Orquestrador guardado: ' + result.id);
            
            // Ahora puedes usar este orquestrador en Chat.IA26
            console.log('Guardado en Chat.IA26 como:', result.id);
          } else {
            alert('Error al guardar');
          }
        } catch (err) {
          console.error('Error:', err);
        }
      },
      
      // Cuando se carga un orquestrador existente
      onLoad: (config) => {
        console.log('Orquestrador cargado:', config);
      }
    });
  </script>
</body>
</html>

Ciclo completo: Crear → Guardar → Usar en Chat

Flujo que debe seguir tu aplicación:

1. Usuario abre tu dashboard
   ↓
2. Ve el Visual Builder (lo incrustaste con VisualOrchestratorBuilder)
   ↓
3. Diseña flujo visualmente (arrastra nodos, conecta, configura)
   ↓
4. Presiona "Guardar"
   ↓
5. Callback onSave() se ejecuta → Tu app obtiene el JSON
   ↓
6. Tu app envía JSON a Chat.IA26:
   POST https://chatia26.bitnodo.net/api/v1/orchestrators
   Body: { name: "...", configuration: {...} }
   ↓
7. Chat.IA26 devuelve ID: orch_abc123
   ↓
8. Cuando crees un chat, usa ese ID:
   POST /chats
   Body: { orchestrator_id: "orch_abc123", ... }
   ↓
9. El asistente responde según el flujo que definió el usuario

Props disponibles en VisualOrchestratorBuilder

Prop Tipo Requerido Descripción
container string (selector CSS) ID o clase del elemento donde se renderiza (ej: '#editor')
apiKey string Tu token de acceso a Chat.IA26
apiUrl string Base URL de la API (default: https://chatia26.bitnodo.net/api/v1)
onSave function(config) Callback cuando se guarda. Recibe el JSON completo.
onLoad function(config) Callback cuando se carga un orquestrador
onExport function(json) Callback cuando el usuario exporta
mode string Modo de funcionamiento del builder. Si usas mode: 'whatsapp_metadata', builder.load() y builder.getConfiguration() trabajan directamente con el mismo JSON de metadata que guardas en tu panel (mismo formato que docs/examples/orquestador-sa-publicidad-estricto.json), sin conversión propia.
readOnly boolean Si true, solo visualiza sin permitir ediciones (default: false)

Métodos del builder

// Cargar un orquestrador existente
builder.load(orchestratorJSON);

// Obtener el JSON actual del editor
const json = builder.getConfiguration();

// Validar el flujo (devuelve true/false)
const isValid = builder.validate();

// Limpiar el editor
builder.clear();

// Exportar como JSON (descarga archivo)
builder.export('json');

// Importar desde JSON
builder.import(jsonString);

// Obtener errores de validación
const errors = builder.getValidationErrors();

Modo especial para WhatsApp: JSON de metadata por defecto

Si usas Chat.IA26 como backend de WhatsApp y tienes un textarea de configuración con el "JSON de metadata por defecto", puedes sincronizarlo 1:1 con el Visual Builder usando el modo whatsapp_metadata.

  • builder.load(orchestratorJSON) acepta directamente el JSON completo de metadata (con version, timestamp, orquestadores, agentes, etc.).
  • builder.getConfiguration() devuelve exactamente el mismo formato de JSON, listo para guardarlo tal cual en tu campo "JSON de metadata por defecto".
Ejemplo: sincronizar con textarea de WhatsApp
// 1) Inicializar el builder en modo whatsapp_metadata
const builder = new VisualOrchestratorBuilder({
    container: '#orchestrator-editor',
    mode: 'whatsapp_metadata',
    onSave: (metadataJson) => {
        // metadataJson tiene el mismo formato que orquestador-sa-publicidad-estricto.json
        // Lo puedes guardar tal cual en tu base de datos o en el campo
        // "JSON de metadata por defecto" de tu integración de WhatsApp.
        saveWhatsappMetadata(JSON.stringify(metadataJson));
    }
});

// 2) Cargar desde tu textarea/campo de configuración
const rawMetadata = getWhatsappMetadataFromDB(); // string JSON
if (rawMetadata) {
    try {
        const parsed = JSON.parse(rawMetadata);
        builder.load(parsed); // El builder dibuja el flujo directamente
    } catch (e) {
        console.error('JSON de metadata inválido', e);
    }
}

// 3) Cuando quieras leer el valor para guardarlo manualmente:
const currentMetadata = builder.getConfiguration();
// currentMetadata es el mismo JSON de metadata que puedes volver a persistir

Guardar el JSON en tu base de datos

Después que el usuario guarda en Visual Builder, tienes el JSON. Debes almacenarlo:

Ejemplo: Guardar en tu BD
const builder = new VisualOrchestratorBuilder({
  container: '#editor',
  apiKey: 'sk_live_YOUR_KEY',
  
  onSave: async (config) => {
    // config es el JSON completo del orquestrador
    
    // 1. Guardar en tu BD
    const saveResponse = await fetch('/api/my-orchestrators', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        name: config.name,
        description: config.description,
        configuration_json: JSON.stringify(config), // Guardar como texto
        created_by: currentUser.id
      })
    });
    
    const saved = await saveResponse.json();
    const localId = saved.id; // ID en tu BD
    
    // 2. Enviar a Chat.IA26
    const chatResponse = await fetch('https://chatia26.bitnodo.net/api/v1/orchestrators', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer sk_live_YOUR_KEY'
      },
      body: JSON.stringify({
        name: config.name,
        description: config.description,
        configuration: config
      })
    });
    
    const chatOrc = await chatResponse.json();
    const chatOrcId = chatOrc.orchestrator.id; // ID en Chat.IA26
    
    // 3. Guardar relación (tu ID local ↔ Chat.IA26 ID)
    await fetch(`/api/my-orchestrators/${localId}`, {
      method: 'PATCH',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        chatia26_id: chatOrcId
      })
    });
    
    alert('✓ Orquestrador guardado localmente y en Chat.IA26');
  }
});
Tip: El Visual Builder funciona offline. El usuario puede diseñar sin conexión a internet. Solo necesita conexión cuando guarda hacia Chat.IA26.

Recurso: Logs

Sistema de auditoría. Registra automáticamente cada acción: creación de chats, mensajes, transferencias, errores.

Obtener logs

GET /logs

Lista los eventos del sistema con filtros y paginación.

Parámetros Query

Parámetro Tipo Descripción
level string "INFO", "WARNING", "ERROR"
chat_id string Filtrar logs de un chat específico
event_type string "chat_created", "message_received", "transfer", etc.
from string (ISO 8601) Fecha inicio (ej: 2026-03-01T00:00:00Z)
to string (ISO 8601) Fecha fin

Ejemplo

curl "https://chatia26.bitnodo.net/api/v1/logs?level=ERROR&page=1" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Response 200 OK

{
  "success": true,
  "logs": [
    {
      "id": "log_001",
      "timestamp": "2026-03-09T11:30:00Z",
      "level": "INFO",
      "event_type": "chat_created",
      "chat_id": "chat_abc123xyz",
      "message": "Chat created for Juan Pérez",
      "metadata": {
        "platform": "web",
        "user_location": "Santiago"
      }
    },
    {
      "id": "log_002",
      "timestamp": "2026-03-09T11:30:45Z",
      "level": "ERROR",
      "event_type": "orchestrator_error",
      "chat_id": "chat_abc123xyz",
      "message": "Node 'node_5' not found in orchestrator",
      "metadata": {
        "orchestrator_id": "orch_def456"
      }
    }
  ],
  "pagination": {
    "current_page": 1,
    "per_page": 20,
    "total": 1250,
    "total_pages": 63
  }
}

Recurso: Bloqueos de clientes

Permite bloquear teléfonos, direcciones IP o sesiones de widget para que el bot no responda, pero sí siga registrando todos los mensajes entrantes en la base de datos. Esto evita consumo de IA con usuarios problemáticos o SPAM, manteniendo el historial.

Comportamiento: cuando un cliente está bloqueado, sus mensajes se marcan como "leídos" (Visto) en WhatsApp, se guardan en la tabla de mensajes, pero el orquestador no se ejecuta y el asistente no envía ninguna respuesta.
Bloqueo automático: cuando el asistente detecta uso indebido (insultos, spam, contenido ofensivo) y emite [CONVERSACIÓN FINALIZADA] en su respuesta, el sistema automáticamente:
  • Bloquea la sesión de widget (tipo session_id) para que no pueda seguir escribiendo.
  • Bloquea la dirección IP del usuario.
  • Marca la conversación como finalizada en la base de datos.
  • Deshabilita el input del widget para esa sesión.
El usuario ya no podrá enviar más mensajes en esa sesión. Al recargar la página obtendrá una sesión nueva, pero si su IP sigue bloqueada, tampoco podrá interactuar.

Crear un bloqueo

POST /blocks

Crea un nuevo bloqueo por teléfono o IP para tu empresa.

Parámetros

Campo Tipo Requerido Descripción
tipo string "telefono", "ip" o "session_id".
valor string Número de teléfono en formato internacional (ej: +56912345678) o dirección IP (ej: 201.190.10.5).
motivo string No Descripción corta del motivo del bloqueo (ej: "insultos", "spam").
activo boolean No Por defecto true. Permite crear el registro ya inactivo si se requiere.
fecha_fin string (timestamp) No Fecha/hora opcional de fin de bloqueo (ej: 2026-03-31T23:59:59Z).

Ejemplo: bloquear por teléfono

curl -X POST https://chatia26.bitnodo.net/api/v1/blocks \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo": "telefono",
    "valor": "+56912345678",
    "motivo": "Uso indebido e insultos"
  }'

Ejemplo: bloquear por IP

curl -X POST https://chatia26.bitnodo.net/api/v1/blocks \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo": "ip",
    "valor": "201.190.10.5",
    "motivo": "Ataques de spam desde esta IP"
  }'

Listar bloqueos

GET /blocks

Lista todos los bloqueos configurados para tu empresa.

Parámetros Query opcionales

Parámetro Tipo Descripción
tipo string Filtra por telefono, ip o session_id.
valor string Busca un valor específico (teléfono/IP exacto).
activo boolean 1 para solo bloqueos activos, 0 para inactivos.

Ejemplo

curl "https://chatia26.bitnodo.net/api/v1/blocks?tipo=telefono&activo=1" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Actualizar o desactivar un bloqueo

PATCH /blocks/{id}

Permite desactivar, reactivar o modificar el motivo/fecha fin de un bloqueo.

Campos aceptados

Campo Tipo Descripción
activo boolean Coloca false para dejar de bloquear (sigue existiendo como histórico).
motivo string Actualiza el motivo del bloqueo.
fecha_fin string Cambia o define la fecha de expiración del bloqueo.

Ejemplo: desactivar bloqueo

curl -X PATCH https://chatia26.bitnodo.net/api/v1/blocks/123 \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "activo": false,
    "motivo": "Bloqueo levantado a solicitud del cliente"
  }'

Eliminar un bloqueo

DELETE /blocks/{id}

Elimina completamente un registro de bloqueo.

curl -X DELETE https://chatia26.bitnodo.net/api/v1/blocks/123 \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
Notas técnicas:
  • Los bloqueos se aplican tanto a mensajes entrantes por WhatsApp (webhook) como a mensajes recibidos vía API (/chats/{id}/messages tipo "recibido") y al widget web.
  • Cuando un cliente está bloqueado, se añade blocked: true en el metadata del mensaje guardado.
  • El bot no ejecuta IA ni envía respuesta, pero la conversación y los mensajes quedan almacenados para auditoría.
  • El bloqueo por session_id se genera automáticamente cuando el asistente emite [CONVERSACIÓN FINALIZADA].
  • El widget deshabilita visualmente el input cuando detecta que la sesión fue bloqueada (respuesta blocked: true o HTTP 403).

Webhooks

Recibe eventos en tiempo real en tu servidor. Se disparan cuando ocurren acciones en Chat.IA26.

Eventos disponibles

Evento Cuándo se dispara Datos incluidos
chat.created Se crea un nuevo chat chat_id, client_name, platform
chat.message_received El cliente envía un mensaje chat_id, message.text, message.sender
chat.message_sent El asistente envía una respuesta chat_id, message.text, message.id
chat.status_changed El estado del chat cambia (paused, closed, etc.) chat_id, previous_status, new_status
chat.transferred Chat transferido a un agente humano chat_id, assigned_to, assigned_at

Configurar webhook

Proporciona una URL que pueda recibir POST requests de Chat.IA26:

https://miservidor.com/webhooks/chat-ia26

Estructura de cada webhook

Payload JSON
{
  "id": "webhook_evt_12345",
  "timestamp": "2026-03-09T11:30:45Z",
  "event": "chat.message_received",
  "chat_id": "chat_abc123xyz",
  "data": {
    "message": {
      "id": "msg_xyz789",
      "sender": "client",
      "text": "¿Cuál es el precio?",
      "type": "text",
      "created_at": "2026-03-09T11:30:45Z"
    },
    "chat": {
      "id": "chat_abc123xyz",
      "client_name": "Juan Pérez",
      "client_number": "+56912345678"
    }
  }
}

Ejemplo de endpoint en Node.js

Express.js
app.post('/webhooks/chat-ia26', (req, res) => {
  const { event, chat_id, data } = req.body;
  
  switch(event) {
    case 'chat.created':
      console.log('Nuevo chat:', chat_id, data.chat.client_name);
      // Guardar en tu BD, enviar email, etc.
      break;
      
    case 'chat.message_received':
      console.log('Mensaje del cliente:', data.message.text);
      // Procesar mensaje, guardar en BD, etc.
      break;
      
    case 'chat.transferred':
      console.log('Chat transferido a:', data.assigned_to);
      // Notificar al agente
      break;
  }
  
  // Responder con 200 OK para confirmar recepción
  res.status(200).json({ success: true });
});
Seguridad: Valida que el webhook viene de Chat.IA26. Incluiremos un header X-Signature firmado con tu secret key.

Códigos de Error

Códigos HTTP y respuestas de error que puede devolver la API.

Errores de autenticación

Código Descripción Response
401 Unauthorized - Sin token o token inválido {"success":false,"error":"Invalid API key"}
401 Unauthorized - Token expirado {"success":false,"error":"Token expired"}

Errores de validación

Código Descripción Response
400 Bad Request - Campo requerido faltante {"success":false,"error":"Missing field: client_name","field":"client_name"}
400 Bad Request - Valor inválido {"success":false,"error":"Invalid platform. Must be: web, whatsapp, telegram"}

Errores de recursos

Código Descripción Response
404 Not Found - Chat o recurso no existe {"success":false,"error":"Chat not found","resource":"chat","id":"chat_xyz"}

Errores del servidor

Código Descripción Response
500 Internal Server Error - Error inesperado {"success":false,"error":"Internal server error","request_id":"req_123"}

Ejemplo: Manejar errores en JavaScript

async function createChat(clientDetails) {
  try {
    const response = await fetch(
      'https://chatia26.bitnodo.net/api/v1/chats',
      {
        method: 'POST',
        headers: {
          'Authorization': 'Bearer ' + apiKey,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(clientDetails)
      }
    );
    
    const result = await response.json();
    
    if (!response.ok) {
      // Manejar error
      if (response.status === 401) {
        console.error('API Key inválida');
      } else if (response.status === 400) {
        console.error('Datos inválidos:', result.error);
      } else if (response.status === 500) {
        console.error('Error del servidor. Request ID:', result.request_id);
      }
      return null;
    }
    
    return result.chat;
    
  } catch (err) {
    console.error('Error de red:', err);
    return null;
  }
}

¿Preguntas o soporte?

  • Email: dev@bitnodo.net
  • Docs: https://docs.chatia26.bitnodo.net

2026 Chat.IA26 by Bitnodo. Todos los derechos reservados.