Перейти к содержимому
СервисАпп API
На этой странице

Ошибки и действия клиента

Все 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-квоту. Правила повторов.