Referencia completa de la API REST de Cortex Knowledge Assistant.
Base URL: http://localhost:8088 (desarrollo) | https://api.cortex.deeprat.tech (demo)
Cortex utiliza JWT Bearer tokens para autenticación. Todos los endpoints (excepto /health, /live, /ready, /auth/login) requieren autenticación.
POST /auth/login
Content-Type: application/json
{
"username": "admin",
"password": "your_password"
}Respuesta (200 OK):
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer",
"user": {
"id": "1",
"username": "admin",
"user_type": "employee",
"role": "admin",
"dlp_level": "standard",
"can_access_all_subjects": true,
"subject_ids": []
}
}Authorization: Bearer eyJhbGciOiJIUzI1NiIs...- Health & Status
- Authentication
- RAG Queries
- Subjects (Clientes)
- Transactional Data
- Admin - Users
- Admin - Documents
- Admin - Products & Transactions
- System Setup
- Metrics
Estado completo del sistema con todos los componentes.
Auth: No requerida
curl http://localhost:8088/healthRespuesta (200 OK):
{
"status": "healthy",
"timestamp": "2024-12-27T15:30:00Z",
"components": {
"database": { "healthy": true, "status": "connected" },
"qdrant": { "healthy": true, "status": "connected", "documents": 1234 },
"redis": { "healthy": true, "status": "connected" },
"llm": {
"healthy": true,
"provider": "hf",
"model": "meta-llama/Llama-3.1-8B-Instruct"
}
}
}Probe de liveness para Kubernetes.
Auth: No requerida
curl http://localhost:8088/liveRespuesta (200 OK):
{
"status": "alive",
"timestamp": "2024-12-27T15:30:00Z"
}Probe de readiness para Kubernetes.
Auth: No requerida
Respuesta (200 OK si listo, 503 si no):
{
"ready": true,
"timestamp": "2024-12-27T15:30:00Z",
"checks": {
"database": true,
"qdrant": true,
"llm": true
}
}Información de versión y build.
Auth: No requerida
{
"git_sha": "abc123def",
"build_time": "2024-12-27T12:00:00Z",
"app_version": "0.1.0-beta"
}Autenticar usuario y obtener JWT.
Request:
{
"username": "string",
"password": "string"
}Respuesta (200 OK): Ver Obtener Token
Errores:
401: Credenciales inválidas403: Usuario deshabilitado
Alias de /auth/login para compatibilidad.
Realizar una consulta RAG con respuesta completa.
Auth: Bearer Token requerido
Request:
{
"query": "¿Cuáles son los requisitos para abrir una cuenta?",
"session_id": "optional-session-id",
"subject_id": "CLI-81093",
"context_type": "public_docs"
}| Campo | Tipo | Descripción |
|---|---|---|
query |
string | Requerido. Pregunta del usuario (máx 2000 chars) |
session_id |
string | Opcional. ID de sesión para memoria de conversación |
subject_id |
string | Opcional. ID del cliente para consultas personalizadas |
context_type |
string | Opcional. Filtro: public_docs, educational, o null |
Respuesta (200 OK):
{
"answer": "Para abrir una cuenta necesita presentar...",
"used_chunks": ["chunk-id-1", "chunk-id-2", "chunk-id-3"],
"session_id": "my-session-123",
"citations": [
{ "id": "chunk-id-1", "source": "requisitos_cuenta.pdf" },
{ "id": "chunk-id-2", "source": "documentacion_general.pdf" }
]
}Errores:
401: No autenticado403: Sin permisos para el subject413: Query demasiado larga422: Query vacía429: Rate limited (incluye headerRetry-After)
Consulta RAG con respuesta en streaming (SSE).
Auth: Bearer Token requerido
Request: Igual que /query
Respuesta: text/event-stream
data: {"token": "Para"}
data: {"token": " abrir"}
data: {"token": " una"}
data: {"token": " cuenta"}
...
data: {"done": true}
Streaming simplificado (requiere CKA_ENABLE_STREAMING=true).
Query Params: q - la consulta
Listar subjects (clientes/entidades) accesibles para el usuario actual.
Auth: Bearer Token requerido
Respuesta (200 OK):
[
{
"subject_id": "CLI-81093",
"subject_type": "person",
"display_name": "Juan García",
"status": "active"
},
{
"subject_id": "CLI-81094",
"subject_type": "person",
"display_name": "María López",
"status": "active"
}
]Detalle de un subject específico.
Auth: Bearer Token requerido
Respuesta (200 OK):
{
"subject_id": "CLI-81093",
"subject_type": "person",
"display_name": "Juan García",
"status": "active",
"attributes": {
"segment": "premium",
"joined_date": "2020-01-15"
}
}Listar productos/servicios de un subject.
Auth: Bearer Token requerido
Respuesta (200 OK):
[
{
"service_type": "bank_account",
"service_key": "ES1234567890123456789012",
"display_name": "Cuenta Corriente",
"status": "active",
"metadata": { "currency": "EUR" }
},
{
"service_type": "credit_card",
"service_key": "****-****-****-1234",
"display_name": "Visa Gold",
"status": "active",
"metadata": { "limit": 5000 }
}
]Snapshot transaccional del usuario actual (solo customers).
Auth: Bearer Token requerido (user_type: customer)
Respuesta (200 OK):
{
"subject_key": "CLI-81093",
"products": [
{
"service_type": "bank_account",
"service_key": "ES1234567890123456789012",
"status": "active",
"extra": { "balance": 15000.5 }
}
],
"recent_transactions": [
{
"timestamp": "2024-12-27T10:30:00Z",
"transaction_type": "debit",
"amount": -50.0,
"currency": "EUR",
"description": "Supermercado",
"extra": null
}
]
}Snapshot de cualquier cliente (solo employees).
Auth: Bearer Token requerido (user_type: employee)
Todos los endpoints de admin requieren user_type: employee y role: admin.
Listar todos los usuarios.
Query Params:
include_inactive(bool): Incluir usuarios deshabilitadosuser_type(string): Filtrar por "customer" o "employee"
Respuesta (200 OK):
{
"users": [
{
"id": 1,
"username": "admin",
"user_type": "employee",
"role": "admin",
"dlp_level": "standard",
"status": "active",
"can_access_all_subjects": true,
"subject_ids": []
}
],
"total": 1
}Crear nuevo usuario.
Request:
{
"username": "nuevo_usuario",
"password": "password_seguro_123",
"user_type": "customer",
"role": "user",
"display_name": "Nuevo Usuario",
"dlp_level": "standard",
"can_access_all_subjects": false,
"subject_ids": ["CLI-81095"],
"full_name": "Nombre Completo",
"document_id": "12345678A",
"tax_id": "12345678A",
"email": "usuario@ejemplo.com",
"phone": "+34612345678"
}Obtener usuario por ID.
Actualizar usuario.
Request:
{
"role": "admin",
"dlp_level": "privileged",
"status": "active",
"can_access_all_subjects": true,
"new_password": "nuevo_password_123"
}Eliminar o desactivar usuario.
Query Params:
hard_delete(bool): Sitrue, elimina permanentemente. Default:false(soft delete)
Subir documento para ingesta.
Auth: Bearer Token (admin)
Content-Type: multipart/form-data
Form Fields:
file: Archivo PDF, TXT o MD (máx 50MB)category:public_docsoeducational
curl -X POST http://localhost:8088/api/admin/upload-public-document \
-H "Authorization: Bearer $TOKEN" \
-F "file=@documento.pdf" \
-F "category=public_docs"Respuesta (200 OK):
{
"success": true,
"message": "Document uploaded and processed",
"filename": "abc12345_documento.pdf",
"file_size": 1234567,
"file_hash": "sha256_hash_aquí",
"audit_id": 42,
"ingestion_status": "success",
"documents_ingested": 15,
"category": "public_docs"
}Re-ingestar todos los PDFs del directorio de documentación.
Auth: Bearer Token (admin)
Respuesta (200 OK):
{
"status": "ok",
"documents_ingested": 25
}Listar todos los subjects con conteo de productos.
Respuesta (200 OK):
{
"subjects": [
{
"id": 1,
"subject_key": "CLI-81093",
"subject_type": "person",
"display_name": "Juan García",
"status": "active",
"product_count": 3
}
],
"total": 1
}Listar productos de un subject.
Crear nuevo producto.
Request:
{
"service_type": "bank_account",
"service_key": "ES9876543210987654321098",
"status": "active",
"extra_metadata": { "currency": "EUR", "type": "savings" }
}Actualizar producto.
Eliminar producto (soft delete por defecto).
Listar transacciones de un producto.
Query Params:
limit(int): Máximo resultados (default: 50, max: 500)offset(int): Offset para paginacióntx_type(string): Filtrar por tipo
Crear nueva transacción.
Request:
{
"transaction_type": "credit",
"amount": 1500.0,
"currency": "EUR",
"description": "Transferencia recibida",
"extra_metadata": { "reference": "TRF-123456" }
}Actualizar transacción.
Eliminar transacción (hard delete).
Obtener datos completos de un subject para edición.
Respuesta (200 OK):
{
"subject_key": "CLI-81093",
"subject_type": "person",
"display_name": "Juan García",
"status": "active",
"full_name": "Juan García Pérez",
"document_id": "12345678A",
"tax_id": "12345678A",
"email": "juan.garcia@ejemplo.com",
"phone": "+34612345678",
"created_at": "2024-01-15T10:00:00Z",
"updated_at": "2024-12-27T15:00:00Z"
}Actualizar datos de subject con auditoría.
Request:
{
"display_name": "Juan García Pérez",
"email": "nuevo.email@ejemplo.com",
"reason": "Actualización por solicitud del cliente vía ticket #12345"
}Importante: El campo
reasones obligatorio (mín 10 caracteres) para documentar el cambio.
Historial de modificaciones de un subject.
Respuesta (200 OK):
[
{
"audit_id": 123,
"timestamp": "2024-12-27T15:00:00Z",
"operator_user_id": "1",
"operator_username": "admin",
"outcome": "success",
"details": {
"changes": ["email"],
"reason": "Actualización por solicitud del cliente"
}
}
]Consultar log de auditoría.
Query Params:
user_id(string): Filtrar por usuariosubject_key(string): Filtrar por subjectoperation(string): Filtrar por operaciónlimit(int): Máximo resultados (default: 200, max: 1000)
Respuesta (200 OK):
[
{
"id": 456,
"user_id": "1",
"username": "admin",
"subject_key": "CLI-81093",
"operation": "query",
"outcome": "success",
"details": { "duration_sec": 1.23 },
"created_at": "2024-12-27T15:30:00Z"
}
]Estado del sistema para setup wizard.
Auth: No requerida (para first-run)
Query Params:
check_llm(bool): Verificar LLM (más lento)include_errors(bool): Incluir mensajes de error detallados
Respuesta (200 OK):
{
"database": {
"connected": true,
"first_run": false,
"admin_exists": true
},
"qdrant": {
"connected": true,
"collection_exists": true,
"document_count": 1234
},
"llm": {
"configured": true,
"provider": "hf"
},
"system": {
"version": "0.1.0-beta"
}
}Crear usuario admin inicial (solo disponible en first-run).
Auth: No requerida
Request:
{
"username": "admin",
"password": "password_seguro_minimo_12_caracteres",
"display_name": "Administrador"
}Errores:
403: Ya existe un admin (first_run = false)422: Password no cumple requisitos
Inicializar colección de Qdrant.
Auth: Bearer Token (admin)
Estado del modo demo (si está habilitado).
Auth: No requerida
Respuesta (200 OK):
{
"demo_reset_enabled": true,
"next_reset": "2024-12-27T16:00:00Z",
"seconds_until_reset": 1800,
"reset_interval_hours": 1
}Métricas en formato Prometheus.
Auth: No requerida
Content-Type: text/plain
# HELP cortex_query_latency_seconds Query processing latency
# TYPE cortex_query_latency_seconds histogram
cortex_query_latency_seconds_bucket{le="0.1"} 10
cortex_query_latency_seconds_bucket{le="0.5"} 50
cortex_query_latency_seconds_bucket{le="1.0"} 95
cortex_query_latency_seconds_count 100
cortex_query_latency_seconds_sum 45.67
# HELP cortex_http_requests_total Total HTTP requests
# TYPE cortex_http_requests_total counter
cortex_http_requests_total{endpoint="/query",status_class="2xx"} 100
cortex_http_requests_total{endpoint="/query",status_class="4xx"} 5
| Código | Significado | Acción Sugerida |
|---|---|---|
| 400 | Bad Request | Verificar formato del request |
| 401 | Unauthorized | Obtener nuevo token |
| 403 | Forbidden | Verificar permisos del usuario |
| 404 | Not Found | Verificar ID/path del recurso |
| 409 | Conflict | Recurso ya existe |
| 413 | Payload Too Large | Reducir tamaño del request |
| 422 | Unprocessable Entity | Corregir datos de entrada |
| 429 | Too Many Requests | Esperar según Retry-After header |
| 500 | Internal Server Error | Reportar bug con request_id |
| 503 | Service Unavailable | Reintentar después |
- Límite por defecto: 120 queries por minuto por usuario
- Burst: Configurable vía
CKA_RATE_LIMIT_BURST - Window: 60 segundos (configurable)
Cuando se excede el límite:
HTTP/1.1 429 Too Many Requests
Retry-After: 5
{"detail": "rate_limited"}Todas las respuestas incluyen:
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: no-referrer
X-Request-ID: abc123def456Con CKA_HTTPS_ENABLED=true:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; ...