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:
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:
X-API-Key: sk_live_your_secret_key_here Content-Type: application/json
Quick Start
Aquí hay un ejemplo completo para crear un chat, enviar mensajes, y escuchar webhooks.
1. Crear un chat
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
{
"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:
{
"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:
<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 |
Sí | 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
/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
}
}
}
plataforma === 'whatsapp' (u otro valor) para mostrar solo las conversaciones que necesitas en tu panel.
Obtener una conversación específica
/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
/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
/index.php?route=conversaciones
Crea una nueva conversación asociada a un orquestador.
Body (JSON)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| orquestador_id | integer | Sí | ID del orquestador a utilizar |
| cliente_telefono | string | Sí | 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
/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 | Sí | 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:
{
"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
/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
/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 -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_idal crear chats víaPOST /chatspara 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?
- Incluyes los scripts del Visual Orchestrator en tu página HTML
- Creas un contenedor donde se renderizará el editor
- Cargas la interfaz con tu token de acceso
- El usuario diseña el flujo visualmente dentro de tu aplicación
- 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).
<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.
Modo 2: módulo JS (VisualOrchestratorBuilder)
Si prefieres integrar el editor directamente en tu panel sin <iframe>, puedes usar el módulo JavaScript VisualOrchestratorBuilder:
<!-- 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
// 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):
<!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 (conversion,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".
// 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:
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');
}
});
Recurso: Logs
Sistema de auditoría. Registra automáticamente cada acción: creación de chats, mensajes, transferencias, errores.
Obtener logs
/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.
[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
finalizadaen la base de datos. - Deshabilita el input del widget para esa sesión.
Crear un bloqueo
/blocks
Crea un nuevo bloqueo por teléfono o IP para tu empresa.
Parámetros
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| tipo | string | Sí | "telefono", "ip" o "session_id". |
| valor | string | Sí |
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
/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
/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
/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"
- 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: trueen 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_idse 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: trueo 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
{
"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
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 });
});
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.