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 SOURCE_LIMIT_REACHED en POST /ingest/sources: ya alcanzaste el límite de fuentes conectadas de tu plan. Solo cuentan los conectores con sincronización (web, Drive, Notion…) — los archivos subidos no ocupan este cupo, ni las fuentes en error que nunca indexaron nada. A diferencia de los excesos de documentos o consultas (que se registran y facturan sin bloquear — ver Límites de uso), este límite sí bloquea la creación del conector nuevo.
Ante 409 CONFLICT en POST /ingest/sources con source_type: web: tu espacio ya tiene una fuente con esa URL (la comparación normaliza mayúsculas, barra final, puerto default y fragmento). El message incluye el nombre y el id de la fuente existente — re-sincronizala o borrala en vez de crear un duplicado.