Para desarrolladores

API para desarrolladores

Conecta AIBI con tus sistemas: dispara flujos desde tu backend, recibe en tu servidor lo que pasó en cada conversación, mantén tus tablas al día desde tu CRM y administra agentes, flujos y créditos por API REST.

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.

Entrada

Disparar un flujo

Tu sistema le dice a AIBI «llama a esta persona» o «arranca este proceso», y le pasa los datos.

Salida

Recibir el resultado

AIBI le dice a tu sistema qué pasó en la conversación, con los datos que se extrajeron.

Datos

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"
  }
}
  • datos lleva 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.

ModoQué haceCuándo usarlo
upsertInserta si el externalId es nuevo; actualiza si ya existía.El modo por defecto y el único idempotente. Es el que quieres casi siempre.
anexarInserta siempre, sin comprobar si ya estaba.Registros que se acumulan, como un histórico de eventos.
reemplazarBorra 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 recibe 401.
  • 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ódigoSignificado
200OK — la petición se completó correctamente.
201Creado — el recurso se creó correctamente.
202Aceptado — el trabajo se encoló y continúa por su cuenta.
204Sin contenido — la operación se completó y no hay nada que devolver.
400Petición inválida — falta un campo, sobra otro o el formato no cuadra.
401No autorizado — credencial ausente, inválida, expirada, revocada, o API key de solo lectura intentando escribir.
403Prohibido — el recurso no pertenece a esta cuenta.
404No encontrado — el recurso no existe.
429Demasiadas peticiones — superaste el límite de la ventana.
500Error 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.

GET/Agente

Lista los agentes de la cuenta.

GET/Agente/{id}

Detalle de un agente.

POST/Agente

Crea un agente.

NombrestringrequeridoCómo se identifica el agente en el panel.
PromptSistemastringrequeridoInstrucciones de comportamiento: quién es y cómo debe conversar.
PromptNegociostringopcionalContexto de tu empresa: qué vendes, horarios, políticas.
TipoAgentestringopcionalventas, soporte, cobranza, agenda, encuesta o personalizado.
SaludoTextostringopcionalPrimera frase con la que abre la conversación.
IDConfigVoznumberopcionalVoz con la que habla, de las que devuelve /Proveedor/opciones.
TemperaturaLLMnumberopcionalCreatividad de las respuestas. Por defecto 0.7.
MaxTurnosHistorialnumberopcionalTurnos de conversación que recuerda. Por defecto 30.
PUT/Agente/{id}

Actualiza un agente existente.

PATCH/Agente/{id}/estado

Activa o desactiva el agente.

POST/Agente/{id}/clonar

Duplica un agente con toda su configuración.

DELETE/Agente/{id}

Elimina un agente.

Flujos

Un flujo es el grafo de nodos que orquesta la conversación.

GET/Flujo

Lista los flujos de la cuenta.

GET/Flujo/{id}

Devuelve el flujo con sus nodos y conexiones.

POST/Flujo

Crea un flujo a partir de su definición de nodos.

PUT/Flujo/{id}

Actualiza el flujo y archiva la versión anterior.

GET/Flujo/{id}/validar

Comprueba si el flujo se puede activar y devuelve los errores encontrados.

POST/Flujo/{id}/activar

Pone el flujo a atender.

POST/Flujo/{id}/pausar

Deja de atender sin borrar nada.

GET/Flujo/{id}/versiones

Historial de versiones del flujo.

DELETE/Flujo/{id}

Elimina un flujo.

POST/Flujo/webhook/{webhookToken}

Público con token propio. Dispara el flujo desde un sistema externo (sección 1).

AuthorizationheaderrequeridoBearer con el token de autorización del flujo.
(cuerpo libre)objectopcionalCada 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.

POST/EjecucionFlujo

Inicia una ejecución de un flujo con el token de la cuenta.

IDFlujonumberrequeridoFlujo que se va a ejecutar.
DescripcionstringopcionalEtiqueta para reconocer la ejecución en el historial.
ContextoInicialobjectopcionalVariables de arranque, como pares clave-valor de texto.
GET/EjecucionFlujo

Historial de ejecuciones.

GET/EjecucionFlujo/{id}

Estado y resultado de una ejecución.

GET/EjecucionFlujo/{id}/nodos

Traza nodo a nodo: qué se ejecutó, con qué salida y si falló.

GET/EjecucionFlujo/{id}/nodos/{nodoLogId}/mensajes

Transcripción de la conversación de ese nodo.

GET/EjecucionFlujo/{id}/contactos

Detalle por contacto de una ejecución masiva.

POST/EjecucionFlujo/{id}/pausar

Pausa una ejecución en curso.

POST/EjecucionFlujo/{id}/cancelar

Cancela 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.

GET/Datasets

Lista tus tablas.

GET/Datasets/{id}

Detalle de una tabla.

GET/Datasets/{id}/fields

Columnas de la tabla, con su tipo.

POST/Datasets/{id}/records/query

Consulta filas con filtros y paginación.

POST/Datasets/{id}/records

Crea una fila.

PATCH/Datasets/{id}/records/{rid}

Actualiza una fila.

DELETE/Datasets/{id}/records/{rid}

Elimina una fila.

POST/Datasets/{id}/records/bulk-update

Actualiza varias filas de una vez.

GET/Datasets/{id}/ingestas

Bitácora de los últimos envíos por ingesta.

GET/Datasets/quota

Espacio consumido y disponible de la cuenta.

POST/Ingesta/{publicId}

Público con token propio. Carga filas por lotes desde tu sistema (sección 3).

AuthorizationheaderrequeridoBearer con el token de ingesta de la tabla.
modostringopcionalupsert (por defecto), anexar o reemplazar.
filasarrayrequeridoHasta 2.000 objetos con externalId y valores.

Calendario

Las agendas contra las que el agente consulta disponibilidad y reserva citas.

GET/Calendario

Lista tus calendarios.

POST/Calendario

Crea un calendario con su horario y su duración de cita.

GET/Calendario/{id}/disponibilidad

Huecos libres en un rango de fechas.

GET/Calendario/{id}/citas

Citas agendadas.

POST/Calendario/{id}/citas

Reserva una cita a nombre de una persona: pide nombre (o idContacto) y admite su teléfono con indicativo.

DELETE/Calendario/citas/{idCita}

Cancela una cita.

Conversaciones de canal

La bandeja de WhatsApp, Instagram y Facebook: leerla y responder como humano.

GET/ConversacionesCanal

Lista las conversaciones, con su estado y su contacto.

GET/ConversacionesCanal/{idConv}/mensajes

Historial de mensajes de una conversación.

POST/ConversacionesCanal/{idConv}/tomar

Un humano toma la conversación y el agente deja de responder.

POST/ConversacionesCanal/{idConv}/responder

Envía un mensaje como humano.

POST/ConversacionesCanal/{idConv}/plantilla

Manda una plantilla aprobada de WhatsApp (lo que sí llega con la ventana de 24 h cerrada).

POST/ConversacionesCanal/{idConv}/devolver

Devuelve la conversación al agente.

POST/ConversacionesCanal/{idConv}/cerrar

Cierra la conversación.

Números telefónicos

Las líneas desde las que opera tu agente.

GET/NumeroTelefono

Lista tus números.

POST/NumeroTelefono/registrar

Registra un número propio.

POST/NumeroTelefono/verificar

Confirma la propiedad del número con el código recibido.

POST/NumeroTelefono/asignar

Asigna el número a un agente para que atienda las entrantes.

DELETE/NumeroTelefono/{id}

Desvincula el número.

Créditos y suscripción

Saldo, consumo y plan contratado.

GET/Transaccion/saldo

Créditos disponibles.

GET/Transaccion

Historial de movimientos de crédito.

GET/Transaccion/resumen

Consumo agregado del periodo.

GET/Transaccion/suscripcion

Plan contratado y su estado.

GET/Transaccion/tarifas

Público. Créditos por minuto de cada nodo.

GET/Transaccion/paquetes

Pú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.

GET/ApiKey

Lista tus claves, sin el valor completo.

POST/ApiKey

Crea una clave. La respuesta incluye el valor completo una sola vez.

NombrestringrequeridoPara reconocerla después: “CRM producción”, “script de facturación”.
Permisosstring[]requeridoAl menos uno. Sin ningún permiso :write, la clave es de solo lectura.
FechaExpiraciondateopcionalCaducidad opcional. Sin ella, la clave vive hasta que se revoque.
PATCH/ApiKey/{id}/revocar

Desactiva la clave de inmediato, conservando su rastro.

DELETE/ApiKey/{id}

Elimina la clave.

Cuenta

Sesión y perfil.

POST/Usuario/login

Público. Devuelve el token Bearer de la cuenta.

GET/Usuario/me

Datos de la cuenta autenticada.

PUT/Usuario/me/perfil

Actualiza los datos de perfil.

PATCH/Usuario/me/password

Cambia la contraseña.

GET/Proveedor/opciones

Pú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ón10 peticiones por minuto y por IP
Recepción de eventos de canal300 peticiones por minuto y por IP
Filas por lote de ingesta2.000 filas
Vigencia del token de sesión10 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.