Ошибки и ограничения
Формат ошибки
Все ошибки — один и тот же вид: HTTP-код и текст.
{ "message": "Торговая точка не найдена" }
Текст рассчитан на человека и годится для лога или сообщения оператору. Логику не стройте на его содержимом — опирайтесь на HTTP-код.
Коды ответов
| Код | Значение | Что делать |
|---|---|---|
200 | Успех | — |
400 | Ошибка в запросе или бизнес-правиле | Читайте message, исправляйте запрос |
401 | Токен неверный или истёк | Получите новый токен и повторите |
404 | Объект не найден или не принадлежит вашему бренду | Проверьте идентификатор |
409 | Действие невозможно в текущем состоянии | Не повторяйте, состояние изменилось |
429 | Превышен лимит запросов | Подождите и повторите с задержкой |
500 | Ошибка на нашей стороне | Повторите позже, при повторении — в поддержку |
Типовые ошибки
Валидация
{ "message": "Поле Торговая точка обязательно для заполнения." }
{ "message": "Поле Торговая точка должно быть корректным UUID." }
{ "message": "Поле Тип заказа должно быть целым числом." }
Возвращается первая найденная ошибка, не список. Исправили — можете получить сообщение о следующей.
Точка и меню
| Сообщение | Код | Причина |
|---|---|---|
Торговая точка не найдена | 404 | point_id неверный или точка чужого бренда |
Меню не найдено | 404 | Витрина не существует или закреплена за другим ключом |
Для этого ключа не выбрано внешнее меню… | 409 | Заведение не выбрало витрину для ключа. Попросите сделать это в кабинете: Интеграции → API-ключи |
Товары
| Сообщение | Код | Причина |
|---|---|---|
Товар 12345 не найден в меню | 400 | Товара нет у бренда или он снят с продажи |
Товар в стоп-листе: Fanta 1 л | 400 | Позиция закончилась |
Недостаточно по стоп-листу: Fanta 1 л (доступно 3) | 400 | Просите больше, чем осталось |
Модификатор 3884 не найден в меню | 400 | Модификатор недоступен |
Все три проверяются и в POST /orders/calculate — вызывайте его перед заказом, и пользователь увидит проблему раньше.
Заказ
| Сообщение | Код | Причина |
|---|---|---|
Тип оплаты недоступен на этой торговой точке | 400 | payment_type_id не настроен на точке |
Не найден подтип заказа для выбранного типа | 400 | У заведения не настроен подтип, нужно обратиться к нему |
Заказ не найден | 404 | Заказ не существует или чужого бренда |
Заказ уже отменён | 409 | Повторная отмена |
Заказ уже принят на точке, отмена возможна только через кассу | 409 | Касса забрала заказ |
Дата предзаказа должна быть как минимум через 30 минут | 400 | scheduled_at слишком близко |
Ограничения
| Ограничение | Значение |
|---|---|
| Запросов в минуту на токен | 1200 |
Запросов в минуту на /auth/token | 60 |
| Время жизни токена | 30 дней |
| Размер тела запроса | 200 МБ |
comment заказа | 500 символов |
comment позиции | 255 символов |
external_id | 255 символов |
При превышении лимита — 429. Повторяйте с экспоненциальной задержкой: 1 с, 2 с, 4 с, 8 с.
Повторные попытки
Можно повторять безопасно: все GET-методы и POST /orders/calculate — они ничего не меняют.
POST /orders — повторяйте только с тем же external_id. Тогда повтор вернёт существующий заказ, а не создаст второй. Без external_id повтор создаст дубль.
Что повторять: 429, 500, таймауты, обрывы соединения. Что не повторять: 400, 404, 409 — они не изменятся сами; сначала исправьте запрос.
Изоляция данных
Ключ видит только данные своего бренда. Обращение к точке, меню или заказу другого заведения вернёт 404 — не 403, чтобы по коду ответа нельзя было выяснить, существует ли объект.
Поддержка
Не сходятся суммы, не приходят заказы, непонятная ошибка — обращайтесь в поддержку Mison. Приложите:
external_idиorder_idзаказа;point_id;- время запроса с часовым поясом;
- тело запроса и полученный ответ.