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.
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
429no 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 traenX-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
- En app.cucu.bo → Configuración > API Keys → Regenerar key del ambiente que corresponda. La key anterior se revoca en el acto.
- Actualizá la variable de entorno o secret manager y desplegá.
- Verificá con un request a
/api/v1/invoices.
generarApiKey.
No hay SDK oficial: la API es REST plano y cualquier cliente HTTP alcanza.