# Amid Backend Документация PROD, коммит 8541d2c2730bee129f6fe6ea94c29878721733e8. ## Страницы - [index.md](https://docs.amid24.tj/prod/index.md) - [integration.md](https://docs.amid24.tj/prod/integration.md) - [catalog-orders.md](https://docs.amid24.tj/prod/catalog-orders.md) - [picker.md](https://docs.amid24.tj/prod/picker.md) - [payments-loyalty.md](https://docs.amid24.tj/prod/payments-loyalty.md) - [realtime.md](https://docs.amid24.tj/prod/realtime.md) - [reference.md](https://docs.amid24.tj/prod/reference.md) - [OpenAPI](https://docs.amid24.tj/prod/openapi.json) # Amid Backend: документация интеграции Справочник для разработчиков покупательского приложения и приложения сборщика. Документация относится к версии backend, указанной в опубликованной сборке. При работе с TEST и PROD выбирайте документацию соответствующего окружения: наличие функции в TEST не означает её доступность в PROD. - [Подключение, авторизация и ошибки](integration.md). - [Каталог, оформление и отмена заказа](catalog-orders.md). - [Сценарии сборщика](picker.md). - [Оплата и лояльность](payments-loyalty.md). - [WebSocket и push](realtime.md). - [Автоматический справочник HTTP API](reference.md). - [Машиночитаемая схема OpenAPI](openapi.json). Типы, параметры и объявленные ответы HTTP генерируются из кода. Сценарии объясняют последовательность действий и поведение при сбоях. OpenAPI может не описывать все ответы middleware, внешних сервисов и инфраструктуры; учитывайте [общие правила обработки ошибок](integration.md). ## Покрытие схем [Отчёт о покрытии](coverage.json) фиксирует ограничения схем этой сборки. У четырёх операций успешный ответ пока не имеет объявленной схемы: `POST /api/catalog/products/add-favorite/{product_id}`, `GET /api/catalog/version`, `GET /api/catalog/bootstrap/{version}` и `GET /api/logistics/stores/pickup/{store_id}`. Это не означает отсутствие тела: добавление избранного возвращает объект со `status`, версия каталога — данные публикации, bootstrap — [снимок витрины](catalog-orders.md), магазин самовывоза — сведения о выбранном магазине. Не генерируйте для этих ответов тип «пустое тело». В описаниях некоторых ошибок picker также отсутствует полная схема тела; учитывайте [общие правила ошибок](integration.md). ## Для ИИ и инструментов Используйте [llms.txt](llms.txt) как оглавление, [llms-full.txt](llms-full.txt) для текстового содержания и OpenAPI для типов HTTP. Страницы также доступны в Markdown. Перед генерацией клиента проверяйте версию и окружение документации. Не заменяйте неизвестные поля или бизнес-правила предположениями: сверяйте автоматический справочник и соответствующий сценарий. Открытая документация описывает основной API `/api/`. Она не предоставляет доступ к данным пользователей и не заменяет авторизацию. Интеграции платёжного провайдера и внешних партнёров не входят в этот справочник. # Подключение, авторизация и ошибки Адрес API выбирает конфигурация приложения для нужного окружения. Все пути ниже начинаются с `/api/`; используйте HTTPS. Поля запросов и объявленные ответы находятся в [справочнике](reference.md) и [OpenAPI](openapi.json). ## Авторизация Покупатель запрашивает OTP через `/api/auth/otp/send` и подтверждает его через `/api/auth/otp/confirm`. Подтверждение возвращает JWT. Проверка `/api/auth/otp/verify` сама по себе JWT не выдаёт. Требования к регистрации нового пользователя указаны в схеме подтверждения. Авторизованные запросы передают `Authorization: Bearer `. Для обновления токена предусмотрен `/api/token/refresh`. После `401` допускается одна попытка обновления и один повтор исходного запроса. Не запускайте бесконечный цикл refresh. Восстановление PIN использует отдельный `X-Recovery-Key`. Отсутствие JWT допустимо только для операций с анонимным доступом. Необязательная авторизация не означает разрешение анонимно изменять заказы или профиль. Сборщик использует [отдельный вход и токены](picker.md); его JWT не заменяет покупательский токен. ## Магазин и язык Передавайте `X-Store-Id` с идентификатором выбранного магазина в запросах каталога, расчёта и оформления заказа. Без заголовка backend может выбрать основной магазин; клиенту следует задавать контекст явно. При смене магазина пересчитайте корзину. Магазин активной сборки определяется серверной сессией сборщика. Для русского содержания используйте `Accept-Language: ru`. Кэш каталога разделяйте по магазину и языку. Токены, платёжные ссылки, адреса, телефоны и полные тела пользовательских запросов не должны попадать в публичные примеры и журналы. ## Ошибки и повтор запросов `detail` может быть строкой или списком ошибок валидации с `loc`, `msg`, `type`. Если есть `code`, выбирайте поведение по нему, а пользователю показывайте локализованное сообщение. Неизвестный код должен обрабатываться без сбоя клиента. Picker дополнительно может вернуть актуальный `session` и задержку повтора. - `400` и `422`: исправьте запрос; автоматический повтор того же тела не поможет. - `401` и `403`: восстановите вход либо покажите отсутствие доступа. - `404`: объект недоступен; не пытайтесь определить владельца по ответу. - `409`: перечитайте состояние и разрешите конфликт; это не подтверждение успеха. - `429`, `502`, `503` и сетевые ошибки: применяйте ограниченные повторы с растущей задержкой и учитывайте `Retry-After`, если он присутствует. Для создания заказа и изменяющих picker-команд сохраните `Idempotency-Key` до отправки. Повтор неизвестного результата использует тот же ключ и то же тело. Новый ключ создаётся для нового действия. `IDEMPOTENCY_CONFLICT` требует остановить автоматические повторы. Для остальных изменяющих операций не предполагайте наличие идемпотентности: сначала проверьте контракт и актуальное состояние. Признак обязательности в OpenAPI отражает декларацию параметра. Picker проверяет наличие корректного ключа внутри обработчика, хотя схема заголовка может показывать его как необязательный. Для checkout обязательность ключа зависит от настройки сервера; клиенту следует всегда передавать его и сохранять при повторах. # Каталог, оформление и отмена заказа Форматы товаров, заказов и параметров находятся в [справочнике](reference.md). ## Загрузка каталога 1. Получите `/api/catalog/version` для выбранного магазина и языка. 2. Если версия неизвестна клиенту, загрузите `/api/catalog/bootstrap/{version}`. 3. Проверьте магазин, язык и версию ответа, затем атомарно сохраните весь снимок. 4. При повторном чтении передайте полученный `ETag` в `If-None-Match` без изменения. Ответ `304` не содержит тела: используйте сохранённый снимок. При `404` версии один раз перечитайте `/version`. При `503` с `CATALOG_NOT_PUBLISHED`, сетевой ошибке или повреждённом ответе сохраняйте последнюю корректную версию. Не заменяйте её частичным результатом. Персональные признаки избранного запрашиваются отдельно от публичного снимка. Успешный `/version` содержит `version`, `etag` и `published_at`. Bootstrap включает `version`, `published_at`, `store_id`, `language`, массивы `menu_categories`, `main_page_categories`, `banners`, `products`, объект `sections` с подборками `top`, `new`, `fresh`, `discounted`, а также `titles` (может быть `null`). Это оболочка публикации витрины; вложенные карточки используют схемы соответствующих категорий, товаров и баннеров. До появления полной схемы bootstrap не считайте пустую схему OpenAPI описанием фактического тела. ## Оформление Выберите магазин, проверьте доступность товаров и способ получения. Для доставки перед оформлением получите оценку стоимости через `POST /api/orders/delivery/price-estimate`. Перед оплатой учитывайте [доступность платёжного метода](payments-loyalty.md). Создайте заказ через `POST /api/orders/`, передав `X-Store-Id` и заранее сохранённый `Idempotency-Key`. Успешный ответ `201` содержит идентификатор заказа. При timeout сохраните исходное тело и ключ: повтор с новым ключом может создать другой заказ. Серверный расчёт является источником итоговой суммы; локальный кэш цены не является подтверждением стоимости заказа. Полное состояние читается через `/api/orders/{order_id}` и `/api/orders/roadmap/{order_id}/detail`. После уведомления перечитывайте HTTP detail. Изменения состава после сборки смотрите в `picking_result`. ## Отмена и доставка UkoJon Доступность отмены определяет серверное `can_cancel`. Запрос покупателя: `POST /api/orders/{order_id}/cancel`. При `409` обновите заказ и покажите серверное сообщение. Если доставка UkoJon уже существует, успешный запрос может лишь поставить отмену в обработку: не подменяйте полученный статус локальным `cancelled`. Различайте состояние покупки `status.value` и доставки `delivery.tracking.state`. Отмена заявки курьера сама по себе не означает отмену покупки или возврат оплаты. Допустимо сочетание покупки `en_route` и доставки `cancelled`. При `cancelled`, `returning` или `returned` удалите живой маркер курьера и его маршрут, покажите серверные `display` и `comment`. Не восстанавливайте старые координаты из кэша. Не обещайте возврат оплаты или поиск нового курьера: для этого требуется новое подтверждённое состояние сервера. Уведомление служит поводом перечитать detail, а не готовым снимком заказа. # Сценарии сборщика Методы и структуры находятся в [справочнике](reference.md), группа `picker`. Вход выполняется через `/api/picker/auth/login`, обновление токенов — через `/api/picker/auth/refresh`. Покупательский JWT не предоставляет права сборщика. ## Рабочая сессия 1. После входа прочитайте `/api/picker/auth/me` и `/api/picker/session/active`. Ответ `204` означает отсутствие активной сессии. 2. Получите очередь `/api/picker/orders` и начните выбранный заказ командой `/api/picker/orders/{order_id}/start`. 3. Выполняйте сканирование, подтверждение количества или веса, замену и уточнения через соответствующие команды API. Каждый ответ применяйте как серверный снимок. 4. Завершайте сборку явной командой `/finish` после готовности всех позиций. Состояние `ready_to_finish` ещё не означает `completed`. Активная сессия задаёт магазин товаров и остатков. Не переносите позиции между магазинами на основании локальных настроек. История сборки доступна через `/api/picker/history/`; детали завершённой сессии отражают состав на момент завершения. ## Идемпотентность и конфликты Изменяющие команды требуют `Idempotency-Key` с UUID. Один ключ обозначает одно действие с неизменным телом и сохраняется при timeout, повторе и перезапуске клиента. Ответ операции может включать `session`; используйте её для восстановления экрана. Несовпадение штрихкода может прийти как HTTP `200` со статусом `mismatch`: проверяйте бизнес-результат, а не только HTTP-код. При конфликте занятого заказа обновите очередь и активную сессию. При ошибке готовности завершения покажите незакрытые позиции. Сетевой timeout, `404` или `410` не подтверждает завершение либо отмену действия. ## Отмена `POST /api/picker/orders/{order_id}/cancel` — отдельная команда сборщика с причиной по схеме запроса. Сохраняйте ключ до получения определённого результата и после восстановления связи перечитывайте сессию. Не смешивайте её с покупательской отменой. Если сервер сообщил `order_cancelled`, примените актуальную сессию, обновите очередь и активную сборку. Подтверждение прочтения отмены отправляется через `/api/picker/orders/{order_id}/cancelled/ack`; оно возвращает `204` и не является новой отменой заказа. # Оплата и лояльность Все формы запросов и объявленные ответы приведены в [справочнике](reference.md). ## Онлайн-оплата Перед предложением онлайн-оплаты прочитайте `/api/payments/eskhata/preferences`. Если `enabled=false`, способ недоступен. После создания заказа с онлайн-оплатой запросите `/api/payments/eskhata/{order_id}/invoice` и откройте полученную ссылку. Этот GET может создать платёжный счёт; он не является обычным чтением для фонового обхода или предварительной загрузки ссылок. После возврата из платёжного интерфейса перечитайте заказ. Сам факт открытия ссылки или возвращения пользователя не доказывает оплату. При истёкшем или уже оплаченном счёте показывайте серверное сообщение. Не сохраняйте платёжные ссылки в аналитике. ## Кошелёк и карты Текущий базовый путь — `/api/loaylty` именно с таким написанием. Кошелёк читается через `/wallet/`; `pending` означает незавершённую синхронизацию, `ready` — готовность, `error` — ошибку последней синхронизации. Блокировку проверяйте по полям управления кошельком и картами, а не по тексту ошибки. Для физической карты используйте `/wallet/link-physical/preview/`, затем после подтверждения пользователя `/wallet/link-physical/`. Для существующей карты предусмотрена отдельная пара `/wallet/link/preview/` и `/wallet/link/`. Успешный preview со статусом `NOT_ISSUED` означает возможность выдачи физической карты. При конфликте принадлежности `409` не показывайте подтверждение привязки и не повторяйте запрос автоматически. ## Предварительный расчёт бонусов `POST /api/loaylty/discounts/preview/` оценивает начисление для текущей корзины, магазина и карты. Повторяйте расчёт после изменения этих данных. Не вычисляйте начисление самостоятельно по проценту уровня; preview не начисляет реальные баллы. Если preview временно недоступен, покажите недоступность бонусного расчёта. Предварительный расчёт не должен сам по себе блокировать оформление без него. Окончательные данные кошелька и заказа перечитывайте с сервера. # WebSocket и push ## Состояние заказа Покупатель подключается к `/ws/orders/tracking/` по WSS. JWT можно передать заголовком `Authorization: Bearer `. Для клиентов без поддержки заголовков доступен параметр `access_token`; не записывайте такой URL в журналы. Неавторизованное или неактивное соединение закрывается с кодом `1008`. `order.changed` сообщает об изменении заказа и содержит `event_id`, `order_id` и `order_version`. Дубликаты события и старые версии игнорируются. После подключения, переподключения или пропуска версии перечитайте `/api/orders/roadmap/{order_id}/detail`. Событие не заменяет этот HTTP-снимок. `delivery.tracking.changed` сообщает об изменении доставки. Соответствующие ему push и WebSocket могут иметь одинаковые `notification_id` и `event_id`: объединяйте повторные запросы detail и не показывайте два оповещения об одном событии. Правила отображения отменённой доставки описаны в [сценарии заказа](catalog-orders.md). Для сборщика параметры событий и область очереди получаются через `/api/picker/realtime/metadata`; основное состояние восстанавливается HTTP-методами сессии и очереди. Разрыв соединения не подтверждает результат команды. ## Регистрация push После разрешения уведомлений зарегистрируйте текущую установку через `PUT /api/accounts/me/push-devices`. Поля см. в [справочнике](reference.md). `device_id` — локально сохранённый случайный UUID установки, а не аппаратный идентификатор устройства. При смене FCM-токена повторите PUT для той же установки. Передавайте окружение, соответствующее API; несовпадение возвращает `409`. При выходе или отключении push удаляйте только текущую установку через `DELETE /api/accounts/me/push-devices/{device_id}` до удаления токена авторизации. Данные push служат для выбора экрана и повторного чтения HTTP. Дедуплицируйте уведомления по `notification_id`, если он есть. После открытия уведомления сначала проверьте вход и получите доступный текущему пользователю заказ. Изображение в рекламном уведомлении необязательно. Если загрузка не удалась, покажите текстовое уведомление. Успешная регистрация устройства и приём сообщения FCM не доказывают видимое получение: отдельно проверяйте получение и переход по нажатию при открытом, фоновом и завершённом приложении на целевых устройствах. # Справочник API [Скачать OpenAPI](openapi.json). Поля и объявленные ответы сформированы из кода. Общие ошибки и условия заголовков — в [правилах интеграции](integration.md). Отсутствие схемы ответа не означает отсутствие тела. ## DELETE `/api/accounts/me/` **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 204 | схема тела не объявлена | | ## GET `/api/accounts/me/` **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | ProfileSchema | | ## PATCH `/api/accounts/me/` **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **ProfileInputPatch**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | ProfileSchema | | ## GET `/api/accounts/me/preferences` **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | UserPreferences | | ## PATCH `/api/accounts/me/preferences` **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **UserPreferencesInputPatch**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | UserPreferences | | ## DELETE `/api/accounts/me/preferences/fcm` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `token` | запрос | string | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 204 | схема тела не объявлена | | ## PUT `/api/accounts/me/push-devices` Register or refresh the FCM token for one app installation. **Авторизация:** JWT: ApplicationJWTAuth. ### Тело запроса `application/json`: **PushDeviceInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PushDeviceSchema | | ## DELETE `/api/accounts/me/push-devices/{device_id}` **Авторизация:** JWT: ApplicationJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `device_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 204 | схема тела не объявлена | | ## POST `/api/auth/otp/confirm` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **ConfirmOTPInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | ConfirmOTPOutput | | ## POST `/api/auth/otp/send` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **SendOTPInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | SuccessResponse | | ## POST `/api/auth/otp/update-pin/send` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **SendOTPInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | SuccessResponse | | ## POST `/api/auth/otp/update-pin/verify` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **VerifyOTPInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | RecoveryTokenSchema | | ## POST `/api/auth/otp/verify` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **VerifyOTPInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | VerifyOTPOutput | | ## PATCH `/api/auth/recovery/update-pin` **Авторизация:** JWT: RecoveryTokenApiKey. ### Тело запроса `application/json`: **PasswordUpdateInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | TokenObtainPairOutputSchema | | ## GET `/api/catalog/bootstrap/{version}` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `version` | путь | string (uuid) | да | | | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | схема тела не объявлена | | ## GET `/api/catalog/features/units/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<MeasurementUnitSchema> | | ## GET `/api/catalog/groups/categories/main-page` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<MainPageCategoryBlockSchema> | | ## GET `/api/catalog/groups/categories/menu` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<CategoryMenuSchema> | | ## GET `/api/catalog/groups/categories/own-production` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<OwnCategorySchema> | | ## GET `/api/catalog/groups/categories/root` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<CategorySchema> | | ## GET `/api/catalog/groups/categories/{category_id}` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `category_id` | путь | string | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | CategorySchema | | ## GET `/api/catalog/groups/categories/{category_id}/children` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `category_id` | путь | string | да | | | `level` | запрос | integer / null | нет | | | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<CategorySchema> | | ## GET `/api/catalog/groups/categories/{category_id}/parents` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `category_id` | путь | string | да | | | `level` | запрос | integer / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<CategorySchema> | | ## GET `/api/catalog/products/` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `search` | запрос | string / null | нет | | | `category_id` | запрос | string (uuid) / null | нет | | | `is_favorite` | запрос | boolean / null | нет | | | `is_top` | запрос | boolean / null | нет | | | `is_new` | запрос | boolean / null | нет | | | `is_fresh` | запрос | boolean / null | нет | | | `sort_by` | запрос | "cheap" / "expensive" / "more_discount" / null | нет | | | `only_discount` | запрос | boolean / null | нет | | | `page` | запрос | integer | нет | | | `page_size` | запрос | integer / null | нет | | | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PagedProductListingSchema | | ## POST `/api/catalog/products/add-favorite/{product_id}` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `product_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | схема тела не объявлена | | ## POST `/api/catalog/products/check-availability` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **массив<AvailabilityItemInput>**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<AvailabilityOutput> | | ## POST `/api/catalog/products/favorites/check` **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **FavoriteProductsCheckInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | FavoriteProductsCheckOutput | | ## GET `/api/catalog/products/recommendations` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `product_ids` | запрос | массив<string (uuid)> | да | | | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<ProductListingSchema> | | ## DELETE `/api/catalog/products/remove-favorite/{product_id}` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `product_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 204 | схема тела не объявлена | | ## GET `/api/catalog/products/{product_id}` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `product_id` | путь | string | да | | | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | ProductDetailSchema | | ## GET `/api/catalog/version` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | схема тела не объявлена | | ## GET `/api/core/banners/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | BannerSchema | | ## POST `/api/core/mobile-version/check/` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **MobileVersionInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | MobileVersionCheckResponse | | ## GET `/api/core/pages/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<PageResponse> | | ## GET `/api/core/pages/main-page/products-titles` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | MainPageProductsTitlesSchema | | ## GET `/api/core/stories/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<StorySchema> | | ## GET `/api/core/support-contact/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | SupportContactSchema | | ## POST `/api/loaylty/discounts/preview/` Preview loyalty bonus accruals for cart items. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **DiscountPreviewInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | DiscountPreviewSchema | | ## GET `/api/loaylty/programs/` Legacy-compatible programs endpoint with silent fallback to `[]`. **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<LoyaltyProgramSchema> | | ## GET `/api/loaylty/programs/strict/` Return programs or surface Set Loyalty integration failures as 502. **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<LoyaltyProgramSchema> | | ## GET `/api/loaylty/wallet/` **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletSchema | | ## POST `/api/loaylty/wallet/accounts/switch/` Switch active bonus account. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **AccountSwitchInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## GET `/api/loaylty/wallet/block-reasons/` Return available card block reasons. **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<BlockReasonSchema> | | ## POST `/api/loaylty/wallet/block/` Block a loyalty card. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardBlockInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## POST `/api/loaylty/wallet/create/` Create wallet and trigger Set Loyalty provisioning. **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## POST `/api/loaylty/wallet/link-physical/` Link a physical Set Loyalty card to user's wallet via transfer API. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardLinkInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## POST `/api/loaylty/wallet/link-physical/preview/` Preview a physical Set Loyalty card before transfer. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardLinkInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletLinkPreviewSchema | | ## POST `/api/loaylty/wallet/link/` Link existing Set Loyalty card to user's wallet. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardLinkInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## POST `/api/loaylty/wallet/link/preview/` Preview card info before linking. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardLinkInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletLinkPreviewSchema | | ## GET `/api/loaylty/wallet/purchases/` Purchase history from Set Loyalty — single source of truth. Returns an empty list when the wallet is not linked to Set Loyalty or the CDP is unreachable. **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `page` | запрос | integer | нет | | | `page_size` | запрос | integer / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PagedPurchaseSchema | | ## GET `/api/loaylty/wallet/purchases/{purchase_id}/` Get detailed purchase from Set Loyalty (positions, discounts). Returns 404 when the wallet is not linked to Set Loyalty or the purchase is not found in the CDP. **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `purchase_id` | путь | string | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PurchaseDetailSchema | | ## POST `/api/loaylty/wallet/replace/` Replace current card with a new one. **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## GET `/api/loaylty/wallet/transactions/` Bonus transactions — from Set Loyalty if available, local fallback. **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `page` | запрос | integer | нет | | | `page_size` | запрос | integer / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PagedTransactionSchema | | ## POST `/api/loaylty/wallet/unblock/` Unblock a loyalty card. **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **CardUnblockInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | WalletWrapperSchema | | ## GET `/api/logistics/map/address-suggestions` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `lon` | запрос | number | да | | | `lat` | запрос | number | да | | | `query` | запрос | string | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<AddressSuggestionOutput> | | ## GET `/api/logistics/map/config` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | MapConfigOutput | | ## POST `/api/logistics/map/reverse-geocode` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **LocationInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | ReverseGeocodeOutput | | ## POST `/api/logistics/stores/delivery/can-use-location` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **LocationInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | string (uuid) / null | | ## POST `/api/logistics/stores/delivery/check-location` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **LocationInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | StoreLocationOutput | | ## POST `/api/logistics/stores/delivery/check-multiply-locations` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **массив<CheckLocationItemInput>**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | object | | ## GET `/api/logistics/stores/delivery/order-preferences` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | DeliveryPreferenceOutput | | ## GET `/api/logistics/stores/delivery/slots` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<DeliverySlotOutput> | | ## GET `/api/logistics/stores/delivery/zones` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<DeliveryZoneOutput> | | ## GET `/api/logistics/stores/pickup/` **Авторизация:** Без обязательного JWT. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<PickupStoreOutput> | | ## GET `/api/logistics/stores/pickup/order-preferences` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickupPreferenceOutput | | ## GET `/api/logistics/stores/pickup/slots` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<PickupSlotOutput> | | ## GET `/api/logistics/stores/pickup/{store_id}` **Авторизация:** Без обязательного JWT. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `store_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | схема тела не объявлена | | ## GET `/api/orders/` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `active` | запрос | boolean / null | нет | | | `page` | запрос | integer | нет | | | `page_size` | запрос | integer / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PagedOrdersListingSchema | | ## POST `/api/orders/` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **OrderInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 201 | string | | | 409 | OrderCommandError | | | 422 | OrderCommandError | | ## POST `/api/orders/delivery/price-estimate` **Авторизация:** JWT: CustomerJWTAuth. ### Тело запроса `application/json`: **DeliveryPriceEstimateInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | DeliveryPriceEstimateSchema | | | 422 | OrderCommandError | | | 502 | OrderCommandError | | | 503 | OrderCommandError | | ## GET `/api/orders/roadmap/{order_id}/detail` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | DetailOrderRoadmapSchema | | ## GET `/api/orders/roadmap/{order_id}/short` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | OrderRoadmapSchema | | ## GET `/api/orders/{order_id}` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | OrderDetailSchema | | ## POST `/api/orders/{order_id}/cancel` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | OrderDetailSchema | | ## GET `/api/payments/eskhata/preferences` **Авторизация:** JWT: CustomerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | object | | ## GET `/api/payments/eskhata/{order_id}/invoice` **Авторизация:** JWT: CustomerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | EskhataInvoiceResponse | | ## POST `/api/picker/auth/login` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **PickerLoginInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerLoginOutput | | ## GET `/api/picker/auth/me` **Авторизация:** JWT: PickerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerUserSchema | | ## POST `/api/picker/auth/refresh` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **PickerRefreshInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerRefreshOutput | | ## GET `/api/picker/catalog/products` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `query` | запрос | string / null | нет | | | `barcode` | запрос | string / null | нет | | | `limit` | запрос | integer | нет | | | `offset` | запрос | integer | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerCatalogOutput | | ## GET `/api/picker/catalog/products/v2` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `query` | запрос | string / null | нет | | | `barcode` | запрос | string / null | нет | | | `limit` | запрос | integer | нет | | | `cursor` | запрос | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerCatalogCursorOutput | | ## GET `/api/picker/history/sessions` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `started_at` | запрос | string (date-time) / null | нет | | | `ended_at` | запрос | string (date-time) / null | нет | | | `limit` | запрос | integer | нет | | | `offset` | запрос | integer | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerHistorySessionsOutput | | ## GET `/api/picker/history/sessions/{session_id}` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `session_id` | путь | integer | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerHistorySessionDetailSchema | | ## GET `/api/picker/history/summary` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `started_at` | запрос | string (date-time) / null | нет | | | `ended_at` | запрос | string (date-time) / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerHistorySummarySchema | | ## GET `/api/picker/orders` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `X-Store-Id` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | массив<PickerOrderSchema> | | ## POST `/api/picker/orders/{order_id}/additional-items` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **AdditionalItemInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/cancel` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **CancelPickingInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/cancelled/ack` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 204 | схема тела не объявлена | | ## POST `/api/picker/orders/{order_id}/finish` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/clarification/confirm` Подтверждает уже сохранённое расхождение до `finish`. Количество или вес должны точно совпадать с `confirmed_quantity` в актуальной session. Эта операция не изменяет фактическое значение, а переводит позицию из `clarified` в `picked`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **ConfirmClarificationInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/clarification/reopen` Возвращает позицию в сборку до `finish`. Допустимо для `missing`, `clarified/removed`, `clarified/quantity_mismatch`, `clarified/weight_mismatch`, `clarified/store_transfer_shortage` и `picked`. Для уже собранной позиции передайте `reason="recheck"`; для найденной ранее отсутствующей — `reason="found_in_store"`. Сервер очищает фактическое количество и возвращает позицию в `pending`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **ReopenItemInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/clarification/resolve` Окончательно удаляет отсутствующую позицию из заказа до `finish`. Сначала выполните `missing` с `action="remove"`, затем вызовите эту операцию с `resolution="remove"`. Результат — `clarified/removed`; при необходимости позицию можно вернуть через `clarification/reopen`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **ResolveClarificationInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/manual-pick` Сохраняет фактическое количество штучной позиции после ручного ввода. Если количество отличается от заказанного, передайте `confirm: true` для подтверждения расхождения. Действие доступно до `finish`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **ManualPickInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/missing` Помечает позицию как отсутствующую до `finish`. `call` и `remove` только фиксируют `missing_action` и переводят позицию в `missing`. Для фактического удаления из заказа затем вызовите `clarification/resolve` с `resolution="remove"`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **MissingInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/piece-quantity` Изменяет фактическое количество штучной позиции до `finish`. Разрешено повторно вызывать для `pending`, `awaiting_quantity`, `picked` и `clarified/quantity_mismatch`. Количество — целое от 1 до заказанного. Неполное количество сохраняется как `clarified/quantity_mismatch`; оно не удаляет товар. Каждое новое действие требует новый `Idempotency-Key`. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **PieceQuantityInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | | 409 | схема тела не объявлена | Сессия закрыта или состояние позиции не позволяет изменение. | | 422 | схема тела не объявлена | Количество нецелое, нулевое или больше заказанного. | ## POST `/api/picker/orders/{order_id}/items/{item_id}/replacement` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **BarcodeInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/scan` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **BarcodeInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | ## POST `/api/picker/orders/{order_id}/items/{item_id}/weight` Сохраняет или исправляет фактический вес до `finish`. Повторный вызов для уже собранной позиции корректирует вес. Вес в допуске переводит позицию в `picked`; вне допуска сохраняется как `clarified/weight_mismatch` и требует отдельного подтверждения. **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `item_id` | путь | integer | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Тело запроса `application/json`: **WeightInput**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingActionOutput | | | 409 | схема тела не объявлена | Сессия закрыта или позиция не весовая. | | 422 | схема тела не объявлена | Вес нулевой, отрицательный или имеет более трёх знаков. | ## GET `/api/picker/orders/{order_id}/session` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingSessionSchema | | ## POST `/api/picker/orders/{order_id}/start` **Авторизация:** JWT: PickerJWTAuth. ### Параметры | Имя | Где | Тип | Обязателен в схеме | Описание | |---|---|---|---|---| | `order_id` | путь | string (uuid) | да | | | `Idempotency-Key` | заголовок | string / null | нет | | ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingSessionSchema | | ## GET `/api/picker/realtime/metadata` **Авторизация:** JWT: PickerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickerRealtimeMetadataSchema | | ## GET `/api/picker/session/active` **Авторизация:** JWT: PickerJWTAuth. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | PickingSessionSchema | | | 204 | схема тела не объявлена | | ## POST `/api/token/pair` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **TokenObtainPairInputSchema**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | TokenObtainPairOutputSchema | | ## POST `/api/token/refresh` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **TokenRefreshInputSchema**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | TokenRefreshOutputSchema | | ## POST `/api/token/verify` **Авторизация:** Без обязательного JWT. ### Тело запроса `application/json`: **TokenVerifyInputSchema**. Обязательно: да. ### Объявленные ответы | Код | Тип тела | Описание | |---|---|---| | 200 | Schema | | ## Модели данных ### AccountSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `title` | string | нет | | | `description` | string | нет | | | `balance` | string | нет | | | `is_active` | boolean | нет | | ```json { "properties": { "balance": { "default": "0", "title": "Balance", "type": "string" }, "description": { "default": "", "title": "Description", "type": "string" }, "id": { "title": "Id", "type": "string" }, "is_active": { "default": true, "title": "Is Active", "type": "boolean" }, "title": { "default": "", "title": "Title", "type": "string" } }, "required": [ "id" ], "title": "AccountSchema", "type": "object" } ``` ### AccountSwitchInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `account_id` | string | да | | ```json { "properties": { "account_id": { "title": "Account Id", "type": "string" } }, "required": [ "account_id" ], "title": "AccountSwitchInput", "type": "object" } ``` ### AdditionalItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `inventory_id` | string (uuid) | да | | | `quantity` | number / string | да | | ```json { "properties": { "inventory_id": { "format": "uuid", "title": "Inventory Id", "type": "string" }, "quantity": { "anyOf": [ { "exclusiveMinimum": 0.0, "type": "number" }, { "type": "string" } ], "title": "Quantity" } }, "required": [ "inventory_id", "quantity" ], "title": "AdditionalItemInput", "type": "object" } ``` ### AddressSuggestionOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `title` | string | да | | | `place_name` | string / null | нет | | | `category` | string | да | | | `location` | LocationOutput | да | | ```json { "properties": { "category": { "title": "Category", "type": "string" }, "location": { "$ref": "#/components/schemas/LocationOutput" }, "place_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Place Name" }, "title": { "title": "Title", "type": "string" } }, "required": [ "title", "category", "location" ], "title": "AddressSuggestionOutput", "type": "object" } ``` ### AvailabilityItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) | да | | | `unit_id` | string (uuid) | да | | | `quantity` | number / string | да | | ```json { "properties": { "product_id": { "format": "uuid", "title": "Product Id", "type": "string" }, "quantity": { "anyOf": [ { "minimum": 0.001, "type": "number" }, { "type": "string" } ], "title": "Quantity" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" } }, "required": [ "product_id", "unit_id", "quantity" ], "title": "AvailabilityItemInput", "type": "object" } ``` ### AvailabilityOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) | да | | | `unit_id` | string (uuid) | да | | | `is_available` | boolean | да | | | `max_quantity` | number / string | да | | | `is_user_order_quantity_limit_enabled` | boolean | нет | | | `user_order_quantity_limit` | number / string | нет | | | `requested_quantity` | number / string | нет | | | `reason_code` | string / null | нет | | ```json { "properties": { "is_available": { "title": "Is Available", "type": "boolean" }, "is_user_order_quantity_limit_enabled": { "default": false, "title": "Is User Order Quantity Limit Enabled", "type": "boolean" }, "max_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Max Quantity" }, "product_id": { "format": "uuid", "title": "Product Id", "type": "string" }, "reason_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reason Code" }, "requested_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "default": "0.000", "title": "Requested Quantity" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" }, "user_order_quantity_limit": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "default": "0.000", "title": "User Order Quantity Limit" } }, "required": [ "product_id", "unit_id", "is_available", "max_quantity" ], "title": "AvailabilityOutput", "type": "object" } ``` ### BannerSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `image` | string | да | | | `reference_type` | string | да | | | `reference_id` | string / null | нет | | ```json { "properties": { "image": { "title": "Image", "type": "string" }, "reference_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reference Id" }, "reference_type": { "title": "Reference Type", "type": "string" } }, "required": [ "image", "reference_type" ], "title": "BannerSchema", "type": "object" } ``` ### BarcodeInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `barcode` | string | да | Штрихкод товара. | ```json { "properties": { "barcode": { "description": "Штрихкод товара.", "examples": [ "482000000001" ], "minLength": 1, "title": "Barcode", "type": "string" } }, "required": [ "barcode" ], "title": "BarcodeInput", "type": "object" } ``` ### BlockReasonSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `key` | string | да | | | `label` | string | да | | ```json { "properties": { "key": { "title": "Key", "type": "string" }, "label": { "title": "Label", "type": "string" } }, "required": [ "key", "label" ], "title": "BlockReasonSchema", "type": "object" } ``` ### CancelPickingInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `reason` | string / null | нет | | ```json { "properties": { "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reason" } }, "title": "CancelPickingInput", "type": "object" } ``` ### CardBlockInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `reason` | string / null | нет | | | `card_id` | string / null | нет | | ```json { "properties": { "card_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Card Id" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reason" } }, "title": "CardBlockInput", "type": "object" } ``` ### CardLinkInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `card_number` | string | да | | ```json { "properties": { "card_number": { "title": "Card Number", "type": "string" } }, "required": [ "card_number" ], "title": "CardLinkInput", "type": "object" } ``` ### CardSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `title` | string | нет | | | `card_number` | string | нет | | | `is_virtual` | boolean | нет | | | `is_active` | boolean | нет | | | `is_blocked` | boolean | нет | | | `qrcode` | QrcodeSchema / null | нет | | ```json { "properties": { "card_number": { "default": "", "title": "Card Number", "type": "string" }, "id": { "title": "Id", "type": "string" }, "is_active": { "default": true, "title": "Is Active", "type": "boolean" }, "is_blocked": { "default": false, "title": "Is Blocked", "type": "boolean" }, "is_virtual": { "default": true, "title": "Is Virtual", "type": "boolean" }, "qrcode": { "anyOf": [ { "$ref": "#/components/schemas/QrcodeSchema" }, { "type": "null" } ] }, "title": { "default": "", "title": "Title", "type": "string" } }, "required": [ "id" ], "title": "CardSchema", "type": "object" } ``` ### CardUnblockInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `card_id` | string / null | нет | | ```json { "properties": { "card_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Card Id" } }, "title": "CardUnblockInput", "type": "object" } ``` ### CategoryMenuSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `level` | integer | да | | | `parent_id` | string (uuid) / null | нет | | | `color` | string | да | | | `children_count` | integer | нет | | | `image` | ListingImageSchema / null | нет | | | `children` | массив<CategorySchema> / null | нет | | ```json { "properties": { "children": { "anyOf": [ { "items": { "$ref": "#/components/schemas/CategorySchema" }, "type": "array" }, { "type": "null" } ], "title": "Children" }, "children_count": { "default": 0, "title": "Children Count", "type": "integer" }, "color": { "title": "Color", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/ListingImageSchema" }, { "type": "null" } ] }, "level": { "title": "Level", "type": "integer" }, "name": { "title": "Name", "type": "string" }, "parent_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Parent Id" } }, "required": [ "id", "name", "level", "color" ], "title": "CategoryMenuSchema", "type": "object" } ``` ### CategorySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `level` | integer | да | | | `parent_id` | string (uuid) / null | нет | | | `color` | string | да | | | `children_count` | integer | нет | | | `image` | ListingImageSchema / null | нет | | ```json { "properties": { "children_count": { "default": 0, "title": "Children Count", "type": "integer" }, "color": { "title": "Color", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/ListingImageSchema" }, { "type": "null" } ] }, "level": { "title": "Level", "type": "integer" }, "name": { "title": "Name", "type": "string" }, "parent_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Parent Id" } }, "required": [ "id", "name", "level", "color" ], "title": "CategorySchema", "type": "object" } ``` ### CheckLocationItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `uuid` | string (uuid) | да | | | `location` | LocationInput | да | | ```json { "properties": { "location": { "$ref": "#/components/schemas/LocationInput" }, "uuid": { "format": "uuid", "title": "Uuid", "type": "string" } }, "required": [ "uuid", "location" ], "title": "CheckLocationItemInput", "type": "object" } ``` ### ConfirmClarificationInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `resolution` | string / null | нет | Необязательный тип расхождения: `quantity_mismatch` или `weight_mismatch`. Если передан, должен совпасть с состоянием позиции. | | `quantity` | integer / null | нет | Подтверждённое целое количество для штучного товара. | | `quantity_kg` | number / string / null | нет | Подтверждённый вес в килограммах для весового товара. | ```json { "properties": { "quantity": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "description": "Подтверждённое целое количество для штучного товара.", "examples": [ 2 ], "title": "Quantity" }, "quantity_kg": { "anyOf": [ { "exclusiveMinimum": 0.0, "type": "number" }, { "type": "string" }, { "type": "null" } ], "description": "Подтверждённый вес в килограммах для весового товара.", "examples": [ "0.680" ], "title": "Quantity Kg" }, "resolution": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Необязательный тип расхождения: `quantity_mismatch` или `weight_mismatch`. Если передан, должен совпасть с состоянием позиции.", "examples": [ "quantity_mismatch" ], "title": "Resolution" } }, "title": "ConfirmClarificationInput", "type": "object" } ``` ### ConfirmOTPInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `otp` | string | да | | | `first_name` | string / null | нет | | | `last_name` | string / null | нет | | | `patronymic` | string / null | нет | | ```json { "properties": { "first_name": { "anyOf": [ { "maxLength": 50, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "First Name" }, "last_name": { "anyOf": [ { "maxLength": 50, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Last Name" }, "otp": { "title": "Otp", "type": "string" }, "patronymic": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Patronymic" }, "phone": { "maxLength": 15, "minLength": 8, "pattern": "^\\+[1-9][0-9]{7,14}$", "title": "Phone", "type": "string" } }, "required": [ "phone", "otp" ], "title": "ConfirmOTPInput", "type": "object" } ``` ### ConfirmOTPOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `refresh` | string | да | | | `access` | string | да | | | `is_new_user` | boolean | да | | ```json { "properties": { "access": { "title": "Access", "type": "string" }, "is_new_user": { "title": "Is New User", "type": "boolean" }, "phone": { "maxLength": 15, "title": "Телефон", "type": "string" }, "refresh": { "title": "Refresh", "type": "string" } }, "required": [ "phone", "refresh", "access", "is_new_user" ], "title": "ConfirmOTPOutput", "type": "object" } ``` ### CourierLocationSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `lng` | number / string | да | | | `lat` | number / string | да | | | `bearing` | number / string / null | нет | | | `updated_at` | string (date-time) / null | нет | | ```json { "properties": { "bearing": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Bearing" }, "lat": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Lat" }, "lng": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Lng" }, "updated_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Updated At" } }, "required": [ "lng", "lat" ], "title": "CourierLocationSchema", "type": "object" } ``` ### CourierSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `name` | string / null | нет | | | `phone` | string / null | нет | | | `vehicle_number` | string / null | нет | | ```json { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Phone" }, "vehicle_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Vehicle Number" } }, "title": "CourierSchema", "type": "object" } ``` ### DeliveryInfoSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `address_line` | string | да | | | `date` | string (date) | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | | `cost` | number / string | да | | | `store_location` | DeliveryRouteLocationSchema / null | нет | | | `customer_location` | DeliveryRouteLocationSchema / null | нет | | | `tracking` | DeliveryTrackingSchema / null | нет | | ```json { "properties": { "address_line": { "title": "Address Line", "type": "string" }, "cost": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Cost" }, "customer_location": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryRouteLocationSchema" }, { "type": "null" } ] }, "date": { "format": "date", "title": "Date", "type": "string" }, "end_time": { "format": "time", "title": "End Time", "type": "string" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" }, "store_location": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryRouteLocationSchema" }, { "type": "null" } ] }, "tracking": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryTrackingSchema" }, { "type": "null" } ] } }, "required": [ "address_line", "date", "start_time", "end_time", "cost" ], "title": "DeliveryInfoSchema", "type": "object" } ``` ### DeliveryInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `address` | UserAddressInput | да | | | `slot_id` | string (uuid) / null | нет | | | `estimate_id` | string (uuid) / null | нет | | ```json { "properties": { "address": { "$ref": "#/components/schemas/UserAddressInput" }, "estimate_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Estimate Id" }, "slot_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Slot Id" } }, "required": [ "address" ], "title": "DeliveryInput", "type": "object" } ``` ### DeliveryPreferenceOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `min_order_amount` | number / string | да | | | `express` | ExpressDeliveryOutput / null | нет | | | `standard` | StandardDeliveryOutput / null | нет | | ```json { "properties": { "express": { "anyOf": [ { "$ref": "#/components/schemas/ExpressDeliveryOutput" }, { "type": "null" } ] }, "min_order_amount": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Min Order Amount" }, "standard": { "anyOf": [ { "$ref": "#/components/schemas/StandardDeliveryOutput" }, { "type": "null" } ] } }, "required": [ "min_order_amount" ], "title": "DeliveryPreferenceOutput", "type": "object" } ``` ### DeliveryPriceEstimateInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `location` | LocationInput | да | | ```json { "properties": { "location": { "$ref": "#/components/schemas/LocationInput" } }, "required": [ "location" ], "title": "DeliveryPriceEstimateInput", "type": "object" } ``` ### DeliveryPriceEstimateSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `estimate_id` | string (uuid) | да | | | `total_price` | number / string | да | | | `currency` | string | да | | | `distance_km` | number / string | да | | | `tariff_id` | string | да | | | `tariff_name` | string / null | нет | | | `expires_at` | string (date-time) | да | | ```json { "properties": { "currency": { "title": "Currency", "type": "string" }, "distance_km": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Distance Km" }, "estimate_id": { "format": "uuid", "title": "Estimate Id", "type": "string" }, "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "tariff_id": { "title": "Tariff Id", "type": "string" }, "tariff_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Tariff Name" }, "total_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Total Price" } }, "required": [ "estimate_id", "total_price", "currency", "distance_km", "tariff_id", "expires_at" ], "title": "DeliveryPriceEstimateSchema", "type": "object" } ``` ### DeliveryRouteLocationSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `lon` | number | да | | | `lat` | number | да | | ```json { "properties": { "lat": { "title": "Lat", "type": "number" }, "lon": { "title": "Lon", "type": "number" } }, "required": [ "lon", "lat" ], "title": "DeliveryRouteLocationSchema", "type": "object" } ``` ### DeliverySlotOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `type` | integer | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | | `cost` | number / string | да | | ```json { "properties": { "cost": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Cost" }, "end_time": { "format": "time", "title": "End Time", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" }, "type": { "title": "Type", "type": "integer" } }, "required": [ "id", "type", "start_time", "end_time", "cost" ], "title": "DeliverySlotOutput", "type": "object" } ``` ### DeliveryTrackingSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `state` | string | да | | | `display` | string | да | | | `comment` | string / null | нет | | | `can_cancel` | boolean | нет | | | `cancellation_reason` | string / null | нет | | | `courier` | CourierSchema / null | нет | | | `location` | CourierLocationSchema / null | нет | | | `updated_at` | string (date-time) / null | нет | | ```json { "properties": { "can_cancel": { "default": false, "title": "Can Cancel", "type": "boolean" }, "cancellation_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cancellation Reason" }, "comment": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Comment" }, "courier": { "anyOf": [ { "$ref": "#/components/schemas/CourierSchema" }, { "type": "null" } ] }, "display": { "title": "Display", "type": "string" }, "location": { "anyOf": [ { "$ref": "#/components/schemas/CourierLocationSchema" }, { "type": "null" } ] }, "state": { "title": "State", "type": "string" }, "updated_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Updated At" } }, "required": [ "state", "display" ], "title": "DeliveryTrackingSchema", "type": "object" } ``` ### DeliveryZoneOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `store_id` | string (uuid) | да | | | `store_name` | string | да | | | `polygon` | PolygonSchema | да | | ```json { "properties": { "polygon": { "$ref": "#/components/schemas/PolygonSchema" }, "store_id": { "format": "uuid", "title": "Store Id", "type": "string" }, "store_name": { "title": "Store Name", "type": "string" } }, "required": [ "store_id", "store_name", "polygon" ], "title": "DeliveryZoneOutput", "type": "object" } ``` ### DetailImageSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `original` | string | да | | | `listing` | string | да | | | `detail` | string | да | | ```json { "properties": { "detail": { "title": "Detail", "type": "string" }, "listing": { "title": "Listing", "type": "string" }, "original": { "title": "Original", "type": "string" } }, "required": [ "original", "listing", "detail" ], "title": "DetailImageSchema", "type": "object" } ``` ### DetailOrderRoadmapSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `no` | integer | да | | | `type` | string | да | | | `status` | OrderStatusSchema | да | | | `total_price` | number / string | да | | | `picking_result_state` | string | нет | | | `has_picking_changes` | boolean | нет | | | `items` | массив<OrderItemSchema> | да | | | `delivery` | DeliveryInfoSchema / null | нет | | | `pickup` | PickupInfoSchema / null | нет | | | `can_cancel` | boolean | нет | | | `picking_result` | PickingResultSchema | да | | ```json { "properties": { "can_cancel": { "default": false, "title": "Can Cancel", "type": "boolean" }, "delivery": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryInfoSchema" }, { "type": "null" } ] }, "has_picking_changes": { "default": false, "title": "Has Picking Changes", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/OrderItemSchema" }, "title": "Items", "type": "array" }, "no": { "title": "No", "type": "integer" }, "picking_result": { "$ref": "#/components/schemas/PickingResultSchema" }, "picking_result_state": { "default": "pending", "title": "Picking Result State", "type": "string" }, "pickup": { "anyOf": [ { "$ref": "#/components/schemas/PickupInfoSchema" }, { "type": "null" } ] }, "status": { "$ref": "#/components/schemas/OrderStatusSchema" }, "total_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Total Price" }, "type": { "title": "Type", "type": "string" } }, "required": [ "no", "type", "status", "total_price", "items", "picking_result" ], "title": "DetailOrderRoadmapSchema", "type": "object" } ``` ### DiscountPreviewInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<DiscountPreviewItemInput> | да | | ```json { "properties": { "items": { "items": { "$ref": "#/components/schemas/DiscountPreviewItemInput" }, "title": "Items", "type": "array" } }, "required": [ "items" ], "title": "DiscountPreviewInput", "type": "object" } ``` ### DiscountPreviewItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) | да | | | `unit_id` | string (uuid) | да | | | `quantity` | number / string | да | | ```json { "properties": { "product_id": { "format": "uuid", "title": "Product Id", "type": "string" }, "quantity": { "anyOf": [ { "minimum": 0.001, "type": "number" }, { "type": "string" } ], "title": "Quantity" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" } }, "required": [ "product_id", "unit_id", "quantity" ], "title": "DiscountPreviewItemInput", "type": "object" } ``` ### DiscountPreviewItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_external_id` | string | да | | | `original_price` | string | да | | | `discounted_price` | string | да | | | `discount_amount` | string | да | | ```json { "properties": { "discount_amount": { "title": "Discount Amount", "type": "string" }, "discounted_price": { "title": "Discounted Price", "type": "string" }, "original_price": { "title": "Original Price", "type": "string" }, "product_external_id": { "title": "Product External Id", "type": "string" } }, "required": [ "product_external_id", "original_price", "discounted_price", "discount_amount" ], "title": "DiscountPreviewItemSchema", "type": "object" } ``` ### DiscountPreviewSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<DiscountPreviewItemSchema> | нет | | | `total_discount` | string | нет | | | `bonus_accrual` | string | нет | | | `bonus_applied` | boolean | нет | | | `bonus_reason` | string | нет | | ```json { "properties": { "bonus_accrual": { "default": "0", "title": "Bonus Accrual", "type": "string" }, "bonus_applied": { "default": false, "title": "Bonus Applied", "type": "boolean" }, "bonus_reason": { "default": "", "title": "Bonus Reason", "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/DiscountPreviewItemSchema" }, "title": "Items", "type": "array" }, "total_discount": { "default": "0", "title": "Total Discount", "type": "string" } }, "title": "DiscountPreviewSchema", "type": "object" } ``` ### EskhataInvoiceResponse | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `link` | string | да | | | `expires_at` | string (date-time) | да | | ```json { "properties": { "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "link": { "title": "Link", "type": "string" } }, "required": [ "link", "expires_at" ], "title": "EskhataInvoiceResponse", "type": "object" } ``` ### ExpressDeliveryOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `minutes` | integer | да | | | `cost` | number / string | да | | | `max_items_count` | integer / null | нет | | | `is_available` | boolean | да | | | `schedule` | массив<ExpressOrderScheduleOutput> | да | | ```json { "properties": { "cost": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Cost" }, "is_available": { "title": "Is Available", "type": "boolean" }, "max_items_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Max Items Count" }, "minutes": { "title": "Minutes", "type": "integer" }, "schedule": { "items": { "$ref": "#/components/schemas/ExpressOrderScheduleOutput" }, "title": "Schedule", "type": "array" } }, "required": [ "minutes", "cost", "is_available", "schedule" ], "title": "ExpressDeliveryOutput", "type": "object" } ``` ### ExpressOrderScheduleOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `weekday` | integer | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | | `is_active` | boolean | да | | ```json { "properties": { "end_time": { "format": "time", "title": "End Time", "type": "string" }, "is_active": { "title": "Is Active", "type": "boolean" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" }, "weekday": { "title": "Weekday", "type": "integer" } }, "required": [ "weekday", "start_time", "end_time", "is_active" ], "title": "ExpressOrderScheduleOutput", "type": "object" } ``` ### FavoriteProductsCheckInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_ids` | массив<string (uuid)> | да | | ```json { "properties": { "product_ids": { "items": { "format": "uuid", "type": "string" }, "maxItems": 100, "title": "Product Ids", "type": "array" } }, "required": [ "product_ids" ], "title": "FavoriteProductsCheckInput", "type": "object" } ``` ### FavoriteProductsCheckOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_ids` | массив<string (uuid)> | да | | ```json { "properties": { "product_ids": { "items": { "format": "uuid", "type": "string" }, "title": "Product Ids", "type": "array" } }, "required": [ "product_ids" ], "title": "FavoriteProductsCheckOutput", "type": "object" } ``` ### Gender ```json { "enum": [ "male", "female" ], "title": "Gender", "type": "string" } ``` ### InventoryItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `unit_id` | string (uuid) | да | | | `stock` | number / string / null | да | | | `unit_price` | number / string | да | | | `old_price` | number / string / null | нет | | | `discount_percent` | number / string / null | нет | | ```json { "properties": { "discount_percent": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Discount Percent" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "old_price": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Old Price" }, "stock": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Stock" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" }, "unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Unit Price" } }, "required": [ "id", "unit_id", "stock", "unit_price" ], "title": "InventoryItemSchema", "type": "object" } ``` ### ListingImageSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `original` | string | да | | | `listing` | string | да | | ```json { "properties": { "listing": { "title": "Listing", "type": "string" }, "original": { "title": "Original", "type": "string" } }, "required": [ "original", "listing" ], "title": "ListingImageSchema", "type": "object" } ``` ### LocationInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `lon` | number | да | | | `lat` | number | да | | ```json { "properties": { "lat": { "maximum": 90, "minimum": -90, "title": "Lat", "type": "number" }, "lon": { "maximum": 180, "minimum": -180, "title": "Lon", "type": "number" } }, "required": [ "lon", "lat" ], "title": "LocationInput", "type": "object" } ``` ### LocationOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `lon` | number | да | | | `lat` | number | да | | ```json { "properties": { "lat": { "title": "Lat", "type": "number" }, "lon": { "title": "Lon", "type": "number" } }, "required": [ "lon", "lat" ], "title": "LocationOutput", "type": "object" } ``` ### LoyaltyProgramLevelSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | integer / null | нет | | | `order` | integer | да | | | `name` | string | да | | | `boundary` | string | нет | | | `clients_count` | integer / null | нет | | | `range_label` | string | нет | | | `description` | string | нет | | ```json { "properties": { "boundary": { "default": "0", "title": "Boundary", "type": "string" }, "clients_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Clients Count" }, "description": { "default": "", "title": "Description", "type": "string" }, "id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Id" }, "name": { "title": "Name", "type": "string" }, "order": { "title": "Order", "type": "integer" }, "range_label": { "default": "", "title": "Range Label", "type": "string" } }, "required": [ "order", "name" ], "title": "LoyaltyProgramLevelSchema", "type": "object" } ``` ### LoyaltyProgramSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | integer | да | | | `name` | string | да | | | `levels` | массив<LoyaltyProgramLevelSchema> | нет | | ```json { "properties": { "id": { "title": "Id", "type": "integer" }, "levels": { "items": { "$ref": "#/components/schemas/LoyaltyProgramLevelSchema" }, "title": "Levels", "type": "array" }, "name": { "title": "Name", "type": "string" } }, "required": [ "id", "name" ], "title": "LoyaltyProgramSchema", "type": "object" } ``` ### LoyaltyStatusSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `program_name` | string | нет | | | `current_tier` | string | нет | | | `next_tier` | string | нет | | | `tiers_source` | string | нет | | | `tiers_complete` | boolean | нет | | | `progress` | number | нет | | | `amount_to_next` | string | нет | | | `total_turnover` | string | нет | | | `last_purchase_points` | string | нет | | | `tiers` | массив<TierSchema> | нет | | ```json { "properties": { "amount_to_next": { "default": "0", "title": "Amount To Next", "type": "string" }, "current_tier": { "default": "", "title": "Current Tier", "type": "string" }, "last_purchase_points": { "default": "0", "title": "Last Purchase Points", "type": "string" }, "next_tier": { "default": "", "title": "Next Tier", "type": "string" }, "program_name": { "default": "", "title": "Program Name", "type": "string" }, "progress": { "default": 0.0, "title": "Progress", "type": "number" }, "tiers": { "items": { "$ref": "#/components/schemas/TierSchema" }, "title": "Tiers", "type": "array" }, "tiers_complete": { "default": false, "title": "Tiers Complete", "type": "boolean" }, "tiers_source": { "default": "cdp_fallback", "title": "Tiers Source", "type": "string" }, "total_turnover": { "default": "0", "title": "Total Turnover", "type": "string" } }, "title": "LoyaltyStatusSchema", "type": "object" } ``` ### MainPageCategoryBlockSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `level` | integer | да | | | `parent_id` | string (uuid) / null | нет | | | `color` | string | да | | | `children_count` | integer | нет | | | `image` | ListingImageSchema / null | нет | | | `children` | массив<CategorySchema> / null | нет | | | `layout` | string | да | | ```json { "properties": { "children": { "anyOf": [ { "items": { "$ref": "#/components/schemas/CategorySchema" }, "type": "array" }, { "type": "null" } ], "title": "Children" }, "children_count": { "default": 0, "title": "Children Count", "type": "integer" }, "color": { "title": "Color", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/ListingImageSchema" }, { "type": "null" } ] }, "layout": { "title": "Layout", "type": "string" }, "level": { "title": "Level", "type": "integer" }, "name": { "title": "Name", "type": "string" }, "parent_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Parent Id" } }, "required": [ "id", "name", "level", "color", "layout" ], "title": "MainPageCategoryBlockSchema", "type": "object" } ``` ### MainPageProductsTitlesSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `promo` | string | да | | | `amid` | string | да | | | `amid_category` | string / null | нет | | | `new` | string | да | | | `childhood` | string | да | | | `fresh` | string | да | | ```json { "properties": { "amid": { "title": "Amid", "type": "string" }, "amid_category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Amid Category" }, "childhood": { "title": "Childhood", "type": "string" }, "fresh": { "title": "Fresh", "type": "string" }, "new": { "title": "New", "type": "string" }, "promo": { "title": "Promo", "type": "string" } }, "required": [ "promo", "amid", "new", "childhood", "fresh" ], "title": "MainPageProductsTitlesSchema", "type": "object" } ``` ### ManualPickInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `quantity` | integer | да | Фактически собранное целое количество. | | `confirm` | boolean | нет | Подтверждает уже сохранённое расхождение количества. | ```json { "properties": { "confirm": { "default": false, "description": "Подтверждает уже сохранённое расхождение количества.", "title": "Confirm", "type": "boolean" }, "quantity": { "description": "Фактически собранное целое количество.", "examples": [ 2 ], "minimum": 1, "title": "Quantity", "type": "integer" } }, "required": [ "quantity" ], "title": "ManualPickInput", "type": "object" } ``` ### MapConfigOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `enabled` | boolean | да | | | `mapbox_public_token` | string / null | нет | | | `style_uri` | string / null | нет | | | `search_min_length` | integer | нет | | | `search_max_results` | integer | нет | | | `search_debounce_ms` | integer | нет | | ```json { "properties": { "enabled": { "title": "Enabled", "type": "boolean" }, "mapbox_public_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Mapbox Public Token" }, "search_debounce_ms": { "default": 400, "title": "Search Debounce Ms", "type": "integer" }, "search_max_results": { "default": 7, "title": "Search Max Results", "type": "integer" }, "search_min_length": { "default": 2, "title": "Search Min Length", "type": "integer" }, "style_uri": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Style Uri" } }, "required": [ "enabled" ], "title": "MapConfigOutput", "type": "object" } ``` ### MaritalStatus ```json { "enum": [ "single", "married" ], "title": "MaritalStatus", "type": "string" } ``` ### MeasurementUnitSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `full_name` | string | да | | | `ratio` | number / string | да | | ```json { "properties": { "full_name": { "title": "Full Name", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "ratio": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Ratio" } }, "required": [ "id", "name", "full_name", "ratio" ], "title": "MeasurementUnitSchema", "type": "object" } ``` ### MissingInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `action` | string | да | `call` — запросить звонок клиенту; `remove` — подготовить удаление. | ```json { "properties": { "action": { "description": "`call` — запросить звонок клиенту; `remove` — подготовить удаление.", "examples": [ "remove" ], "title": "Action", "type": "string" } }, "required": [ "action" ], "title": "MissingInput", "type": "object" } ``` ### MobileVersionCheckResponse | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `update_required` | boolean | да | | | `can_update` | boolean | да | | | `message` | string / null | нет | | ```json { "properties": { "can_update": { "title": "Can Update", "type": "boolean" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message" }, "update_required": { "title": "Update Required", "type": "boolean" } }, "required": [ "update_required", "can_update" ], "title": "MobileVersionCheckResponse", "type": "object" } ``` ### MobileVersionInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `platform` | "android" / "ios" | да | | | `version` | string | да | | ```json { "properties": { "platform": { "enum": [ "android", "ios" ], "title": "Platform", "type": "string" }, "version": { "title": "Version", "type": "string" } }, "required": [ "platform", "version" ], "title": "MobileVersionInput", "type": "object" } ``` ### OrderAdviceActionEnum ```json { "enum": [ "remove", "call" ], "title": "OrderAdviceActionEnum", "type": "string" } ``` ### OrderCommandError | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `detail` | string | да | | | `code` | string | да | | ```json { "properties": { "code": { "title": "Code", "type": "string" }, "detail": { "title": "Detail", "type": "string" } }, "required": [ "detail", "code" ], "title": "OrderCommandError", "type": "object" } ``` ### OrderDetailSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `no` | integer | да | | | `type` | string | да | | | `address_line` | string | да | | | `created_at` | string (date-time) | да | | | `total_price` | number / string | да | | | `picking_result_state` | string | нет | | | `has_picking_changes` | boolean | нет | | | `items` | массив<OrderItemSchema> | да | | | `status` | OrderStatusSchema | да | | | `delivery` | DeliveryInfoSchema / null | нет | | | `pickup` | PickupInfoSchema / null | нет | | | `comment` | string / null | нет | | | `can_cancel` | boolean | нет | | | `picking_result` | PickingResultSchema | да | | ```json { "properties": { "address_line": { "title": "Address Line", "type": "string" }, "can_cancel": { "default": false, "title": "Can Cancel", "type": "boolean" }, "comment": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Comment" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "delivery": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryInfoSchema" }, { "type": "null" } ] }, "has_picking_changes": { "default": false, "title": "Has Picking Changes", "type": "boolean" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/OrderItemSchema" }, "title": "Items", "type": "array" }, "no": { "title": "No", "type": "integer" }, "picking_result": { "$ref": "#/components/schemas/PickingResultSchema" }, "picking_result_state": { "default": "pending", "title": "Picking Result State", "type": "string" }, "pickup": { "anyOf": [ { "$ref": "#/components/schemas/PickupInfoSchema" }, { "type": "null" } ] }, "status": { "$ref": "#/components/schemas/OrderStatusSchema" }, "total_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Total Price" }, "type": { "title": "Type", "type": "string" } }, "required": [ "id", "no", "type", "address_line", "created_at", "total_price", "items", "status", "picking_result" ], "title": "OrderDetailSchema", "type": "object" } ``` ### OrderInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `type` | OrderTypeEnum | да | | | `delivery_context` | DeliveryInput / null | нет | | | `pickup_context` | PickupInput / null | нет | | | `payment_method` | PaymentMethodEnum | да | | | `items` | массив<OrderItemInput> | да | | | `comment` | string / null | нет | | | `change` | number / string / null | нет | | | `absence_action` | OrderAdviceActionEnum | нет | | ```json { "properties": { "absence_action": { "allOf": [ { "$ref": "#/components/schemas/OrderAdviceActionEnum" } ], "default": "call" }, "change": { "anyOf": [ { "minimum": 0.01, "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Change" }, "comment": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "Comment" }, "delivery_context": { "anyOf": [ { "$ref": "#/components/schemas/DeliveryInput" }, { "type": "null" } ] }, "items": { "items": { "$ref": "#/components/schemas/OrderItemInput" }, "title": "Items", "type": "array" }, "payment_method": { "$ref": "#/components/schemas/PaymentMethodEnum" }, "pickup_context": { "anyOf": [ { "$ref": "#/components/schemas/PickupInput" }, { "type": "null" } ] }, "type": { "$ref": "#/components/schemas/OrderTypeEnum" } }, "required": [ "type", "payment_method", "items" ], "title": "OrderInput", "type": "object" } ``` ### OrderItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) | да | | | `unit_id` | string (uuid) | да | | | `quantity` | number / string | да | | ```json { "properties": { "product_id": { "format": "uuid", "title": "Product Id", "type": "string" }, "quantity": { "anyOf": [ { "minimum": 0.001, "type": "number" }, { "type": "string" } ], "title": "Quantity" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" } }, "required": [ "product_id", "unit_id", "quantity" ], "title": "OrderItemInput", "type": "object" } ``` ### OrderItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) / null | нет | | | `unit_id` | string (uuid) / null | нет | | | `unit_name` | string | да | | | `name` | string | да | | | `image` | string / null | нет | | | `weight` | number / string | да | | | `old_price` | number / string / null | нет | | | `unit_price` | number / string | да | | | `quantity` | number / string | да | | ```json { "properties": { "image": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image" }, "name": { "title": "Name", "type": "string" }, "old_price": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Old Price" }, "product_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Product Id" }, "quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Quantity" }, "unit_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Unit Id" }, "unit_name": { "title": "Unit Name", "type": "string" }, "unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Unit Price" }, "weight": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Weight" } }, "required": [ "unit_name", "name", "weight", "unit_price", "quantity" ], "title": "OrderItemSchema", "type": "object" } ``` ### OrderRoadmapSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `no` | integer | да | | | `type` | string | да | | | `status` | OrderStatusSchema | да | | | `total_price` | number / string | да | | | `picking_result_state` | string | нет | | | `has_picking_changes` | boolean | нет | | | `items_count` | integer | да | | ```json { "properties": { "has_picking_changes": { "default": false, "title": "Has Picking Changes", "type": "boolean" }, "items_count": { "title": "Items Count", "type": "integer" }, "no": { "title": "No", "type": "integer" }, "picking_result_state": { "default": "pending", "title": "Picking Result State", "type": "string" }, "status": { "$ref": "#/components/schemas/OrderStatusSchema" }, "total_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Total Price" }, "type": { "title": "Type", "type": "string" } }, "required": [ "no", "type", "status", "total_price", "items_count" ], "title": "OrderRoadmapSchema", "type": "object" } ``` ### OrderStatusSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `display` | string | да | | | `value` | string | да | | | `comment` | string / null | нет | | ```json { "properties": { "comment": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Comment" }, "display": { "title": "Display", "type": "string" }, "value": { "title": "Value", "type": "string" } }, "required": [ "display", "value" ], "title": "OrderStatusSchema", "type": "object" } ``` ### OrderTypeEnum ```json { "enum": [ "pickup", "delivery" ], "title": "OrderTypeEnum", "type": "string" } ``` ### OrdersListingSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `no` | integer | да | | | `type` | string | да | | | `address_line` | string | да | | | `created_at` | string (date-time) | да | | | `total_price` | number / string | да | | | `picking_result_state` | string | нет | | | `has_picking_changes` | boolean | нет | | ```json { "properties": { "address_line": { "title": "Address Line", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "has_picking_changes": { "default": false, "title": "Has Picking Changes", "type": "boolean" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "no": { "title": "No", "type": "integer" }, "picking_result_state": { "default": "pending", "title": "Picking Result State", "type": "string" }, "total_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Total Price" }, "type": { "title": "Type", "type": "string" } }, "required": [ "id", "no", "type", "address_line", "created_at", "total_price" ], "title": "OrdersListingSchema", "type": "object" } ``` ### OwnCategorySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `level` | integer | да | | | `parent_id` | string (uuid) / null | нет | | | `color` | string | да | | | `children_count` | integer | нет | | | `image` | ListingImageSchema / null | нет | | | `products_count` | integer / null | нет | | ```json { "properties": { "children_count": { "default": 0, "title": "Children Count", "type": "integer" }, "color": { "title": "Color", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/ListingImageSchema" }, { "type": "null" } ] }, "level": { "title": "Level", "type": "integer" }, "name": { "title": "Name", "type": "string" }, "parent_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Parent Id" }, "products_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Products Count" } }, "required": [ "id", "name", "level", "color" ], "title": "OwnCategorySchema", "type": "object" } ``` ### PageResponse | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `title` | string | да | | | `content` | string | да | | ```json { "properties": { "content": { "title": "Content", "type": "string" }, "title": { "title": "Title", "type": "string" } }, "required": [ "title", "content" ], "title": "PageResponse", "type": "object" } ``` ### PagedOrdersListingSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<OrdersListingSchema> | да | | | `count` | integer | да | | | `has_next` | boolean | да | | ```json { "properties": { "count": { "title": "Count", "type": "integer" }, "has_next": { "title": "Has Next", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/OrdersListingSchema" }, "title": "Items", "type": "array" } }, "required": [ "items", "count", "has_next" ], "title": "PagedOrdersListingSchema", "type": "object" } ``` ### PagedProductListingSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<ProductListingSchema> | да | | | `count` | integer | да | | | `has_next` | boolean | да | | ```json { "properties": { "count": { "title": "Count", "type": "integer" }, "has_next": { "title": "Has Next", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/ProductListingSchema" }, "title": "Items", "type": "array" } }, "required": [ "items", "count", "has_next" ], "title": "PagedProductListingSchema", "type": "object" } ``` ### PagedPurchaseSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<PurchaseSchema> | да | | | `count` | integer | да | | | `has_next` | boolean | да | | ```json { "properties": { "count": { "title": "Count", "type": "integer" }, "has_next": { "title": "Has Next", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/PurchaseSchema" }, "title": "Items", "type": "array" } }, "required": [ "items", "count", "has_next" ], "title": "PagedPurchaseSchema", "type": "object" } ``` ### PagedTransactionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<TransactionSchema> | да | | | `count` | integer | да | | | `has_next` | boolean | да | | ```json { "properties": { "count": { "title": "Count", "type": "integer" }, "has_next": { "title": "Has Next", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/TransactionSchema" }, "title": "Items", "type": "array" } }, "required": [ "items", "count", "has_next" ], "title": "PagedTransactionSchema", "type": "object" } ``` ### PasswordUpdateInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `password` | string (password) | да | | | `password_repeat` | string (password) | да | | ```json { "properties": { "password": { "format": "password", "title": "Password", "type": "string", "writeOnly": true }, "password_repeat": { "format": "password", "title": "Password Repeat", "type": "string", "writeOnly": true } }, "required": [ "password", "password_repeat" ], "title": "PasswordUpdateInput", "type": "object" } ``` ### PaymentMethodEnum ```json { "enum": [ "cash", "online" ], "title": "PaymentMethodEnum", "type": "string" } ``` ### PaymentSummarySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `original_total` | number / string | да | | | `current_total` | number / string | да | | | `difference` | number / string | да | | | `reconciliation_status` | string / null | нет | | ```json { "properties": { "current_total": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Current Total" }, "difference": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Difference" }, "original_total": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Original Total" }, "reconciliation_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reconciliation Status" } }, "required": [ "original_total", "current_total", "difference" ], "title": "PaymentSummarySchema", "type": "object" } ``` ### PickerCatalogCursorOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<PickerCatalogProductSchema> | да | | | `next_cursor` | string / null | нет | | | `has_more` | boolean | да | | ```json { "properties": { "has_more": { "title": "Has More", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/PickerCatalogProductSchema" }, "title": "Items", "type": "array" }, "next_cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Next Cursor" } }, "required": [ "items", "has_more" ], "title": "PickerCatalogCursorOutput", "type": "object" } ``` ### PickerCatalogOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<PickerCatalogProductSchema> | да | | | `total` | integer | да | | | `limit` | integer | да | | | `offset` | integer | да | | | `has_more` | boolean | да | | ```json { "properties": { "has_more": { "title": "Has More", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/PickerCatalogProductSchema" }, "title": "Items", "type": "array" }, "limit": { "title": "Limit", "type": "integer" }, "offset": { "title": "Offset", "type": "integer" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "items", "total", "limit", "offset", "has_more" ], "title": "PickerCatalogOutput", "type": "object" } ``` ### PickerCatalogProductSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `inventory_id` | string | да | | | `product_id` | string | да | | | `name` | string | да | | | `barcode` | string | да | | | `description` | string | да | | | `price` | number / string | да | | | `available_quantity` | number / string | да | | | `unit` | string | да | | | `kind` | string | да | | | `plu_code` | string / null | нет | | | `image_url` | string / null | нет | | ```json { "properties": { "available_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Available Quantity" }, "barcode": { "title": "Barcode", "type": "string" }, "description": { "title": "Description", "type": "string" }, "image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image Url" }, "inventory_id": { "title": "Inventory Id", "type": "string" }, "kind": { "title": "Kind", "type": "string" }, "name": { "title": "Name", "type": "string" }, "plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Plu Code" }, "price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Price" }, "product_id": { "title": "Product Id", "type": "string" }, "unit": { "title": "Unit", "type": "string" } }, "required": [ "inventory_id", "product_id", "name", "barcode", "description", "price", "available_quantity", "unit", "kind" ], "title": "PickerCatalogProductSchema", "type": "object" } ``` ### PickerHistoryItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `item_id` | string | да | | | `source` | string | да | | | `original_name` | string | да | | | `original_image_url` | string / null | нет | | | `final_name` | string | да | | | `final_image_url` | string / null | нет | | | `original_barcode` | string | нет | | | `final_barcode` | string | нет | | | `barcode` | string | да | | | `original_plu_code` | string / null | нет | | | `final_plu_code` | string / null | нет | | | `plu_code` | string / null | нет | | | `required_quantity` | number / string | да | | | `actual_quantity` | number / string | да | | | `original_unit_price` | number / string | да | | | `final_unit_price` | number / string | да | | | `state` | string | да | | | `resolution_type` | string / null | нет | | | `is_added` | boolean | да | | | `is_removed` | boolean | да | | ```json { "properties": { "actual_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Actual Quantity" }, "barcode": { "title": "Barcode", "type": "string" }, "final_barcode": { "default": "", "title": "Final Barcode", "type": "string" }, "final_image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Final Image Url" }, "final_name": { "title": "Final Name", "type": "string" }, "final_plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Final Plu Code" }, "final_unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Final Unit Price" }, "is_added": { "title": "Is Added", "type": "boolean" }, "is_removed": { "title": "Is Removed", "type": "boolean" }, "item_id": { "title": "Item Id", "type": "string" }, "original_barcode": { "default": "", "title": "Original Barcode", "type": "string" }, "original_image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Original Image Url" }, "original_name": { "title": "Original Name", "type": "string" }, "original_plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Original Plu Code" }, "original_unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Original Unit Price" }, "plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Plu Code" }, "required_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Required Quantity" }, "resolution_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Resolution Type" }, "source": { "title": "Source", "type": "string" }, "state": { "title": "State", "type": "string" } }, "required": [ "item_id", "source", "original_name", "final_name", "barcode", "required_quantity", "actual_quantity", "original_unit_price", "final_unit_price", "state", "is_added", "is_removed" ], "title": "PickerHistoryItemSchema", "type": "object" } ``` ### PickerHistorySessionDetailSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `session_id` | integer | да | | | `order_id` | string | да | | | `order_number` | string | да | | | `session_status` | string | да | | | `completed_at` | string (date-time) | да | | | `duration_seconds` | integer | да | | | `items` | массив<PickerHistoryItemSchema> | да | | | `store` | PickerStoreSchema | да | | | `fulfillment_type` | string | да | | | `slot` | PickerSlotSchema / null | нет | | ```json { "properties": { "completed_at": { "format": "date-time", "title": "Completed At", "type": "string" }, "duration_seconds": { "title": "Duration Seconds", "type": "integer" }, "fulfillment_type": { "title": "Fulfillment Type", "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/PickerHistoryItemSchema" }, "title": "Items", "type": "array" }, "order_id": { "title": "Order Id", "type": "string" }, "order_number": { "title": "Order Number", "type": "string" }, "session_id": { "title": "Session Id", "type": "integer" }, "session_status": { "title": "Session Status", "type": "string" }, "slot": { "anyOf": [ { "$ref": "#/components/schemas/PickerSlotSchema" }, { "type": "null" } ] }, "store": { "$ref": "#/components/schemas/PickerStoreSchema" } }, "required": [ "session_id", "order_id", "order_number", "session_status", "completed_at", "duration_seconds", "items", "store", "fulfillment_type" ], "title": "PickerHistorySessionDetailSchema", "type": "object" } ``` ### PickerHistorySessionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `session_id` | integer | да | | | `order_id` | string (uuid) | да | | | `order_number` | string | да | | | `picker_id` | integer | да | | | `picker_login` | string | да | | | `picker_display_name` | string | да | | | `store_id` | string | да | | | `store_name` | string | да | | | `status` | string | да | | | `started_at` | string (date-time) | да | | | `completed_at` | string (date-time) | да | | | `duration_seconds` | integer | да | | | `total_items` | integer | да | | | `picked_items` | integer | да | | | `added_items` | integer | да | | | `replacement_items` | integer | да | | | `removed_items` | integer | да | | | `weighted_items` | integer | да | | | `piece_items` | integer | да | | | `store` | PickerStoreSchema | да | | | `fulfillment_type` | string | да | | | `slot` | PickerSlotSchema / null | нет | | ```json { "properties": { "added_items": { "title": "Added Items", "type": "integer" }, "completed_at": { "format": "date-time", "title": "Completed At", "type": "string" }, "duration_seconds": { "title": "Duration Seconds", "type": "integer" }, "fulfillment_type": { "title": "Fulfillment Type", "type": "string" }, "order_id": { "format": "uuid", "title": "Order Id", "type": "string" }, "order_number": { "title": "Order Number", "type": "string" }, "picked_items": { "title": "Picked Items", "type": "integer" }, "picker_display_name": { "title": "Picker Display Name", "type": "string" }, "picker_id": { "title": "Picker Id", "type": "integer" }, "picker_login": { "title": "Picker Login", "type": "string" }, "piece_items": { "title": "Piece Items", "type": "integer" }, "removed_items": { "title": "Removed Items", "type": "integer" }, "replacement_items": { "title": "Replacement Items", "type": "integer" }, "session_id": { "title": "Session Id", "type": "integer" }, "slot": { "anyOf": [ { "$ref": "#/components/schemas/PickerSlotSchema" }, { "type": "null" } ] }, "started_at": { "format": "date-time", "title": "Started At", "type": "string" }, "status": { "title": "Status", "type": "string" }, "store": { "$ref": "#/components/schemas/PickerStoreSchema" }, "store_id": { "title": "Store Id", "type": "string" }, "store_name": { "title": "Store Name", "type": "string" }, "total_items": { "title": "Total Items", "type": "integer" }, "weighted_items": { "title": "Weighted Items", "type": "integer" } }, "required": [ "session_id", "order_id", "order_number", "picker_id", "picker_login", "picker_display_name", "store_id", "store_name", "status", "started_at", "completed_at", "duration_seconds", "total_items", "picked_items", "added_items", "replacement_items", "removed_items", "weighted_items", "piece_items", "store", "fulfillment_type" ], "title": "PickerHistorySessionSchema", "type": "object" } ``` ### PickerHistorySessionsOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `items` | массив<PickerHistorySessionSchema> | да | | | `total` | integer | да | | | `limit` | integer | да | | | `offset` | integer | да | | | `has_more` | boolean | да | | ```json { "properties": { "has_more": { "title": "Has More", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/PickerHistorySessionSchema" }, "title": "Items", "type": "array" }, "limit": { "title": "Limit", "type": "integer" }, "offset": { "title": "Offset", "type": "integer" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "items", "total", "limit", "offset", "has_more" ], "title": "PickerHistorySessionsOutput", "type": "object" } ``` ### PickerHistorySummarySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `picker_id` | integer | да | | | `picker_login` | string | да | | | `picker_full_name` | string | да | | | `picker_display_name` | string | да | | | `store_id` | string | да | | | `store_name` | string | да | | | `completed_orders` | integer | да | | | `total_items` | integer | да | | | `added_items` | integer | да | | | `replacement_items` | integer | да | | | `removed_items` | integer | да | | | `missing_items` | integer | да | | | `weighted_items` | integer | да | | | `piece_items` | integer | да | | | `total_duration_seconds` | integer | да | | | `average_duration_seconds` | integer | да | | ```json { "properties": { "added_items": { "title": "Added Items", "type": "integer" }, "average_duration_seconds": { "title": "Average Duration Seconds", "type": "integer" }, "completed_orders": { "title": "Completed Orders", "type": "integer" }, "missing_items": { "title": "Missing Items", "type": "integer" }, "picker_display_name": { "title": "Picker Display Name", "type": "string" }, "picker_full_name": { "title": "Picker Full Name", "type": "string" }, "picker_id": { "title": "Picker Id", "type": "integer" }, "picker_login": { "title": "Picker Login", "type": "string" }, "piece_items": { "title": "Piece Items", "type": "integer" }, "removed_items": { "title": "Removed Items", "type": "integer" }, "replacement_items": { "title": "Replacement Items", "type": "integer" }, "store_id": { "title": "Store Id", "type": "string" }, "store_name": { "title": "Store Name", "type": "string" }, "total_duration_seconds": { "title": "Total Duration Seconds", "type": "integer" }, "total_items": { "title": "Total Items", "type": "integer" }, "weighted_items": { "title": "Weighted Items", "type": "integer" } }, "required": [ "picker_id", "picker_login", "picker_full_name", "picker_display_name", "store_id", "store_name", "completed_orders", "total_items", "added_items", "replacement_items", "removed_items", "missing_items", "weighted_items", "piece_items", "total_duration_seconds", "average_duration_seconds" ], "title": "PickerHistorySummarySchema", "type": "object" } ``` ### PickerLoginInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `login` | string | да | | | `password` | string (password) | да | | ```json { "properties": { "login": { "minLength": 1, "title": "Login", "type": "string" }, "password": { "format": "password", "minLength": 1, "title": "Password", "type": "string", "writeOnly": true } }, "required": [ "login", "password" ], "title": "PickerLoginInput", "type": "object" } ``` ### PickerLoginOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `access_token` | string | да | | | `refresh_token` | string | да | | | `expires_at` | string (date-time) | да | | | `user` | PickerUserSchema | да | | ```json { "properties": { "access_token": { "title": "Access Token", "type": "string" }, "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "refresh_token": { "title": "Refresh Token", "type": "string" }, "user": { "$ref": "#/components/schemas/PickerUserSchema" } }, "required": [ "access_token", "refresh_token", "expires_at", "user" ], "title": "PickerLoginOutput", "type": "object" } ``` ### PickerOrderSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `order_number` | string | да | | | `created_at` | string (date-time) | да | | | `is_express` | boolean | да | | | `absence_preference` | string | да | | | `customer_comment` | string | да | | | `customer_phone` | string / null | нет | | | `status` | string | да | | | `store` | PickerStoreSchema | да | | | `fulfillment_type` | string | да | | | `slot` | PickerSlotSchema | да | | ```json { "properties": { "absence_preference": { "title": "Absence Preference", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "customer_comment": { "title": "Customer Comment", "type": "string" }, "customer_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Customer Phone" }, "fulfillment_type": { "title": "Fulfillment Type", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "is_express": { "title": "Is Express", "type": "boolean" }, "order_number": { "title": "Order Number", "type": "string" }, "slot": { "$ref": "#/components/schemas/PickerSlotSchema" }, "status": { "title": "Status", "type": "string" }, "store": { "$ref": "#/components/schemas/PickerStoreSchema" } }, "required": [ "id", "order_number", "created_at", "is_express", "absence_preference", "customer_comment", "status", "store", "fulfillment_type", "slot" ], "title": "PickerOrderSchema", "type": "object" } ``` ### PickerRealtimeMetadataSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `realtime_recommended` | boolean | да | | | `socket_path` | string | да | | | `poll_after_seconds` | integer | да | | ```json { "properties": { "poll_after_seconds": { "title": "Poll After Seconds", "type": "integer" }, "realtime_recommended": { "title": "Realtime Recommended", "type": "boolean" }, "socket_path": { "title": "Socket Path", "type": "string" } }, "required": [ "realtime_recommended", "socket_path", "poll_after_seconds" ], "title": "PickerRealtimeMetadataSchema", "type": "object" } ``` ### PickerRefreshInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `refresh` | string (password) | да | | ```json { "properties": { "refresh": { "format": "password", "minLength": 1, "title": "Refresh", "type": "string", "writeOnly": true } }, "required": [ "refresh" ], "title": "PickerRefreshInput", "type": "object" } ``` ### PickerRefreshOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `access` | string | да | | | `refresh` | string | да | | ```json { "properties": { "access": { "title": "Access", "type": "string" }, "refresh": { "title": "Refresh", "type": "string" } }, "required": [ "access", "refresh" ], "title": "PickerRefreshOutput", "type": "object" } ``` ### PickerSlotSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `date` | string (date) | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | | `start_at` | string (date-time) | да | | | `end_at` | string (date-time) | да | | | `is_overdue` | boolean | да | | ```json { "properties": { "date": { "format": "date", "title": "Date", "type": "string" }, "end_at": { "format": "date-time", "title": "End At", "type": "string" }, "end_time": { "format": "time", "title": "End Time", "type": "string" }, "is_overdue": { "title": "Is Overdue", "type": "boolean" }, "start_at": { "format": "date-time", "title": "Start At", "type": "string" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" } }, "required": [ "date", "start_time", "end_time", "start_at", "end_at", "is_overdue" ], "title": "PickerSlotSchema", "type": "object" } ``` ### PickerStoreSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `name` | string | да | | ```json { "properties": { "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" } }, "required": [ "id", "name" ], "title": "PickerStoreSchema", "type": "object" } ``` ### PickerUserSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `login` | string | да | | | `full_name` | string | да | | | `role` | string | да | | | `status` | string | да | | | `access_scope` | string | да | | | `namespace` | string | да | | | `store` | PickerStoreSchema / null | нет | | | `stores` | массив<PickerStoreSchema> | нет | | ```json { "properties": { "access_scope": { "title": "Access Scope", "type": "string" }, "full_name": { "title": "Full Name", "type": "string" }, "id": { "title": "Id", "type": "string" }, "login": { "title": "Login", "type": "string" }, "namespace": { "title": "Namespace", "type": "string" }, "role": { "title": "Role", "type": "string" }, "status": { "title": "Status", "type": "string" }, "store": { "anyOf": [ { "$ref": "#/components/schemas/PickerStoreSchema" }, { "type": "null" } ] }, "stores": { "default": [], "items": { "$ref": "#/components/schemas/PickerStoreSchema" }, "title": "Stores", "type": "array" } }, "required": [ "id", "login", "full_name", "role", "status", "access_scope", "namespace" ], "title": "PickerUserSchema", "type": "object" } ``` ### PickingActionOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `session` | PickingSessionSchema | да | | | `status` | string | да | | | `message` | string / null | нет | | ```json { "properties": { "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message" }, "session": { "$ref": "#/components/schemas/PickingSessionSchema" }, "status": { "title": "Status", "type": "string" } }, "required": [ "session", "status" ], "title": "PickingActionOutput", "type": "object" } ``` ### PickingItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `name` | string | да | | | `category` | string | да | | | `image_asset` | string | да | | | `image_url` | string / null | нет | | | `barcode` | string | да | | | `description` | string | да | | | `price` | number / string | да | | | `required_quantity` | number / string | да | | | `confirmed_quantity` | number / string | да | | | `unit` | string | да | | | `kind` | string | да | | | `plu_code` | string / null | нет | | | `weight_tolerance_kg` | number / string / null | нет | | | `min_quantity_kg` | number / string / null | нет | | | `max_quantity_kg` | number / string / null | нет | | | `state` | string | да | | | `item_version` | integer | да | | | `source` | string | да | | | `replacement_options` | массив<ReplacementOptionSchema> | да | | | `selected_replacement` | ReplacementOptionSchema / null | нет | | | `missing_action` | string / null | нет | | | `is_added` | boolean | нет | | | `is_removed` | boolean | нет | | | `resolution_type` | string / null | нет | | ```json { "properties": { "barcode": { "title": "Barcode", "type": "string" }, "category": { "title": "Category", "type": "string" }, "confirmed_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Confirmed Quantity" }, "description": { "title": "Description", "type": "string" }, "id": { "title": "Id", "type": "string" }, "image_asset": { "title": "Image Asset", "type": "string" }, "image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image Url" }, "is_added": { "default": false, "title": "Is Added", "type": "boolean" }, "is_removed": { "default": false, "title": "Is Removed", "type": "boolean" }, "item_version": { "title": "Item Version", "type": "integer" }, "kind": { "title": "Kind", "type": "string" }, "max_quantity_kg": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Max Quantity Kg" }, "min_quantity_kg": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Min Quantity Kg" }, "missing_action": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Missing Action" }, "name": { "title": "Name", "type": "string" }, "plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Plu Code" }, "price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Price" }, "replacement_options": { "items": { "$ref": "#/components/schemas/ReplacementOptionSchema" }, "title": "Replacement Options", "type": "array" }, "required_quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Required Quantity" }, "resolution_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Resolution Type" }, "selected_replacement": { "anyOf": [ { "$ref": "#/components/schemas/ReplacementOptionSchema" }, { "type": "null" } ] }, "source": { "title": "Source", "type": "string" }, "state": { "title": "State", "type": "string" }, "unit": { "title": "Unit", "type": "string" }, "weight_tolerance_kg": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Weight Tolerance Kg" } }, "required": [ "id", "name", "category", "image_asset", "barcode", "description", "price", "required_quantity", "confirmed_quantity", "unit", "kind", "state", "item_version", "source", "replacement_options" ], "title": "PickingItemSchema", "type": "object" } ``` ### PickingResultItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `group` | string | да | | | `changes` | массив<string> | да | | | `reason` | PickingResultReasonSchema / null | нет | | | `original` | PickingResultPositionSchema / null | нет | | | `final` | PickingResultPositionSchema / null | нет | | ```json { "properties": { "changes": { "items": { "type": "string" }, "title": "Changes", "type": "array" }, "final": { "anyOf": [ { "$ref": "#/components/schemas/PickingResultPositionSchema" }, { "type": "null" } ] }, "group": { "title": "Group", "type": "string" }, "id": { "title": "Id", "type": "string" }, "original": { "anyOf": [ { "$ref": "#/components/schemas/PickingResultPositionSchema" }, { "type": "null" } ] }, "reason": { "anyOf": [ { "$ref": "#/components/schemas/PickingResultReasonSchema" }, { "type": "null" } ] } }, "required": [ "id", "group", "changes" ], "title": "PickingResultItemSchema", "type": "object" } ``` ### PickingResultPositionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `product_id` | string (uuid) / null | нет | | | `unit_id` | string (uuid) / null | нет | | | `name` | string | да | | | `image` | string / null | нет | | | `barcode` | string / null | нет | | | `plu_code` | string / null | нет | | | `unit` | string / null | нет | | | `weight` | number / string / null | нет | | | `quantity` | number / string | да | | | `unit_price` | number / string | да | | | `line_total` | number / string | да | | ```json { "properties": { "barcode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Barcode" }, "image": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image" }, "line_total": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Line Total" }, "name": { "title": "Name", "type": "string" }, "plu_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Plu Code" }, "product_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Product Id" }, "quantity": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Quantity" }, "unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Unit" }, "unit_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Unit Id" }, "unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Unit Price" }, "weight": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Weight" } }, "required": [ "name", "quantity", "unit_price", "line_total" ], "title": "PickingResultPositionSchema", "type": "object" } ``` ### PickingResultReasonSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `code` | string | да | | | `display` | string | да | | ```json { "properties": { "code": { "title": "Code", "type": "string" }, "display": { "title": "Display", "type": "string" } }, "required": [ "code", "display" ], "title": "PickingResultReasonSchema", "type": "object" } ``` ### PickingResultSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `state` | string | да | | | `completed_at` | string (date-time) / null | нет | | | `summary` | PickingResultSummarySchema | да | | | `items` | массив<PickingResultItemSchema> | да | | ```json { "properties": { "completed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Completed At" }, "items": { "items": { "$ref": "#/components/schemas/PickingResultItemSchema" }, "title": "Items", "type": "array" }, "state": { "title": "State", "type": "string" }, "summary": { "$ref": "#/components/schemas/PickingResultSummarySchema" } }, "required": [ "state", "summary", "items" ], "title": "PickingResultSchema", "type": "object" } ``` ### PickingResultSummarySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `removed` | integer | да | | | `changed` | integer | да | | | `unchanged` | integer | да | | ```json { "properties": { "changed": { "title": "Changed", "type": "integer" }, "removed": { "title": "Removed", "type": "integer" }, "unchanged": { "title": "Unchanged", "type": "integer" } }, "required": [ "removed", "changed", "unchanged" ], "title": "PickingResultSummarySchema", "type": "object" } ``` ### PickingSessionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `session_id` | integer | да | | | `order_id` | string | да | | | `order_number` | string | да | | | `is_express` | boolean | да | | | `current_item_index` | integer | да | | | `is_locked` | boolean | да | | | `is_cancelled` | boolean | да | | | `is_completed` | boolean | да | | | `session_status` | string | да | | | `version` | integer | да | | | `updated_at` | string (date-time) | да | | | `closure_source` | string | да | | | `cancellation_reason` | string / null | нет | | | `absence_preference` | string | да | | | `customer_comment` | string | да | | | `customer_phone` | string | да | | | `items` | массив<PickingItemSchema> | да | | | `max_added_items` | integer | да | | | `added_items_count` | integer | да | | | `payment_summary` | PaymentSummarySchema | да | | | `cancel_after_resolved_items` | integer / null | нет | | | `store` | PickerStoreSchema | да | | | `fulfillment_type` | string | да | | | `slot` | PickerSlotSchema / null | нет | | ```json { "properties": { "absence_preference": { "title": "Absence Preference", "type": "string" }, "added_items_count": { "title": "Added Items Count", "type": "integer" }, "cancel_after_resolved_items": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Cancel After Resolved Items" }, "cancellation_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cancellation Reason" }, "closure_source": { "title": "Closure Source", "type": "string" }, "current_item_index": { "title": "Current Item Index", "type": "integer" }, "customer_comment": { "title": "Customer Comment", "type": "string" }, "customer_phone": { "title": "Customer Phone", "type": "string" }, "fulfillment_type": { "title": "Fulfillment Type", "type": "string" }, "is_cancelled": { "title": "Is Cancelled", "type": "boolean" }, "is_completed": { "title": "Is Completed", "type": "boolean" }, "is_express": { "title": "Is Express", "type": "boolean" }, "is_locked": { "title": "Is Locked", "type": "boolean" }, "items": { "items": { "$ref": "#/components/schemas/PickingItemSchema" }, "title": "Items", "type": "array" }, "max_added_items": { "title": "Max Added Items", "type": "integer" }, "order_id": { "title": "Order Id", "type": "string" }, "order_number": { "title": "Order Number", "type": "string" }, "payment_summary": { "$ref": "#/components/schemas/PaymentSummarySchema" }, "session_id": { "title": "Session Id", "type": "integer" }, "session_status": { "title": "Session Status", "type": "string" }, "slot": { "anyOf": [ { "$ref": "#/components/schemas/PickerSlotSchema" }, { "type": "null" } ] }, "store": { "$ref": "#/components/schemas/PickerStoreSchema" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "version": { "title": "Version", "type": "integer" } }, "required": [ "session_id", "order_id", "order_number", "is_express", "current_item_index", "is_locked", "is_cancelled", "is_completed", "session_status", "version", "updated_at", "closure_source", "absence_preference", "customer_comment", "customer_phone", "items", "max_added_items", "added_items_count", "payment_summary", "store", "fulfillment_type" ], "title": "PickingSessionSchema", "type": "object" } ``` ### PickupInfoSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `date` | string (date) | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | ```json { "properties": { "date": { "format": "date", "title": "Date", "type": "string" }, "end_time": { "format": "time", "title": "End Time", "type": "string" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" } }, "required": [ "date", "start_time", "end_time" ], "title": "PickupInfoSchema", "type": "object" } ``` ### PickupInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `slot_id` | string (uuid) | да | | ```json { "properties": { "slot_id": { "format": "uuid", "title": "Slot Id", "type": "string" } }, "required": [ "slot_id" ], "title": "PickupInput", "type": "object" } ``` ### PickupPreferenceOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `min_order_amount` | number / string | да | | ```json { "properties": { "min_order_amount": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Min Order Amount" } }, "required": [ "min_order_amount" ], "title": "PickupPreferenceOutput", "type": "object" } ``` ### PickupSlotOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `type` | integer | да | | | `start_time` | string (time) | да | | | `end_time` | string (time) | да | | ```json { "properties": { "end_time": { "format": "time", "title": "End Time", "type": "string" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "start_time": { "format": "time", "title": "Start Time", "type": "string" }, "type": { "title": "Type", "type": "integer" } }, "required": [ "id", "type", "start_time", "end_time" ], "title": "PickupSlotOutput", "type": "object" } ``` ### PickupStoreOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `address` | string / null | нет | | | `location` | LocationOutput | да | | | `work_time` | string / null | нет | | | `contacts` | массив<string> / null | нет | | ```json { "properties": { "address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Address" }, "contacts": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Contacts" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "location": { "$ref": "#/components/schemas/LocationOutput" }, "name": { "title": "Name", "type": "string" }, "work_time": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Work Time" } }, "required": [ "id", "name", "location" ], "title": "PickupStoreOutput", "type": "object" } ``` ### PieceQuantityInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `quantity` | integer | да | Фактически собранное целое количество. | ```json { "properties": { "quantity": { "description": "Фактически собранное целое количество.", "examples": [ 2 ], "minimum": 1, "title": "Quantity", "type": "integer" } }, "required": [ "quantity" ], "title": "PieceQuantityInput", "type": "object" } ``` ### PolygonSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `type` | string | да | | | `coordinates` | массив<произвольный JSON> | да | | ```json { "properties": { "coordinates": { "items": {}, "title": "Coordinates", "type": "array" }, "type": { "title": "Type", "type": "string" } }, "required": [ "type", "coordinates" ], "title": "PolygonSchema", "type": "object" } ``` ### ProductDetailSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `category_id` | string (uuid) / null | нет | | | `category_uuid` | string (uuid) / null | нет | | | `category_name` | string / null | нет | | | `inventories` | массив<InventoryItemSchema> | да | | | `image` | DetailImageSchema / null | нет | | | `is_favorite` | boolean | нет | | | `description` | string / null | нет | | | `composition` | string / null | нет | | | `manufacturer` | string / null | нет | | | `made_country` | string / null | нет | | | `brand` | string / null | нет | | | `weight_based` | boolean | нет | | | `weight` | number / string | нет | | | `is_user_order_quantity_limit_enabled` | boolean | нет | | | `user_order_quantity_limit` | number / string | нет | | | `calories` | number / string / null | нет | | | `protein` | number / string / null | нет | | | `fats` | number / string / null | нет | | | `carbohydrates` | number / string / null | нет | | ```json { "properties": { "brand": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Brand" }, "calories": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Calories" }, "carbohydrates": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Carbohydrates" }, "category_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Category Id" }, "category_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Category Name" }, "category_uuid": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Category Uuid" }, "composition": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Composition" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "fats": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Fats" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/DetailImageSchema" }, { "type": "null" } ] }, "inventories": { "items": { "$ref": "#/components/schemas/InventoryItemSchema" }, "title": "Inventories", "type": "array" }, "is_favorite": { "default": false, "title": "Is Favorite", "type": "boolean" }, "is_user_order_quantity_limit_enabled": { "default": false, "title": "Is User Order Quantity Limit Enabled", "type": "boolean" }, "made_country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Made Country" }, "manufacturer": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Manufacturer" }, "name": { "title": "Name", "type": "string" }, "protein": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Protein" }, "user_order_quantity_limit": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "default": "0.000", "title": "User Order Quantity Limit" }, "weight": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "default": "0.000", "title": "Weight" }, "weight_based": { "default": false, "title": "Weight Based", "type": "boolean" } }, "required": [ "id", "name", "inventories" ], "title": "ProductDetailSchema", "type": "object" } ``` ### ProductListingSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `category_id` | string (uuid) / null | нет | | | `category_uuid` | string (uuid) / null | нет | | | `unit_id` | string (uuid) | да | | | `stock` | number / string | да | | | `user_order_quantity_limit` | number / string | нет | | | `is_user_order_quantity_limit_enabled` | boolean | нет | | | `unit_price` | number / string | да | | | `old_price` | number / string / null | нет | | | `discount_percent` | number / string / null | нет | | | `image` | ListingImageSchema / null | нет | | | `is_favorite` | boolean | нет | | ```json { "properties": { "category_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Category Id" }, "category_uuid": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Category Uuid" }, "discount_percent": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Discount Percent" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "image": { "anyOf": [ { "$ref": "#/components/schemas/ListingImageSchema" }, { "type": "null" } ] }, "is_favorite": { "default": false, "title": "Is Favorite", "type": "boolean" }, "is_user_order_quantity_limit_enabled": { "default": false, "title": "Is User Order Quantity Limit Enabled", "type": "boolean" }, "name": { "title": "Name", "type": "string" }, "old_price": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "title": "Old Price" }, "stock": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Stock" }, "unit_id": { "format": "uuid", "title": "Unit Id", "type": "string" }, "unit_price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Unit Price" }, "user_order_quantity_limit": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "default": "0.000", "title": "User Order Quantity Limit" } }, "required": [ "id", "name", "unit_id", "stock", "unit_price" ], "title": "ProductListingSchema", "type": "object" } ``` ### ProfileInputPatch | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `first_name` | string / null | нет | | | `last_name` | string / null | нет | | | `patronymic` | string / null | нет | | | `email` | string (email) / null | нет | | | `birth_date` | string (date) / null | нет | | | `gender` | Gender / null | нет | | | `marital_status` | MaritalStatus / null | нет | | ```json { "properties": { "birth_date": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Birth Date" }, "email": { "anyOf": [ { "format": "email", "type": "string" }, { "type": "null" } ], "title": "Email" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "First Name" }, "gender": { "anyOf": [ { "$ref": "#/components/schemas/Gender" }, { "type": "null" } ] }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Name" }, "marital_status": { "anyOf": [ { "$ref": "#/components/schemas/MaritalStatus" }, { "type": "null" } ] }, "patronymic": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Patronymic" } }, "title": "ProfileInputPatch", "type": "object" } ``` ### ProfileSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `first_name` | string | нет | | | `last_name` | string | нет | | | `patronymic` | string | нет | | | `email` | string | нет | | | `birth_date` | string (date) / null | нет | | | `gender` | string / null | нет | | | `marital_status` | string / null | нет | | ```json { "properties": { "birth_date": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Birth Date" }, "email": { "default": "", "title": "Email", "type": "string" }, "first_name": { "default": "", "title": "First Name", "type": "string" }, "gender": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Gender" }, "last_name": { "default": "", "title": "Last Name", "type": "string" }, "marital_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Marital Status" }, "patronymic": { "default": "", "title": "Patronymic", "type": "string" }, "phone": { "title": "Phone", "type": "string" } }, "required": [ "phone" ], "title": "ProfileSchema", "type": "object" } ``` ### PurchaseDetailSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `date` | string | да | | | `shop_name` | string | нет | | | `total` | string | нет | | | `bonus_accrual` | string | нет | | | `items_count` | integer | нет | | | `positions` | массив<PurchasePositionSchema> | нет | | | `discounts` | массив<PurchaseDiscountSchema> | нет | | | `source` | string | нет | | ```json { "properties": { "bonus_accrual": { "default": "0", "title": "Bonus Accrual", "type": "string" }, "date": { "title": "Date", "type": "string" }, "discounts": { "items": { "$ref": "#/components/schemas/PurchaseDiscountSchema" }, "title": "Discounts", "type": "array" }, "id": { "title": "Id", "type": "string" }, "items_count": { "default": 0, "title": "Items Count", "type": "integer" }, "positions": { "items": { "$ref": "#/components/schemas/PurchasePositionSchema" }, "title": "Positions", "type": "array" }, "shop_name": { "default": "", "title": "Shop Name", "type": "string" }, "source": { "default": "offline", "title": "Source", "type": "string" }, "total": { "default": "0", "title": "Total", "type": "string" } }, "required": [ "id", "date" ], "title": "PurchaseDetailSchema", "type": "object" } ``` ### PurchaseDiscountSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `name` | string | нет | | | `amount` | string | нет | | ```json { "properties": { "amount": { "default": "0", "title": "Amount", "type": "string" }, "name": { "default": "", "title": "Name", "type": "string" } }, "title": "PurchaseDiscountSchema", "type": "object" } ``` ### PurchasePositionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `name` | string | нет | | | `code` | string | нет | | | `quantity` | integer | нет | | | `price` | string | нет | | | `amount` | string | нет | | | `discount` | string | нет | | ```json { "properties": { "amount": { "default": "0", "title": "Amount", "type": "string" }, "code": { "default": "", "title": "Code", "type": "string" }, "discount": { "default": "0", "title": "Discount", "type": "string" }, "name": { "default": "", "title": "Name", "type": "string" }, "price": { "default": "0", "title": "Price", "type": "string" }, "quantity": { "default": 1, "title": "Quantity", "type": "integer" } }, "title": "PurchasePositionSchema", "type": "object" } ``` ### PurchaseSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `date` | string | да | | | `shop_name` | string | нет | | | `total` | string | нет | | | `bonus_accrual` | string | нет | | | `items_count` | integer | нет | | | `source` | string | нет | | ```json { "properties": { "bonus_accrual": { "default": "0", "title": "Bonus Accrual", "type": "string" }, "date": { "title": "Date", "type": "string" }, "id": { "title": "Id", "type": "string" }, "items_count": { "default": 0, "title": "Items Count", "type": "integer" }, "shop_name": { "default": "", "title": "Shop Name", "type": "string" }, "source": { "default": "offline", "title": "Source", "type": "string" }, "total": { "default": "0", "title": "Total", "type": "string" } }, "required": [ "id", "date" ], "title": "PurchaseSchema", "type": "object" } ``` ### PushDeviceInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `fcm_token` | string | да | | | `device_id` | string (uuid) | да | | | `platform` | "ios" / "android" | да | | | `app_kind` | "customer" / "picker" | нет | | | `environment` | "TEST" / "PRODUCTION" / null | нет | | | `app_version` | string | да | | | `build_number` | string | да | | ```json { "properties": { "app_kind": { "default": "customer", "enum": [ "customer", "picker" ], "title": "App Kind", "type": "string" }, "app_version": { "maxLength": 64, "minLength": 1, "title": "App Version", "type": "string" }, "build_number": { "maxLength": 64, "minLength": 1, "title": "Build Number", "type": "string" }, "device_id": { "format": "uuid", "title": "Device Id", "type": "string" }, "environment": { "anyOf": [ { "enum": [ "TEST", "PRODUCTION" ], "type": "string" }, { "type": "null" } ], "title": "Environment" }, "fcm_token": { "maxLength": 255, "minLength": 3, "title": "Fcm Token", "type": "string" }, "platform": { "enum": [ "ios", "android" ], "title": "Platform", "type": "string" } }, "required": [ "fcm_token", "device_id", "platform", "app_version", "build_number" ], "title": "PushDeviceInput", "type": "object" } ``` ### PushDeviceSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `device_id` | string (uuid) | да | | | `platform` | string | да | | | `app_version` | string | да | | | `build_number` | string | да | | | `app_kind` | string | да | | | `environment` | string | да | | | `updated_at` | string (date-time) | да | | ```json { "properties": { "app_kind": { "title": "App Kind", "type": "string" }, "app_version": { "title": "App Version", "type": "string" }, "build_number": { "title": "Build Number", "type": "string" }, "device_id": { "format": "uuid", "title": "Device Id", "type": "string" }, "environment": { "title": "Environment", "type": "string" }, "platform": { "title": "Platform", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" } }, "required": [ "device_id", "platform", "app_version", "build_number", "app_kind", "environment", "updated_at" ], "title": "PushDeviceSchema", "type": "object" } ``` ### QrcodeSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `original` | string | да | | | `listing` | string | да | | | `detail` | string | да | | ```json { "properties": { "detail": { "title": "Detail", "type": "string" }, "listing": { "title": "Listing", "type": "string" }, "original": { "title": "Original", "type": "string" } }, "required": [ "original", "listing", "detail" ], "title": "QrcodeSchema", "type": "object" } ``` ### RecoveryTokenSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `token` | string | да | | ```json { "properties": { "phone": { "title": "Phone", "type": "string" }, "token": { "title": "Token", "type": "string" } }, "required": [ "phone", "token" ], "title": "RecoveryTokenSchema", "type": "object" } ``` ### ReopenItemInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `reason` | string | да | `found_in_store` — товар найден после отсутствия; `recheck` — вернуть уже собранный товар на пересчёт. | ```json { "properties": { "reason": { "description": "`found_in_store` — товар найден после отсутствия; `recheck` — вернуть уже собранный товар на пересчёт.", "examples": [ "found_in_store", "recheck" ], "title": "Reason", "type": "string" } }, "required": [ "reason" ], "title": "ReopenItemInput", "type": "object" } ``` ### ReplacementOptionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string | да | | | `name` | string | да | | | `barcode` | string | да | | | `description` | string | да | | | `price` | number / string | да | | ```json { "properties": { "barcode": { "title": "Barcode", "type": "string" }, "description": { "title": "Description", "type": "string" }, "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "price": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Price" } }, "required": [ "id", "name", "barcode", "description", "price" ], "title": "ReplacementOptionSchema", "type": "object" } ``` ### ResolveClarificationInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `resolution` | string | да | Для удаления используется только значение `remove`. | ```json { "properties": { "resolution": { "description": "Для удаления используется только значение `remove`.", "examples": [ "remove" ], "title": "Resolution", "type": "string" } }, "required": [ "resolution" ], "title": "ResolveClarificationInput", "type": "object" } ``` ### ReverseGeocodeOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `address` | AddressSuggestionOutput / null | нет | | ```json { "properties": { "address": { "anyOf": [ { "$ref": "#/components/schemas/AddressSuggestionOutput" }, { "type": "null" } ] } }, "title": "ReverseGeocodeOutput", "type": "object" } ``` ### Schema ```json { "properties": {}, "title": "Schema", "type": "object" } ``` ### SendOTPInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | ```json { "properties": { "phone": { "maxLength": 15, "minLength": 8, "pattern": "^\\+[1-9][0-9]{7,14}$", "title": "Phone", "type": "string" } }, "required": [ "phone" ], "title": "SendOTPInput", "type": "object" } ``` ### StandardDeliveryOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `free_amount_threshold` | number / string | да | | ```json { "properties": { "free_amount_threshold": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Free Amount Threshold" } }, "required": [ "free_amount_threshold" ], "title": "StandardDeliveryOutput", "type": "object" } ``` ### StoreLocationOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `store` | StoreOutput | да | | | `location` | LocationOutput | да | | | `distance_km` | number | да | | ```json { "properties": { "distance_km": { "title": "Distance Km", "type": "number" }, "location": { "$ref": "#/components/schemas/LocationOutput" }, "store": { "$ref": "#/components/schemas/StoreOutput" } }, "required": [ "store", "location", "distance_km" ], "title": "StoreLocationOutput", "type": "object" } ``` ### StoreOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | string (uuid) | да | | | `name` | string | да | | | `address` | string / null | нет | | | `location` | LocationOutput | да | | ```json { "properties": { "address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Address" }, "id": { "format": "uuid", "title": "Id", "type": "string" }, "location": { "$ref": "#/components/schemas/LocationOutput" }, "name": { "title": "Name", "type": "string" } }, "required": [ "id", "name", "location" ], "title": "StoreOutput", "type": "object" } ``` ### StoryItemSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `image` | string | да | | | `type` | string | да | | | `reference_id` | string / null | нет | | ```json { "properties": { "image": { "title": "Image", "type": "string" }, "reference_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reference Id" }, "type": { "title": "Type", "type": "string" } }, "required": [ "image", "type" ], "title": "StoryItemSchema", "type": "object" } ``` ### StorySchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `image` | string | да | | | `created_at` | string (date-time) | да | | | `items` | массив<StoryItemSchema> | да | | ```json { "properties": { "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "image": { "title": "Image", "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/StoryItemSchema" }, "title": "Items", "type": "array" } }, "required": [ "image", "created_at", "items" ], "title": "StorySchema", "type": "object" } ``` ### SuccessResponse | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `message` | string | да | | | `data` | object / null | нет | | ```json { "properties": { "data": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Data" }, "message": { "title": "Message", "type": "string" } }, "required": [ "message" ], "title": "SuccessResponse", "type": "object" } ``` ### SupportContactSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `jivo_enabled_android` | boolean | нет | | | `jivo_enabled_ios` | boolean | нет | | | `jivo_channel_id` | string / null | нет | | | `jivo_android_app_key` | string / null | нет | | | `jivo_ios_app_key` | string / null | нет | | | `support_phone` | string / null | нет | | | `email` | string / null | нет | | | `site` | string / null | нет | | ```json { "properties": { "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Email" }, "jivo_android_app_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Jivo Android App Key" }, "jivo_channel_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Jivo Channel Id" }, "jivo_enabled_android": { "default": false, "title": "Jivo Enabled Android", "type": "boolean" }, "jivo_enabled_ios": { "default": false, "title": "Jivo Enabled Ios", "type": "boolean" }, "jivo_ios_app_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Jivo Ios App Key" }, "site": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Site" }, "support_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Support Phone" } }, "title": "SupportContactSchema", "type": "object" } ``` ### TierSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `id` | integer / null | нет | | | `label` | string | да | | | `is_active` | boolean | да | | | `order` | integer / null | нет | | | `boundary` | string / null | нет | | | `range_label` | string | нет | | | `description` | string | нет | | ```json { "properties": { "boundary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Boundary" }, "description": { "default": "", "title": "Description", "type": "string" }, "id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Id" }, "is_active": { "title": "Is Active", "type": "boolean" }, "label": { "title": "Label", "type": "string" }, "order": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Order" }, "range_label": { "default": "", "title": "Range Label", "type": "string" } }, "required": [ "label", "is_active" ], "title": "TierSchema", "type": "object" } ``` ### TokenObtainPairInputSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `password` | string | да | | | `phone` | string | да | | ```json { "additionalProperties": false, "properties": { "password": { "maxLength": 128, "title": "Пароль", "type": "string" }, "phone": { "maxLength": 15, "title": "Телефон", "type": "string" } }, "required": [ "password", "phone" ], "title": "TokenObtainPairInputSchema", "type": "object" } ``` ### TokenObtainPairOutputSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `refresh` | string | да | | | `access` | string | да | | ```json { "properties": { "access": { "title": "Access", "type": "string" }, "phone": { "maxLength": 15, "title": "Телефон", "type": "string" }, "refresh": { "title": "Refresh", "type": "string" } }, "required": [ "phone", "refresh", "access" ], "title": "TokenObtainPairOutputSchema", "type": "object" } ``` ### TokenRefreshInputSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `refresh` | string | да | | ```json { "properties": { "refresh": { "title": "Refresh", "type": "string" } }, "required": [ "refresh" ], "title": "TokenRefreshInputSchema", "type": "object" } ``` ### TokenRefreshOutputSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `refresh` | string | да | | | `access` | string / null | да | | ```json { "properties": { "access": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Access" }, "refresh": { "title": "Refresh", "type": "string" } }, "required": [ "refresh", "access" ], "title": "TokenRefreshOutputSchema", "type": "object" } ``` ### TokenVerifyInputSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `token` | string | да | | ```json { "properties": { "token": { "title": "Token", "type": "string" } }, "required": [ "token" ], "title": "TokenVerifyInputSchema", "type": "object" } ``` ### TransactionSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `action` | string | да | | | `before` | number / string | да | | | `amount` | number / string | да | | | `after` | number / string | да | | | `time` | string (date-time) | да | | | `reason` | string / null | нет | | ```json { "properties": { "action": { "title": "Action", "type": "string" }, "after": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "After" }, "amount": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Amount" }, "before": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Before" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reason" }, "time": { "format": "date-time", "title": "Time", "type": "string" } }, "required": [ "action", "before", "amount", "after", "time" ], "title": "TransactionSchema", "type": "object" } ``` ### UserAddressInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `address` | string | да | | | `location` | LocationInput | да | | | `apartment_number` | string / null | нет | | | `entrance` | string / null | нет | | | `floor` | string / null | нет | | | `intercom` | string / null | нет | | | `landmark` | string / null | нет | | ```json { "properties": { "address": { "title": "Address", "type": "string" }, "apartment_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Apartment Number" }, "entrance": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Entrance" }, "floor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Floor" }, "intercom": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Intercom" }, "landmark": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Landmark" }, "location": { "$ref": "#/components/schemas/LocationInput" } }, "required": [ "address", "location" ], "title": "UserAddressInput", "type": "object" } ``` ### UserPreferences | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `receive_mail` | boolean | нет | | | `receive_sms` | boolean | нет | | ```json { "properties": { "receive_mail": { "default": false, "title": "Receive Mail", "type": "boolean" }, "receive_sms": { "default": false, "title": "Receive Sms", "type": "boolean" } }, "title": "UserPreferences", "type": "object" } ``` ### UserPreferencesInputPatch | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `receive_mail` | boolean / null | нет | | | `receive_sms` | boolean / null | нет | | | `fcm_token` | string / null | нет | | ```json { "properties": { "fcm_token": { "anyOf": [ { "minLength": 3, "type": "string" }, { "type": "null" } ], "title": "Fcm Token" }, "receive_mail": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Receive Mail" }, "receive_sms": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Receive Sms" } }, "title": "UserPreferencesInputPatch", "type": "object" } ``` ### VerifyOTPInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `otp` | string | да | | ```json { "properties": { "otp": { "title": "Otp", "type": "string" }, "phone": { "maxLength": 15, "minLength": 8, "pattern": "^\\+[1-9][0-9]{7,14}$", "title": "Phone", "type": "string" } }, "required": [ "phone", "otp" ], "title": "VerifyOTPInput", "type": "object" } ``` ### VerifyOTPOutput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `phone` | string | да | | | `is_new_user` | boolean | да | | ```json { "properties": { "is_new_user": { "title": "Is New User", "type": "boolean" }, "phone": { "title": "Phone", "type": "string" } }, "required": [ "phone", "is_new_user" ], "title": "VerifyOTPOutput", "type": "object" } ``` ### WalletLinkPreviewSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `card_number_digits` | string | нет | | | `card_number` | string | нет | | | `status` | string | нет | | | `bonus_points` | integer | нет | | ```json { "properties": { "bonus_points": { "default": 0, "title": "Bonus Points", "type": "integer" }, "card_number": { "default": "", "title": "Card Number", "type": "string" }, "card_number_digits": { "default": "", "title": "Card Number Digits", "type": "string" }, "status": { "default": "", "title": "Status", "type": "string" } }, "title": "WalletLinkPreviewSchema", "type": "object" } ``` ### WalletManagementSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `is_blocked` | boolean | нет | | | `status_label` | string | нет | | | `blocked_reason` | string | нет | | | `active_account_id` | string | нет | | | `accounts` | массив<AccountSchema> | нет | | | `cards` | массив<CardSchema> | нет | | ```json { "properties": { "accounts": { "items": { "$ref": "#/components/schemas/AccountSchema" }, "title": "Accounts", "type": "array" }, "active_account_id": { "default": "", "title": "Active Account Id", "type": "string" }, "blocked_reason": { "default": "", "title": "Blocked Reason", "type": "string" }, "cards": { "items": { "$ref": "#/components/schemas/CardSchema" }, "title": "Cards", "type": "array" }, "is_blocked": { "default": false, "title": "Is Blocked", "type": "boolean" }, "status_label": { "default": "", "title": "Status Label", "type": "string" } }, "title": "WalletManagementSchema", "type": "object" } ``` ### WalletSchema | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `amount` | number / string | да | | | `points_balance` | string | нет | | | `card_number` | string / null | нет | | | `qrcode` | QrcodeSchema / null | нет | | | `status` | string | нет | | | `synced_at` | string (date-time) / null | нет | | | `last_error` | string / null | нет | | | `loyalty_status` | LoyaltyStatusSchema / null | нет | | | `management` | WalletManagementSchema / null | нет | | ```json { "properties": { "amount": { "anyOf": [ { "type": "number" }, { "type": "string" } ], "title": "Amount" }, "card_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Card Number" }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Error" }, "loyalty_status": { "anyOf": [ { "$ref": "#/components/schemas/LoyaltyStatusSchema" }, { "type": "null" } ] }, "management": { "anyOf": [ { "$ref": "#/components/schemas/WalletManagementSchema" }, { "type": "null" } ] }, "points_balance": { "default": "0", "title": "Points Balance", "type": "string" }, "qrcode": { "anyOf": [ { "$ref": "#/components/schemas/QrcodeSchema" }, { "type": "null" } ] }, "status": { "default": "pending", "title": "Status", "type": "string" }, "synced_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Synced At" } }, "required": [ "amount" ], "title": "WalletSchema", "type": "object" } ``` ### WalletWrapperSchema Wraps wallet in {"wallet": {...}} as mobile expects for mutations. | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `wallet` | WalletSchema | да | | ```json { "description": "Wraps wallet in {\"wallet\": {...}} as mobile expects for mutations.", "properties": { "wallet": { "$ref": "#/components/schemas/WalletSchema" } }, "required": [ "wallet" ], "title": "WalletWrapperSchema", "type": "object" } ``` ### WeightInput | Поле | Тип | Обязательное | Описание | |---|---|---|---| | `quantity_kg` | number / string | да | Фактический вес в килограммах, максимум три знака после запятой. | ```json { "properties": { "quantity_kg": { "anyOf": [ { "exclusiveMinimum": 0.0, "type": "number" }, { "type": "string" } ], "description": "Фактический вес в килограммах, максимум три знака после запятой.", "examples": [ "1.250" ], "title": "Quantity Kg" } }, "required": [ "quantity_kg" ], "title": "WeightInput", "type": "object" } ```