API · Guía oficial

Integraciones externas para agentes de IA

Conecta Codex u otra herramienta con tus agentes de Bulest sin compartir tu contraseña. El token define la cuenta, los agentes y las acciones permitidas; cada cambio queda aislado y trazable.

Qué permite esta integración

Una Integración externa es una credencial revocable asociada a la cuenta activa de Bulest. Puede limitarse a agentes concretos y a capacidades específicas. La API pública usa como base:

Base URL
https://bulest.co/api/v1/external

Dependiendo de los permisos concedidos, una herramienta puede:

  • Consultar agentes y su configuración pública.
  • Explorar productos y variantes de la tienda vinculada a cada agente.
  • Leer fragmentos y preparar cambios sin tocar inmediatamente al agente activo.
  • Probar un borrador con texto, imágenes, audio, video o archivos en el Chat de pruebas.
  • Solicitar aprobación o aplicar un borrador de acuerdo con la política elegida.
  • Consultar en la Caja Negra la actividad atribuida a esa integración.

La cuenta es implícita

Nunca envíes user_id ni account_id. Bulest deriva ambos del token y vuelve a verificar el alcance en cada solicitud.

1. Crear el acceso en Bulest

  1. Abre Perfil → Integraciones externas.
  2. Selecciona Nueva integración y ponle un nombre reconocible, por ejemplo “Codex — conocimiento de ventas”.
  3. Elige los permisos y los agentes a los que podrá acceder.
  4. Define cómo manejará los cambios: solo borradores, aprobación humana o aplicación directa.
  5. Copia el token. Bulest lo muestra completo una sola vez.

Trata el token como una contraseña

No lo publiques, no lo guardes en el repositorio y no lo envíes en la URL. Si se pierde o se expone, rótalo desde Perfil; el anterior dejará de funcionar inmediatamente.

Permisos disponibles

PermisoUso
agents.readLista y consulta agentes autorizados.
agents.lifecycleCrea y archiva agentes.
fragments.readConsulta fragmentos y la revisión vigente.
fragments.draftPrepara borradores de configuración o conocimiento.
fragments.applyEnvía a aprobación o aplica según la política configurada.
catalog.readConsulta productos, variantes e IDs de la tienda vinculada al agente.
configuration.readDiagnostica instancias, tienda, departamentos, capacidades, calendarios y dependencias antes de editar.
chat_test.runUsa el Chat de pruebas con la versión activa o un borrador.
activity.readConsulta la actividad de esa integración.

2. Autenticación

Envía el token en el encabezado HTTP Authorization con el esquema Bearer:

cURL
curl https://bulest.co/api/v1/external/guide \
  -H "Authorization: Bearer BULEST_TOKEN" \
  -H "Accept: application/json"

Para solicitudes con cuerpo añade Content-Type: application/json. El token no se admite en parámetros de consulta ni dentro del JSON.

3. Descubrir capacidades

El primer llamado recomendado es GET /guide. Devuelve los permisos, la política, los agentes visibles y un mapa de las operaciones disponibles para ese token. GET /capabilities es un alias compatible.

Respuesta abreviada
{
  "success": true,
  "integration": {
    "id": "INTEGRATION_ID",
    "name": "Codex — conocimiento de ventas",
    "permissions": ["agents.read", "fragments.read", "fragments.draft"],
    "agent_scope_mode": "selected",
    "change_policy": "approval_required"
  },
  "agents": [
    { "id": "AGENT_ID", "name": "Ventas", "revision": "REVISION_SHA256" }
  ],
  "guide": { "base_path": "/api/v1/external", "endpoints": {} }
}

Una herramienta debe tratar esta respuesta como la autoridad del acceso y no intentar operar sobre agentes o capacidades ausentes.

4. Leer agentes y fragmentos

MétodoRutaResultado
GET/agentsAgentes visibles para el token.
GET/agents/AGENT_IDConfiguración pública y revisión.
GET/agents/AGENT_ID/configuration-contextRelaciones, estado de dependencias y advertencias previas a la edición.
GET/agents/AGENT_ID/fragmentsSnapshot de fragmentos y revision.
Leer fragmentos
curl https://bulest.co/api/v1/external/agents/AGENT_ID/fragments \
  -H "Authorization: Bearer BULEST_TOKEN"

Conserva la revisión

La respuesta incluye revision. Debes enviarla como base_revision al preparar un cambio. Si alguien editó el agente entre ambos pasos, Bulest rechazará el borrador en lugar de pisar el cambio humano.

Comprueba el contexto antes de editar

Con GET /agents/AGENT_ID/configuration-context la integración puede detectar, por ejemplo, una instancia desconectada, una tienda ausente, un calendario eliminado o un departamento sin asesores disponibles. Los IDs se incluyen para operaciones precisas, pero los diagnósticos usan nombres y mensajes legibles.

Diagnóstico previo
curl https://bulest.co/api/v1/external/agents/AGENT_ID/configuration-context \
  -H "Authorization: Bearer BULEST_TOKEN"

6. Preparar cambios como borradores

Las operaciones sobre fragmentos nunca cambian por sí solas al agente activo. Construyen un borrador con el snapshot completo resultante. Esto permite probarlo y revisarlo antes de aplicarlo.

Crear un fragmento

POST /agents/AGENT_ID/fragments
{
  "base_revision": "REVISION_SHA256",
  "summary": "Añade la política de envíos nacionales",
  "fragment": {
    "title": "Envíos nacionales",
    "type": "text",
    "content": "Los envíos tardan entre 2 y 5 días hábiles.",
    "active": true,
    "meta": {}
  }
}

Editar o eliminar un fragmento

MétodoRutaCuerpo mínimo
PATCH/agents/AGENT_ID/fragments/FRAGMENT_IDbase_revision y fragment parcial.
DELETE/agents/AGENT_ID/fragments/FRAGMENT_IDbase_revision y resumen opcional.

Snapshot completo

Para cambiar varios fragmentos o también la configuración pública del agente, usa POST /agents/AGENT_ID/drafts:

JSON
{
  "base_revision": "REVISION_SHA256",
  "summary": "Reorganiza el conocimiento comercial",
  "agent": {
    "description": "Asistente comercial de la tienda",
    "delay": 2000
  },
  "fragments": [
    {
      "id": "FRAGMENT_ID_EXISTENTE",
      "title": "Envíos nacionales",
      "type": "text",
      "content": "Los envíos tardan entre 2 y 5 días hábiles.",
      "active": true,
      "meta": {}
    }
  ]
}

Cuando envíes un snapshot completo, conserva todos los fragmentos que no deseas eliminar. Bulest fija la cuenta, autoría y fechas; el cliente no debe suplantar esos campos.

7. Probar el borrador en el Chat de pruebas

El envío es asíncrono. La API responde 202 Accepted con un session_id y un message_id.

POST /test-chat/messages
{
  "agent_id": "AGENT_ID",
  "draft_id": "DRAFT_ID",
  "client_message_id": "scenario-shipping-001",
  "message": {
    "type": "text",
    "content": "¿Cuánto tarda mi envío?"
  }
}

Para continuar, envía el session_id. Bulest recuerda y revalida el mismo borrador; no permite cambiarlo dentro de esa conversación.

Continuación
{
  "session_id": "SESSION_ID",
  "message": {
    "type": "text",
    "content": "¿Y para Medellín?"
  }
}

Multimedia

Los tipos admitidos son image, audio, video y file. El mensaje puede llevar una leyenda y el archivo en base64:

Imagen
{
  "agent_id": "AGENT_ID",
  "draft_id": "DRAFT_ID",
  "message": {
    "type": "image",
    "caption": "¿Este producto está disponible?",
    "filename": "producto.jpg",
    "mime_type": "image/jpeg",
    "base64": "/9j/4AAQSkZJRgABAQ..."
  }
}

Consultar respuestas

Polling
GET /test-chat/sessions/SESSION_ID/messages?after=0

Usa el cursor devuelto como próximo valor de after. Continúa consultando mientras is_terminal sea falso; estados como waiting_for_tool indican que todavía llegarán resultados. Cada sesión aísla su memoria por integración, agente y session_id.

Las herramientas con posibles escrituras pueden añadir mensajes tool_activity cuando se ejecutan en modo de prueba. Son evidencia creada por Bulest —API alcanzada, datos seguros, validaciones y efectos omitidos— y no forman parte de conversation ni del texto del agente.

Actividad simulada
{
  "sender": "system",
  "type": "tool_activity",
  "visibility": "tester",
  "tool_activity": {
    "operation": "checkout.create",
    "status": "simulated_success",
    "title": "Checkout simulado",
    "summary": "El checkout fue validado y no se creó un pedido real.",
    "validated": ["Catálogo y precios vigentes"],
    "suppressed_effects": ["Crear el pedido", "Modificar inventario"]
  }
}
Reiniciar memoria
POST /test-chat/sessions/SESSION_ID/reset

client_message_id evita duplicados si debes reintentar un envío. Dentro de una sesión se procesa un turno a la vez; sesiones diferentes sí pueden ejecutarse en paralelo.

8. Aplicar o enviar a aprobación

Cuando el resultado sea correcto, llama:

Aplicación
POST /drafts/DRAFT_ID/apply
PolíticaComportamiento
draft_onlyEl borrador queda disponible para aplicación manual desde Perfil.
approval_requiredPasa a pendiente de aprobación humana en Bulest.
direct_applySe aplica inmediatamente si la revisión base sigue vigente.

Las dos últimas políticas requieren el permiso fragments.apply. Un conflicto de revisión debe resolverse leyendo de nuevo al agente y reconstruyendo el borrador; nunca se fuerza la escritura.

9. Actividad y Caja Negra

Consulta la actividad atribuida exclusivamente a la integración:

Actividad
GET /activity?limit=50

Bulest registra la preparación y aplicación de borradores, creación o archivado de agentes y ejecuciones del Chat de pruebas. La Caja Negra identifica a la integración por nombre, pero no guarda el token ni copia el contenido completo de fragmentos o conversaciones.

Referencia rápida de endpoints

MétodoRutaPermiso
GET/guideToken activo
GET/agentsagents.read
POST/agentsagents.lifecycle
DELETE/agents/AGENT_IDagents.lifecycle
GET/agents/AGENT_ID/catalogcatalog.read
GET/agents/AGENT_ID/configuration-contextconfiguration.read
GET/agents/AGENT_ID/fragmentsfragments.read
POST/agents/AGENT_ID/fragmentsfragments.draft
PATCH/agents/AGENT_ID/fragments/FRAGMENT_IDfragments.draft
POST/agents/AGENT_ID/draftsfragments.draft
GET/draftsfragments.read
POST/drafts/DRAFT_ID/applyfragments.apply
POST/test-chat/messageschat_test.run
GET/test-chat/sessions/SESSION_ID/messageschat_test.run
POST/test-chat/sessions/SESSION_ID/resetchat_test.run
GET/activityactivity.read

La referencia machine-readable está disponible en /docs/openapi.json.

Errores y reglas de seguridad

  • 401: token ausente, inválido, vencido o revocado.
  • 403: permiso, agente autorizado o política insuficiente.
  • 409: conflicto de revisión, versión, sesión o estado del borrador.
  • 410: borrador o sesión de prueba vencida.
  • 429: demasiadas solicitudes; respeta el tiempo de espera antes de reintentar.

No reintentes automáticamente una mutación si no sabes si el servidor la alcanzó a procesar. Vuelve a consultar el recurso y decide con su estado actual.

Datos que nunca debes enviar

No envíes contraseñas de Bulest, credenciales de tiendas, claves internas del sistema, user_id, account_id ni tokens de otras integraciones.

Continuar con la referencia OpenAPIContrato machine-readable para herramientas y agentes.