Bob Office 168/52 developer documentation

Referencia de API, webhooks y el widget integrable de Bob: su front office de IA gobernado.

🔐 Autenticación

POST /api/auth/login
Autenticar usuarios administradores y obtener token de acceso
{
  "email": "admin@office16852.com",
  "password": "your_password"
}
POST /api/customers/auth/login
Autenticar usuarios cliente (multiinquilino)
{
  "email": "customer@business.com",
  "password": "customer_password"
}

Chat y conversaciones

Tres caminos: (1) Mismo origen, público anónimoPOST /api/chat (p. ej., widget del sitio de marketing; sin inicio de sesión). (2) Inserción de origen cruzadoPOST /api/widget/chat with X-Widget-Key and allowed Origin. (3) Aplicación autenticada / Mission ControlPOST /api/chat/session y POST /api/chat/message (requiere chat.manage and session/CSRF for cookie auth) — no for anonymous fetch desde páginas públicas.

1) Público anónimo (same-origin)

POST /api/chat
Unified pipeline for visitors on your own domain without signing in. Body includes message, session_id, opcional business_id.

2) Widget cross-origin

POST /api/widget/chat
Se incrusta en sitios de clientes. Encabezados: X-Widget-Key, Content-Type: application/json. Origin must be allowed for the key. See docs/REQUEST_FLOWS.md en el repositorio para los detalles de CORS.

3) Solo sesión autenticada / interfaz de administración

POST /api/chat/session
Crear sesión al iniciar en Mission Control o en el panel (RBAC + CSRF para cookies).
POST /api/chat/message
Send a message from autenticado admin/chat UI (chat.manage). Devuelve 401 if called anonymously from a public page — use POST /api/chat para ese caso en su lugar.
{
  "session_id": "session_123",
  "message": "Hello, I need help with my order"
}
GET /api/chat/history/:session_id
Recuperar el historial de conversaciones del chat (usuario autenticado)

📊 Analítica y monitorización

GET /api/analytics/overview
Obtener resumen de analíticas del sistema
GET /api/health
Comprobar el estado de salud del sistema
GET /api/metrics/business
Obtener métricas específicas del negocio

Gestión de clientes multi-inquilino

GET /api/customers/dashboard/:businessId
Obtener datos del panel del cliente para un negocio específico
GET /api/customers/analytics/:businessId
Obtener analíticas de negocio para un cliente específico
GET /api/customers/integration/:businessId/status
Comprobar el estado de integración de la empresa

🎯 Piloto UnityXpressions

GET /api/unityxpressions/dashboard
Datos del panel piloto de UnityXpressions
GET /api/pilot/metrics/realtime
Métricas de desempeño del piloto en tiempo real
GET /api/pilot/feedback/recent
Comentarios recientes de clientes (piloto)

🎓 Formación y aprendizaje

POST /api/training/unityxpressions/analyze
Analizar el negocio de UnityXpressions para entrenamiento
POST /api/training/unityxpressions/quick-setup
Formación rápida de puesta en marcha para UnityXpressions
GET /api/learning/health
Estado de salud del motor de aprendizaje

🔌 Instalación del widget

Agregue Bob a cualquier sitio web con una sola etiqueta de script. Tras el onboarding, su código de inserción del widget estará disponible en el Portal del Cliente en Configuración del widget.

<!-- Canonical tenant-scoped bundle from Customer Portal Widget Setup (no API key in HTML). -->
<script src="https://YOUR_OFFICE_HOST/widget/YOUR_TENANT_UUID/widget.js" async></script>
GET /api/customer-portal/widget-code
Devuelve código incrustable listo para pegar en su web. Requiere JWT del cliente.

🎭 Personalización de la persona

Las personas rigen cómo se expresa Bob (tono, nombre, instrucciones). Cada tenant recibe un persona por defecto; puede personalizarlo en el panel o por API.

GET /api/personas/:tenantId
Listar todas las personas de un tenant.
POST /api/personas/:tenantId
Crear una nueva persona. Cuerpo: { name, description, tone, systemPrompt }
PUT /api/personas/:tenantId/:personaId
Actualiza el tono, las instrucciones o el nombre de una persona existente.

💰 Planes y precios

Published pricebook is the source of truth. Use the APIs below for live numbers; this table matches pricebook-seed V1 (se ajusta cuando publicas una nueva versión).

Función Inicial Pro Enterprise
Precio de lista (USD/mes) $79 $249 $899
Créditos de IA incluidos / mes 15,000 75,000 250,000
Puestos de equipo Hasta 3 Hasta 10 Ilimitado
Integraciones estándar (incluidas) 1 3 10
Soporte Correo electrónico Prioridad Dedicado
GET /api/pricing/marketing-cards
Tarjetas de plan para marketing y checkout (precios, créditos, presupuestos) — a partir de la tarifa publicada. Sin autenticación.
GET /api/pricing/snapshot
Instantánea pública y segura del listado de precios completo (sin campos de coste del proveedor). No requiere inicio de sesión.

🛠️ Ejemplos de integración

Usa el bloque que coincida con tu escenario. No copies el ejemplo de administración en HTML de marketing anónimo.

Mismo origen, público (anónimo)

const response = await fetch('/api/chat', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    session_id: sessionId,
    message: userMessage,
    business_id: 'office16852-platform'
  })
});
const data = await response.json();

Widget de origen cruzado

const response = await fetch('https://office16852.com/api/widget/chat', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Widget-Key': 'pk_live_...',
    'Origin': 'https://your-customer-site.com'
  },
  body: JSON.stringify({ session_id: sessionId, message: userMessage })
});

Solo administrador autenticado (Bearer)

// JavaScript — requires logged-in admin / Mission Control (Bearer)
const response = await fetch('/api/chat/message', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + token
  },
  body: JSON.stringify({
    session_id: sessionId,
    message: userMessage
  })
});
const data = await response.json();
// Python — authenticated only
import requests
response = requests.post(
    'https://office16852.com/api/chat/message',
    headers={
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {token}'
    },
    json={ 'session_id': session_id, 'message': user_message }
)