Errores
Un único formato para todos los errores, con un código estable legible por máquinas y un mensaje para personas.
{ "error": "entitlement_required", "message": "Guard is not enabled for this organisation", "details": { "upgrade": "/settings#plan" } }| Status | error | Cuándo |
|---|---|---|
| 400 | invalid_body | El cuerpo no superó la validación; details.fieldErrors indica los campos |
| 400 | invalid_json · invalid_query · empty | JSON mal formado, query string incorrecta, payload vacío |
| 400 | no_agent_build · endpoint_required · no_connection | El proyecto no está listo para una ejecución o para Guard |
| 400 | invalid_cron · unknown_template · no_scenarios | Programaciones y ejecuciones |
| 400 | missing_signature · invalid_signature · turnstile_failed | Verificación de webhooks y formularios públicos |
| 400 | config_error · invalid_provider · weak_password | Validación de ajustes |
| 400 | restricted_key_required · invalid_key_format · stripe_key_rejected · missing_permission · mode_mismatch · account_mismatch | Conectar o rotar Stripe: las claves live deben ser restringidas; details.missing indica los permisos que faltan |
| 400 | project_required · egress_blocked · secret_required · not_configured | Observaciones y servicio de acceso |
| 401 | unauthorized · invalid_credentials | Credencial ausente o incorrecta |
| 402 | plan_limit_reached | Ejecuciones mensuales del plan agotadas |
| 403 | forbidden · entitlement_required · wrong_password | Rol insuficiente, funcionalidad no desbloqueada |
| 404 | not_found · mandate_not_found · project_not_found · connection_not_found · agent_build_not_found | Desconocido o no es tuyo |
| 409 | idempotency_key_reused · business_key_conflict | Misma clave con otro cuerpo; mismo efecto ya propuesto |
| 409 | digest_mismatch · approval_expired · not_reviewable · no_pending_approval · already_decided | Aprobaciones |
| 409 | mandate_inactive · project_paused | La autoridad terminó, o el kill-switch está activo |
| 409 | slug_taken · exists · already_enabled · already_onboarded | Conflictos |
| 409 | use_billing · billing_not_configured · already_subscribed · no_billing_account | Los cambios de plan pasan por la facturación |
| 409 | connection_in_use | Mandatos activos u operaciones sin terminar siguen usando la conexión |
| 413 | payload_too_large | Cuerpo por encima del límite |
| 422 | no_priced_models · no_valid_cases | Catálogo de IA o entrada de red team inutilizable |
| 429 | rate_limited | Demasiadas peticiones desde esta IP |
| 500 | internal_error | Inesperado; reintenta una vez y luego contacta con soporte indicando la hora de la petición |
| 502 | sandbox_unavailable · sync_failed · stripe_unreachable | Una dependencia no respondió |
Las decisiones no son errores: un DENY es un 202 con decision: "DENY" y decision_reasons explícitos. Los veredictos tampoco son errores.