Sapa Moto

Ошибки

problem+json со стабильным кодом — полный справочник, собранный из спецификации OpenAPI.

Ошибки приходят как application/problem+json (RFC 9457) с полями, на которые стоит опираться в коде:

422 Unprocessable Entity
{
  "type": "urn:sapa:problem:order_not_editable",
  "title": "Unprocessable Entity",
  "status": 422,
  "detail": "Этот заказ уже нельзя изменить таким образом",
  "code": "order_not_editable",
  "message": "Этот заказ уже нельзя изменить таким образом",
  "details": [
    { "field": "dropoff", "code": "order_not_editable", "message": "Адрес уже нельзя изменить" }
  ],
  "order_status": "picked_up",
  "editable": ["comment", "recipient_phone"],
  "request_id": "0192f1c3-9e8d-7f6a-b5c4-d3e2f1a0b9c8"
}
ПолеЧто это
codeстабильный машинный код из справочника ниже — ветвитесь по нему
messageтекст для людей: по умолчанию на русском, на казахском — с Accept-Language: kk; может меняться
details[]ошибки по полям: field (путь вида recipient.phone), свой code и message
request_idid запроса — то же, что заголовок X-Request-Id; сообщайте его поддержке
дополнительные полянекоторые коды добавляют данные, например order_id и order_url у duplicate_external_id

Внутри v1 могут появляться новые коды — незнакомый код обрабатывайте по HTTP-статусу.

Проверка полей

400 validation_failed перечисляет все неверные поля:

400 Bad Request
{
  "status": 400,
  "code": "validation_failed",
  "message": "Проверьте поля запроса",
  "details": [
    { "field": "recipient.phone", "code": "invalid_phone", "message": "Телефон получателя: +7XXXXXXXXXX" },
    { "field": "external_id", "code": "not_blank", "message": "не должно быть пустым" }
  ],
  "request_id": "0192f1c3-9e8d-7f6a-b5c4-d3e2f1a0b9c8"
}

Изоляция

Заказы, расчёты и адреса вебхуков других организаций — и другой среды вашей организации — всегда 404 not_found, никогда не 403. Узнать, существует ли чужой id, нельзя.

Справочник ошибок

Собран из x-error-catalogue спецификации OpenAPI; тесты платформы следят, чтобы он совпадал с кодами, которые API возвращает на самом деле.

HTTPКодЧто значитПовторять
400validation_failedОдно или несколько полей неверны. Каждый элемент details[] называет поле field и свой code.
message: «Проверьте поля запроса»
нет
400malformed_requestТело — не корректный JSON, или у значения неверный тип.
message: «Тело запроса не удалось прочитать»
нет
400bad_requestУ параметра неверное значение (например, дату не удалось разобрать).
message: «Некорректный запрос»
нет
400invalid_cursorcursor взят не из предыдущего next_cursor или изменён.
message: «Некорректный курсор пагинации»
нет
400idempotency_key_invalidЗаголовок Idempotency-Key — 1–255 печатных символов ASCII без пробелов.
message: «Некорректный Idempotency-Key»
нет
400batch_too_largeВ пакете больше 100 заказов. Разделите его.
message: «Не больше 100 заказов за запрос»
нет
400webhook_url_not_allowedАдрес вебхука — только https и публичный хост.
message: «Адрес вебхука: только https и публичный хост»
нет
401unauthorizedНет заголовка Authorization: Bearer, ключ неизвестен или отозван. Отозванный ключ перестаёт работать на всех серверах не позже чем через 60 секунд. Токены пользователей платформы Partner API не принимает.
message: «Требуется вход»
нет
403forbiddenУ ключа нет нужной области доступа (orders.read, orders.write, points.read, finance.read, webhooks.manage).
message: «Недостаточно прав»
нет
403api_key_ip_not_allowedУ ключа есть allowlist IP, а запрос пришёл с другого адреса.
message: «Запрос с адреса вне allowlist ключа»
нет
403feature_disabledPartner API ещё не включён для вашей организации. Обратитесь к аккаунт-менеджеру.
message: «Функция недоступна»
нет
403organization_not_activeДля боевых заказов нужна активная организация с подписанным договором. Тестовые ключи продолжают работать.
message: «Организация не активна: новые заказы и аренда не принимаются»
нет
403live_keys_not_enabledБоевые ключи выпускаются после того, как бэк-офис включит боевой режим вашей организации.
message: «Боевые ключи включает аккаунт-менеджер после чек-листа готовности интеграции»
нет
403delivery_not_connectedДоставка не входит в договор вашей организации.
message: «Модуль «Доставка» не подключён организации»
нет
404not_foundТакого ресурса нет у вашей организации в среде ключа. Заказы других организаций — всегда 404, никогда 403.
message: «Не найдено»
нет
404quote_not_foundТакого quote_id нет у вашей организации в этой среде.
message: «Расчёт не найден»
нет
409duplicate_external_idЗаказ с таким external_id уже есть в этой среде. В ошибке — order_id и order_url существующего заказа: запросите его вместо создания нового.
message: «Заказ с таким внешним номером уже есть»
нет
409idempotency_conflictЭтот Idempotency-Key уже использован в течение 24 часов с другим телом. Для нового запроса — новый ключ.
message: «Idempotency-Key уже использован с другим запросом»
нет
409idempotency_in_progressПервый запрос с этим ключом ещё выполняется. Повторите через секунду.
message: «Запрос с этим Idempotency-Key ещё выполняется»
да
409slot_fullВ выбранном слоте не осталось мест. Выберите другой слот из GET /v1/slots.
message: «Слот заполнен»
нет
409order_transition_invalidВ текущем статусе заказа это действие невозможно (например, ready для вручённого заказа).
message: «Недопустимый переход статуса заказа»
нет
409api_key_limit_reachedНе больше двух активных ключей на среду (для ротации). Сначала отзовите один в кабинете.
message: «Уже есть два активных ключа этой среды: отзовите один»
нет
409webhook_endpoint_limit_reachedНе больше 10 адресов вебхуков на среду.
message: «Не больше 10 адресов вебхуков на среду»
нет
422out_of_zoneАдрес забора или доставки вне зон доставки.
message: «Адрес вне зоны доставки»
нет
422quote_expiredРасчёту больше 10 минут. Запросите новый; цена может отличаться.
message: «Срок действия расчёта истёк, запросите новый»
нет
422order_not_editableПосле picked_up можно менять только comment и recipient_phone. В details[].field — отклонённые поля; в ошибке — order_status и ещё доступные для изменения поля editable.
message: «Этот заказ уже нельзя изменить таким образом»
нет
422order_not_cancellableЗаказ завершён (вручён, возвращён, отменён) или уже не доставлен / возвращается. В ошибке — order_status.
message: «Заказ уже нельзя отменить»
нет
422pickup_point_unavailableДля боевых заказов нужен point_id активной точки забора вашей организации.
message: «Точка забора неактивна или недоступна»
нет
422address_ambiguousАдрес текстом не удалось точно найти на карте. Передайте latitude и longitude.
message: «Адрес не найден точно — укажите точку на карте»
нет
422cargo_too_largeГруз слишком тяжёлый или крупный для любого доступного транспорта.
message: «Груз не помещается ни в один транспорт»
нет
422cod_not_allowedНаложенный платёж не включён в вашем договоре.
message: «Оплата при получении не разрешена договором»
нет
422cod_limit_exceededСумма наложенного платежа выше лимита договора.
message: «Сумма к оплате выше лимита договора»
нет
422window_invalidДля заказа scheduled или slot нет scheduled_at, оно в прошлом или вне часов работы.
message: «Окно времени не подходит для типа заказа»
нет
429rate_limitedБольше 20 запросов в секунду с одного ключа (лимит можно повысить для вашей организации) или /track вызван чаще раза в 10 секунд для одного заказа. Подождите Retry-After секунд.
message: «Слишком много запросов, повторите позже»
да
500internal_errorНепредвиденная ошибка на нашей стороне. Повторите с тем же Idempotency-Key; сообщите поддержке request_id.
message: «Внутренняя ошибка, мы уже разбираемся»
да
503partner_live_orders_unavailableБоевые заказы временно недоступны. Песочница работает.
message: «Боевые заказы через API станут доступны с запуском модуля заказов (Д1); песочница работает»
да

Коды причин

reason_code отмен, недоставок и переназначений (в history[], order.status_changed, order.failed). Незнакомые коды, которые вы передаёте в POST /cancel, сохраняются как other.

КодВидЧто значит
client_changed_mindотменаКлиент передумал.
duplicateотменаДубль заказа.
out_of_stockотменаТовара нет в наличии.
no_courierотменаКурьер не найден (без платы).
dispatcher_decisionотменаОтменено диспетчером Sapa Moto.
otherотменаДругая причина. Незнакомые коды, которые вы передаёте, сохраняются как other с вашим кодом в комментарии.
batteryпереназначениеУ курьера села батарея; заказ возвращается в searching.
no_connectionпереназначениеПропала связь с курьером; заказ возвращается в searching.
better_optionпереназначениеНайден курьер ближе.
not_readyпереназначениеЗаказ не был готов на точке забора вовремя.
recipient_unreachableнедоставкаПолучатель не отвечает; заказ возвращается на точку забора.
wrong_addressнедоставкаНеверный адрес.
refusedнедоставкаПолучатель отказался от заказа.
no_adult_documentнедоставкаНет документа для заказа 18+.
no_paymentнедоставкаНаложенный платёж не оплачен.
damagedнедоставкаТовар повреждён.

Документация собирается из спецификации OpenAPI платформы. Скачать OpenAPI