Ошибки и ограничения

Формат ошибки

Все ошибки — один и тот же вид: HTTP-код и текст.

{ "message": "Торговая точка не найдена" }

Текст рассчитан на человека и годится для лога или сообщения оператору. Логику не стройте на его содержимом — опирайтесь на HTTP-код.

Коды ответов

КодЗначениеЧто делать
200Успех—
400Ошибка в запросе или бизнес-правилеЧитайте message, исправляйте запрос
401Токен неверный или истёкПолучите новый токен и повторите
403У ключа нет доступа к разделуПопросите заведение включить доступ в кабинете — например, к отчётам
404Объект не найден или не принадлежит вашему брендуПроверьте идентификатор
409Действие невозможно в текущем состоянииНе повторяйте, состояние изменилось
429Превышен лимит запросовПодождите и повторите с задержкой
500Ошибка на нашей сторонеПовторите позже, при повторении — в поддержку

Типовые ошибки

Валидация

{ "message": "Поле Торговая точка обязательно для заполнения." }
{ "message": "Поле Торговая точка должно быть корректным UUID." }
{ "message": "Поле Тип заказа должно быть целым числом." }

Возвращается первая найденная ошибка, не список. Исправили — можете получить сообщение о следующей.

Точка и меню

СообщениеКодПричина
Торговая точка не найдена404point_id неверный или точка чужого бренда
Меню не найдено404Витрина не существует или закреплена за другим ключом
Для этого ключа не выбрано внешнее меню…409Заведение не выбрало витрину для ключа. Попросите сделать это в кабинете: Интеграции → API-ключи

Товары

СообщениеКодПричина
Товар 12345 не найден в меню400Товара нет у бренда или он снят с продажи
Товар в стоп-листе: Fanta 1 л400Позиция закончилась
Недостаточно по стоп-листу: Fanta 1 л (доступно 3)400Просите больше, чем осталось
Модификатор 3884 не найден в меню400Модификатор недоступен

Все три проверяются и в POST /orders/calculate — вызывайте его перед заказом, и пользователь увидит проблему раньше.

Отчёты

СообщениеКодПричина
У ключа нет доступа к отчётам…403На ключе не включена галочка «Доступ к отчётам»
Период не длиннее N дней…400Запросите период частями
group_by: поле X недоступно в отчёте Y400Поле из другого вида отчёта. Список — GET /reports/olap/columns
В отчёте больше 50000 строк…400Уберите группировку или сократите период
Отчёт не успел построиться за 60 секунд…400Сократите период, число точек или группировок

Заказ

СообщениеКодПричина
Тип оплаты недоступен на этой торговой точке400payment_type_id не настроен на точке
Не найден подтип заказа для выбранного типа400У заведения не настроен подтип, нужно обратиться к нему
Адрес вне зоны доставки этого заведения400Координаты не попали ни в одну зону — заведение туда не возит
Для доставки нужны координаты адреса: latitude и longitude400У заведения настроены зоны, без координат тариф не определить
Минимальная сумма заказа для этой зоны: N400Корзина дешевле порога, заданного для зоны
Заказ не найден404Заказ не существует или чужого бренда
Заказ уже отменён409Повторная отмена
Заказ уже принят на точке, отмена возможна только через кассу409Касса забрала заказ
Дата предзаказа должна быть как минимум через 30 минут400scheduled_at слишком близко

Ограничения

ОграничениеЗначение
Запросов в минуту на API-ключ1200
Запросов в минуту на /auth/token с одного IP60
Запросов в минуту на отчёты и выгрузки, на API-ключ60
Время жизни токена30 дней
Размер тела запроса200 МБ
comment заказа500 символов
comment позиции255 символов
external_id255 символов

Лимиты считаются на ключ: если один ваш сервер работает с ключами нескольких брендов, у каждого ключа свой счётчик.

При превышении лимита — 429 с заголовком Retry-After (секунды до сброса счётчика):

{ "message": "Превышен лимит запросов. Повторите через 23 с", "retry_after": 23 }

Ждите retry_after секунд, а не повторяйте сразу: повтор до сброса счётчика тоже получит 429. Если заголовка нет — экспоненциальная задержка 1 с, 2 с, 4 с, 8 с.

Повторные попытки

Можно повторять безопасно: все GET-методы, POST /orders/calculate и POST /reports/olap — они ничего не меняют.

POST /orders — повторяйте только с тем же external_id. Тогда повтор вернёт существующий заказ, а не создаст второй. Без external_id повтор создаст дубль.

Что повторять: 429, 500, таймауты, обрывы соединения. Что не повторять: 400, 404, 409 — они не изменятся сами; сначала исправьте запрос.

Изоляция данных

Ключ видит только данные своего бренда. Обращение к точке, меню или заказу другого заведения вернёт 404 — не 403, чтобы по коду ответа нельзя было выяснить, существует ли объект.

Поддержка

Не сходятся суммы, не приходят заказы, непонятная ошибка — обращайтесь в поддержку Mison. Приложите:

  • external_id и order_id заказа;
  • point_id;
  • время запроса с часовым поясом;
  • тело запроса и полученный ответ.