La mayoría de los endpoints devuelven errores con un código estable y legible por máquina junto al mensaje:
{ "error": { "code": "SOURCE_NOT_FOUND", "message": "source not found" }}
code — SCREAMING_SNAKE_CASE, estable una vez publicado. Úsalo para lógica condicional en tu integración; nunca hagas switch sobre message.
message — texto libre en inglés, pensado para logs, no para mostrar directamente al usuario final.
Un subconjunto de endpoints — POST /agent/query, POST /agents/{id}/query y los endpoints de /tenants/me/mcp/* — todavía responden con el formato heredado, sin code:
{ "error": "missing tenant context" }
Distínguelos por status HTTP y por el texto de error mientras se completa la migración a códigos estables. El resto de esta página documenta el formato con code (mayoría de la superficie).
Trata code como el contrato estable; message puede cambiar sin aviso.
Ante 429, respeta un backoff exponencial — no reintentes inmediatamente.
Ante 402 PLAN_LIMIT_REACHED en /ingest/sources o /ingest/sources/upload: la operación se rechazó porque ya alcanzaste el límite de fuentes de tu plan. A diferencia de los excesos de documentos o consultas (que se registran y facturan sin bloquear — ver Límites de uso), el límite de fuentes activas sí bloquea la creación de una fuente nueva.