Skip to main content
Cada request lleva el header X-API-Key. La key identifica el tenant, el ambiente y los permisos. No se acepta por query string, body ni Basic Auth. Una key solo funciona en su ambiente: sk_live_ en sandbox (o al revés) responde 401. La key llega al contratar el plan (agente de CUCU o app.cucu.bo) y es la misma para REST y MCP.
sk_live_ vive solo en tu backend (variable de entorno o secret manager). Nunca en frontend, apps móviles ni repositorios.

Errores de autenticación

Los filtros responden antes de llegar al endpoint, con un JSON mínimo (error: true + message, sin error.code):

Freno a credenciales inválidas (429)

Si desde una misma IP se presentan más de 20 credenciales inválidas en un minuto (keys de tenant o de servicio en rutas protegidas, credenciales de administración en /api/v1/admin, o keys en /mcp), esa IP recibe 429 con Retry-After presente la llave que presente, incluida una válida, hasta que se cierre la ventana.
  • No cuentan: un request sin credencial (sigue siendo 401) ni una credencial válida sin permiso (403).
  • Es independiente del límite de requests por API Key: el tráfico con una llave válida no lo activa.
  • En MCP el 429 no es una respuesta HTTP: el texto llega como resultado de la tool (detalle).
  • Si tu integración rota llaves, asegurate de que la vieja no quede en un reintento en bucle.

Cabeceras de seguridad

Todas las respuestas traen X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer y Strict-Transport-Security: max-age=31536000; includeSubDomains. Las respuestas JSON (incluido /mcp) traen además X-Frame-Options: DENY y Content-Security-Policy: default-src 'none'; frame-ancestors 'none'. Los documentos públicos (/api/v1/public/...) y la página /f/{cuf} quedan fuera de esas dos últimas para poder embeberse; la página pública lleva su propia CSP.

Endpoints públicos (sin API Key)

El CUF actúa como token de acceso: las URLs se pueden compartir con el cliente final. Todo lo demás (/api/v1/invoices, /api/v1/siat/*, /api/v1/ai/chat, etc.) exige X-API-Key, y cada endpoint verifica que el recurso pertenezca al tenant autenticado.

Rotación

  1. En app.cucu.bo → Configuración > API Keys → Regenerar key del ambiente que corresponda. La key anterior se revoca en el acto.
  2. Actualizá la variable de entorno o secret manager y desplegá.
  3. Verificá con un request a /api/v1/invoices.
Rotación con período de gracia (la anterior sigue valiendo hasta 30 días): la hace CUCU con generarApiKey. No hay SDK oficial: la API es REST plano y cualquier cliente HTTP alcanza.