# Harbor error contract v1 Public API failures use one envelope: ```json { "success": false, "error": { "code": "PROVIDER_UNAVAILABLE", "message": "Провайдер подписки временно недоступен.", "retryable": true, "correlationId": "6f1a63de-30f9-4dc5-b8ce-38d38c164fe3", "details": "HTTP 503" } } ``` `code`, Russian user copy, HTTP status and retry policy come from `src/shared/errors.js`. The browser maps copy and retry behavior by `code`; it does not display server-provided `details`. Unknown failures use `UNKNOWN`, never expose the raw exception, and always receive a correlation reference. Server logs use the same reference and redact complete HTTP(S) URLs. Errors are local operation results, not canonical state replacements. A failed apply keeps the previous snapshot; in particular, server existence is validated before `desiredServerId` is persisted. Frontend errors are shown beside subscription or connection controls. Only retryable codes expose `Повторить`. This is a coordinated API change: old frontends do not understand the object-valued `error` field, so frontend and control plane must be deployed together. Persisted files and volumes are unchanged. Rollback is code-only and requires no data migration.