Primeros pasos
La API es REST sobre HTTPS. Las peticiones y las respuestas usan application/json en UTF-8, y todas cuelgan de la misma URL base:
https://agentaibi.com/aibicore/- Las fechas se devuelven en ISO 8601 (
2026-09-01T14:03:00Z). - Los identificadores de recurso son numéricos; los de integración son UUID.
- Los nombres de los campos van en PascalCase, tal como los devuelve la API.
Las tres formas de integrar
Antes del listado de endpoints conviene saber cuál de los tres caminos necesitas. Los dos primeros no requieren iniciar sesión: se autentican con un token propio del recurso, pensado para vivir en la configuración de tu sistema.
Disparar un flujo
Tu sistema le dice a AIBI «llama a esta persona» o «arranca este proceso», y le pasa los datos.
Recibir el resultado
AIBI le dice a tu sistema qué pasó en la conversación, con los datos que se extrajeron.
Mantener tus tablas
Tu CRM o tu ERP empuja filas a una tabla de Datos para que el agente las consulte.
1. Disparar un flujo desde tu sistema
Cada flujo tiene dos identificadores propios: uno que lo identifica en la URL y otro que autentica la petición en la cabecera. Van separados a propósito, para poder rotar el token sin cambiar la URL que ya pegaste en tu sistema. Los encuentras en la configuración del flujo, dentro del panel.
POST https://agentaibi.com/aibicore/Flujo/webhook/{webhookToken}
Authorization: Bearer {webhookAuthToken}
Content-Type: application/json
{
"nombre": "Ana Restrepo",
"telefono": "+573001234567",
"fecha_cita": "2026-09-04"
}Cada campo del cuerpo entra al flujo como una variable disponible desde el nodo de inicio. La respuesta es inmediata: AIBI acepta el trabajo y sigue por su cuenta.
# 202 Accepted
{ "IDEjecucion": 4187, "message": "Ejecución iniciada" }Si el flujo contiene un nodo de voz en tiempo real o de videollamada, la respuesta espera a que la sesión exista y te devuelve además la URL a la que enviar al usuario:
{
"IDEjecucion": 4188,
"sesion_url": "https://agentaibi.com/Videocallv1/...",
"sesion_token": "3f2a91c4-...",
"message": "Sesión creada"
}Un flujo sin token de autorización no se dispara. El endpoint responde 401 antes de ejecutar nada. Es deliberado: preferimos que una integración mal configurada falle a que quede abierta.
2. Recibir en tu sistema lo que pasó
Para que AIBI avise a tu backend, añade un nodo Webhook al flujo en el punto donde quieras el aviso —normalmente después del agente— y pon ahí tu URL. AIBI enviará un POST con el contexto del flujo en ese momento:
POST https://tu-sistema.com/aibi/resultado
Content-Type: application/json
{
"ejecucion_id": 4187,
"detalle_id": 9032,
"telefono": "+573001234567",
"nombre": "Ana Restrepo",
"datos": {
"resultado": "contestada",
"objetivo_logrado": "true",
"fecha_cita": "2026-09-04"
}
}datoslleva el contexto del flujo en ese punto: las variables de arranque más todo lo que los nodos anteriores hayan añadido.- Las variables internas de control y los tokens de sesión nunca se incluyen, aunque estén en el contexto.
- Cada envío queda registrado con el código de respuesta de tu servidor, para poder revisar después qué avisos llegaron y cuáles no.
- La URL de destino debe ser pública. Se rechazan direcciones internas y de red privada.
3. Mantener tus tablas al día
Una tabla de Datos puede recibir filas desde fuera. Se activa por tabla desde el panel y, igual que los flujos, entrega dos identificadores: uno para la URL y otro para la cabecera. El token se muestra una sola vez.
POST https://agentaibi.com/aibicore/Ingesta/{publicId}
Authorization: Bearer {ingestToken}
Content-Type: application/json
{
"modo": "upsert",
"filas": [
{ "externalId": "SKU-1", "valores": { "sku": "SKU-1", "nombre": "Cama ortopédica", "precio": 189000, "stock": 4 } },
{ "externalId": "SKU-2", "valores": { "sku": "SKU-2", "nombre": "Collar antipulgas", "precio": 42000, "stock": 20 } }
]
} Las claves de valores son los nombres de las columnas de tu tabla, tal cual. externalId es el identificador de la fila en tu sistema: es lo que hace el envío idempotente, de modo que reenviar el mismo lote actualiza en vez de duplicar.
| Modo | Qué hace | Cuándo usarlo |
|---|---|---|
upsert | Inserta si el externalId es nuevo; actualiza si ya existía. | El modo por defecto y el único idempotente. Es el que quieres casi siempre. |
anexar | Inserta siempre, sin comprobar si ya estaba. | Registros que se acumulan, como un histórico de eventos. |
reemplazar | Borra todas las filas de la tabla y deja las del lote. | Sincronizar un catálogo completo. Se lleva por delante lo que hubiera. |
La respuesta dice exactamente qué ocurrió con el lote:
{ "ok": true, "recibidas": 2, "creadas": 2, "actualizadas": 0,
"borradas": 0, "rechazadas": [], "message": null }El lote es todo o nada, y no se crean columnas solas. Si una fila trae una columna que no existe, se rechaza el lote entero indicando cuál era y qué columnas son válidas, y no se escribe nada. Un error de tipeo no debe convertirse en una columna permanente que nadie revisa. El máximo por lote es de 2.000 filas.
Lo escrito queda disponible para el agente en su siguiente consulta: no hay reindexado pendiente. Y cada envío deja bitácora, consultable en GET /Datasets/{id}/ingestas.
Autenticación de la API de gestión
Para el resto de la API —crear agentes, editar flujos, consultar ejecuciones, leer el saldo— hay dos formas de autenticarse. Para una integración, usa la primera.
API key (recomendado)
Genera una clave desde el panel, en la sección de API keys, y envíala en la cabecera X-API-Key. No caduca cada pocas horas, se revoca sin tocar la contraseña de la cuenta y puede ser de solo lectura.
GET https://agentaibi.com/aibicore/Agente
X-API-Key: aibi_live_{tu_clave}- La clave se muestra una sola vez, al crearla. Se guarda como huella criptográfica, así que no podemos volver a enseñártela: si la pierdes, se rota.
- Permisos. Al crear la clave eliges qué puede hacer. Una clave sin ningún permiso de escritura solo responde a
GET; cualquier intento de crear, modificar o borrar recibe401. - Alcance limitado. Una API key opera sobre los datos de tu cuenta y nunca da acceso a funciones de administración de la plataforma, aunque tu usuario sea administrador.
- Se puede revocar en cualquier momento, y deja de funcionar al instante. Desactivar la cuenta también inutiliza sus claves.
Token de sesión
La alternativa es el token Bearer que devuelve el inicio de sesión. Es lo que usa el panel; para una integración es peor opción, porque obliga a guardar las credenciales de la cuenta y a renovar el token.
POST https://agentaibi.com/aibicore/Usuario/login
Content-Type: application/json
{
"NombreUsuario": {tu_usuario},
"Password": {tu_contraseña}
}
# Respuesta
{
"Success": true,
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"Usuario": { "IDUsuario": 12, "NombreUsuario": "clinica-norte" }
}El token dura 10 horas. Después va en cada petición:
Authorization: Bearer {token}Guarda cualquier credencial en tu servidor, nunca en el navegador ni en un repositorio. Y usa siempre la de menor alcance que resuelva tu caso: si solo necesitas disparar un flujo o enviar datos, los tokens de flujo y de tabla de las secciones anteriores bastan y no dan acceso a nada más.
Códigos de estado
| Código | Significado |
|---|---|
200 | OK — la petición se completó correctamente. |
201 | Creado — el recurso se creó correctamente. |
202 | Aceptado — el trabajo se encoló y continúa por su cuenta. |
204 | Sin contenido — la operación se completó y no hay nada que devolver. |
400 | Petición inválida — falta un campo, sobra otro o el formato no cuadra. |
401 | No autorizado — credencial ausente, inválida, expirada, revocada, o API key de solo lectura intentando escribir. |
403 | Prohibido — el recurso no pertenece a esta cuenta. |
404 | No encontrado — el recurso no existe. |
429 | Demasiadas peticiones — superaste el límite de la ventana. |
500 | Error del servidor — vuelve a intentar más tarde. |
Los errores devuelven un cuerpo JSON con un mensaje legible:
{ "message": "Token de autorización inválido" }Endpoints
Los recursos de la API de gestión, agrupados por área. Todos requieren el token Bearer del inicio de sesión, salvo los marcados como públicos, y operan siempre sobre los datos de la cuenta a la que pertenece el token.
Agentes
Los agentes son la personalidad y las instrucciones con las que se conversa.
/AgenteLista los agentes de la cuenta.
/Agente/{id}Detalle de un agente.
/AgenteCrea un agente.
Nombre | string | requerido | Cómo se identifica el agente en el panel. |
PromptSistema | string | requerido | Instrucciones de comportamiento: quién es y cómo debe conversar. |
PromptNegocio | string | opcional | Contexto de tu empresa: qué vendes, horarios, políticas. |
TipoAgente | string | opcional | ventas, soporte, cobranza, agenda, encuesta o personalizado. |
SaludoTexto | string | opcional | Primera frase con la que abre la conversación. |
IDConfigVoz | number | opcional | Voz con la que habla, de las que devuelve /Proveedor/opciones. |
TemperaturaLLM | number | opcional | Creatividad de las respuestas. Por defecto 0.7. |
MaxTurnosHistorial | number | opcional | Turnos de conversación que recuerda. Por defecto 30. |
/Agente/{id}Actualiza un agente existente.
/Agente/{id}/estadoActiva o desactiva el agente.
/Agente/{id}/clonarDuplica un agente con toda su configuración.
/Agente/{id}Elimina un agente.
Flujos
Un flujo es el grafo de nodos que orquesta la conversación.
/FlujoLista los flujos de la cuenta.
/Flujo/{id}Devuelve el flujo con sus nodos y conexiones.
/FlujoCrea un flujo a partir de su definición de nodos.
/Flujo/{id}Actualiza el flujo y archiva la versión anterior.
/Flujo/{id}/validarComprueba si el flujo se puede activar y devuelve los errores encontrados.
/Flujo/{id}/activarPone el flujo a atender.
/Flujo/{id}/pausarDeja de atender sin borrar nada.
/Flujo/{id}/versionesHistorial de versiones del flujo.
/Flujo/{id}Elimina un flujo.
/Flujo/webhook/{webhookToken}Público con token propio. Dispara el flujo desde un sistema externo (sección 1).
Authorization | header | requerido | Bearer con el token de autorización del flujo. |
(cuerpo libre) | object | opcional | Cada campo entra al flujo como variable de arranque. |
Ejecuciones
Cada vez que un flujo arranca se crea una ejecución que puedes seguir paso a paso.
/EjecucionFlujoInicia una ejecución de un flujo con el token de la cuenta.
IDFlujo | number | requerido | Flujo que se va a ejecutar. |
Descripcion | string | opcional | Etiqueta para reconocer la ejecución en el historial. |
ContextoInicial | object | opcional | Variables de arranque, como pares clave-valor de texto. |
/EjecucionFlujoHistorial de ejecuciones.
/EjecucionFlujo/{id}Estado y resultado de una ejecución.
/EjecucionFlujo/{id}/nodosTraza nodo a nodo: qué se ejecutó, con qué salida y si falló.
/EjecucionFlujo/{id}/nodos/{nodoLogId}/mensajesTranscripción de la conversación de ese nodo.
/EjecucionFlujo/{id}/contactosDetalle por contacto de una ejecución masiva.
/EjecucionFlujo/{id}/pausarPausa una ejecución en curso.
/EjecucionFlujo/{id}/cancelarCancela una ejecución en curso.
Datos
Las tablas que tus agentes consultan y escriben. Además de la ingesta por lotes, se pueden manipular fila a fila.
/DatasetsLista tus tablas.
/Datasets/{id}Detalle de una tabla.
/Datasets/{id}/fieldsColumnas de la tabla, con su tipo.
/Datasets/{id}/records/queryConsulta filas con filtros y paginación.
/Datasets/{id}/recordsCrea una fila.
/Datasets/{id}/records/{rid}Actualiza una fila.
/Datasets/{id}/records/{rid}Elimina una fila.
/Datasets/{id}/records/bulk-updateActualiza varias filas de una vez.
/Datasets/{id}/ingestasBitácora de los últimos envíos por ingesta.
/Datasets/quotaEspacio consumido y disponible de la cuenta.
/Ingesta/{publicId}Público con token propio. Carga filas por lotes desde tu sistema (sección 3).
Authorization | header | requerido | Bearer con el token de ingesta de la tabla. |
modo | string | opcional | upsert (por defecto), anexar o reemplazar. |
filas | array | requerido | Hasta 2.000 objetos con externalId y valores. |
Calendario
Las agendas contra las que el agente consulta disponibilidad y reserva citas.
/CalendarioLista tus calendarios.
/CalendarioCrea un calendario con su horario y su duración de cita.
/Calendario/{id}/disponibilidadHuecos libres en un rango de fechas.
/Calendario/{id}/citasCitas agendadas.
/Calendario/{id}/citasReserva una cita a nombre de una persona: pide nombre (o idContacto) y admite su teléfono con indicativo.
/Calendario/citas/{idCita}Cancela una cita.
Conversaciones de canal
La bandeja de WhatsApp, Instagram y Facebook: leerla y responder como humano.
/ConversacionesCanalLista las conversaciones, con su estado y su contacto.
/ConversacionesCanal/{idConv}/mensajesHistorial de mensajes de una conversación.
/ConversacionesCanal/{idConv}/tomarUn humano toma la conversación y el agente deja de responder.
/ConversacionesCanal/{idConv}/responderEnvía un mensaje como humano.
/ConversacionesCanal/{idConv}/plantillaManda una plantilla aprobada de WhatsApp (lo que sí llega con la ventana de 24 h cerrada).
/ConversacionesCanal/{idConv}/devolverDevuelve la conversación al agente.
/ConversacionesCanal/{idConv}/cerrarCierra la conversación.
Números telefónicos
Las líneas desde las que opera tu agente.
/NumeroTelefonoLista tus números.
/NumeroTelefono/registrarRegistra un número propio.
/NumeroTelefono/verificarConfirma la propiedad del número con el código recibido.
/NumeroTelefono/asignarAsigna el número a un agente para que atienda las entrantes.
/NumeroTelefono/{id}Desvincula el número.
Créditos y suscripción
Saldo, consumo y plan contratado.
/Transaccion/saldoCréditos disponibles.
/TransaccionHistorial de movimientos de crédito.
/Transaccion/resumenConsumo agregado del periodo.
/Transaccion/suscripcionPlan contratado y su estado.
/Transaccion/tarifasPúblico. Créditos por minuto de cada nodo.
/Transaccion/paquetesPúblico. Planes disponibles con sus créditos y precios.
API keys
Las claves con las que tus sistemas se autentican. Se gestionan con el token de sesión, no con otra API key.
/ApiKeyLista tus claves, sin el valor completo.
/ApiKeyCrea una clave. La respuesta incluye el valor completo una sola vez.
Nombre | string | requerido | Para reconocerla después: “CRM producción”, “script de facturación”. |
Permisos | string[] | requerido | Al menos uno. Sin ningún permiso :write, la clave es de solo lectura. |
FechaExpiracion | date | opcional | Caducidad opcional. Sin ella, la clave vive hasta que se revoque. |
/ApiKey/{id}/revocarDesactiva la clave de inmediato, conservando su rastro.
/ApiKey/{id}Elimina la clave.
Cuenta
Sesión y perfil.
/Usuario/loginPúblico. Devuelve el token Bearer de la cuenta.
/Usuario/meDatos de la cuenta autenticada.
/Usuario/me/perfilActualiza los datos de perfil.
/Usuario/me/passwordCambia la contraseña.
/Proveedor/opcionesPúblico. Voces, idiomas y modelos disponibles, con los identificadores que piden los agentes.
Ejemplo completo
Lanzar una campaña de recordatorios desde tu backend y recoger el resultado:
# 1) Cargar los contactos del día en la tabla que lee el flujo
POST https://agentaibi.com/aibicore/Ingesta/{publicId}
Authorization: Bearer {ingestToken}
{ "modo": "reemplazar", "filas": [ /* ... */ ] }
# 2) Disparar el flujo que recorre la tabla y llama a cada uno
POST https://agentaibi.com/aibicore/Flujo/webhook/{webhookToken}
Authorization: Bearer {webhookAuthToken}
{ "campana": "recordatorios-2026-09-04" }
# 3) El nodo Webhook del flujo llama a tu servidor por cada contacto atendido,
# y el estado global se consulta cuando quieras:
GET https://agentaibi.com/aibicore/EjecucionFlujo/{id}
Authorization: Bearer {token}Límites de uso
Los límites que hay hoy protegen los puntos sensibles, y se aplican por dirección IP dentro de una ventana de un minuto:
| Qué | Límite |
|---|---|
| Inicio de sesión | 10 peticiones por minuto y por IP |
| Recepción de eventos de canal | 300 peticiones por minuto y por IP |
| Filas por lote de ingesta | 2.000 filas |
| Vigencia del token de sesión | 10 horas |
Al superarlos la API responde 429. Si tu integración necesita un volumen mayor, escríbenos y lo ajustamos para tu cuenta.
Consumo de créditos
Lo que se lanza por API consume igual que lo que se lanza desde el panel: solo el tiempo de conversación. Las llamadas a la API de gestión, la ingesta de datos y los webhooks no cuestan créditos. Puedes consultar tu saldo con GET /Transaccion/saldo y el detalle de consumo con GET /Transaccion. Las tarifas vigentes están en Precios y también se pueden leer por API, sin autenticación, en GET /Transaccion/tarifas.