Ошибки и действия клиента
Все JSON-ошибки имеют общий конверт. Поле request_id в теле отсутствует; для диагностики сохраните новый заголовок X-Request-Id, HTTP-код, error.code и ID операции, если он известен. Не записывайте Bearer или полные секреты в журнал интеграции.
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Проверьте поля запроса.",
"fields": {"contacts.0.phone": ["Укажите телефон."]}
}
}
| Поле | Тип | Обязательно | null |
|---|---|---|---|
error |
объект | да | нет |
| error.code | строка, машинный код | да | нет |
| error.message | строка, безопасное сообщение | да | нет |
| error.fields | объект: публичный путь поля → массив строк | нет | нет |
| error.details | объект, безопасные сведения по конкретной ошибке | нет | нет |
Отсутствующие fields/details не заменяются обязательным null. В details могут находиться operation_id, версия или доступные ссылки на конфликтующие ресурсы. Текст сообщения не используйте как условие программы. SQL, сведения о внутренних вызовах и секреты не входят в публичную ошибку. Код 404 не позволяет различить отсутствие записи и недостаточный доступ.
Общие коды
| HTTP | error.code | Действие |
|---|---|---|
| 400 | INVALID_JSON |
Передать JSON-объект без повторных ключей |
| 400 | GET_BODY_NOT_ALLOWED |
Убрать тело GET |
| 401 | TOKEN_INVALID |
Проверить токен, срок и сотрудника; cookie не заменяет Bearer |
| 403 | SUBSCRIPTION_INACTIVE |
Проверить context и подписку |
| 403 | API_DISABLED |
Проверить включение API для организации |
| 403 | FEATURE_UNAVAILABLE |
Проверить тариф и модуль; при закрытом плане public_api details содержит required_plan |
| 403 | FORBIDDEN |
Проверить разрешения подключения, права сотрудника и условия полей |
| 404 | ORGANIZATION_NOT_FOUND |
Проверить HTTPS-домен организации |
| 404 | NOT_FOUND |
Проверить ID, принадлежность родителю и текущий доступ |
| 405 | METHOD_NOT_ALLOWED |
Использовать описанный GET или POST |
| 406 | NOT_ACCEPTABLE |
Разрешить identity или gzip |
| 409 | IDEMPOTENCY_CONFLICT |
Один ключ принят для другого пути, тела, версии или файла |
| 409 | OPERATION_IN_PROGRESS |
Опрашивать журнал с учётом Retry-After |
| 409 | OPERATION_OUTCOME_UNKNOWN |
Сверять исход, не выполнять действие повторно новым ключом |
| 409 | IDEMPOTENCY_RESULT_EXPIRED |
Тело очищено, ключ занят; читать журнал и актуальные ресурсы |
| 409 | CURSOR_EXPIRED |
Начать выборку заново |
| 412 | VERSION_MISMATCH |
Перечитать состояние и согласовать новое действие |
| 413 | PAYLOAD_TOO_LARGE |
Уменьшить JSON или файл до лимита |
| 415 | UNSUPPORTED_MEDIA_TYPE |
Передать JSON или описанный multipart |
| 422 | VALIDATION_FAILED |
Исправить поля и условные требования выбранного режима |
| 422 | UNKNOWN_FIELD |
Убрать неизвестные или недопустимые поля |
| 422 | UNKNOWN_QUERY_PARAMETER |
Использовать только параметры конкретного GET |
| 422 | INVALID_CURSOR |
Не менять курсор, фильтры и размер страницы при продолжении |
| 422 | IDEMPOTENCY_KEY_REQUIRED |
Передать ключ каждого POST |
| 422 | INVALID_IDEMPOTENCY_KEY |
Исправить формат ключа |
| 422 | INVALID_VERSION |
Передать одно значение version без кавычек |
| 422 | UNEXPECTED_RESOURCE_VERSION |
Убрать версию у команды, которая её не принимает |
| 422 | UNSUPPORTED_CONDITIONAL_HEADER |
Убрать HTTP-предусловия из POST; применить предусмотренную версию |
| 422 | INVALID_MULTIPART |
Один файл и уникальные разрешённые текстовые части |
| 422 | FILE_TYPE_NOT_ALLOWED |
Проверить фактический формат и набор MIME конкретного владельца |
| 428 | VERSION_REQUIRED |
Передать заголовок, expected_versions или целую JSON-version по контракту команды |
| 429 | RATE_LIMITED |
Учитывать Retry-After; повтор POST сохраняет исходный ключ |
| 500 | INTERNAL_ERROR |
Сначала уточнить исход; 5xx не доказывает откат |
| 503 | SERVICE_UNAVAILABLE |
Повторить с задержкой, сохранив исходную идентичность команды |
| 503 | MULTIPART_INPUT_UNAVAILABLE |
Сообщить X-Request-Id администратору; сервер не смог прочитать исходное multipart-тело |
Конкретная операция может вернуть дополнительные коды ограничений ресурса. Их перечень по ресурсам дополняет таблицу HTTP-ответов у каждого метода. Ошибки транспорта могут возникнуть до обработки контроллером и действуют также там, где автоматически полученная таблица ответов не повторяет все общие отказы.
Ошибки ресурсов
| Пример | Значение |
|---|---|
RESOURCE_IN_USE |
Удаление справочника заблокировано зависимостями |
RESOURCE_ARCHIVED |
Архивная запись недоступна для нового выбора |
TRACKING_MODE_CHANGE_UNAVAILABLE |
Изменение режима серийного/маркированного/учёта установленного оснащения существующего товара не поддерживается |
MAINTENANCE_STATE_CONFLICT, MAINTENANCE_NOT_MUTABLE |
Команда не разрешена текущим состоянием ТО |
OPEN_MAINTENANCE_EXISTS |
Для оборудования уже есть подходящая открытая заявка; выберите её явно |
DAY_OFF_EXISTS |
На дату уже сохранено исключение с другой причиной |
CLIENT_WINDOW_MISMATCH |
Интервал выезда не помещается в клиентское окно |
ROUTE_SOURCE_CHANGED |
Исходное расписание расчёта изменилось; нужен новый расчёт |
EXTERNAL_EFFECT_RECONCILIATION_REQUIRED |
Отложенный протокол внешней лояльности UDS/Самоселл; соответствующая команда заблокирована с 409 |
Коды предупреждений в meta.warnings не являются ошибками HTTP. Например, ручное назначение может завершиться с предупреждением CREW_OVERLAP или CREW_UNAVAILABLE. Повтор принятой команды сохраняет исходные предупреждения. Автоматическое применение маршрута использует более строгие ограничения из его контракта.
Безопасное восстановление
При сетевом сбое, превышение времени ожидания и 5xx сохраняйте исходный запрос и повторяйте его с прежним Idempotency-Key. При известном operation_id сначала можно прочитать журнал. Если исправляете уже принятое действие или разрешили конфликт версии, используйте новый ключ для нового запроса. needs_reconciliation и EXTERNAL_EFFECT_RECONCILIATION_REQUIRED требуют сверки; автоматическое создание повторного изменения под новым ключом не допускается.
При опросе и повторе 429/503 учитывайте Retry-After, добавляйте задержку и ограничивайте параллелизм на подключение. Лимиты сервера могут настраиваться; повторный запрос также расходует HTTP-квоту. Правила повторов.