openapi: 3.0.1
info:
  title: UDS API
  version: 2.0.0
  description: >-
    В настоящем документе дается описание PARTNER API, предоставляемого UDS для
    партнеров. PARTNER API предназначен для разработчиков для интеграции UDS в
    системы. 


    PARTNER API предоставляет функциональные возможности, которые направлены на
    выполнение различных программных действий, в том числе:  

    * [получение информации о компании, ее
    настройкам](https://docs.uds.app/#tag/Settings/paths/~1settings/get); 

    * [получение списка клиентов
    компании](https://docs.uds.app/#tag/Customers/paths/~1customers/get); 

    * [получение информации о клиенте по его ID в
    компании](https://docs.uds.app/#tag/Customers/paths/~1customers~1{id}/get); 

    * [получение списка проведенных
    операций](https://docs.uds.app/#tag/Operations/paths/~1operations/get); 

    * [получение информации о проведенной операции по ID в
    компании](https://docs.uds.app/#tag/Operations/paths/~1operations~1{id}/get); 

    * [получение списка товаров/
    категорий](https://docs.uds.app/#tag/Goods/paths/~1goods/get); 

    * [получение информации о товаре/ категории по ID в
    компании](https://docs.uds.app/#tag/Goods/paths/~1goods~1{id}/get); 

    * [получение информации о заказе по ID в
    компании](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}/get); 

    * [поиск информации о клиенте по коду из приложения UDS App, номеру
    телефона,
    UID](https://docs.uds.app/#tag/Customers/paths/~1customers~1find/get); 

    * [создание
    операции](https://docs.uds.app/#tag/Operations/paths/~1operations/post); 

    * [возврат по
    операции](https://docs.uds.app/#tag/Operations/paths/~1operations~1{id}~1refund/post); 

    * [расчет максимального количества списываемых бонусов/ размера скидки для
    операции](https://docs.uds.app/#tag/Operations/paths/~1operations~1{id}~1refund/post); 

    * [начисление бонусных
    баллов](https://docs.uds.app/#tag/Operations/paths/~1operations~1reward/post); 

    * [создание
    ваучера](https://docs.uds.app/#tag/Operations/paths/~1operations~1voucher/post); 

    * [создание товара/
    категории](https://docs.uds.app/#tag/Goods/paths/~1goods/post); 

    * [редактирование товара/
    категории](https://docs.uds.app/#tag/Goods/paths/~1goods~1{id}/put); 

    * [удаление товара/
    категории](https://docs.uds.app/#tag/Goods/paths/~1goods~1{id}/delete); 

    * [редактирование
    заказа](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}/put); 

    * [изменение статуса
    заказа](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~1change-status/post); 

    * [закрытие
    заказа](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~1complete/post); 

    * [отмена
    заказа](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~1cancel/post); 

    *[генерирование кода клиента для
    заказа](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~1code/post); 

    * вебхуки по новым
    [операциям](https://docs.uds.app/#tag/Webhooks/paths/~1api~1v2~1events~1operation/post),
    [заказам](https://docs.uds.app/#tag/Webhooks/paths/~1api~1v2~1events~1goods-order/post),
    [клиентам](https://docs.uds.app/#tag/Webhooks/paths/~1api~1v2~1events~1participant/post); 

    *сегментация клиентов с помощью [тегов](https://docs.uds.app/#tag/Tags). 


    ## Инструкция по применению API 


    API предоставляет доступ к API-методам через пути URI. Чтобы использовать
    API, приложение должно иметь возможность сделать HTTPS-запрос и
    проанализировать ответ. API по определению не сохраняет данные о поступающих
    запросах, поэтому при каждом запросе клиент должен указывать все данные,
    необходимые для обработки запроса. Информация, необходимая для обработки
    запроса (бизнес-логика), представляется как часть строки URI и/или как
    содержимое тела запроса (для методов `POST`/`PUT`). Информация, необходимая
    для инфраструктуры обмена данными (например, обработка авторизации),
    представляется через пользовательские заголовки запроса. 


    Формат ответа - JSON (пожалуйста, проверьте спецификацию каждого метода
    относительно фактических объектных структур). Методы должны быть
    стандартными методами HTTP: `GET`, `POST`, `DELETE` или `PUT`. Partner API
    основан на открытых стандартах, поэтому можно использовать любой язык
    веб-разработки для доступа к API. 


    ### URI 


    Каждый API метод привязан к URI. Поэтому каждый запрос, отправленный на
    сервер, будет иметь пункт назначения следующего
    формата:`https://<base_uri>/<method_path>/<additional_qualifier>` 


    Основной URI для доступа к API - `https://api.uds.app/partner/v2`. 


    ### Заголовки запроса 


    Существует несколько заголовков, которые должны быть размещены в каждом
    запросе для удовлетворения требований транспортной инфраструктуры. 


    |Название|Формат (тип данных)|Описание| 

    |--- |--- |--- | 

    |Common Headers||| 

    |Accept|MIME Type|должен быть application/json| 

    |Accept-Charset|String|должен быть utf-8| 

    |Content-Type|MIME Type|должен быть application/json; применимый для метода
    POST| 

    |Custom Headers||| 

    |X-Origin-Request-Id|UUID|идентификатор запроса, используемого приложением;
    может быть опущен, но его использование рекомендуется| 

    |X-Request-Id|UUID|идентификатор запроса, используемого Partner API| 

    |X-Timestamp|ISO 8601 Date|дата и время создания запроса| 


    ### Типы данных 


    Существуют специальные пояснения о типах данных, используемых Partner API.
    Данные пояснения должны рассматриваться в качестве требований, так как их
    несоблюдение может привести к отсутствию функциональности, ошибкам или
    непредсказуемому поведению. 


    #### Числа и округление 


    Все числа API **должны** быть округлены с точностью до двух десятичных
    знаков до [ближайшего
    числа](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html#HALF_UP).
    Все ответы от сервера также должны следовать этому правилу; поэтому каждое
    поле, рассчитанное на стороне сервера, будет иметь не более двух десятичных
    цифр, а число будет округлено до ближайшего числа. При передаче баллов в
    `points` значение можно округлять только в меньшую сторону.  


    #### UUID 


    Partner API использует UUID 4 (или аналогичный) для идентификации каждого
    запроса, отправленного приложением. Клиенты должны устанавливать заголовки
    `X-Origin-Request-Id` в запросах и регистрировать (если возможно)`
    X-Request-Id`, установленный сервером, чтобы упростить отладку ошибок и
    получить надлежащую поддержку в случае ошибок. Должно быть гарантировано,
    что в этих идентификаторах не будет дублирования, по крайней мере, в течение
    разумного периода времени. Этот идентификатор не должен использоваться
    повторно для дальнейших запросов. 


    #### Временные отметки и даты 


    Для любой временной отметки или даты в Partner API используется формат [ISO
    8601](https://en.wikipedia.org/wiki/ISO_8601). 


    Временные отметки используются в: 

    * заголовке `X-Timestamp` 

    * поле для операции `dateCreated` 

    * других заголовках или полях, имеющих явное описание типов `Date` или `ISO
    8601 Date`. 


    ### Выполнение запросов 


    Клиенты должны устанавливать заголовки `X-Origin-Request-Id` со значением
    UUID и `X-Timestamp` со значением временной отметки по ISO-8601 для всех
    запросов. 

    В ответ сервер генерирует и устанавливает новый UUID в `X-Request-Id` и
    временную отметку в заголовке `X-Timestamp`. Если запрос содержит заголовок
    `X-Origin-Request-Id`, сервер устанавливает его в ответ. 


    **Пример:** 


    ``` 

    X-Origin-request-Id: 8c828ee7-e7b2-4631-a3e4-b18987962556 

    X-Timestamp: 2016-07-08T13:17:39,245+00:00 

    ``` 



    ### Коды ответов и ошибки 


    Partner API использует стандартные коды состояния HTTP для индикации
    успешности запроса. Некоторые ответы также могут содержать поле `errorCode`,
    которое содержит подробное объяснение возникшей ошибки. Ожидается, что все
    запросы, приведшие к состоянию ответа 4xx (ошибка на стороне клиента), не
    будут повторяться до тех пор, пока не будет найден источник ошибки. 


    #### Коды ответов 


    |Код ответа|Описание| 

    |--- |--- | 

    |`200`|Ok. Вызов API был успешным| 

    |`400`|Произошла ошибка проверки достоверности или бизнес-логики| 

    |`401`|Неверно указан ID компании или API Key.| 

    |`404`|Запрошенный объект, API-метод или путь не существует| 


    #### Объект ошибки 


    Когда вызов API-метода приводит к ошибке, ответ будет содержать объект
    ошибки JSON.  

    Для большинства ответов об ошибках этот объект выглядит следующим образом: 


    ```json 

    { 
      "errorCode": "<Short code for given error>",       // string 
      "message": "<Human readable error description>"    // string 
    } 

    ``` 


    > **Совет:** Язык описания ошибки зависит от HTTP-заголовка
    `Accept-Language`. 


    Для ошибок проверки достоверности формы существует специальный код ошибки -
    `badRequest`. Если объект ошибки имеет этот код ошибки, ответ также будет
    содержать свойство `errors` по следующей схеме: 


    ```json 

    { 
      "errorCode": "badRequest",                         // string 
      "message": "<Error description>",                  // string 
      "errors": [                                        // array 
        { 
          "errorCode": "nullalbe",                       // string 
          "message": "Property [points] cannot be null", // string 
          "field": "points",                             // string, optional 
          "value": null                                  // string, optional 
        }, 
        ... 
      ] 
    } 

    ``` 


    #### Распространенные коды ошибок 


    |Код ошибки|Описание| 

    |--- |--- | 

    |forbidden|Доступ запрещен, данный токен аутентификации не установлен или не
    имеет соответствующего разрешения| 

    |notFound|Объект не найден| 

    |badRequest|Произошли ошибки проверки достоверности формы. Например, это
    может быть несоответствие типов или ошибки нарушения ограничений| 


    #### Коды ошибок конкретного метода 


    Каждый вызов API-метода может вызвать ошибки, характерные для этого метода.
    Для получения подробной информации об этих ошибках, пожалуйста, ознакомьтесь
    с описанием метода в каждом пути API. 



    ## Типовой сценарий интеграции 


    1. Клиент скачивает приложение UDS App ([App
    Store](https://apps.apple.com/ru/app/game-united-discount-system/id954809132),
    [Google
    Play](https://play.google.com/store/apps/details?id=com.setinbox.game), [App
    Gallery](https://appgallery.huawei.com/#/app/C101533881)). 

    2. Показывает свой код на оплату из приложения кассиру. 

    3. Кассир вводит данный код в кассу и отображается информация о клиенте
    (Имя, Фамилия, сколько бонусных баллов накопил). 

    4. Кассир вводит сколько бонусов списать, 1 бонусный балл = 1 рубль. 

    5. Итоговая сумма счета понижается на количество списываемых бонусных
    баллов. Например, счет 100, списываем 30 бонусных баллов, итого клиент
    должен оплатить 70 рублей. 

    6. После оплаты в UDS отправляется информация о данной оплате.  

    7. Если по каким-то причинам чек был проведен без использования UDS, то
    реализовать [печать
    ваучера](https://docs.uds.app/#tag/Operations/paths/~1operations~1voucher/post)
    для накопления бонусов после покупки. 


    Далее детально разбирается каждый пункт с описанием вызываемых методов. 


    ### Требования 

    * API key (токен) и id компании, которые мы используем при интеграции с
    кассой, не должны жестко прописываться в коде, т.е. при настройке
    интеграционного модуля должна быть возможность прописать API key и id в
    какой-нибудь конфигурационный файл (config), т.к. они для каждой компании
    свои. 


    **Внимание!** 


    ``` 

    Если при отправке запросов возвращается 401 ошибка unauthorized, то API key
    или id компании введены неверно 

    ``` 


    * К интеграционному модулю должна прилагаться документация по настройке
    данного модуля, чтобы любой специалист кассовой системы смог настроить
    интеграцию в компании. 


    ### Предполагаемый бизнес процесс работы кассы при реализованной интеграции
    с UDS 


    1. После формирования итогового счета к оплате должна быть возможность ввода
    кода на оплату (из мобильного приложения UDS App) или номера телефона
    клиента в международном формате +79992221133. Если есть возможность, также
    реализовать ввод кода на оплату с помощью сканера QR кодов. 


    2. После ввода кода на оплату или номера телефона клиента, отображается
    информация о клиенте (`GET` запрос [Поиск
    клиента](https://docs.uds.app/#tag/Customers/paths/~1customers~1find/get)) 


    **Пример запроса** 


    ``` 

    curl -H 'Accept: application/json' \ 
           -H "X-Origin-Request-Id: $(uuidgen)" \ 
           -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \ 
           -u "<companyId>:<api_key>" 
           -X GET -s https://api.uds.app/partner/v2/customers/find?code=456123&exchangeCode=true&total=1000 
    ``` 

    Где `code` - код на оплату из мобильного приложения UDS, `total` -
    изначальная сумма счета (без скидок и списанных бонусных баллов). 


    **Ответ, основные поля** 

    * `uid` - идентификатор пользователя (по `uid` также можно производить поиск
    и оплату), 

    * `displayName` - имя и фамилия, 

    * `discountRate` - размер скидки, 

    * `points` - количество баллов, 

    * `maxPoints` - количество допустимых к списанию баллов, 

    * `code` - код на оплату для проведения следующей транзакции (данным
    пользователем) 


    Если при вводе номера телефона информация о клиенте не вернулась (ошибка
    notFound), это значит, что данного клиента еще нет в UDS. В таком случае
    требуется указать номер телефона при проведении операции (см. запрос
    [Проведение
    операции](https://docs.uds.app/#tag/Operations/paths/~1operations/post)):
    UDS позволяет проводить транзакции по незарегистрированным номерам
    телефонов. 


    3. Применяется скидка к заказу в размере `discountRate`. Если `discountRate`
    = 0, то это значит, что клиенту после оплаты будут начислены бонусы и скидка
    не нужна. 


    4. Вводится количество бонусных баллов для списания. Списание бонусов
    возможно при вводе кода из приложения. По номеру телефона бонусы можно
    списывать при условии, что в компании активна соответствующая настройка. По
    uid нельзя списывать бонусные баллы, только копить. 


    5. Итоговая сумма счета уменьшается на примененную скидку (если в компании
    включена скидка, а не cashback) и количество списываемых бонусных баллов. 


    6. После нажатия кнопки Оплатить (закрытия заказа), транзакция должна
    отправиться и в UDS (см. запрос [Проведенеие
    операции](https://docs.uds.app/#tag/Operations/paths/~1operations/post)). 


    **Пример запроса** 


    ``` 

    curl -H "accept: application/json" \ 
           -H "Content-Type: application/json" \ 
           -H "X-Origin-Request-Id: $(uuidgen)" \ 
           -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \ 
           -u "<companyId>:<api_key>" 
           -d '{ \ 
                  "code":"string", \ 
                  "nonce":"string", \ 
                  "cashier": { \ 
                         "externalId":"string", \ 
                         "name":"string" \ 
                  }, \ 
                  "receipt": { \ 
                         "total":100.0, \ 
                         "cash":50.0, \ 
                         "points":50.0, \ 
                         "number":"string" \ 
                  } \ 
           }' -X POST https://api.uds.app/partner/v2/operations 
    ``` 

    В запросе **Create operation** передаются следующие параметры: 


    * `code` (код для проведения транзакции, из ответа к запросу **Find
    customer**) или phone (номер телефона в международном формате через +7); 

    * `total` (изначальная сумма счета); 

    Если в заказе присутствуют сторонние скидки, тогда сумма `total` должна
    высчитываться по следующему правилу: `total = изначальная сумма счета -
    (сторонняя скидка* изначальная сумма счета)`. 

    Если в заказе присутствуют товары, которые не должны участвовать в системе
    UDS (т.е. на эти товары не распространяются скидки), тогда сумма total
    должна высчитываться по следующему правилу: `total = изначальная сумма счета
    - стоимость исключенных товаров`; 


    * `points` (количество списываемых баллов у клиента); 


    * `cash` (сумма, оплаченная деньгами: карта, наличными или комбинированная
    оплата); 


    * `externalId` и `name` - идентификатор и имя кассира, производивший оплату.
    В кассовой системе этим идентификатором может являться id или номер
    сотрудника; 


    * `number` (номер чека в кассовой системе); 


    При возвращении ошибки с UDS не проводить оплату в учетной системе до
    внесения корректировки / устранения ошибки и отправления повторного запроса,
    т.е. проводить оплату в учетной системе только после получения ответа
    success. Возможные ошибки описаны ниже. 


    **Внимание!** 


    ``` 

    Списываемые бонусные баллы не должны попадать в прибыль. Т.е по списанным
    баллам не должны взиматься налоги. 

    ``` 


    7. Если при оплате / закрытии заказа вернулась ошибка от UDS, то в
    интерфейсе учетной системы следует писать соответствующее описание: 


    |Статус|Код ошибки|Описание| 

    |--- |--- |--- | 

    |`400`|badRequest|Form validation errors occurred. Обратитесь, пожалуйста, к
    разработчикам учетной системы| 

    |`400`|invalidChecksum|Удалите, пожалуйста, в заказе посторонние скидки| 

    |`400`|insufficientFunds|Попытка списания бонусных баллов больше чем есть у
    клиента на балансе. Внесите, пожалуйста, корректировку| 

    |`400`|discountLimitExceed|Попытка списания бонусных баллов больше чем
    допустимо по маркетингу. Внесите, пожалуйста, корректировку| 

    |`401`|unauthorized|Неверно указан ID компании или API Key| 

    |`404`|notFound|Неверно введен код клиента или время жизни кода истекло.
    Введите, пожалуйста, новый код| 


    8. Реализовать возможность отмены оплаты, т.е. при отмене в учетной системе
    также должна происходить отмена транзакции в UDS. Запрос [POST
    /operations/{id}/refund](#tag/Operations/paths/~1operations~1{id}~1refund/post)
    , где: 

    * `id` - это `id` транзакции UDS, значение которой возвращается ответом
    после успешной проведенной транзакции. 

    * `partialAmount` - сумма, на которую производится отмена. Для реализации
    частичной отмены оплаты, необходимо в данном запросе передавать параметр
    `partialAmount`, иначе отмена будет полной. 


    **Пример запроса** 


    ``` 

    curl -H "accept: application/json" \ 
           -H "Content-Type: application/json" \ 
           -H "X-Origin-Request-Id: $(uuidgen)" \ 
           -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \ 
           -u "<companyId>:<api_key>" \ 
           -d '{"partialAmount":100.0}' \ 
           -X POST https://api.uds.app/partner/v2/operations/<id>/refund 
    ```
servers:
  - url: 'https://api.uds.app/partner/v2'
    description: API server
security:
  - Basic: []
tags:
  - name: Settings
    description: API настроек компании.
    x-displayName: Настройки
  - name: Operations
    description: API операций.
    x-displayName: Операции
  - name: Customers
    description: API клиентов.
    x-displayName: Клиенты
  - name: Webhooks
    x-displayName: Вебхуки
    description: >-
      API вебхуков. Вебхуки предоставляют способ доставки уведомлений на внешний
      веб-сервер всякий раз, когда в компании UDS происходят определенные
      события.  

       Вы можете настроить вебхуки для событий:  
       * Новая транзакция создана;  
       * Новый клиент зарегистрирован в компании;  
       * Новый заказ.
  - name: Goods
    description: >-
      API товаров. Методы Partner API позволяют настроить автоматическую
      загрузку товаров в UDS и обновление информации по загруженным товарам
      (цены, описание, количество, фотографии и т.п.) из Вашей учетной системы. 
    x-displayName: Товары
  - name: Goods Order
    description: API заказов.
    x-displayName: Заказы товаров
  - name: Image uploading
    description: >-
      API загрузки изображений товара.  


      ### Основные моменты 


      1. Отправьте запрос для получения ссылки для загрузки изображения.  


      2. Из полученного ответа загрузите изображение по ссылке `url`, используя
      метод из ответа `method`  и заголовки из `headers`.  


      3. После загрузки изображений создайте или обновите информацию по товару,
      передав список идентификаторов изображений `imageId` товара в параметре
      `photos`. 


      * При загрузке изображения в `headers` необходимо указывать `Content-Type:
      image/jpeg`, а также другие заголовки, указанные в ответе при запросе
      получения ссылки для загрузки изображения. 


      * Пункты 1 - 2 могут осуществляться несколько раз для загрузки нескольких
      изображений товара, т.е. формируется список идентификаторов изображений
      (максимум- 5 фотографий для одного товара).  


      * Если передать пустой список `photos: []` в объекте `data` при обновлении
      информации о товаре, то все изображения товара будут удалены.
    x-displayName: Загрузка изображений
  - name: Tags
    description: >-
      API тегов компании. Сегментация используется для разделения клиентской
      базы и выделения отдельных групп пользователей по интересующим критериям
      для дальнейшей оценки и работы с ними.
    x-displayName: Теги
  - name: FAQ
    description: >-



      ## Наиболее часто задаваемые вопросы по API 


      ### Где можно получить код (QR код) клиента для проведения оплат? 


      * Вы можете установить себе мобильное приложение UDS App ([App
      Store](https://apps.apple.com/ru/app/game-united-discount-system/id954809132),
      [Google
      Play](https://play.google.com/store/apps/details?id=com.setinbox.game),
      [App Gallery](https://appgallery.huawei.com/#/app/C101533881)),
      зарегистрироваться в нем. Для генерации кода нажмите на карту в
      приложении. 


      ### Какая длительность жизни кода клиента из приложения? 


      * Время жизни кода 45 минут. Досрочно действие кода прерывается при
      проведении оплаты по нему. 


      ### Как получить код с увеличенным сроком действия?  


      * Необходимо при запросе [customer ->
      find](https://docs.uds.app/#tag/Customers/paths/~1customers~1find/get)
      добавить параметр `exchangeCode=true`, тогда в ответе с информацией о
      клиенте в поле code придет длинный код, по которому можно списывать баллы
      в течение 24 часов. 


      ### Как можно получить тестовый доступ к API? 


      * Напишите нам на почту [support@uds.app](mailto:support@uds.app) для
      предоставления тестовой лицензии. 


      ### Где можно найти API Key и company ID? 


      * ID компании и API Key можно скопировать в настройках UDS Бизнес в окне
      [Интеграция](https://admin.uds.app/admin/options/integration). 


      ### Можно ли использовать один API Key и ID компании на нескольких
      кассах? 


      * У каждой компании только одни данные для интеграции в UDS, поэтому на
      всех кассах указываются один API Key и ID компании. Идентификация по
      кассам/ филиалам/ сотрудникам осуществляется передачей параметров в поле
      `cashier`. 


      ### Можно ли менять процент начисляемых баллов на покупку клиентов по
      API? 


      * Нет, начисление бонусных баллов зависит от параметра `cash` и от
      бонусных настроек статусов клиентов в компании. Для ограничения
      начисляемых баллов можно передать параметр `skipLoyaltyTotal` - сумму
      счета, на которую не должны начисляться бонусные баллы. 


      ### Можно ли списывать бонусные баллы по номеру телефона или по UID
      клиента для оплаты? 


      * По номеру телефона бонусы можно списывать при условии, что в компании
      активна соответствующая настройка. По uid клиента нельзя списывать
      бонусные баллы.  


      ### Можно ли округлять бонусные баллы в большую сторону при создании
      операции? 


      * Нет, бонусные баллы можно округлять только в меньшую сторону. 


      ### Что такое внешний идентификатор сотрудника? 


      * Для идентификации сотрудника, который проводил оплату на кассе по UDS,
      необходимо отправлять индивидуальный номер сотрудника - его идентификатор.
      Этот идентификатор можно установить в UDS Бизнес для каждого сотрудника в
      соответствующем поле - внешнем идентификаторе. 


      ### Как настроить вебхук? 


      * Вебхук настраивается в настройках UDS Бизнес в окне
      [Интеграция](https://admin.uds.app/admin/options/integration). Для
      уведомлении о событии необходимо указать адрес Вашего сервера, куда будет
      отправляться вебхук. 


      ### Почему приходят несколько вебхуков с одинаковой информацией?  


      * Вебхук повторяется три раза с интервалом в 5 минут, если по каким-то
      причинам он не был доставлен или не был получен 200-й ответ в течение 5
      секунд. 



      ## Список возвращаемых ошибок по API 


      ###  


      |Статус|Код ошибки|Описание| 

      |--- |--- |--- | 

      |`400`|badRequest|Возникли ошибки при проведении валидации. Для получения
      подробной информации об ошибке обратитесь к полю `errors`. Возникает при
      передаче некорректного запроса.| 

      |`400`|invalidChecksum|Указанные значения в полях `cash`, `points` или
      `total` не соответствуют настройке `Способ предоставления скидки` в
      настройках [программы
      лояльности](https://admin.uds.app/admin/options/loyalty-program/bonus) в
      UDS Бизнес. Должно быть в случае начисления бонусных баллов `total= cash +
      points` . Например, total =100, cash  = 50,  points = 50. Для
      предоставления скидки `total = (cash + point) / (1 - процент скидки)`.
      Например, total =100, cash  = 50,  points = 40 (для скидки в 10%). Ошибки
      часто возникают при применении сторонних скидок, неверном округлении. В
      случае печати ваучера ошибка может возникать из-за способа предоставления
      скидки не `CHARGE_SCORES`; размер начисляемых бонусных баллов равен `0.0`;
      поле `total` меньше или равно`skipLoyaltyTotal`. | 

      |`400`|withdrawNotPermitted|В запросе было указано значение в поле
      `participant -> uid`, при этом значение в поле `points` не равно `0.0`.
      Ошибка может возникать, если передавать вместе с параметром `code` в
      запросе на проведение операции со списанием баллов параметров `uid` или
      `phone`. Необходимо удалить параметры `uid` и `phone` в запросе и оставить
      только `code`. Ошибка может также возникать при попытке списать бонусы по
      uid или номеру телефона (если в компании такая возможность отсутствует).
      Необходимо внести корректировку в сумму баллов и указать `0.0`.  | 

      |`400`|insufficientFunds|Значение в поле `points`превышает доступное
      количество бонусных баллов на счете клиента. Ошибка в основном возникает
      при неверном округлении, округлять баллы можно только в меньшую сторону.| 

      |`400`|discountLimitExceed|Соотношение `points / total` больше, чем
      указано в настройках UDS.Компания может установить максимальный процент от
      чека, на который допускается списать бонусы. Посмотреть допустимый процент
      списания баллов можно в настройках UDS Бизнес в [Программа
      лояльности](https://admin.uds.app/admin/options/loyalty-program/bonus) в
      графе `Какой процент счета можно оплатить баллами`. | 

      |`400`|purchaseByPhoneDisabled|Проведение операции по номеру телефона не
      разрешено настройками UDS. Необходимо включить настройку [оплаты по номеру
      телефона](https://admin.uds.app/admin/options/loyalty-program/special) в
      настройках UDS Бизнес.| 

      |`400`|participantIsBlocked|Клиент в данной компании заблокирован. | 

      |`400`|goods.nodeIndex.invalid|Для создания категории указание
      идентификатора `nodeId` недопустимо. Необходимо проверить актуальный ID
      категории, в которую создается товар или категория. | 

      |`400`|goods.limitIsReached|Превышен лимит количества товаров. Лимит
      товаров можно проверить в разделе [Товары и
      услуги](https://admin.uds.app/admin/price-list) в UDS Бизнес| 

      |`401`|unauthorized|Неверно указан ID компании или API Key. Необходимо
      проверить актуальность API Key и ID компании на странице
      [Интеграция](https://admin.uds.app/admin/options/integration) и
      корректность аутентификации Basic. | 

      |`404`|notFound|Пользователь с данным кодом на оплату или идентификатором
      не найден. В основном, возникает при  неверно введенном коде клиента или
      время жизни кода истекло. Также возникает при запросе
      [find](https://docs.uds.app/#tag/Customers/paths/~1customers~1find/get) по
      номеру телефона, если такой номер в системе не зарегистрирован и по нему в
      компании ранее не было операций.| 



      ## Список последних изменений  
       В разделе перечислены изменения и расширения возможностей существующих методов, а также новые методы.  

      ### 2025-09-22  


      * Добавлены новые объекты `offerPrice`, `skipLoyalty` в модель
      [заказа](https://docs.uds.app/#tag/Goods-Order) и в вебхук [нового
      заказа](https://docs.uds.app/#tag/Webhooks/paths/~1api~1v2~1events~1goods-order/post).  


      ### 2025-07-21  


      * Добавлен новый объект `usePointsByPhone` в модель [настроек
      компании](https://docs.uds.app/#tag/Settings).  


      ### 2025-02-03  


      * Добавлены новые методы
      [получения](https://docs.uds.app/#tag/Goods/paths/~1goods~1external~1{externalId}/get),
      [редактирования](https://docs.uds.app/#tag/Goods/paths/~1goods~1external~1{externalId}/put)
      и
      [удаление](https://docs.uds.app/#tag/Goods/paths/~1goods~1external~1{externalId}/delete)
      товара по внешнему идентификатору в компании. 


      ### 2024-08-26  


      * Добавлены новые объекты `cashSpent`, `savedFunds`, `invitedCount`,
      `effectiveInvitedCount`, `operationsCount`,  `fullRefundsCount`, `note`,
      `pointsExpireIn` в модель
      [клиента](https://docs.uds.app/#tag/Customers).   


      ### 2024-06-24   


      * Добавлен новый объект `certificatePoints` в модель
      [операции](https://docs.uds.app/#tag/Operations)   


      ### 2024-03-11  


      * Добавлен новый объект `nodeId` в модель
      [товара](https://docs.uds.app/#tag/Goods)  


      ### 2024-02-19  


      * Добавлен новый метод [отмены заказа в
      компании](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~1cancel/post). 


      * Добавлен новый метод [изменения статуса заказа в
      компании](https://docs.uds.app/#tag/Goods-Order/paths/~1goods-orders~1{id}~change-satus/post). 


      * Добавлен новый объект `orderStatus` в модель
      [заказа](https://docs.uds.app/#tag/Goods-Order).   


      ### 2023-10-09  


      * Добавлены новые объекты `vatCode` и `paymentSubject` в модель
      [товара](https://docs.uds.app/#tag/Goods) для возможности указания и
      получения информации по НДС (`NO_NDS`, `NDS_0`, `NDS_10`, `NDS_20`,
      `NDS_10_110`, `NDS_20_120`) и типу признака предмета расчета (`COMMODITY`
      - Товар, `EXCISE` - Подакцизный товар, `SERVICE` - Услуга). 


      ### 2023-04-24 


      * Добавлен новый объект `unredeemableTotal` - сумма чека, на которую
      запрещено списывать бонусы, в метод [поиска
      клиента](https://docs.uds.app/#tag/Customers/paths/~1customers~1find/get),
      [расчета
      скидок](https://docs.uds.app/#tag/Operations/paths/~1operations~1calc/post)
      и в
      [операцию](https://docs.uds.app/#tag/Operations/paths/~1operations/post).  


      * Добавлены новые объекты `maxScoresDiscount` и `certificatePoints` в
      модель
      [PurchaseCalc](https://docs.uds.app/#tag/Operations/paths/~1operations~1calc/post).  


      ### 2022-07-18 


      * Добавлен новый объект `maxScoresDiscount` в модель
      [клиента](https://docs.uds.app/#tag/Customers).  


      ### 2022-04-25 


      * Добавлены новые методы [получения списков тегов в
      компании](https://docs.uds.app/#tag/Tags/paths/~1tags/get),
      [получения](https://docs.uds.app/#tag/Customers/paths/~1customers~1{id}~1tags/get)
      и
      [установки](https://docs.uds.app/#tag/Customers/paths/~1customers~1{id}~1tags/post)
      тегов клиенту.  


      * Добавлен новый объект `tags` в модель
      [клиента](https://docs.uds.app/#tag/Customers) и в модель [проведения
      операции](https://docs.uds.app/#tag/Operations/paths/~1operations/post).   


      ### 2022-04-11 


      * Добавлены новые объекты `measurement`, `minQuantity` и `increment` в
      модель [товара](https://docs.uds.app/#tag/Goods) для возможности получения
      и создания товаров с различными единицами измерения и минимальным
      количеством для заказа. 


      ### 2022-03-28 


      * Добавлен новый объект `email` в модель
      [клиента](https://docs.uds.app/#tag/Customers).   


      ### 2021-11-29 


      * Добавлен новый объект `channelName` в модель
      [клиента](https://docs.uds.app/#tag/Customers) для получения названия
      источника трафика, по которому клиент вступил в компанию.   


      ### 2021-09-21  


      * Добавлены новые объекты `photos` и `imageUrls` в модель
      [товара](https://docs.uds.app/#tag/Goods) для возможности указания и
      получения информации по изображениям товара.  


      * Добавлен новый метод `image-upload-url` для получения ссылки для
      загрузки изображения товара. Получите ссылку для загрузки изображения,
      загрузите изображение по url из ответа в параметре `url` и после загрузки
      создайте или обновите информацию по товару, передав список идентификаторов
      изображений `imageId` товара в параметре `photos`.  


      ### 2021-08-23  


      * Добавлен новый объект `inventory` с вложенностью `inStock` в модель
      [товара](https://docs.uds.app/#tag/Goods) для возможности указания и
      получения информации по остаткам.  


      * Добавлен новый параметр `cursor` для замены параметра `offset` для
      постраничной пагинации [списка
      операций](https://docs.uds.app/#tag/Operations/paths/~1operations/get).
      Для получения списка операций нужно сделать первый запрос без указания
      `cursor`, затем следующий запрос сделать с указанием вернувшегося значения
      `cursor` для предыдущего запроса. Если в ответе возвращается `cursor =
      null`, то последующие данные по операциям отсутствуют.  


      ### 2021-07-12  


      * Добавлен новый метод [получения
      ваучера](https://docs.uds.app/#tag/Operations/paths/~1operations~1voucher/post)
      для начисления бонусов. Метод позволяет напечатать на чеке код ваучера (qr
      код) и клиент, отсканировав его в приложении UDS App, сможет получить
      баллы за покупку.  


      * Для оптимизации скорости работы запроса получения [списка
      операции](https://docs.uds.app/#tag/Operations/paths/~1operations/get) в
      `total` возвращается всегда `0`. 


      ### 2021-02-08  


      * Добавлен новый объект `silent` для [начисления бонусов
      пользователю](https://docs.uds.app/#tag/Operations/paths/~1operations~1reward/post).
      Если передать `silent = True`, то клиенту не будет отправлено
      пуш-уведомление. 
    x-displayName: FAQ
paths:
  /settings:
    get:
      summary: Получение настроек компании
      tags:
        - Settings
      description: >-
        Получение настроек компании, способа предоставления скидки и промокода
        для вступления в компанию. Способ предоставления скидки настраивается в
        [UDS](https://admin.uds.app/admin/options/loyalty-program/bonus).
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/settings
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/settings";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/settings',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/settings',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      parameters:
        - $ref: '#/components/parameters/x-request-id'
        - $ref: '#/components/parameters/x-timestamp'
      responses:
        '200':
          description: Настройки.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanySettings'
  /customers:
    get:
      summary: Список клиентов
      tags:
        - Customers
      description: 'Получение списка клиентов компании, начиная с новых.'
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/customers?max=10&offset=0
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/customers?max=10&offset=0";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/customers?max=10&offset=0',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/customers?max=10&offset=0',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      parameters:
        - $ref: '#/components/parameters/max'
        - $ref: '#/components/parameters/offset'
        - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Клиенты.
          content:
            application/json:
              schema:
                type: object
                properties:
                  rows:
                    type: array
                    description: Список клиентов.
                    items:
                      $ref: '#/components/schemas/Customer'
  /customers/find:
    get:
      summary: Поиск клиента
      tags:
        - Customers
      description: >-
        Поиск клиента по коду на оплату, номеру телефона или UID. Важно!
        Необходимо передавать только один из параметров: или код клиента, или
        номер телефона, или UID.
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/customers/find?code=456123&phone=%2b71234567898&uid=23684cea-ca50-4c5c-b399-eb473e85b5ad
        - lang: PHP
          source: >
            $date = new DateTime();

            $url =
            "https://api.uds.app/partner/v2/customers/find?code=456123&phone=%2b71234567898&uid=23684cea-ca50-4c5c-b399-eb473e85b5ad";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/customers/find?code=456123&phone=%2b71234567898&uid=23684cea-ca50-4c5c-b399-eb473e85b5ad',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/customers/find?code=456123&phone=%2b71234567898&uid=23684cea-ca50-4c5c-b399-eb473e85b5ad',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      parameters:
        - name: code
          in: query
          schema:
            type: string
          description: Код на оплату.
        - name: phone
          in: query
          schema:
            type: string
          description: >-
            Номер телефона в формате E164, кодированный в URL. Например,
            +79123456789 нужно передать, как %2b79123456789.
        - name: uid
          in: query
          schema:
            type: string
          description: Идентификатор клиента в UDS (UID).
        - name: exchangeCode
          in: query
          schema:
            type: boolean
          description: >-
            Если указан, то в ответе будет отправлен новый долгоживущий код на
            оплату
        - name: total
          in: query
          description: Общая сумма счета в денежных единицах
          schema:
            type: number
        - name: skipLoyaltyTotal
          in: query
          description: >-
            Часть суммы счета, на которую не начисляется кешбэк и на которую не
            распространяется скидка (в денежных единицах).
          schema:
            type: number
        - name: unredeemableTotal
          in: query
          description: 'Часть суммы счета, которую нельзя погасить баллами.'
          schema:
            type: number
      responses:
        '200':
          description: Клиент.
          content:
            application/json:
              schema:
                properties:
                  user:
                    $ref: '#/components/schemas/CustomerDetail'
                  code:
                    type: string
                    description: >-
                      Новый долгоживущий код на оплату, если был запрошен
                      параметр `exchangeCode`.
                    nullable: true
                  type:
                    $ref: '#/components/schemas/PurchaseTokenAction'
                  purchase:
                    type: object
                    nullable: true
                    allOf:
                      - $ref: '#/components/schemas/PurchaseCalc'
        '404':
          $ref: '#/components/responses/NotFound'
  '/customers/{id}':
    parameters:
      - $ref: '#/components/parameters/id'
    get:
      summary: Получение информации о клиенте
      tags:
        - Customers
      description: Получение информации о клиенте по ID в компании.
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/customers/<id>
        - lang: PHP
          source: >
            $date = new DateTime();

            $customerId = 123;

            $url = "https://api.uds.app/partner/v2/customers/".$customerId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            customerId = 123
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/customers/' + customerId,
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var customerId = 123;

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/customers/' + customerId,
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: Клиент.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerDetail'
        '404':
          $ref: '#/components/responses/NotFound'
  '/customers/{id}/tags':
    parameters:
      - $ref: '#/components/parameters/id'
    get:
      summary: Получение списка тегов клиента
      tags:
        - Customers
      description: Получение списока тегов клиента по ID в компании.
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/customers/<id>/tags
        - lang: PHP
          source: >
            $date = new DateTime();

            $customerId = 123;

            $url =
            "https://api.uds.app/partner/v2/customers/".$customerId."/tags";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            customerId = 123
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/customers/' + customerId + '/tags',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var customerId = 123;

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/customers/' + customerId + '/tags',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: Список тегов.
          content:
            application/json:
              schema:
                type: object
                properties:
                  rows:
                    type: array
                    items:
                      $ref: '#/components/schemas/TagModel'
                    description: Список тегов.
                  total:
                    type: integer
                    description: Количество тегов.
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      summary: Установка тегов клиенту
      tags:
        - Customers
      description: Установка тегов клиенту путем передачи идентификаторов тегов компании.
      x-codeSamples:
        - lang: curl
          source: >
            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{"ids": [1, 2, 3]}' -X POST
            "https://api.uds.app/partner/v2/customers/<id>/tags"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/customers/<id>/tags";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array("ids", array(1, 2, 3))  // ids of tags
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/customers/<id>/tags',
                body=json.dumps({'ids': [1, 2, 3]}),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/customers/<id>/tags',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({'ids': [1, 2, 3]});

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ids:
                  description: Список устанавливаемых идентификаторов (ids) тегов компании.
                  type: array
                  items:
                    $ref: '#/components/schemas/TagId'
              required:
                - ids
      responses:
        '200':
          description: Список установленных тегов.
          content:
            application/json:
              schema:
                type: object
                properties:
                  rows:
                    description: Список тегов.
                    type: array
                    items:
                      $ref: '#/components/schemas/TagModel'
                  total:
                    type: integer
                    description: Количество тегов.
        '404':
          $ref: '#/components/responses/NotFound'
  /operations:
    get:
      summary: Список операций
      tags:
        - Operations
      description: 'Возвращается список операций компании, начиная с последней.'
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X GET -s https://api.uds.app/partner/v2/operations?max=10
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/operations?max=10";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );



            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/operations?max=10',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations?max=10',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      parameters:
        - $ref: '#/components/parameters/max'
        - name: offset
          in: query
          description: >-
            Количество строк, которое будет пропущено перед выводом результата.
            Устаревший параметр. Используйте параметр cursor
          deprecated: true
          schema:
            type: integer
            default: 0
            maximum: 10000
        - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Список операций.
          content:
            application/json:
              schema:
                type: object
                properties:
                  rows:
                    $ref: '#/components/schemas/Operation'
                  total:
                    deprecated: true
                    type: integer
                  cursor:
                    description: Используйте это значение для следующего запроса
                    type: string
    post:
      summary: Проведение операции
      tags:
        - Operations
      description: >-
        Проведение операции в UDS. После успешного завершения операция
        отобразится в списке операций в UDS, а администратор и клиент получат
        push-уведомление о покупке. 


        ### Способ предоставления скидки 


        Зависит от выбранной компанией политики (поле `baseDiscountPolicy`) в
        настройках компании. Допустимо два значения: 


        * `APPLY_DISCOUNT` - Понижать сумму счета: позволяет пользователю
        получать скидку в денежных единицах при проведении операции в размере,
        указанном в поле `participant.discountRate` в информации о
        пользователе; 


        * `CHARGE_SCORES` - Начислять бонусные баллы. При проведении операции
        пользователь получит бонусные баллы в размере, указанном в поле
        `participant.cashbackRate` в информации о пользователе; 


        ### Основные моменты 


        * Поля `total` и `points` должны быть введены со стороны интегрируемого
        приложения, но поле `cash` - вычислено при помощи запроса [Рассчитать
        информацию по
        операции](https://docs.uds.app/#tag/Operations/paths/~1operations~1calc/post). 


        * Пользователь может быть идентифицирован с помощью кода на оплату, с
        помощью uuid-идентификатора (`participant -> uid`), либо с помощью
        номера телефона (поле `participant -> phone`). В случае, если
        пользователь идентифицирован с помощью `uid`, то списание бонусных
        баллов не будет разрешено. В таком случае требуется указать значение
        `0.0` в поле `points`, иначе будет получен ответ `400` с кодом ошибки
        `withdrawNotPermitted`; 


        * Необходимо передавать только один из параметров: или код клиента, или
        номер телефона, или UID; 


        * Все числа должны быть округлены по правилу математического округления
        (`round half up`). Баллы `points` можно округлять только в меньшую
        сторону; 


        * Поля `cash`, `points` и `total` в обязательном порядке должны
        соответствовать настройке "Способ предоставления скидки" в настройках
        UDS 


        * Поле `nonce` - произвольная строка вида uuid, которая может быть
        использована только однажды. Рекомендуется указывать для исключения
        повторных операций в случае дублирования запроса.  


        * Поле `externalId` - идентификатор кассира, производивший оплату. Он
        может состоять только из латинских букв, цифр и символов `_`, `-`.  


        * Eсли касса передает информацию о кассире, проводившем оплату, то для
        просмотра подробной информации о кассире подключите модуль
        [Сотрудники](https://store.uds.app/modules/staff)  


        |Статус|Код ошибки|Описание| 

        |--- |--- |--- | 

        |`400`|badRequest|Возникли ошибки при проведении валидации. Для
        получения подробной информации об ошибке обратитесь к полю `errors`.| 

        |`400`|invalidChecksum|Указанные значения в полях `cash`, `points` или
        `total` не соответствуют настройке "Способ предоставления скидки" в
        настройках UDS.| 

        |`400`|withdrawNotPermitted|В запросе было указано значение в поле
        `participant -> uid`, при этом значение в поле `points` не равно
        `0.0`.| 

        |`400`|insufficientFunds|Значение в поле `points`превышает доступное
        количество бонусных баллов на счете клиента.| 

        |`400`|discountLimitExceed|Соотношение `points / total` больше, чем
        указано в настройках UDS.| 

        |`400`|purchaseByPhoneDisabled|Проведение операции по номеру телефона не
        разрешено настройками UDS.| 

        |`401`|unauthorized|Неверно указан ID компании или API Key| 

        |`404`|notFound|Пользователь с данным кодом на оплату или
        идентификатором не найден.|
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
              "code":"string", \
              "participant":{ \
                "uid":"string", \
                "phone":"string" \
              }, \
              "nonce":"string", \
              "cashier":{ \
                "externalId":"string", \
                "name":"string" \
              }, \
              "receipt":{ \
                "total":100.0, \
                "cash":50.0, \
                "points":50.0, \
                "number":"string", \
                "skipLoyaltyTotal": 50.0 \
              } \
            }' -X POST "https://api.uds.app/partner/v2/operations"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/operations";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'code' => 'string',
                'participant' => array(
                  'uid' => 'string',
                  'phone' => 'string'
                ),
                'nonce' => 'string',
                'cashier' => array(
                  'externalId' => 'string',
                  'name' => 'string'
                ),
                'receipt' => array(
                  'total' => 100.0,
                  'cash' => 50.0,
                  'points' => 50.0,
                  'number' => 'string',
                  'skipLoyaltyTotal' => 50.0
                )
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/operations',
                body=json.dumps({
                  'code': 'string',
                  'participant': {
                    'uid': 'string',
                    'phone': 'string'
                  },
                  'nonce': 'string',
                  'cashier': {
                    'extrnalId': 'string',
                    'name': 'string'
                  },
                  'receipt': {
                    'total': 100.0,
                    'cash': 50.0,
                    'points': 50.0,
                    'number': 'string',
                    'skipLoyaltyTotal': 50.0
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'code': 'string',
              'participant': {
                'uid': 'string',
                'phone': 'string'
              },
              'nonce': 'string',
              'cashier': {
                'extrnalId': 'string',
                'name': 'string'
              },
              'receipt': {
                'total': 100.0,
                'cash': 50.0,
                'points': 50.0,
                'number': 'string',
                'skipLoyaltyTotal': 50.0
              }
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOperation'
      responses:
        '200':
          description: Операция.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Operation'
              example:
                id: 1
                dateCreated: '2018-09-21T07:48:22.771Z'
                action: PURCHASE
                state: NORMAL
                customer:
                  id: 0
                  uid: abcdefgh-0000-1111-2222-ijklmnopqrst
                  displayName: Customer
                  membershipTier:
                    uid: vip
                    name: VIP
                    rate: 15
                    conditions:
                      totalCashSpent:
                        target: 100
                cashier:
                  id: 0
                  displayName: Cashier
                branch:
                  id: 0
                  displayName: Branch
                points: 0
                certificatePoints: 0
                cash: 100
                total: 100
                origin:
                  id: 0
  '/operations/{id}':
    parameters:
      - $ref: '#/components/parameters/id'
    get:
      summary: Получение информации об операции
      tags:
        - Operations
      description: Получение информации об операции по ID.
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/operations/<id>
        - lang: PHP
          source: >
            $date = new DateTime();

            $customerId = 123;

            $url = "https://api.uds.app/partner/v2/operations/".$customerId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );



            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            customerId = 123
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/operations/' + customerId,
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var customerId = 123;

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations/' + customerId,
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: Операция.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Operation'
              example:
                oneOf:
                  - id: 1 (Purchase operation)
                    dateCreated: '2018-09-21T07:48:22.771Z'
                    action: PURCHASE
                    state: NORMAL
                    customer:
                      id: 0
                      uid: abcdefgh-0000-1111-2222-ijklmnopqrst
                      displayName: Customer
                      membershipTier:
                        uid: vip
                        name: VIP
                        rate: 15
                        conditions:
                          totalCashSpent:
                            target: 100
                    cashier:
                      id: 0
                      displayName: Cashier
                    branch:
                      id: 0
                      displayName: Branch
                    points: 0
                    cash: 100
                    total: 100
                    origin:
                      id: 0
  /operations/voucher:
    post:
      summary: Создание ваучера
      tags:
        - Operations
      description: >-
        Создание ваучера на проведение операции в UDS. Метод позволяет получить
        информацию для печати на чеке кода или QR кода ваучера, по которому
        клиент сможет накопить бонусы за покупку.  


        ### Маркетинговая политика 


        Обязательным условием использования данного функционала является
        настройка модуля программы лояльности в настройках административной
        панели UDS Бизнес (https://admin.uds.app/). Вам необходимо указать
        `Начислять бонусные баллы` в блоке настройки `Способ предоставления
        скидки` 


        ### Ошибки 


        Статус | Код ошибки | Описание 

        ------ | ---------- | ----------- 

        `400` | invalidChecksum | Способ предоставления скидки не
        `CHARGE_SCORES` 

        `400` | invalidChecksum | Размер начисляемых бонусных баллов равен 0 

        `400` | invalidChecksum | Поле `total` меньше или равно`
        skipLoyaltyTotal`
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
              "nonce":"string-UUID", \
              "cashier":{ \
                "externalId":"string", \
                "name":"string" \
              }, \
              "receipt":{ \
                "total":100.0, \
                "number":"string", \
                "skipLoyaltyTotal": 50.0 \
              } \
            }' -X POST "https://api.uds.app/partner/v2/operations/voucher"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/operations/voucher";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'nonce' => 'string-UUID',
                'cashier' => array(
                  'externalId' => 'string',
                  'name' => 'string'
                ),
                'receipt' => array(
                  'total' => 100.0,
                  'number' => 'string',
                  'skipLoyaltyTotal' => 50.0
                )
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/operations/voucher',
                body=json.dumps({
                  'nonce': 'string-UUID',
                  'cashier': {
                    'extrnalId': 'string',
                    'name': 'string'
                  },
                  'receipt': {
                    'total': 100.0,
                    'number': 'string',
                    'skipLoyaltyTotal': 50.0
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations/voucher',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'nonce': 'string-UUID',
              'cashier': {
                'extrnalId': 'string',
                'name': 'string'
              },
              'receipt': {
                'total': 100.0,
                'number': 'string',
                'skipLoyaltyTotal': 50.0
              }
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateVoucher'
      responses:
        '200':
          description: Ваучер.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoucherInfo'
  '/operations/{id}/refund':
    parameters:
      - $ref: '#/components/parameters/id'
    post:
      summary: Операция возврата
      tags:
        - Operations
      description: >-
        Возврат операции по ее идентификатору. Если указан параметр
        `partialAmount`, то возврат будет частичным, иначе - полным
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
              "partialAmount":100.0 \
            }' -X POST "https://api.uds.app/partner/v2/operations/<id>/refund"
        - lang: PHP
          source: >
            $date = new DateTime();

            $operationId = 123;

            $url =
            "https://api.uds.app/partner/v2/operations/".$operationId."/refund";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company


            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'partialAmount' => 100.0
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );



            $context = stream_context_create($opts);



            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            operationId = 123
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/operations/' + operationId + '/refund',
                body=json.dumps({
                  'partialAmount': 100.0
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var operationId = 123;

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations/' + operationId + '/refund',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'partialAmount': 100.0
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                partialAmount:
                  type: number
                  nullable: true
                  description: Сумма возврата.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Operation'
  /operations/calc:
    post:
      summary: Рассчитать информацию по операции
      tags:
        - Operations
      description: >-
        Информация о доступных бонусных баллах для списания или размере скидки
        (в зависимости от настроек бонусной программы), сумме к оплате после
        применения скидок / бонусов и о количестве бонусных баллов, которые
        будут начислены после выполнения операции.
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
              "code":"string", \
              "participant":{ \
                "uid":"string", \
                "phone":"string" \
              }, \
              "receipt":{ \
                "total":100.0, \
                "points":50.0, \
                "skipLoyaltyTotal": 50.0 \
              } \
            }' -X POST "https://api.uds.app/partner/v2/operations/calc"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/operations/calc";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'code' => 'string',
                'participant' => array(
                  'uid' => 'string',
                  'phone' => 'string'
                ),
                'receipt' => array(
                  'total' => 100.0,
                  'points' => 50.0,
                  'skipLoyaltyTotal' => 50.0
                )
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/operations/calc',
                body=json.dumps({
                  'code': 'string',
                  'participant': {
                    'uid': 'string',
                    'phone': 'string'
                  },
                  'receipt': {
                    'total': 100.0,
                    'points': 50.0,
                    'skipLoyaltyTotal': 50.0
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations/calc',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'code': 'string',
              'participant': {
                'uid': 'string',
                'phone': 'string'
              },
              'receipt': {
                'total': 100.0,
                'points': 50.0,
                'skipLoyaltyTotal': 50.0
              }
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PurchaseCalcRequest'
      responses:
        '200':
          description: Информация об оплате
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PurchaseCalcResponse'
  /operations/reward:
    post:
      summary: Начисление бонусов клиенту (подарок)
      tags:
        - Operations
      description: >-
        Бонусы начисляются асинхронно, отдельно для каждого пользователя. В
        `participants` указываются ID клиентов в компании (`customer ->
        participant -> id`). Для списания бонусных баллов необходимо в `points` 
        передать отрицательное число. 
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
              "comment":"string", \
              "points":50.0, \
              "participants": [1, 3, 21], \
              "silent": false \
            }' -X POST "https://api.uds.app/partner/v2/operations/reward"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/operations/reward";

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'comment' => 'string',
                'points' => 50.0,
                'participants' => array(1, 3, 21),
                'silent' => false
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/operations/reward',
                body=json.dumps({
                  'code': 'string',
                  'participants': [1, 3, 17],
                  'points': 50.0,
                  'silent': false
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/operations/reward',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'code': 'string',
              'participants': [1, 3, 17],
              'points': 50.0,
              'silent': false
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
                - points
                - participants
              properties:
                points:
                  type: number
                  description: Количество бонусных баллов.
                comment:
                  type: string
                  nullable: true
                  description: 'Текст комментария, который увидит пользователь.'
                participants:
                  type: array
                  description: Список ID клиентов в компании.
                  items:
                    type: string
                silent:
                  type: boolean
                  nullable: true
                  description: Не отправлять пуш-уведомление клиенту (default false).
      responses:
        '202':
          description: Информация об операции
          content:
            application/json:
              schema:
                type: object
                properties:
                  accepted:
                    type: string
                    description: >-
                      Количество пользователей, которым будут начислены бонусные
                      баллы.
  /api/v2/events/operation:
    parameters:
      - $ref: '#/components/parameters/x-request-id'
      - $ref: '#/components/parameters/x-timestamp'
      - $ref: '#/components/parameters/x-signature'
    post:
      summary: Операция создана
      servers:
        - url: 'https://webhook-server.domain/'
      tags:
        - Webhooks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Operation'
      security:
        - Webhook: []
      responses:
        '200':
          description: OK
  /api/v2/events/participant:
    parameters:
      - $ref: '#/components/parameters/x-request-id'
      - $ref: '#/components/parameters/x-timestamp'
      - $ref: '#/components/parameters/x-signature'
    post:
      summary: Новый клиент
      servers:
        - url: 'https://webhook-server.domain/'
      tags:
        - Webhooks
      security:
        - Webhook: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Participant'
      responses:
        '200':
          description: OK
  /api/v2/events/goods-order:
    parameters:
      - $ref: '#/components/parameters/x-request-id'
      - $ref: '#/components/parameters/x-timestamp'
      - $ref: '#/components/parameters/x-signature'
    post:
      summary: Новый заказ
      servers:
        - url: 'https://webhook-server.domain/'
      tags:
        - Webhooks
      security:
        - Webhook: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoodsOrderDetailed'
      responses:
        '200':
          description: ОК.
  /goods:
    description: Категории могут иметь 3 уровня вложенности и не больше 20 подкатегорий
    get:
      tags:
        - Goods
      summary: Список товаров и категорий
      description: Получение списка товаров и категорий в компании
      parameters:
        - $ref: '#/components/parameters/max'
        - $ref: '#/components/parameters/offset'
        - name: nodeId
          description: Фильтр товаров по идентификатору категории
          in: query
          schema:
            type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                properties:
                  rows:
                    type: array
                    description: Информация о товарах и категориях.
                    items:
                      $ref: '#/components/schemas/GoodsInfoType'
                  total:
                    type: integer
                    description: Количество товаров и категорий.
      x-codeSamples:
        - lang: curl
          source: >
            // Get price list starting from the top item

            curl -H 'Accept: application/json' \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -X GET -s https://api.uds.app/partner/v2/goods?max=10&offset=0

            // Get price list items of the category with id=132

            curl -H 'Accept: application/json' \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -X GET -s
            https://api.uds.app/partner/v2/goods?max=10&offset=0&nodeId=123
        - lang: PHP
          source: >
            /**
             * Get price list from the top item
            **/


            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods?max=10&offset=0";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company


            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * Get price list items of the category with id=132
            **/


            $date = new DateTime();

            $url =
            "https://api.uds.app/partner/v2/goods?max=10&offset=0&nodeId=123";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company


            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            # Get price list from the top item

            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/goods?max=10&offset=0',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()

            # Get price list items of the category with id=132

            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/goods?max=10&offset=0&nodeId=123',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            /**
             * Get price list items of the category with nodeId=132
            **/

            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods?max=10&offset=0',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();

            /**
             * Get price list items of the category with id=132
            **/

            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods?max=10&offset=0&nodeId=123',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();
    post:
      tags:
        - Goods
      summary: Создать товар/категорию
      description: >-
        Создание товара или категории в UDS. После успешного создания, товар
        отобразится в UDS, а идентификатор созданной категории можно будет
        использовать для указания `nodeId` при создании других товаров, а также
        для получения списка товаров. 


        ### Основные моменты 

        * Тип создаваемого объекта указывается в поле `data.type`. Допустимо 3
        значения: 
          - `CATEGORY` - для создания категории товаров 
          - `ITEM` - для создания товара 
          - `VARYING_ITEM` - для создания товара с вариантами 
        * Можно создать подкатегорию в категории (допускается три уровня
        вложенности).  

        * Можно создать 20 категорий в основном списке, по 20 подкатегорий для
        каждой категории и по 20 подкатегорий для каждой подкатегории.  

        * Для создания товара без категории следует указать значение `null` в
        поле `nodeId` 

        * Для создания товара без ограничения по количеству следует указать
        значение `null` в поле `inStock`.  

         |Статус|Код ошибки|Описание| 
        |--- |--- |--- | 

        |`400`|badRequest|Возникли ошибки при валидации. Для получения подробной
        информации об ошибке обратитесь к полю `errors`.| 

        |`400`|goods.nodeIndex.invalid|Для создания категории указание
        идентификатора `nodeId` недопустимо| 

        |`400`|goods.limitIsReached|Превышен лимит количества товаров| 

        |`401`|unauthorized|Неверно указан ID компании или API Key|
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoodsDetailed'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsDetailed'
      x-codeSamples:
        - lang: curl
          source: >
            // create category 'Clothers'

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Clothers", \
              "nodeId": null, \
              "externalId": "clothers", \
              "data": {
                "type": "CATEGORY"
              }
            }' -X POST "https://api.uds.app/partner/v2/goods"


            // create goods item without category, but with variants and array
            of photo imageIds, which have been uploaded in advance using
            /image-upload method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Apple", \
              "nodeId": null, \
              "externalId": "apple", \
              "data": {
                "type": "VARYING_ITEM",
                "description": "This is an item without category"
                "photos": [
                  "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=="
                ],
                "variants": [
                  {
                    "name": "red apple",
                    "price": 100.0,
                    "inventory":
                      {
                      "inStock": 17
                      }
                  },
                  {
                    "name": "green apple",
                    "price": 150.0,
                    "inventory":
                      {
                      "inStock": 10
                      }
                  }
                ]
              }
            }' -X POST "https://api.uds.app/partner/v2/goods"


            // create goods item in category with id=123 and array of photo
            imageIds, which have been uploaded in advance using /image-upload
            method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "T-shirt", \
              "nodeId": 123, \
              "externalId": "tshirt", \
              "data": {
                "type": "ITEM",
                "price": 100.0,
                "photos": [
                  "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=="
                ],
                "description": "This is an item in category",
                "offer": {
                  "offerPrice": 90.0,
                  "skipLoyalty": true
                },
                "inventory": {
                  "inStock": 10
                }
              }
            }' -X POST "https://api.uds.app/partner/v2/goods"


            // create goods item with measurement

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Shugar", \
              "externalId": "shugar", \
              "data": {
                "type": "ITEM",
                "price": 0.1,
                "description": "This is an item with measurement"
                "inventory": {
                  "inStock": 300000
                },
                "measurement": "GRAM",
                "increment": 500,
                "minQuantity": 500
              }
            }' -X POST "https://api.uds.app/partner/v2/goods"
        - lang: PHP
          source: >
            $url = "https://api.uds.app/partner/v2/goods";

            $companyId = 123456; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            /**
             * create category 'Clothers'
            **/


            $date = new DateTime();


            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $categoryData = json_encode(
              array(
                'name' => 'Clothers',
                'nodeId' => null,
                'externalId' => 'clothers',
                'data' => array(
                    'type' => 'CATEGORY'
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $categoryData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * create goods item without category, but with variants and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/


            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $varItemData = json_encode(
              array(
                'name' => 'Apple',
                'nodeId' => null,
                'externalId' => 'category1',
                'data' => array(
                    'type' => 'VARYING_ITEM',
                    'description' => 'This is an item without category',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'variants' => array(
                      array(
                        'name' => 'red apple',
                        'price' => 100.0,
                        'inventory' => array(
                            'inStock' => 17
                          )
                      ),
                      array(
                        'name' => 'green apple',
                        'price' => 150.0,
                        'inventory' =>array(
                            'inStock' =>10
                          )
                      ),
                    )
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $varItemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * create goods item in category with id=123 and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/


            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $itemData = json_encode(
              array(
                'name' => 'T-shirt',
                'nodeId' => 123,
                'externalId' => 'tshirt',
                'data' => array(
                    'type' => 'ITEM',
                    'price' => 100.0,
                    'description' => 'This is an item in category',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'offer'=> array(
                       'offerPrice'=> 90.0,
                       'skipLoyalty'=> true
                      ),
                    'inventory' =>array(
                        'inStock' =>null
                      )
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * create goods item with measurement
            **/


            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $itemData = json_encode(
              array(
                'name' => 'Shugar',
                'externalId' => 'shugar',
                'data' => array(
                    'type' => 'ITEM',
                    'price' => 0.1,
                    'description' => 'This is an item with measurement',
                    'inventory' => array(
                        'inStock' => 300000
                    ),
                    'measurement' => 'GRAM',
                    'increment' => 500,
                    'minQuantity' => 500
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            /**
             * create category 'Clothers'
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods',
                body=json.dumps({
                  'name': 'Clothers',
                  'nodeId': None,
                  'externalId': 'clothers',
                  'data': {
                      'type': 'CATEGORY'
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
            /**
             * create goods item without category, but with variants and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods',
                body=json.dumps({
                  'name': 'Applevdmkfmdkfmd',
                  'nodeId': None,
                  'externalId': 'varying-item-id',
                  'data': {
                    'type': 'VARYING_ITEM',
                    'description': 'This is an item without category',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'variants': [{
                      'name': 'red apple',
                      'price': 100.0,
                      'inventory': {
                        'inStock': 17
                      }
                    },
                    {
                      'name': 'green apple',
                      'price': 150.0,
                      'inventory': {
                        'inStock': 10
                      }
                    }]
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
            /**
             * create goods item in category with id=123 and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods',
                body=json.dumps({
                  'name': 'T-shirt',
                  'nodeId': 123,
                  'externalId': 'tshirt',
                  'data': {
                      'type': 'ITEM',
                      'price': 100.0,
                      'description': 'This is an item in category',
                      'photos': [
                          'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                      ],
                      'offer': {
                          'offerPrice': 90.0,
                          'skipLoyalty': true
                      },
                      'inventory': {
                        'inStock': null
                      }
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
            /**
             * create goods item with measurement
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods',
                body=json.dumps({
                  'name': 'Shugar',
                  'externalId': 'shugar',
                  'data': {
                      'type': 'ITEM',
                      'price': 0.1,
                      'description': 'This is an item with measurement',
                      'inventory': {
                        'inStock': 300000
                      },
                      'measurement': 'GRAM',
                      'increment': 500,
                      'minQuantity': 500
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            /**
             * create category 'Clothers'
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                var responseData = JSON.parse(response);
                console.log(responseData);
              });
            });
            var requestData = JSON.stringify({
              'name': 'Clothers',
              'nodeId': null,
              'externalId': 'clothers',
              'data': {
                'type': 'CATEGORY'
              }
            });
            req.write(requestData);
            req.end();
            /**
             * create goods item without category, but with variants and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                var responseData = JSON.parse(response);
                console.log(responseData);
              });
            });
            var requestData = JSON.stringify({
              'name': 'Applevdmkfmdkfmd',
              'nodeId': null,
              'externalId': 'category',
              'data': {
                'type': 'VARYING_ITEM',
                'description': 'This is an item without category',
                'photos': [
                    'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                ],
                'variants': [
                  {
                    'name': 'red apple',
                    'price': 100.0,
                    'inventory': {
                      'inStock': 17
                    }
                  },
                  {
                    'name': 'green apple',
                    'price': 150.0,
                    'inventory': {
                      'inStock': 10
                    }
                  }
                ]
              }
            });
            req.write(requestData);
            req.end();
            /**
             * create goods item in category with id=123 and array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                var responseData = JSON.parse(response);
                console.log(responseData);
              });
            });
            var requestData = JSON.stringify({
              'name': 'T-shirt',
              'nodeId': 34430,
              'externalId': 'tshirt',
              'data': {
                'type': 'ITEM',
                'price': 100.0,
                'description': 'This is an item in category',
                'photos': [
                    'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                ],
                'offer': {
                    'offerPrice': 90.0,
                    'skipLoyalty': true
                },
                'inventory': {
                  'inStock': null
                }
             }
            });
            req.write(requestData);
            req.end();
            /**
             * create goods item with measurement
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                var responseData = JSON.parse(response);
                console.log(responseData);
              });
            });
            var requestData = JSON.stringify({
              'name': 'Shugar',
              'externalId': 'shugar',
              'data': {
                'type': 'ITEM',
                'price': 100.0,
                'description': 'This is an item with measurement',
                'inventory': {
                  'inStock': 300000
                },
                'measurement': 'GRAM',
                'increment': 500,
                'minQuantity': 500
             }
            });
            req.write(requestData);
            req.end();
  '/goods/{id}':
    parameters:
      - $ref: '#/components/parameters/id'
    get:
      tags:
        - Goods
      summary: Получить информацию о товаре/категории
      description: Получение информацию о товаре/категории товаров компании
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsDetailed'
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X GET -s https://api.uds.app/partner/v2/goods/123
        - lang: PHP
          source: >
            $goodsId = 345; //set ID of goods

            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods/".$goodsId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/goods/345',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/345',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();
    put:
      tags:
        - Goods
      summary: Обновить товар/категорию
      description: >-
        ### Основные моменты 


        * Тип редактируемого объекта указывается в поле `data.type`. Допустимо 3
        значения: 

        - `CATEGORY` - для создания категории; 

        - `ITEM` - для создания товара; 

        - `VARYING_ITEM` - для создания товара с вариантами; 

        * Для перемещения товара в другую категорию следует указать
        идентификатор категории в `nodeId`; 

        * Перенос категории внутрь другой категории недопустим; 

        * Чтобы товар стал без категории, следует указать значение `null` в поле
        `nodeId`. 


        ### Ошибки 

        |Статус|Код ошибки|Описание| 

        |--- |--- |--- | 

        |`400`|goods.nodeIndex.invalid|Для создания категории указание
        идентификатора `nodeId` недопустимо| 

        |`400`|goods.limitIsReached|Превышен лимит количества|
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoodsDetailed'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsDetailed'
      x-codeSamples:
        - lang: curl
          source: >
            // update category 'Clothers'

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Clothers and shoes", \
              "nodeId": null, \
              "externalId": "clothers", \
              "data": {
                "type": "CATEGORY"
              },
              "hidden": null
            }' -X PUT "https://api.uds.app/partner/v2/goods/123"


            // update goods item without category, but with variants and with
            array of photo imageIds, which have been uploaded in advance using
            /image-upload method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Apple", \
              "nodeId": null, \
              "externalId": "apple", \
              "hidden": null, \
              "data": {
                "type": "VARYING_ITEM",
                "photos": [
                    "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==",
                ],
                "description": "This is an item without category"
                "variants": [
                  {
                    "name": "red apple",
                    "price": 110.0
                  },
                  {
                    "name": "green apple",
                    "price": 160.0
                  }
                ]
              }
            }' -X PUT "https://api.uds.app/partner/v2/goods/111"


            // update goods item in category with array of photo imageIds, which
            have been uploaded in advance using /image-upload method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "T-shirt", \
              "nodeId": 123, \
              "externalId": "tshirt", \
              "hidden": false, \
              "data": {
                "type": "ITEM",
                "price": 110.0,
                "photos": [
                    "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==",
                ],
                "description": "This is an item in category"
              }
            }' -X POST "https://api.uds.app/partner/v2/goods/222"


            // update goods item with measurement

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Shugar", \
              "externalId": "shugar", \
              "data": {
                "type": "ITEM",
                "price": 0.1,
                "description": "This is an item with measurement"
                "inventory": {
                  "inStock": 300000
                },
                "measurement": "GRAM",
                "increment": 500,
                "minQuantity": 500
              }
            }' -X POST "https://api.uds.app/partner/v2/goods/222"
        - lang: PHP
          source: >
            $companyId = 123456; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            /**
             * update category 'Clothers'
            **/

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $url = "https://api.uds.app/partner/v2/goods/123";


            $categoryData = json_encode(
              array(
                'name' => 'Clothers',
                'nodeId' => null,
                'hidden' => null,
                'externalId' => 'clothers',
                'data' => array(
                    'type' => 'CATEGORY'
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $categoryData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/


            $url = "https://api.uds.app/partner/v2/goods/111";

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $varItemData = json_encode(
              array(
                'name' => 'Apple',
                'nodeId' => null,
                'hidden' => null,
                'externalId' => 'category1',
                'data' => array(
                    'type' => 'VARYING_ITEM',
                    'description' => 'This is an item without category',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'variants' => array(
                      array(
                        'name' => 'red apple',
                        'price' => 100.0
                      ),
                      array(
                        'name' => 'green apple',
                        'price' => 150.0
                      ),
                    )
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $varItemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/

            $url = "https://api.uds.app/partner/v2/goods/222";

            $date = new DateTime();


            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $itemData = json_encode(
              array(
                'name' => 'T-shirt',
                'nodeId' => 123,
                'hidden' => false,
                'externalId' => 'tshirt',
                'data' => array(
                    'type' => 'ITEM',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'price' => 100.0,
                    'description' => 'This is an item in category'
                  )
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item with measurement
            **/

            $url = "https://api.uds.app/partner/v2/goods/222";

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $itemData = json_encode(
              array(
                'name' => 'Shugar',
                'externalId' => 'shugar',
                'data' => array(
                    'type' => 'ITEM',
                    'price' => 0.1,
                    'description' => 'This is an item with measurement',
                    'inventory' => array(
                        'inStock' => 300000
                    ),
                    'measurement' => 'GRAM',
                    'increment' => 500,
                    'minQuantity' => 500
                )
              )
            );


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $cont

            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            import ssl
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            /**
             * update category 'Clothers'
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/123',
                body=json.dumps({
                  'name': 'Clothers',
                  'nodeId': None,
                  'hidden': None,
                  'externalId': 'clothers',
                  'data': {
                      'type': 'CATEGORY'
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/123',
                body=json.dumps({
                  'name': 'Apple',
                  'nodeId': None,
                  'hidden': None,
                  'externalId': 'category1',
                  'data': {
                    'type': 'VARYING_ITEM',
                    'description': 'This is an item without category',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'variants': [{
                      'name': 'red apple',
                      'price': 100.0
                    },
                    {
                      'name': 'green apple',
                      'price': 150.0
                    }]
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/222',
                body=json.dumps({
                  'name': 'T-shirе',
                  'nodeId': 123,
                  'hidden': false,
                  'externalId': 'tshirt',
                  'data': {
                    'type': 'ITEM',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'description': 'This is an item in category',
                    'price': 100.0
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item with measurement
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/222',
                body=json.dumps({
                  'name': 'Shugar',
                  'externalId': 'shugar',
                  'data': {
                    'type': 'ITEM',
                    'price': 0.1,
                    'description': 'This is an item with measurement',
                    'inventory': {
                      'inStock': 300000
                    },
                    'measurement': 'GRAM',
                    'increment': 500,
                    'minQuantity': 500
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            /**
             * update category 'Clothers'
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/123',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'New Clothers',
              'nodeId': null,
              'hidden': null,
              'externalId': 'clothers',
              'data': {
                  'type': 'CATEGORY'
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/111',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'Apple',
              'nodeId': null,
              'hidden': null,
              'externalId': 'category1',
              'data': {
                'type': 'VARYING_ITEM',
                'description': 'This is an item without category',
                'photos': [
                  'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                ],
                'variants': [{
                  'name': 'red apple',
                  'price': 100.0
                },
                {
                  'name': 'green apple',
                  'price': 150.0
                }]
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/222',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
                  'name': 'T-shirе',
                  'nodeId': 123,
                  'hidden': false,
                  'externalId': 'external',
                  'data': {
                    'type': 'ITEM',
                    'description': 'This is an item in category',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'price': 100.0
                  }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item with measurement
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/222',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'Shugar',
              'externalId': 'shugar',
              'data': {
                'type': 'ITEM',
                'price': 100.0,
                'description': 'This is an item with measurement',
                'inventory': {
                  'inStock': 300000
                },
                'measurement': 'GRAM',
                'increment': 500,
                'minQuantity': 500
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();
    delete:
      tags:
        - Goods
      summary: Удалить товар/категорию
      description: Удалить товар/категорию по ID
      responses:
        '204':
          description: Успешно удалено
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X DELETE -s https://api.uds.app/partner/v2/goods/123
        - lang: PHP
          source: >
            $goodsId = 345; //set ID of deleting goods

            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods/".$goodsId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'DELETE',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);


            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='DELETE',
                url='/partner/v2/goods/345',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/345',
              'method': 'DELETE',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();
  '/goods/external/{externalId}':
    parameters:
      - $ref: '#/components/parameters/externalId'
    get:
      tags:
        - Goods
      summary: Получить информацию о товаре/категории по внешнему идентификатору
      description: Получение товара/категории в компании по внешнему идентификатору
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsDetailed'
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X GET -s https://api.uds.app/partner/v2/goods/external/abc123
        - lang: PHP
          source: >
            $goodsExternalId = 345; //set externalId of goods

            $date = new DateTime();

            $url =
            "https://api.uds.app/partner/v2/goods/external/".$goodsExternalId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/goods/external/abc345',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc345',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();
    put:
      tags:
        - Goods
      summary: Обновить товар/категорию  по внешнему идентификатору
      description: >-
        ### Основные моменты 


        * Тип редактируемого объекта указывается в поле `data.type`. Допустимо 3
        значения: 

        - `CATEGORY` - для создания категории; 

        - `ITEM` - для создания товара; 

        - `VARYING_ITEM` - для создания товара с вариантами; 

        * Для перемещения товара в другую категорию следует указать
        идентификатор категории в `nodeId`; 

        * Чтобы товар стал без категории, следует указать значение `null` в поле
        `nodeId`. 


        ### Ошибки 

        |Статус|Код ошибки|Описание| 

        |--- |--- |--- | 

        |`400`|goods.nodeIndex.invalid|Для создания категории указание
        идентификатора `nodeId` недопустимо| 

        |`404`|notFound|Товар/категория с данным внешним идентификатором не
        найдена|
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoodsDetailed'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsDetailed'
      x-codeSamples:
        - lang: curl
          source: >
            // update category 'Clothers'

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Clothers and shoes", \
              "nodeId": null, \
              "externalId": "abc123", \
              "data": {
                "type": "CATEGORY"
              },
              "hidden": false
            }' -X PUT "https://api.uds.app/partner/v2/goods/external/abc123"


            // update goods item without category, but with variants and with
            array of photo imageIds, which have been uploaded in advance using
            /image-upload method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Apple", \
              "nodeId": null, \
              "externalId": "abc123", \
              "hidden": false, \
              "data": {
                "type": "VARYING_ITEM",
                "photos": [
                    "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==",
                ],
                "description": "This is an item without category"
                "variants": [
                  {
                    "name": "red apple",
                    "price": 110.0
                  },
                  {
                    "name": "green apple",
                    "price": 160.0
                  }
                ]
              }
            }' -X PUT "https://api.uds.app/partner/v2/goods/external/abc111"


            // update goods item in category with array of photo imageIds, which
            have been uploaded in advance using /image-upload method

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "T-shirt", \
              "nodeId": 123, \
              "externalId": "abc222", \
              "hidden": false, \
              "data": {
                "type": "ITEM",
                "price": 110.0,
                "photos": [
                    "NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==",
                ],
                "description": "This is an item in category"
              }
            }' -X POST "https://api.uds.app/partner/v2/goods/external/abc222"


            // update goods item with measurement

            curl -H "accept: application/json" \

            -H "Content-Type: application/json" \

            -H "X-Origin-Request-Id: $(uuidgen)" \

            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \

            -u "<companyId>:<api_key>"

            -d '{ \
              "name": "Sugar", \
              "externalId": "abc222", \
              "data": {
                "type": "ITEM",
                "price": 0.1,
                "description": "This is an item with measurement"
                "inventory": {
                  "inStock": 300000
                },
                "measurement": "GRAM",
                "increment": 500,
                "minQuantity": 500
              }
            }' -X POST "https://api.uds.app/partner/v2/goods/external/abc222"
        - lang: PHP
          source: >
            $companyId = 123456; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            /**
             * update category 'Clothers'
            **/

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $url = "https://api.uds.app/partner/v2/goods/external/abc123";


            $categoryData = json_encode(
              array(
                'name' => 'Clothers',
                'nodeId' => null,
                'hidden' => null,
                'externalId' => 'abc123',
                'data' => array(
                    'type' => 'CATEGORY'
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $categoryData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/


            $url = "https://api.uds.app/partner/v2/goods/external/abc111";

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $varItemData = json_encode(
              array(
                'name' => 'Apple',
                'nodeId' => null,
                'hidden' => null,
                'externalId' => 'abc111',
                'data' => array(
                    'type' => 'VARYING_ITEM',
                    'description' => 'This is an item without category',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'variants' => array(
                      array(
                        'name' => 'red apple',
                        'price' => 100.0
                      ),
                      array(
                        'name' => 'green apple',
                        'price' => 150.0
                      ),
                    )
                  )
              )
            );


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $varItemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/

            $url = "https://api.uds.app/partner/v2/goods/external/abc222";

            $date = new DateTime();


            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)


            $itemData = json_encode(
              array(
                'name' => 'T-shirt',
                'nodeId' => 123,
                'hidden' => false,
                'externalId' => 'abc222',
                'data' => array(
                    'type' => 'ITEM',
                    'photos' => array(
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ=='
                    ),
                    'price' => 100.0,
                    'description' => 'This is an item in category'
                  )
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;


            /**
             * update goods item with measurement
            **/

            $url = "https://api.uds.app/partner/v2/goods/external/abc222";

            $date = new DateTime();

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $itemData = json_encode(
              array(
                'name' => 'Shugar',
                'externalId' => 'abc222',
                'data' => array(
                    'type' => 'ITEM',
                    'price' => 0.1,
                    'description' => 'This is an item with measurement',
                    'inventory' => array(
                        'inStock' => 300000
                    ),
                    'measurement' => 'GRAM',
                    'increment' => 500,
                    'minQuantity' => 500
                )
              )
            );


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $itemData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $cont

            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            import ssl
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            /**
             * update category 'Clothers'
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/external/abc123',
                body=json.dumps({
                  'name': 'Clothers',
                  'nodeId': None,
                  'hidden': None,
                  'externalId': 'abc123',
                  'data': {
                      'type': 'CATEGORY'
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/external/abc123',
                body=json.dumps({
                  'name': 'Apple',
                  'nodeId': None,
                  'hidden': None,
                  'externalId': 'abc123',
                  'data': {
                    'type': 'VARYING_ITEM',
                    'description': 'This is an item without category',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'variants': [{
                      'name': 'red apple',
                      'price': 100.0
                    },
                    {
                      'name': 'green apple',
                      'price': 150.0
                    }]
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/external/abc222',
                body=json.dumps({
                  'name': 'T-shirt',
                  'nodeId': 123,
                  'hidden': false,
                  'externalId': 'abc222',
                  'data': {
                    'type': 'ITEM',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'description': 'This is an item in category',
                    'price': 100.0
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()

            /**
             * update goods item with measurement
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods/external/abc222',
                body=json.dumps({
                  'name': 'Shugar',
                  'externalId': 'abc222',
                  'data': {
                    'type': 'ITEM',
                    'price': 0.1,
                    'description': 'This is an item with measurement',
                    'inventory': {
                      'inStock': 300000
                    },
                    'measurement': 'GRAM',
                    'increment': 500,
                    'minQuantity': 500
                  }
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            /**
             * update category 'Clothers'
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc123',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'New Clothers',
              'nodeId': null,
              'hidden': null,
              'externalId': 'abc123',
              'data': {
                  'type': 'CATEGORY'
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item without category, but with variants and with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc111',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'Apple',
              'nodeId': null,
              'hidden': null,
              'externalId': 'abc111',
              'data': {
                'type': 'VARYING_ITEM',
                'description': 'This is an item without category',
                'photos': [
                  'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                ],
                'variants': [{
                  'name': 'red apple',
                  'price': 100.0
                },
                {
                  'name': 'green apple',
                  'price': 150.0
                }]
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item in category with array of photo imageIds, which have been uploaded in advance using /image-upload method
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc222',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
                  'name': 'T-shirе',
                  'nodeId': 123,
                  'hidden': false,
                  'externalId': 'abc222',
                  'data': {
                    'type': 'ITEM',
                    'description': 'This is an item in category',
                    'photos': [
                      'NTQ5NzU1ODIxNDg5L0dPT0RTLzdiYzBlNTU0LWMyNzMtNDc1MC05MjEyLWY0NWJhNWM1ODZiOQ==',
                    ],
                    'price': 100.0
                  }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();

            /**
             * update goods item with measurement
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc222',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'name': 'Shugar',
              'externalId': 'abc222',
              'data': {
                'type': 'ITEM',
                'price': 100.0,
                'description': 'This is an item with measurement',
                'inventory': {
                  'inStock': 300000
                },
                'measurement': 'GRAM',
                'increment': 500,
                'minQuantity': 500
              }
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();
    delete:
      tags:
        - Goods
      summary: Удалить товар/категорию  по внешнему идентификатору
      description: Удалить товар/категорию  по внешнему идентификатору
      responses:
        '204':
          description: Успешно удалено
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X DELETE -s https://api.uds.app/partner/v2/goods/external/abc123
        - lang: PHP
          source: >
            $goodsId = 345; //set ID of deleting goods

            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods/".$goodsId;

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'DELETE',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);


            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='DELETE',
                url='/partner/v2/goods/external/abc345',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods/external/abc345',
              'method': 'DELETE',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.end();
  '/goods-orders/{id}':
    parameters:
      - $ref: '#/components/parameters/id'
    get:
      tags:
        - Goods Order
      summary: Подробная информация о заказе
      description: Подробная информация о заказе товара
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/goods-orders/123
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods-orders/123";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/goods-orders/123',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: ОК.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsOrderDetailed'
    put:
      tags:
        - Goods Order
      summary: Изменить заказ
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoodsOrderUpdate'
      responses:
        '200':
          description: ОК
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsOrderDetailed'
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
                "deliveryCase": {"name": "new zone", "value": 0}, \
                "items": [{
                  "id": 111, \
                  "variantName": "red", \
                  "qty": 2 \
                  },{ \
                  "externalId": 22222, \
                  "name": "new green apple", \
                  "price": 110.0, \
                  "qty": 2, \
                  "skipLoyalty": false \
                  }] \
                }' \
            -X PUT "https://api.uds.app/partner/v2/goods-orders/123"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods-orders/123";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Change quantity of the one item and add new one unknown for UDS

            $varOrderData = json_encode(
              array(
                'deliveryCase' => array(
                    'name' => 'new zone',
                    'value' => 0
                    ),
                'items' => array(
                    array(
                      'id' => 111,
                      'variantName' => 'red',
                      'qty' => 2
                    ),
                    array(
                      'externalId' => 22222,
                      'name' => 'new green apple',
                      'price' => 110.0,
                      'qty' => 2,
                      'skipLoyalty' => false
                    )
                )
              )
            );


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'PUT',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "Content-Type: application/json\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $varOrderData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            import ssl
            from datetime import datetime
            from http.client import HTTPSConnection
            authString = base64.b64encode(b'<companyId>:<apiKey>')

            /**
             * Change quantity of the one item and add new one unknown for UDS
            **/
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='PUT',
                url='/partner/v2/goods-orders/123',
                body=json.dumps({
                  'deliveryCase': {
                    'name': 'new zone',
                    'value': 0
                  },
                  'items': [
                    {
                      'id': 111,
                      'variantName': 'red',
                      'qty': 2
                    },
                    {
                      'externalId': 22222,
                      'name': 'new green apple',
                      'price': 150.0,
                      'qty': 2,
                      'skipLoyalty': false
                    }
                  ]
                }),
                headers={
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            /**
             * update goods item without category, but with variants
            **/
            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123',
              'method': 'PUT',
              'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };
            var requestData = JSON.stringify({
              'deliveryCase': {
                'name': 'new zone',
                'value': 0
              },
              'items': [
                {
                  'id': 111,
                  'variantName': 'red',
                  'qty': 2
                },
                {
                  'externalId': 22222,
                  'name': 'new green apple',
                  'price': 150.0,
                  'qty': 2,
                  'skipLoyalty': false
                }
              ]
            });
            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });
            req.write(requestData);
            req.end();
  '/goods-orders/{id}/complete':
    parameters:
      - $ref: '#/components/parameters/id'
    post:
      tags:
        - Goods Order
      summary: Завершить заказ
      description: Завершает заказ товара с идентификатором и создает транзакцию
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X POST "https://api.uds.app/partner/v2/goods-orders/123/complete"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods-orders/123/complete";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
              method='POST',
              url='/partner/v2/goods-orders/123/complete',
              headers={
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + authString.decode("utf-8"),
                'X-Origin-Request-Id': str(uuid.uuid4()),
                'X-Timestamp': datetime.now().isoformat(),
              }
            )
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123/complete',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );

              });
            });
            req.end();
      responses:
        '200':
          description: ОК.
          content:
            application/json:
              schema:
                properties:
                  transaction:
                    type: object
                    description: Информация об операции.
                    properties:
                      id:
                        type: integer
                        format: int64
                        description: ID операции.
                  order:
                    $ref: '#/components/schemas/GoodsOrderDetailed'
  '/goods-orders/{id}/code':
    parameters:
      - $ref: '#/components/parameters/id'
    post:
      tags:
        - Goods Order
      summary: Сгенерировать код для завершения заказа
      description: Сгенерировать код для завершения заказа товара с идентификатором
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -X POST "https://api.uds.app/partner/v2/goods-orders/123/code"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods-orders/123/code";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
              method='POST',
              url='/partner/v2/goods-orders/123/code',
              headers={
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + authString.decode("utf-8"),
                'X-Origin-Request-Id': str(uuid.uuid4()),
                'X-Timestamp': datetime.now().isoformat(),
              }
            )
            print(con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123/code',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );

              });
            });
            req.end();
      responses:
        '200':
          description: ОК.
          content:
            application/json:
              schema:
                properties:
                  code:
                    type: string
                    description: Код платежа для завершения заказа товара
  '/goods-orders/{id}/change-status':
    parameters:
      - $ref: '#/components/parameters/id'
    post:
      tags:
        - Goods Order
      summary: Изменить статус заказа
      description: >-
        Метод позволяет изменить статус обработки заказа в компании по
        идентификатору заказа
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                orderStatus:
                  description: Cтатус обработки заказа.
                  type: string
                  enum:
                    - WAITING_PAYMENT
                    - ACCEPTED
                    - READY
              required:
                - orderStatus
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "Content-Type: application/json" \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -d '{"orderStatus": "ACCEPTED"}'
                 -X POST -s https://api.uds.app/partner/v2/goods-orders/123/change-status
        - lang: PHP
          source: >
            $date = new DateTime();

            $url =
            "https://api.uds.app/partner/v2/goods-orders/123/change-status";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey
             // Set request body

            $postData = json_encode(
              array("orderStatus", "ACCEPTED")  // status of order
            );


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods-orders/123/change-status',
                body=json.dumps({'orderStatus': 'READY'}),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123/change-status',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({'orderStatus': 'READY'});

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: ОК.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsOrderDetailed'
  '/goods-orders/{id}/cancel':
    parameters:
      - $ref: '#/components/parameters/id'
    post:
      tags:
        - Goods Order
      summary: Отменить заказ
      description: Метод отменяет заказ товаров в компании по идентификатору заказа
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X POST -s https://api.uds.app/partner/v2/goods-orders/123/cancel
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/goods-orders/123/cancel";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream

            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='/partner/v2/goods-orders/123/cancel',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8"),
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/goods-orders/123/cancel',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: ОК.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoodsOrderDetailed'
  /image-upload-url:
    post:
      tags:
        - Image uploading
      summary: Получение ссылки для загрузки изображения товара
      x-codeSamples:
        - lang: curl
          source: |
            curl -H "accept: application/json" \
            -H "Content-Type: application/json" \
            -H "X-Origin-Request-Id: $(uuidgen)" \
            -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
            -u "<companyId>:<api_key>"
            -d '{ \
                "contentType": "image/jpeg"
              } \
            }' -X POST "https://api.uds.app/partner/v2/image-upload-url"
        - lang: PHP
          source: >
            $date = new DateTime();

            $url = "https://api.uds.app/partner/v2/image-upload-url";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Set request body


            $postData = json_encode(
              array(
                'contentType' => 'image/jpeg'
              )
            );


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Content-Type: application/json\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM),
                    'content' => $postData,
                    'ignore_errors' => true
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='POST',
                url='https://api.uds.app/partner/v2/image-upload-url',
                body=json.dumps({
                  'contentType': 'image/jpeg'
                }),
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/image-upload-url',
              'method': 'POST',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var data = JSON.stringify({
              'contentType': 'image/jpeg'
            });

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {
                console.log(
                  JSON.parse(response)
                );
              });
            });

            req.write(data);
            req.end();
      requestBody:
        content:
          application/json:
            schema:
              required:
                - contentType
              properties:
                contentType:
                  type: string
                  description: Тип содержимого файла для загрузки.
                  example: image/jpeg
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                properties:
                  imageId:
                    type: string
                    description: Идентификатор изображения.
                  headers:
                    type: object
                    properties:
                      Content-Type:
                        type: array
                        description: Array of allowed content-types
                        items:
                          type: string
                          description: Allowed content-type
                          example: image/jpeg
                    description: >-
                      Список заголовков, которые нужно передать при загрузке
                      изображений.
                  url:
                    type: string
                    description: URL для загрузки изображения.
                  method:
                    type: string
                    description: Http метод загрузки изображения.
                    example: PUT
                  expires:
                    type: number
                    description: 'Срок действия ссылки для загрузки, в миллисекундах epoch.'
                    example: 1632137293751
  /tags:
    get:
      tags:
        - Tags
      summary: Список тегов компании
      x-codeSamples:
        - lang: curl
          source: |
            curl -H 'Accept: application/json' \
                 -H "X-Origin-Request-Id: $(uuidgen)" \
                 -H "X-Timestamp: $(date --iso-8601=seconds --utc)" \
                 -u "<companyId>:<api_key>"
                 -X GET -s https://api.uds.app/partner/v2/tags
        - lang: PHP
          source: >
            $date = new DateTime();

            $customerId = 123;

            $url = "https://api.uds.app/partner/v2/tags";

            $uuid_v4 = 'UUID'; //generate universally unique identifier version
            4 (RFC 4122)

            $companyId = 123; //set ID of your company

            $apiKey = 'ZDk1MmE5NzMtODcxNi00YzIwLTllZDMtN2ZjM2NjOGI2YTMz'; //set
            company apikey


            // Create a stream


            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => "Accept: application/json\r\n" .
                                "Accept-Charset: utf-8\r\n" .
                                "Authorization: Basic ". base64_encode("$companyId:$apiKey")."\r\n" .
                                "X-Origin-Request-Id: ".$uuid_v4."\r\n" .
                                "X-Timestamp: ".$date->format(DateTime::ATOM)
                )
            );


            $context = stream_context_create($opts);

            $result = file_get_contents($url, false, $context);


            echo $result;
        - lang: Python
          source: |
            import json
            import uuid
            import base64
            from datetime import datetime
            from http.client import HTTPSConnection

            authString = base64.b64encode(b'<companyId>:<apiKey>')
            customerId = 123
            con = HTTPSConnection('api.uds.app')
            con.request(
                method='GET',
                url='/partner/v2/tags',
                headers={
                    'Accept': 'application/json',
                    'Accept-Charset': 'utf-8',
                    'Authorization': 'Basic ' + authString.decode("utf-8") ,
                    'X-Origin-Request-Id': str(uuid.uuid4()),
                    'X-Timestamp': datetime.now().isoformat(),
                })
            print (con.getresponse().read())
            con.close()
        - lang: Node
          source: |
            var https = require('https');
            var uuid = require('uuid4');
            var authString = '<companyId>' + ':' + '<apiKey>';
            var customerId = 123;

            var options = {
              'host': 'api.uds.app',
              'port': 443,
              'path': '/partner/v2/tags',
              'method': 'GET',
              'headers': {
                'Accept': 'application/json',
                'Accept-Charset': 'utf-8',
                'Authorization': 'Basic ' + Buffer.from(authString).toString('base64'),
                'X-Origin-Request-Id': uuid(),
                'X-Timestamp': new Date().toISOString()
              }
            };

            var req = https.request(options, function(res) {
              res.setEncoding('utf8');
              res.on('data', function (response) {

                console.log(
                  JSON.parse(response)
                );

              });
            });

            req.end();
      responses:
        '200':
          description: Теги.
          content:
            application/json:
              schema:
                properties:
                  rows:
                    type: array
                    description: Список тегов.
                    items:
                      $ref: '#/components/schemas/TagModel'
                  total:
                    type: number
                    description: Количество тегов.
      description: Получение списка тегов компании.
components:
  securitySchemes:
    Basic:
      type: http
      scheme: basic
      description: >-
        Для вызова методов Partner API интегрируемые приложения должны
        аутентифицировать запросы, используя [Basic
        Auth](https://en.wikipedia.org/wiki/Basic_access_authentication). Для
        этого требуется установить значение токена в http-заголовок
        `Authorization`. 


        Значение токена - это строка вида `Basic <base64-encoded-string>`, где
        <base64-encoded-string> - это строка "<companyId>:<apiKey>",
        закодированная с помощью base64. Создать или получить имеющийся `apiKey`
        можно на странице
        [Интеграция](https://admin.uds.app/admin/options/integration). 


        #### Пример 


        ```bash 

        curl -X GET -s https://api.uds.app/partner/v2/settings 

        -H "Authorization: Basic MTIzNDp0b2tlbg==" 

        ```  


        Где `MTIzNDp0b2tlbg==` -- это закодированная в Base64 строка
        `1234:token`.
    Webhook:
      type: apiKey
      in: header
      name: X-Signature
      description: >-
        В целях обеспечения безопасности запросов все вебхуки подписаны цифровой
        подписью. 


        Псевдокод для вычисления подписи: 


        ``` 
           md5 ( concat ( X-RequestId, X-Timestamp, Client-Id, Api-Key ) ) 
        ``` 


        Где: 

        * `md5` - md5 хэш-функция 

        * `concat` - объединение строк 

        * `X-RequestId` - значение http-заголовка `X-RequestId` 

        * `X-Timestamp` - значение http-заголовка `X-Timestamp` 

        * `Client-Id` - идентификатор клиента или компании 

        * `Api-Key` - ключ api, который требуется для аутентификации запросов к
        Partner API 


        ### Пример 


        Например, `123456` - идентификатор клиента, а
        `ZWY5ZmI4ZjQtNTgxMC00M2M3LWE2YTYtZGVhMDRmZTAwNzQxCg==` - Api-Key. Тогда
        вебхук-запрос будет выглядеть следующим образом: 


        ``` 
                curl -X POST https://webhook-server.com/api/evetns/operation \ 
                  -H 'X-RequestId: bf7d19b0-8e3c-4d55-98ba-2783915957b3' \ 
                  -H 'X-Timestamp: 2018-10-22T13:52:46,769Z' \ 
                  -H 'X-Signature: dc8d4416d3e01a40fd10f1c7bf3f4754' \ 
                  -d '{ ... }'  # тело запроса пропущено для примера 
        ``` 


        Где строка `dc8d4416d3e01a40fd10f1c7bf3f4754` - это результат
        выполнения: 


        ``` 

        $ echo -n
        'bf7d19b0-8e3c-4d55-98ba-2783915957b32018-10-22T13:52:46,769Z123456ZWY5ZmI4ZjQtNTgxMC00M2M3LWE2YTYtZGVhMDRmZTAwNzQxCg=='
        | md5sum dc8d4416d3e01a40fd10f1c7bf3f4754  - 

        ```
  responses:
    NotFound:
      description: Объект не найден.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GeneralError'
  parameters:
    id:
      name: id
      in: path
      description: Идентификатор объекта.
      schema:
        type: integer
        format: int64
      required: true
    max:
      name: max
      in: query
      description: Ограничить количество результатов в ответе.
      schema:
        type: integer
        default: 10
        maximum: 50
    offset:
      name: offset
      in: query
      description: 'Количество строк, которое будет пропущено перед выводом результата.'
      schema:
        type: integer
        default: 0
        maximum: 10000
    cursor:
      name: cursor
      in: query
      description: Пагинация через курсор.
      schema:
        type: string
    externalId:
      name: externalId
      in: path
      description: Внешний идентификатор объекта.
      schema:
        type: string
      required: true
    x-request-id:
      name: X-Origin-Request-Id
      in: header
      description: Идентификатор запроса (UUID).
      required: true
      schema:
        type: string
    x-timestamp:
      name: X-Timestamp
      in: header
      description: Временная метка в формате ISO8601.
      required: true
      schema:
        type: string
        format: date-time
    x-signature:
      name: X-Signature
      in: header
      description: Подпись webhook-запроса.
      required: true
      schema:
        type: string
  headers:
    X-Request-Id:
      description: Идентификатор запроса.
      schema:
        type: string
        format: uuid
    X-Timestamp:
      description: Временная метка запроса.
      schema:
        type: string
        format: date-time
  schemas:
    GeneralError:
      type: object
      description: Общая ошибка.
      properties:
        errorCode:
          $ref: '#/components/schemas/ErrorCode'
        message:
          type: string
          description: Описание ошибки.
      required:
        - errorCode
        - message
    ErrorCode:
      type: string
      description: Код ошибки.
      enum:
        - notFound
        - badRequest
        - forbidden
    CompanySettings:
      type: object
      description: Настройки компании.
      required:
        - id
        - name
        - promoCode
        - marketingSettings
        - currency
        - baseDiscountPolicy
        - purchaseByPhone
        - usePointsByPhone
        - writeInvoice
        - slug
      properties:
        id:
          type: integer
          description: Идентификатор компании в UDS.
        name:
          type: string
          description: Название компании.
        promoCode:
          type: string
          description: Промокод компании для вступления.
        currency:
          description: Валюта компании (стандарт ISO-4217).
          nullable: true
          type: string
        baseDiscountPolicy:
          type: string
          description: |-
            Определяет тип программы лояльности: 
            * `APPLY_DISCOUNT` - понижать сумму счета (скидка); 
            * `CHARGE_SCORES` - начислять бонусные баллы (кешбэк).
          enum:
            - APPLY_DISCOUNT
            - CHARGE_SCORES
        loyaltyProgramSettings:
          $ref: '#/components/schemas/LoyaltyProgramSettings'
        purchaseByPhone:
          type: boolean
          description: 'Возможность проведения операции, используя номер телефона клиента.'
        usePointsByPhone:
          type: boolean
          description: >-
            Возможность списания бонусов в операции, используя номер телефона
            клиента.
        writeInvoice:
          type: boolean
          description: >-
            Необходимо ли указывать номер счета при проведении оплаты через UDS
            Кассир.
        slug:
          type: string
          description: >-
            Доменное имя, которое отображается в ссылке на веб-страницу вашей
            компании.
    LoyaltyProgramSettings:
      type: object
      description: >-
        Настройки [бонусной
        программы](https://admin.uds.app/admin/options/loyalty-program/bonus)
        компании.
      required:
        - baseMembershipTier
        - membershipTiers
        - referralCashbackRates
        - cashierAward
        - referralReward
        - discountVip
        - receiptLimit
        - deferPointsForDays
      properties:
        baseMembershipTier:
          $ref: '#/components/schemas/MembershipTier'
        membershipTiers:
          type: array
          description: Настройки статусов.
          items:
            $ref: '#/components/schemas/MembershipTier'
        referralCashbackRates:
          type: array
          description: Коэффициенты начисления кешбэка для рефералов (3 уровня в %).
          items:
            type: number
        cashierAward:
          type: number
          nullable: true
          description: Процент вознаграждения кассиру за проведенную операцию.
        referralReward:
          type: number
          nullable: true
          description: Вознаграждение клиенту за эффективную рекомендацию.
        receiptLimit:
          type: number
          nullable: true
          description: >-
            Максимальная сумма операции, которую можно провести через UDS
            Кассир.
        deferPointsForDays:
          type: number
          nullable: true
          description: >-
            Количество дней, после которых будут начислены отложенные бонусные
            баллы.
        firstPurchasePoints:
          type: number
          nullable: true
          minimum: 0.01
          description: Number of points for the first purchase
    Customer:
      type: object
      description: Информация о клиенте.
      properties:
        uid:
          type: string
          description: Идентификатор клиента в UDS (UID).
          nullable: true
        avatar:
          type: string
          description: URL изображения клиента.
          nullable: true
        displayName:
          type: string
          description: Имя клиента.
        gender:
          type: string
          nullable: true
          description: Пол.
          allOf:
            - $ref: '#/components/schemas/Gender'
        phone:
          type: string
          description: Номер телефона клиента.
          nullable: true
        birthDate:
          type: string
          nullable: true
          format: date
          readOnly: true
          description: Дата рождения клиента.
        participant:
          $ref: '#/components/schemas/Participant'
        channelName:
          type: string
          description: Источник трафика.
          nullable: true
        email:
          type: string
          description: Email клиента.
          nullable: true
    CustomerDetail:
      description: Информация о клиенте.
      allOf:
        - $ref: '#/components/schemas/Customer'
        - type: object
          properties:
            tags:
              description: Список тегов клиента.
              type: array
              nullable: false
              default: []
              items:
                $ref: '#/components/schemas/TagModel'
    PurchaseTokenAction:
      description: Тип кода операции.
      type: string
      nullable: false
      enum:
        - PURCHASE
        - BONUS_ITEMS_PURCHASE
        - GOODS_ORDER_COMPLETE
        - CERTIFICATE
    MembershipTier:
      type: object
      description: Настройки статусов клиентов.
      required:
        - name
        - rate
      properties:
        uid:
          type: string
          description: Идентификатор статуса.
          readOnly: true
        name:
          type: string
          description: Название статуса.
        rate:
          type: number
          description: Коэффициент статуса.
          maximum: 100
          minimum: 0
        maxScoresDiscount:
          type: number
          nullable: true
          description: 'Процент счета, который можно оплатить бонусными баллами.'
        conditions:
          type: object
          description: Условия для автоматического назначения статуса.
          properties:
            totalCashSpent:
              type: object
              description: 'Повысить статус, когда сумма покупок достигнет данного значения.'
              nullable: true
              properties:
                target:
                  type: number
                  description: Сумма покупок.
            effectiveInvitedCount:
              type: object
              description: >-
                Повысить уровень, когда клиент достигнет значения
                `effectiveInvitedCount`.
              nullable: true
              properties:
                target:
                  type: integer
                  description: Количество эффективных рекомендаций.
    Gender:
      type: string
      nullable: true
      description: Пол.
      enum:
        - MALE
        - FEMALE
        - NOT_SPECIFIED
    Participant:
      type: object
      description: Информация о клиенте.
      properties:
        id:
          type: integer
          format: int64
          nullable: true
          description: ID клиента в компании.
        inviterId:
          type: integer
          format: int64
          nullable: true
          description: 'ID клиента в компании, пригласившего данного клиента.'
        points:
          type: number
          description: Баланс бонусных баллов клиента.
        discountRate:
          type: number
          description: Размер скидки (в процентах).
        cashbackRate:
          type: number
          description: Размер кешбэка (в процентах) для данного клиента UDS.
        cashSpent:
          type: number
          description: Сумма оплат деньгами.
        savedFunds:
          type: number
          description: >-
            Сумма общей выгоды с учетом прямой скидки и оплатой бонусами и
            сертификатами.
        invitedCount:
          type: integer
          description: Количество рекомендаций.
        effectiveInvitedCount:
          type: integer
          description: Количество эффективных рекомендаций.
        operationsCount:
          type: integer
          description: Количество операций.
        fullRefundsCount:
          type: integer
          description: Количество полных возвратов.
        note:
          type: string
          nullable: true
          description: Заметка.
        membershipTier:
          $ref: '#/components/schemas/MembershipTier'
        dateCreated:
          type: string
          nullable: true
          format: date-time
          readOnly: true
          description: 'Дата, когда клиент присоединился к компании'
        lastTransactionTime:
          type: string
          format: date-time
          readOnly: true
          nullable: true
          description: 'Дата и время, когда клиент совершил последнюю транзакцию.'
        pointsExpireIn:
          type: string
          format: date-time
          readOnly: true
          nullable: true
          description: Срок действия бонусов клиента.
    Operation:
      type: object
      description: Информация об операции.
      required:
        - action
      discriminator:
        propertyName: action
        mapping:
          PURCHASE: '#/components/schemas/PurchaseOperation'
      properties:
        id:
          type: integer
          description: ID операции в базе UDS .
          format: int64
          readOnly: true
        dateCreated:
          type: string
          description: Дата операции.
          format: date-time
          readOnly: true
        action:
          $ref: '#/components/schemas/Action'
          description: Тип операции.
        state:
          $ref: '#/components/schemas/ActionState'
        customer:
          allOf:
            - $ref: '#/components/schemas/CustomerShortInfo'
            - type: object
              properties:
                uid:
                  nullable: true
                  description: Идентификатор клиента в UDS (UID).
        cashier:
          allOf:
            - $ref: '#/components/schemas/CashierInfo'
            - nullable: true
        branch:
          allOf:
            - $ref: '#/components/schemas/BranchInfo'
            - nullable: true
        points:
          type: number
          description: >-
            Количество бонусных баллов, которое будет списано с клиента после
            завершения операции. Отрицательное значение говорит о списании, а
            положительное - о начислении бонусных баллов.
        certificatePoints:
          type: number
          nullable: true
          description: Количество списываемых баллов сертификата.
        receiptNumber:
          type: string
          nullable: true
          description: Номер чека.
        origin:
          type: object
          description: Для сторнирующей операции - ссылка на оригинальную операцию.
          nullable: true
          properties:
            id:
              type: integer
              format: int64
              description: Идентификатор исходной (оригинальной) операции.
    VoucherInfo:
      description: Информация о ваучере.
      properties:
        code:
          type: string
          description: Числовой код ваучера.
        qrCodeText:
          type: string
          description: Текст для генерации QR - кода ваучера для дальнейшей печати.
        qrCode128:
          type: string
          description: >-
            Ссылка  для генерирования картинки QR кода (size 128), которую можно
            распечатать.
        qrCode256:
          type: string
          description: >-
            Ссылка  для генерирования картинки QR кода (size 256), которую можно
            распечатать.
        expiresIn:
          type: string
          format: date-time
          description: 'Время, когда ваучер сгорит по времени UTC.'
        points:
          type: number
          description: >-
            Количество баллов для начисления. Рассчитывается из настроек
            базового уровня бонусной программы.
    CreateVoucher:
      type: object
      required:
        - receipt
      properties:
        nonce:
          type: string
          nullable: true
          description: UID чека.
        cashier:
          type: object
          nullable: true
          description: Информация о сотруднике.
          properties:
            externalId:
              type: string
              description: Внешний  идентификатор сотрудника.
            name:
              type: string
              nullable: true
              description: Имя сотрудника.
        receipt:
          type: object
          description: Информация о чеке.
          required:
            - total
            - cash
            - points
          properties:
            total:
              type: number
              description: Сумма  счета в денежных единицах.
            number:
              type: string
              nullable: true
              description: Номер чека.
            skipLoyaltyTotal:
              type: number
              nullable: true
              description: >-
                Часть суммы счета, на которую не начисляется кешбэк (в денежных
                единицах).
    CreateOperation:
      type: object
      description: Operation information.
      required:
        - receipt
      properties:
        code:
          type: string
          nullable: true
          description: Код на оплату.
        participant:
          type: object
          nullable: true
          description: Информация о клиенте.
          properties:
            uid:
              type: string
              nullable: true
              description: Идентификатор клиента в UDS (UID).
            phone:
              type: string
              nullable: true
              description: Номер телефона.
        nonce:
          type: string
          nullable: true
          description: Уникальный идентификатор операции (UUID).
        cashier:
          type: object
          nullable: true
          description: Информация о сотруднике.
          properties:
            externalId:
              type: string
              description: Внешний идентификатор сотрудника.
            name:
              type: string
              nullable: true
              description: Имя сотрудника.
        receipt:
          type: object
          description: Информация о чеке.
          required:
            - total
            - cash
            - points
          properties:
            total:
              type: number
              description: Сумма счета в денежных единицах.
            cash:
              type: number
              description: Оплачиваемая сумма в денежных единицах.
            points:
              type: number
              description: Оплачиваемая сумма в бонусных баллах.
            number:
              type: string
              nullable: true
              description: Номер чека.
            skipLoyaltyTotal:
              type: number
              nullable: true
              description: >-
                Часть суммы счета, на которую не начисляется кешбэк и на которую
                не распространяется скидка (в денежных единицах).
            unredeemableTotal:
              type: number
              nullable: true
              description: 'Часть суммы счета, которую нельзя погасить баллами.'
        tags:
          type: array
          nullable: true
          description: >-
            Список id тегов компании, назначаемых клиенту при проведении
            операции. Передача `null` означает, что существующее значение не
            будет изменено
          items:
            $ref: '#/components/schemas/TagId'
    PurchaseCalcRequest:
      description: Operation information.
      type: object
      required:
        - receipt
      properties:
        code:
          type: string
          nullable: true
          description: Код на оплату.
        participant:
          type: object
          nullable: true
          description: Информация о клиенте.
          properties:
            uid:
              type: string
              nullable: true
              description: Идентификатор клиента в UDS (UID).
            phone:
              type: string
              nullable: true
              description: Номер телефона.
        receipt:
          type: object
          description: Информация о чеке.
          required:
            - total
          properties:
            total:
              type: number
              description: Общая сумма  чека  до применения скидок в денежных единицах.
            skipLoyaltyTotal:
              type: number
              description: >-
                Часть суммы счета, на которую не начисляется кешбэк и на которую
                не распространяется скидка (в денежных единицах).
            unredeemableTotal:
              type: number
              description: 'Часть суммы счета, которую нельзя погасить баллами.'
            points:
              type: number
              description: >-
                Количество бонусных баллов, которое клиент хочет списать. По
                умолчанию максимально доступное число баллов.
    PurchaseCalcResponse:
      type: object
      required:
        - user
        - purchase
      properties:
        user:
          $ref: '#/components/schemas/CustomerDetail'
        purchase:
          $ref: '#/components/schemas/PurchaseCalc'
    PurchaseCalc:
      type: object
      description: Информация об операции.
      properties:
        maxPoints:
          type: number
          description: 'Максимальное количество бонусных баллов, доступное для списания.'
        total:
          type: number
          description: Общая сумма счета (в денежных единицах).
        skipLoyaltyTotal:
          type: number
          description: >-
            Часть суммы счета, на которую не начисляется кешбэк и на которую не
            распространяется скидка (в денежных единицах).
        unredeemableTotal:
          type: number
          description: 'Часть суммы счета, которую нельзя погасить баллами.'
        discountAmount:
          description: Размер скидки (в денежных единицах).
          type: number
        discountPercent:
          description: Предоставленная скидка (в процентах).
          type: number
        points:
          type: number
          description: Бонусных баллов к оплате.
        pointsPercent:
          description: Размер скидки за счет бонусных баллов (в процентах).
          type: number
        netDiscount:
          description: Общий размер скидки (в денежных единицах).
          type: number
        netDiscountPercent:
          description: Общий размер скидки (в процентах от общей суммы счета).
          type: number
        certificatePoints:
          description: >-
            Количество списываемых бонусных баллов сертификата (в денежных
            единицах).
          type: number
        cash:
          type: number
          description: Сумма к оплате (в денежных единицах).
        cashTotal:
          type: number
          description: Итоговая сумма к оплате с учетом доставки.
        cashBack:
          type: number
          description: >-
            Вознаграждение (кешбэк), которое получит клиент после проведения
            операции (в бонусных баллах).
        extras:
          type: object
          description: >-
            Дополнительный платежи, на которые не распространяется программа
            лояльности.
          properties:
            delivery:
              type: number
              description: Стоимость доставки.
        maxScoresDiscount:
          type: number
          description: 'Процент счета, который можно оплатить бонусными баллами.'
    Action:
      type: string
      description: Тип операции.
      enum:
        - PURCHASE
    ActionState:
      type: string
      description: Статус операции.
      enum:
        - NORMAL
        - CANCELED
        - REVERSAL
    PurchaseOperation:
      allOf:
        - $ref: '#/components/schemas/Operation'
        - type: object
          properties:
            total:
              type: number
              description: Общая сумма  чека  до применения скидок в денежных единицах.
            cash:
              type: number
              description: Оплачиваемая сумма в денежных единицах.
      description: Идентификатор клиента в UDS (UID).
    Reference:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Identifier.
        displayName:
          type: string
          description: Name.
    CashierInfo:
      type: object
      description: Информация о сотруднике.
      properties:
        id:
          type: integer
          format: int64
          description: ID сотрудника в UDS.
        displayName:
          type: string
          description: Имя сотрудника.
    ParticipantShortInfo:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: ID клиента в компании
        displayName:
          type: string
          description: Имя и фамилия клиента.
    BranchInfo:
      type: object
      description: Информация о филиале.
      properties:
        id:
          type: integer
          format: int64
          description: ID филиала в UDS.
        displayName:
          type: string
          description: Название филиала.
    GoodsInfoType:
      type: object
      description: Информация о товаре / категории.
      required:
        - name
        - data
      properties:
        id:
          type: integer
          readOnly: true
          description: ID товара / категории.
        name:
          type: string
          description: Название товара / категории.
        data:
          $ref: '#/components/schemas/GoodsData'
        hidden:
          type: boolean
          description: Скрыт ли товар / категория.
        blocked:
          type: boolean
          description: Заблокирован ли товар / категория.
          readOnly: true
        nodeId:
          type: integer
          nullable: true
          description: 'ID категории, в которую вложен товар / категория.'
        imageUrls:
          description: Список ссылок на изображение товара.
          type: array
          nullable: false
          readOnly: true
          items:
            type: string
            nullable: false
        externalId:
          type: string
          nullable: true
          description: Внешний идентификатор товара / категории.
        dateCreated:
          type: string
          format: date-time
          readOnly: true
          description: Дата создания товара / категории.
    GoodsDetailed:
      description: ' Свойства товара / категории.'
      required:
        - name
        - data
      properties:
        id:
          type: integer
          readOnly: true
          description: ID товара.
        name:
          type: string
          description: Название товара / категории.
        nodeId:
          type: integer
          nullable: true
          description: 'ID категории, в которой находится товар / категория.'
        externalId:
          type: string
          nullable: true
          description: Внешний идентификатор товара / категории.
        dateCreated:
          type: string
          format: date-time
          readOnly: true
          description: Date item created.
        data:
          $ref: '#/components/schemas/GoodsData'
        hidden:
          type: boolean
          nullable: true
          description: Скрыт ли товар / категория.
        blocked:
          type: boolean
          nullable: true
          readOnly: true
          description: Заблокирован ли товар / категория.
        imageUrls:
          description: Список ссылок на изображение товара.
          type: array
          nullable: false
          readOnly: true
          items:
            type: string
            nullable: false
    GoodsData:
      type: object
      description: Свойства товара / категории.
      oneOf:
        - $ref: '#/components/schemas/GoodsCategoryType'
        - $ref: '#/components/schemas/GoodsItemType'
        - $ref: '#/components/schemas/GoodsVaryingItemType'
      discriminator:
        propertyName: type
        mapping:
          CATEGORY: '#/components/schemas/GoodsCategoryType'
          ITEM: '#/components/schemas/GoodsItemType'
          VARYING_ITEM: '#/components/schemas/GoodsVaryingItemType'
    GoodsCategoryType:
      type: object
      required:
        - type
      properties:
        type:
          $ref: '#/components/schemas/GoodsType'
    GoodsItemType:
      type: object
      required:
        - type
      properties:
        type:
          $ref: '#/components/schemas/GoodsType'
        sku:
          type: string
          nullable: true
          description: Артикул товара.
        price:
          type: number
          description: Цена товара.
        description:
          type: string
          nullable: true
          description: Описание товара.
        offer:
          allOf:
            - $ref: '#/components/schemas/GoodsOffer'
            - nullable: true
        inventory:
          $ref: '#/components/schemas/GoodsInventory'
        photos:
          $ref: '#/components/schemas/GoodsPhotos'
        measurement:
          $ref: '#/components/schemas/GoodsMeasurement'
        increment:
          type: number
          nullable: true
          description: >-
            Количество товара, которое покупатель может добавить или убрать за 1
            шаг.
        minQuantity:
          type: number
          nullable: true
          description: Минимальное количество товара для заказа.
        vatCode:
          allOf:
            - $ref: '#/components/schemas/VatCode'
            - nullable: true
        paymentSubject:
          allOf:
            - $ref: '#/components/schemas/PaymentSubject'
            - nullable: true
    GoodsVaryingItemType:
      type: object
      description: Свойства товара с вариантами.
      required:
        - type
      properties:
        type:
          $ref: '#/components/schemas/GoodsType'
        variants:
          type: array
          description: Список вариантов товара.
          items:
            allOf:
              - $ref: '#/components/schemas/GoodsVariantType'
        description:
          type: string
          nullable: true
          description: Описание товара с вариантами.
        photos:
          $ref: '#/components/schemas/GoodsPhotos'
        vatCode:
          allOf:
            - $ref: '#/components/schemas/VatCode'
            - nullable: true
        paymentSubject:
          allOf:
            - $ref: '#/components/schemas/PaymentSubject'
            - nullable: true
    GoodsVariantType:
      properties:
        name:
          type: string
          description: Название варианта.
        sku:
          type: string
          nullable: true
          description: Артикул варианта.
        price:
          type: number
          description: Цена варианта.
        offer:
          allOf:
            - $ref: '#/components/schemas/GoodsOffer'
            - nullable: true
        inventory:
          $ref: '#/components/schemas/GoodsInventory'
    GoodsOffer:
      type: object
      description: Акционный товар.
      properties:
        offerPrice:
          type: number
          nullable: true
          description: Цена по акции.
        skipLoyalty:
          type: boolean
          description: Не применять бонусную программу на товар.
    GoodsInventory:
      type: object
      nullable: true
      description: Доступное количество товара.
      properties:
        inStock:
          type: integer
          description: >-
            Доступное количество товара. Значение "null" обозначает -
            неограниченное количество.
          nullable: true
    GoodsType:
      type: string
      enum:
        - CATEGORY
        - ITEM
        - VARYING_ITEM
    GoodsPhotos:
      type: array
      nullable: false
      description: Список идентификаторов изображений товара.
      items:
        type: string
        description: Base64 encoded photo path
    GoodsOrderDetailed:
      type: object
      description: Информация о заказе.
      properties:
        id:
          type: integer
          description: ID заказа.
        dateCreated:
          type: string
          format: date-time
          description: Дата заказа.
        comment:
          type: string
          nullable: true
          description: Комментарий к заказу.
        state:
          $ref: '#/components/schemas/GoodsOrderState'
          description: Статус заказа.
        orderStatus:
          nullable: true
          description: Статус обработки заказа.
          allOf:
            - $ref: '#/components/schemas/GoodsOrderUpdateStatus'
        cash:
          type: number
          description: 'Сумма, оплачиваемая деньгами.'
        points:
          type: number
          description: Количество списываемых баллов .
        total:
          type: number
          description: Сумма заказа.
        certificatePoints:
          type: number
          description: Количество списываемых баллов сертификата.
        customer:
          $ref: '#/components/schemas/CustomerShortInfo'
        delivery:
          $ref: '#/components/schemas/DeliveryType'
        onlinePayment:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/OnlinePayment'
        paymentMethod:
          $ref: '#/components/schemas/PaymentMethod'
        items:
          type: array
          description: Информация о товарах.
          items:
            allOf:
              - $ref: '#/components/schemas/GoodsOrderItem'
        purchase:
          type: object
          nullable: false
          allOf:
            - $ref: '#/components/schemas/PurchaseCalc'
    GoodsOrderUpdate:
      type: object
      properties:
        deliveryCase:
          $ref: '#/components/schemas/DeliveryCase'
        items:
          type: array
          description: Информация о товарах.
          items:
            oneOf:
              - $ref: '#/components/schemas/GoodsOrderItemUpdate'
              - $ref: '#/components/schemas/GoodsOrderItemNew'
    GoodsOrderItemUpdate:
      type: object
      properties:
        id:
          type: integer
          description: ID товара в UDS.
        variantName:
          type: string
          description: 'Имя варианта товара, если тип этого товара VARYING_ITEM'
        qty:
          type: integer
          description: Количество.
    GoodsOrderItemNew:
      type: object
      properties:
        externalId:
          type: string
          description: Внешний идентификатор товара.
        name:
          type: string
          description: Название товара
        variantName:
          type: string
          description: 'Имя варианта товара, если тип этого товара VARYING_ITEM'
        qty:
          type: integer
          description: Количество.
        price:
          type: number
          description: Цена товара.
        skipLoyalty:
          type: boolean
          default: false
          description: Не применять бонусную программу к товару.
    OnlinePayment:
      type: object
      nullable: true
      description: Информация об онлайн-оплате.
      properties:
        paymentProvider:
          type: string
          description: Тип платежной системы
          enum:
            - B2P
            - CLOUD_PAYMENTS
            - YOOKASSA
            - PAYTURE
            - CUSTOM
        id:
          type: string
          description: Идентификатор платежа во внешней платежной системе
        completed:
          type: boolean
          description: Статус оплаты.
    PaymentMethod:
      type: object
      description: Информация об оплате.
      properties:
        type:
          type: string
          description: Тип оплаты.
          enum:
            - BEST_TO_PAY
            - CLOUD_PAYMENTS
            - CASH
            - MANUAL
            - CUSTOM
        name:
          type: string
          description: Название пользовательского метода оплаты с типом MANUAL
          nullable: true
        online:
          type: boolean
          description: Платеж онлайн.
        providerType:
          type: string
          description: Тип провайдера онлайн-оплаты.
          nullable: true
    GoodsOrderItem:
      type: object
      description: Информация о товаре.
      properties:
        id:
          type: integer
          description: ID товара в UDS.
        externalId:
          type: string
          nullable: true
          description: Внешний идентификатор товара.
        name:
          type: string
          description: Название товара
        variantName:
          type: string
          nullable: true
          description: 'Имя варианта товара, если тип этого товара VARYING_ITEM'
        sku:
          type: string
          nullable: true
          description: Артикул товара.
        type:
          type: string
          description: Тип товара.
          enum:
            - ITEM
            - VARYING_ITEM
        qty:
          type: integer
          description: Количество.
        price:
          type: number
          description: Цена товара.
        offerPrice:
          type: number
          nullable: true
          description: Цена по акции.
        skipLoyalty:
          type: boolean
          default: false
          description: Не применять бонусную программу на товар.
        measurement:
          $ref: '#/components/schemas/GoodsMeasurement'
    DeliveryType:
      type: object
      description: Способ получения заказа.
      oneOf:
        - $ref: '#/components/schemas/Pickup'
        - $ref: '#/components/schemas/Delivery'
      discriminator:
        propertyName: type
        mapping:
          PICKUP: '#/components/schemas/Pickup'
          DELIVERY: '#/components/schemas/Delivery'
    ReceiverInfo:
      type: object
      description: Информация о получателе.
      properties:
        receiverName:
          type: string
          description: 'Имя клиента, который заберет заказа.'
        receiverPhone:
          type: string
          description: 'Номер телефона клиента, который заберет заказ.'
        userComment:
          type: string
          nullable: true
          description: Комментарий клиента к заказу
    DeliveryTypes:
      type: string
      description: Способ получения заказа.
      enum:
        - PICKUP
        - DELIVERY
    Pickup:
      type: object
      description: Самовывоз заказа.
      required:
        - type
      allOf:
        - $ref: '#/components/schemas/ReceiverInfo'
        - type: object
          properties:
            branch:
              $ref: '#/components/schemas/BranchInfo'
            type:
              $ref: '#/components/schemas/DeliveryTypes'
    Delivery:
      type: object
      description: Доставка заказа.
      required:
        - type
      allOf:
        - $ref: '#/components/schemas/ReceiverInfo'
        - type: object
          properties:
            deliveryCase:
              $ref: '#/components/schemas/DeliveryCase'
            address:
              type: string
              nullable: true
              description: Адрес доставки.
            type:
              $ref: '#/components/schemas/DeliveryTypes'
    DeliveryCase:
      properties:
        name:
          type: string
          description: Название доставки.
          example: zone A
        value:
          type: number
          description: Стоимость доставки.
          example: 0.1
      description: Информация о доставке.
    CustomerShortInfo:
      type: object
      description: Информация о клиенте.
      allOf:
        - $ref: '#/components/schemas/ParticipantShortInfo'
        - properties:
            uid:
              type: string
              description: Идентификатор клиента в UDS (UID).
            membershipTier:
              $ref: '#/components/schemas/MembershipTier'
    GoodsOrderState:
      type: string
      description: Статус заказа.
      enum:
        - NEW
        - COMPLETED
        - DELETED
        - WAITING_PAYMENT
        - NEED_ACK
    GoodsOrderUpdateStatus:
      type: string
      description: Статус обработки заказа.
      enum:
        - ACCEPTED
        - READY
    GoodsMeasurement:
      type: string
      description: Единицы измерения товаров.
      enum:
        - PIECE
        - CENTIMETRE
        - METRE
        - MILLILITRE
        - LITRE
        - GRAM
        - KILOGRAM
        - TON
        - SQUARE_METRE
        - CUBIC_METRE
        - DAY
        - HOUR
        - MINUTE
        - KILOMETRE
    VatCode:
      type: string
      description: Коды ставок НДС.
      enum:
        - NO_NDS
        - NDS_0
        - NDS_10
        - NDS_20
        - NDS_10_110
        - NDS_20_120
    PaymentSubject:
      type: string
      description: >-
        Признак предмета расчета: `COMMODITY` - Товар,  `EXCISE` - Подакцизный
        товар,  `SERVICE` - Услуга.
      enum:
        - COMMODITY
        - EXCISE
        - SERVICE
    TaxSystemCode:
      type: string
      description: >-
        Коды систем налогообложения: `OSN` - Общая система налогообложения, 
        `USN_INCOME` - Упрощенная (УСН, доходы),  `USN_INCOME_EXPENSES` -
        Упрощенная (УСН, доходы минус расходы),  `ENVD` - Единый налог на
        вмененный доход (ЕНВД),  `ESN` - Единый сельскохозяйственный налог
        (ЕСН),  `PSN` - Патентная система налогообложения.
      enum:
        - OSN
        - USN_INCOME
        - USN_INCOME_EXPENSES
        - ENVD
        - ESN
        - PSN
    TagId:
      type: integer
      format: int64
      example: 1
      description: Идентификатор тега.
    TagModel:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/TagId'
        name:
          description: Наименование тега.
          type: string
      description: Тег.
