openapi: 3.0.0
info:
  title: RUVDS API
  version: '2.24'
  description: |
    # Введение

    RUVDS API позволяет управлять серверами с помощью HTTP запросов.

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

    Документация по API начинается с общего обзора технологий, которые были реализованы.
    Затем представлена справочная информация о вызовах API.


    ## История изменений
    |Версия|Дата|Изменения|
    |---|---|---|
    |2.24|2025-06-23| Добавлен метод POST `/v2/payments/balance` для продления сервера с баланса. |
    |2.23|2025-06-23| В целях безопасности убрана возможность использования HTTP Basic авторизации при обращении к API. Для получения токена доступа через API в разделе `Auth` есть методы с анонимным доступом. Так же токен можно получить на сайте: https://ruvds.com/my/settings/api |
    |2.22|2025-05-06| Добавлен раздел `Auth` для получения токена API с возможностью двухфакторной авторизации. |
    |2.21|2025-04-15| В еnum `payment_period` добавлено значение `0`. |
    |2.20|2025-03-17| В запрос GET `/v2/servers` добавлена возможность поиска и получения информации об IP адресах и даты до которой оплачен сервер. |
    |2.19|2025-02-20| В запрос GET `/v2/os` добавлена информация об операционных системах. |
    |2.18|2025-01-13| В запрос GET `/v2/tariffs` добавлена информация о скидках за платёжные периоды. |
    |2.17|2024-11-22| Добавлена возможность получать количество уведомлений с необходимым статусом и массовой пометки уведомлений новым статусом. |
    |2.16|2024-07-19| Для всех запросов добавлены JavaScript примеры. |
    |2.15|2024-07-04| Для всех запросов добавлены Python примеры. |
    |2.14|2024-06-26| Для всех запросов добавлены Powershell примеры. |
    |2.13|2024-06-19| Для всех запросов добавлены cURL примеры. |
    |2.12|2024-06-11| Добавлена возможность получения состояния питания и даты, до которой оплачен сервер. В методы управления сервером, добавлен возвращаемый код ошибки `409`. |
    |2.11|2024-05-29| Добавлена возможность управления SSH ключами и указания SSH ключа при создании сервера. |
    |2.10|2023-11-27| Добавлена возможность получения начального пароля от сервера при помощи GET запроса. `GET /v2/servers/$VIRTUAL_SERVER_ID/start_password` Требуется токен с правами `remove`. |
    |2.9|2023-11-24| Добавлена возможность получения скриншота сервера. `GET /v2/servers/$VIRTUAL_SERVER_ID/screenshot` |
    |2.8|2023-11-20| Ответ со статусом `403` теперь возвращает объект `api_forbidden_error`. В данном объекте дополнительно содержится поле `user_id`. |
    |2.7|2023-11-09| Добавлена возможность получения информации о стоимости продления виртуального сервера. `GET /v2/servers/$VIRTUAL_SERVER_ID/cost` |
    |2.6|2023-11-09| Добавлена возможность получения начального пароля от сервера. `POST /v2/servers/$VIRTUAL_SERVER_ID/start_password` |
    |2.5|2023-11-08| Добавлено получение IP адресов виртуального сервера. `GET /v2/servers/$VIRTUAL_SERVER_ID/networks` |
    |2.4|2023-11-07| Добавлено поле `datacenter` в объект `server`, который возвращается при получении статуса сервера. |
    |2.3|2023-10-31| Теперь можно предварительно узнать стоимость создания и изменения сервера при помощи параметра `get_price_only`. <br /><br /> Изменен возвращаемый объект при изменении сервера `PUT /v2/servers`. |
    |2.2|2023-10-23| В модель `action_error` добавлены новые типы ошибок `server_wait_for_payment` и `too_much_servers_wait_for_payment`. <br /><br /> В модель `api_action` добавлен статус `wait_user_action`. <br /><br /> Добавлена возможность выпускать токен с правами на запись. |
    |2.1|2023-10-12| В модель `api_error` добавлены новые типы ошибок `conflict` и `unexpected_error`. |


    ## Запросы
    Основоной URL, на который отправляются запросы: `https://api.ruvds.com`.

    Все запросы выполняются посредством HTTPS на соответствующий URI.
    Таким образом весть трафик зашифрован.
    Методы запросов соответствуют HTTP протоколу.

    |Метод HTTP|Использование|
    |---|---|
    |GET| Получение информации. Данный запрос не изменяет объект. |
    |DELETE| Удаление объекта. Если объект не найден, то будет возвращен соответствующий код. Идемпотентность означает, что перед удалением нет необходимости проверять наличие объекта. Конечное состояние после удаления будет одним и тем же независимо от наличия объекта. |
    |PUT| Обновление объекта. |
    |POST| Создание объекта. |
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  contact:
    name: RUVDS Support Team
    email: support@ruvds.com
  termsOfService: https://ruvds.com/ru-rub/contract/
servers:
  - url: https://api.ruvds.com
    description: production
security:
  - bearer_auth: []
tags:
  - name: Actions
    description: Информация о действиях.
  - name: Auth
    description: Авторизация и получение токена.
  - name: Balance
    description: Информация о доступных денежных средствах в личном кабинете пользователя.
  - name: Datacenters
    description: Информация о дата-центрах.
  - name: Notifications
    description: Информация об оповещениях.
  - name: OS
    description: Информация о доступных образах операционных систем.
  - name: Payments
    description: Список платежей пользователя.
  - name: SSH Keys
    description: Управление SSH ключами в личном кабинете пользователя.
  - name: Servers
    description: Операции над виртуальными серверами в личном кабинете пользователя.
  - name: Statistics
    description: Информация об использовании  CPU, RAM и сетевого трафика виртуальным серверами пользователя.
  - name: Tariffs
    description: Информация о тарифах.
  - name: Templates
    description: Информация о шаблонах виртуальных серверов доступных пользователю.
  - name: Tokens
    description: Получение токена авторизации при помощи логина и пароля от личного кабинета RUVDS.
paths:
  /v2/actions:
    get:
      operationId: actions_list
      summary: Информация о действиях пользователя, созданных через API.
      description: |
        Чтобы получить список всех действий пользователя отправьте GET запрос по адресу `/v2/actions`.
      tags:
        - Actions
      parameters:
        - $ref: '#/components/parameters/per_page'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/actions_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_actions'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/actions"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ActionsList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                actions_api = pyruvds.ActionsApi(api_client)
                api_response = actions_api.actions_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let actionsApi = new RuvdsApi.ActionsApi();
            let opts = {};
            actionsApi.actionsList(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/actions/{action_id}:
    get:
      operationId: actions_get
      summary: Получение информации по действию.
      description: Для получения конкретного действия отправьте GET запрос по адресу `/v2/actions/$ACTION_ID`.
      tags:
        - Actions
      parameters:
        - $ref: '#/components/parameters/action_id'
      responses:
        '200':
          $ref: '#/components/responses/api_action'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            ACTION_ID=132

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/actions/$ACTION_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ActionsGet -ActionId 132
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            ACTION_ID = int(os.environ.get("ACTION_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                actions_api = pyruvds.ActionsApi(api_client)
                api_response = actions_api.actions_get(ACTION_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const ACTION_ID = process.env.ACTION_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let actionsApi = new RuvdsApi.ActionsApi();
            actionsApi.actionsGet(ACTION_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/auth/captcha_site_key:
    get:
      operationId: auth_captcha_site_key_get
      summary: Получение Site Key для генерации Captcha.
      description: |
        Для получения Site Key Captcha отправьте GET запрос по адресу `/v2/auth/captcha_site_key`.

        В данный момент используется hCaptcha: https://docs.hcaptcha.com/
      tags:
        - Auth
      responses:
        '200':
          $ref: '#/components/responses/auth_captcha_site_key'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - NONE: []
  /v2/auth/login:
    post:
      operationId: auth_login
      summary: Получение токена для доступа к API при помощи логина и пароля.
      description: |
        Для получения токена для доступа к API при помощи логина и пароля
        отправьте POST запрос по адресу `/v2/auth/login`.

        Для заполнения поля `captcha_response` может потребоваться разгадать Captcha.
      tags:
        - Auth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/auth_login'
      responses:
        '200':
          $ref: '#/components/responses/auth_login'
        '400':
          $ref: '#/components/responses/bad_request'
        '403':
          $ref: '#/components/responses/forbidden'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - NONE: []
  /v2/auth/send_code:
    post:
      operationId: auth_send_code
      summary: Отправка кода двухфакторной авторизации.
      description: |
        Для отправки кода двухфакторной авторизации
        отправьте POST запрос по адресу `/v2/auth/send_code`.

        Если в объекте `api_forbidden_error` значение `two_factor_otp=true`,
        то предпочтительнее использовать OTP код вместо данного метода.
      tags:
        - Auth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/auth_send_code'
      responses:
        '200':
          description: OK
        '400':
          $ref: '#/components/responses/bad_request'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - NONE: []
  /v2/auth/two_factor_otp:
    post:
      operationId: auth_two_factor_otp
      summary: Получение токена для доступа к API при помощи OTP кода.
      description: |
        Для получения токена для доступа к API при помощи OTP кода
        отправьте POST запрос по адресу `/v2/auth/two_factor_otp`.
      tags:
        - Auth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/auth_two_factor_otp'
      responses:
        '200':
          $ref: '#/components/responses/auth_two_factor_otp'
        '400':
          $ref: '#/components/responses/bad_request'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - NONE: []
  /v2/auth/two_factor_code:
    post:
      operationId: auth_two_factor_code
      summary: Получение токена для доступа к API при помощи кода из SMS или Email.
      description: |
        Для получения токена для доступа к API при помощи кода из SMS или Email
        отправьте POST запрос по адресу `/v2/auth/two_factor_code`.
      tags:
        - Auth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/auth_two_factor_code'
      responses:
        '200':
          $ref: '#/components/responses/auth_two_factor_code'
        '400':
          $ref: '#/components/responses/bad_request'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - NONE: []
  /v2/balance:
    get:
      operationId: balance_get
      summary: Получение информации об актуальном балансе.
      description: Для получения баланса отправьте GET запрос по адресу `/v2/balance`.
      tags:
        - Balance
      parameters:
        - $ref: '#/components/parameters/type'
        - $ref: '#/components/parameters/currency_id'
      responses:
        '200':
          $ref: '#/components/responses/balance'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/balance"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-BalanceGet
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                balance_api = pyruvds.BalanceApi(api_client)
                api_response = balance_api.balance_get()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let balanceApi = new RuvdsApi.BalanceApi();
            let opts = {};
            balanceApi.balanceGet(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/datacenters:
    get:
      operationId: datacenters_list
      summary: Информация о доступных дата-центрах
      description: |
        Чтобы получить список всех доступных дата-центров отправьте GET запрос по адресу `/v2/datacenters`.
      tags:
        - Datacenters
      responses:
        '200':
          $ref: '#/components/responses/all_datacenters'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/datacenters"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-DatacentersList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                datacenters_api = pyruvds.DatacentersApi(api_client)
                api_response = datacenters_api.datacenters_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let datacentersApi = new RuvdsApi.DatacentersApi();
            datacentersApi.datacentersList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/notifications:
    get:
      operationId: notifications_list
      summary: Список всех оповещений
      description: |
        Чтобы получить список всех оповещений отправьте GET запрос по адресу `/v2/notifications`.

        В ответе будет JSON объект с ключом `notifications`. Он будет содержать массив оповещений.
      tags:
        - Notifications
      parameters:
        - $ref: '#/components/parameters/status'
        - $ref: '#/components/parameters/per_page'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/notifications_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_notifications'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/notifications"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-NotificationsList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                notifications_api = pyruvds.NotificationsApi(api_client)
                api_response = notifications_api.notifications_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let notificationsApi = new RuvdsApi.NotificationsApi();
            let opts = {};
            notificationsApi.notificationsList(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/notifications/{notification_id}:
    get:
      operationId: notifications_get
      summary: Получение информации об оповещении.
      description: Для получения информации об оповещении отправьте GET запрос по адресу `/v2/notifications/$NOTIFICATION_ID`.
      tags:
        - Notifications
      parameters:
        - $ref: '#/components/parameters/notification_id'
      responses:
        '200':
          $ref: '#/components/responses/notification'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            NOTIFICATION_ID='9d60a92e-c0de-ed11-a79f-ac220bccc098'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/notifications/$NOTIFICATION_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-NotificationsGet -NotificationId '9d60a92e-c0de-ed11-a79f-ac220bccc098'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            NOTIFICATION_ID = os.environ.get("NOTIFICATION_ID")

            with pyruvds.ApiClient(configuration) as api_client:
                notifications_api = pyruvds.NotificationsApi(api_client)
                api_response = notifications_api.notifications_get(NOTIFICATION_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const NOTIFICATION_ID = process.env.NOTIFICATION_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let notificationsApi = new RuvdsApi.NotificationsApi();
            notificationsApi.notificationsGet(NOTIFICATION_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    put:
      operationId: notifications_put
      summary: Изменение статуса оповещения.
      description: Для изменения статуса оповещения отправьте PUT запрос по адресу `/v2/notifications/$NOTIFICATION_ID`.
      tags:
        - Notifications
      parameters:
        - $ref: '#/components/parameters/notification_id'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/notification_change'
      responses:
        '200':
          description: OK
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            NOTIFICATION_ID='9d60a92e-c0de-ed11-a79f-ac220bccc098'

            curl -X PUT \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d '{ "status": "read" }' \
              "$API_URL/v2/notifications/$NOTIFICATION_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $NotificationId = "9d60a92e-c0de-ed11-a79f-ac220bccc098"
            $NotificationChange = Initialize-NotificationChange -Status "read"
            Invoke-NotificationsPut -NotificationId $NotificationId -NotificationChange $NotificationChange
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            NOTIFICATION_ID = os.environ.get("NOTIFICATION_ID")

            with pyruvds.ApiClient(configuration) as api_client:
                notifications_api = pyruvds.NotificationsApi(api_client)
                notification_change = pyruvds.NotificationChange(status='read')
                api_response = notifications_api.notifications_put(
                    NOTIFICATION_ID,
                    notification_change=notification_change)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const NOTIFICATION_ID = process.env.NOTIFICATION_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let notificationsApi = new RuvdsApi.NotificationsApi();
            let notificationChange = new RuvdsApi.NotificationChange();
            notificationChange.status = 'read';
            let opts = {
                'notificationChange': notificationChange
            };
            notificationsApi.notificationsPut(NOTIFICATION_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/notifications/count:
    get:
      operationId: notifications_count_get
      summary: Получение информации о количестве оповещений с заданным статусом.
      description: |
        Для получения информации о количестве оповещений с заданным статусом
        отправьте GET запрос по адресу `/v2/notifications/count`.
      tags:
        - Notifications
      parameters:
        - $ref: '#/components/parameters/status'
      responses:
        '200':
          $ref: '#/components/responses/notification_count'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/notifications/count?status=unread"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-NotificationsCountGet -Status 'unread'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                notifications_api = pyruvds.NotificationsApi(api_client)
                api_response = notifications_api.notifications_count_get('unread')
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let notificationsApi = new RuvdsApi.NotificationsApi();
            let opts = {
              'status': "unread"
            };
            notificationsApi.notificationsCountGet(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/notifications/status_all:
    put:
      operationId: notifications_status_all_put
      summary: Обновить статус всех уведомлений
      description: |
        Для обновления статуса всех уведомлений отправьте
        отправьте PUT запрос по адресу `/v2/notifications/status_all`.
      tags:
        - Notifications
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/notification_change'
      responses:
        '200':
          description: OK
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X PUT \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d '{ "status": "read" }' \
              "$API_URL/v2/notifications/status_all"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Initialize-NotificationChange -Status 'read'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                notifications_api = pyruvds.NotificationsApi(api_client)
                notification_change = pyruvds.NotificationChange(status='read')
                api_response = notifications_api.notifications_status_all_put(
                    notification_change=notification_change)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let notificationsApi = new RuvdsApi.NotificationsApi();
            let notificationChange = new RuvdsApi.NotificationChange();
            notificationChange.status = 'read';
            let opts = {
                'notificationChange': notificationChange
            };
            notificationsApi.notificationsStatusAllPut(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/os:
    get:
      operationId: os_list
      summary: Информация о доступных операционных системах
      description: |
        Для получения списка операционных систем отправьте GET запрос по адресу `/v2/os`.
      tags:
        - OS
      responses:
        '200':
          $ref: '#/components/responses/all_os'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/os"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-OsList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                os_api = pyruvds.OSApi(api_client)
                api_response = os_api.os_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let osApi = new RuvdsApi.OSApi();
            osApi.osList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/payments:
    get:
      operationId: payments_list
      summary: Список всех платежей
      description: |
        Чтобы получить список всех платежей отправьте GET запрос по адресу `/v2/payments`.

        В ответе будет JSON объект с ключом `payments`. Он будет содержать массив платежей.
      tags:
        - Payments
      parameters:
        - $ref: '#/components/parameters/type'
        - $ref: '#/components/parameters/per_page'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/payments_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_payments'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/payments"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-PaymentsList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                payments_api = pyruvds.PaymentsApi(api_client)
                api_response = payments_api.payments_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let paymentsApi = new RuvdsApi.PaymentsApi();
            let opts = {};
            paymentsApi.paymentsList(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/payments/balance:
    post:
      operationId: payment_balance
      summary: Продление сервера с баланса
      description: |
        Для оплаты либо продления сервера с баланса отправьте POST пост запрос по адресу `/v2/payments/balance`
        установив необходимые параметры.
      tags:
        - Payments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/payment_balance'
      responses:
        '200':
          $ref: '#/components/responses/payment_balance'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      security:
        - bearer_auth:
            - write
  /v2/servers:
    get:
      operationId: servers_list
      summary: Список всех виртуальных серверов
      description: |
        Чтобы получить список всех виртуальных серверов в аккаунте отправьте GET запрос по адресу `/v2/servers`.

        В ответе будет JSON объект с ключом `servers`. Он будет содержать массив статусов виртуальных серверов.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/per_page'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/servers_sort'
        - $ref: '#/components/parameters/order'
        - $ref: '#/components/parameters/inactive_first'
        - $ref: '#/components/parameters/get_paid_till'
        - $ref: '#/components/parameters/get_network'
        - $ref: '#/components/parameters/search'
      responses:
        '200':
          $ref: '#/components/responses/all_servers'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers?page=1&per_page=1"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            let opts = {};
            serversApi.serversList(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    post:
      operationId: servers_create
      summary: Создание виртуального сервера
      description: |
        Для создания нового сервера отправьте POST пост запрос по адресу `/v2/servers` установив
        необходимые параметры.

        Необходимые параметры передаются в теле JSON. Возвращаемый код 200 Accepted говорит об
        успешной постановки задачи в очередь. Это не гарантирует успешное создание сервера.
        Прогресс создания можно получить из статуса соответствующего действия.
      tags:
        - Servers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/server_create'
      parameters:
        - $ref: '#/components/parameters/get_price_only'
      responses:
        '200':
          $ref: '#/components/responses/server_create'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d '{ "datacenter": 1, "tariff_id": 14, "os_id": 52, "payment_period": 2, "cpu": 2, "ram": 2, "drive": 20, "drive_tariff_id": 3, "ip": 1, "computer_name": "SQLSRV-01", "user_comment": "Server created via API."}' \
              "$API_URL/v2/servers"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $ServerCreate = Initialize-ServerCreate -Datacenter 1 -TariffId 14 -OsId 52 -PaymentPeriod "2" -Cpu 2 -Ram 2 -Drive 20 -DriveTariffId 3 -Ip 1 -ComputerName "SQLSRV-01" -UserComment "Server created via API."
            $GetPriceOnly = $false
            Invoke-ServersCreate -ServerCreate $ServerCreate -GetPriceOnly $GetPriceOnly
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                server_create = pyruvds.ServerCreate(
                    datacenter=1,
                    tariff_id=14,
                    os_id=52,
                    payment_period=2,
                    cpu=2,
                    ram=2.0,
                    drive=20,
                    drive_tariff_id=3,
                    ip=1,
                    computer_name='SQLSRV-01',
                    user_comment='Server created via API.')
                api_response = servers_api.servers_create(server_create,
                                                          get_price_only=False)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serverCreate = new RuvdsApi.ServerCreate();
            serverCreate.datacenter = 1;
            serverCreate.tariff_id = 14;
            serverCreate.os_id = 52;
            serverCreate.payment_period = 2;
            serverCreate.cpu = 2;
            serverCreate.ram = 2.0;
            serverCreate.drive = 20;
            serverCreate.drive_tariff_id = 3;
            serverCreate.ip = 1;
            serverCreate.computer_name = 'SQLSRV-01';
            serverCreate.user_comment = 'Server created via API.';

            let serversApi = new RuvdsApi.ServersApi();
            let opts = {
                'getPriceOnly': false
            };
            serversApi.serversCreate(serverCreate, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
    put:
      operationId: servers_change
      summary: Изменение виртуального сервера
      description: |
        Для изменения виртуального сервера отправьте PUT запрос по адресу `/v2/servers` установив
        необходимые параметры.

        Необходимые параметры передаются в теле JSON. Нужно передать хотя бы один из необязательных параметров.
        Возвращаемый код 200 Accepted говорит об успешной постановки задачи в очередь.
        Это не гарантирует успешное изменение сервера.
        В ответ приходит JSON объект `action`.
        Информация о получении статуса действия в разделе `Actions`.
      tags:
        - Servers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/server_change'
      parameters:
        - $ref: '#/components/parameters/get_price_only'
      responses:
        '200':
          $ref: '#/components/responses/server_change'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X PUT \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d "{ virtual_server_id: $VIRTUAL_SERVER_ID, ram: 4 }" \
              "$API_URL/v2/servers"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $ServerChange = Initialize-ServerChange -VirtualServerId 1232 -Ram 4
            $GetPriceOnly = $false
            Invoke-ServersChange -ServerChange $ServerChange -GetPriceOnly $GetPriceOnly
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                server_change = pyruvds.ServerChange(
                    virtual_server_id=VIRTUAL_SERVER_ID,
                    ram=3.0)
                api_response = servers_api.servers_change(
                    server_change,
                    get_price_only = False)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            let serverChange = new RuvdsApi.ServerChange();
            serverChange.virtual_server_id = VIRTUAL_SERVER_ID;
            serverChange.ram = 3;
            let opts = {
                'getPriceOnly': false
            };
            serversApi.serversChange(serverChange, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
  /v2/servers/{virtual_server_id}:
    get:
      operationId: servers_get
      summary: Получение информации о виртуальном сервере.
      description: Для получения информации о виртуальном сервере отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/server'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersGet -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_get(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversGet(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    delete:
      operationId: servers_delete
      summary: Удаление виртуального сервера
      description: |
        Для удаления виртуального сервера отправьте DELETE запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/server_delete'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            #
            # Be careful! After delete all data will be lost!
            #
            curl -X DELETE \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersDelete -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_delete(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversDelete(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - remove
  /v2/servers/{virtual_server_id}/actions:
    put:
      operationId: servers_action_create
      summary: Отправка команды виртуальному серверу
      description: |
        Для отправки команды виртуальному серверу отправьте PUT пост запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/actions`
        установив необходимые параметры.

        Возвращаемый код 200 Accepted говорит об успешной постановки задачи в очередь.
        Результат выполения можно получить из статуса соответствующего действия.
      tags:
        - Servers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/server_action_create'
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/servers_action_create'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X PUT \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d '{ type: "power_on" }' \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/actions"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $VirtualServerId = 1232
            $ServerActionCreate = Initialize-ServerActionCreate -Type "power_on"
            Invoke-ServersActionCreate -VirtualServerId $VirtualServerId -ServerActionCreate $ServerActionCreate
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                server_action_create = pyruvds.ServerActionCreate(
                    type="power_off")
                api_response = servers_api.servers_action_create(
                    VIRTUAL_SERVER_ID,
                    server_action_create)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            let serverActionCreate = new RuvdsApi.ServerActionCreate();
            serverActionCreate.type = 'reboot';
            serversApi.serversActionCreate(VIRTUAL_SERVER_ID, serverActionCreate, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/cost:
    get:
      operationId: servers_cost_get
      summary: Получение информации о стоимости виртуального сервера.
      description: Для получения информации о стоимости виртуального сервера отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/cost`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/server_cost'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/cost"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersCostGet -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_cost_get(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversCostGet(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/networks:
    get:
      operationId: servers_network_get
      summary: Получение информации об IP адресах виртуального сервера.
      description: Для получения информации об IP адресах виртуального сервера отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/networks`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/all_networks'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/networks"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersNetworkGet -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_network_get(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversNetworkGet(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/paid_till:
    get:
      operationId: servers_paid_till_get
      summary: Получение даты и времени до которого оплачен сервера.
      description: |
        Для получения даты и времени, до которого оплачен виртуальныq сервер,
        отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/paid_till`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/paid_till_response'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/paid_till"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersPaidTillGet -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_paid_till_get(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversPaidTillGet(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/power_state:
    get:
      operationId: servers_power_state_get
      summary: Получение состояния питания виртуального сервера.
      description: |
        Для получения состояния питания виртуального сервера отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/power_state`.

        Данный вызов непосредственно опрашивает физическую машину о состоянии виртуального сервера и является блокирующим.
        Таймаут вызова 10 сек. Если в данный момент статус сервера получить не удаётся, то возвращается ошибка с кодом `500`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/power_state_response'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/power_state"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersPowerStateGet -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_power_state_get(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversPowerStateGet(VIRTUAL_SERVER_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/screenshot:
    get:
      operationId: servers_screenshot
      summary: Получение снимка экрана виртуального сервера.
      description: Для получения снимка экрана виртуального сервера отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/screenshot`.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/screen_size'
      responses:
        '200':
          $ref: '#/components/responses/screenshot'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/screenshot?screen_size=64x48"
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_screenshot(
                    VIRTUAL_SERVER_ID,
                    "300x225")
                print(len(api_response))
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            serversApi.serversScreenshot(VIRTUAL_SERVER_ID, '300x225', (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(`Screen data length: ${data.length}`);
            });
      security:
        - bearer_auth:
            - read
  /v2/servers/{virtual_server_id}/start_password:
    get:
      operationId: servers_start_password_get
      summary: Получение пароля для доступа к виртуальному серверу.
      description: |
        Для получение пароля для доступа к виртуальному серверу отправьте GET запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/start_password`.
        Для вызова данного метода необходим токен с правами `remove`.


        Обратите внимание, что в целях безопасности пароль доступа к серверу **рекомендуется сменить** при первом заходе на сервер.
      tags:
        - Servers
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/response_format'
      responses:
        '200':
          $ref: '#/components/responses/start_password'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/start_password?response_format=base64"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-ServersStartPasswordGet -VirtualServerId 1232 -ResponseFormat 'base64'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID=int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                api_response = servers_api.servers_start_password_get(
                    VIRTUAL_SERVER_ID,
                    response_format='base64')
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            let opts = {
                'responseFormat': 'base64'
            };
            serversApi.serversStartPasswordGet(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - remove
    post:
      operationId: servers_start_password
      summary: Получение пароля для доступа к виртуальному серверу.
      description: |
        Для получение пароля для доступа к виртуальному серверу отправьте POST пост запрос по адресу `/v2/servers/$VIRTUAL_SERVER_ID/start_password`.
        В теле запроса передается пароль от личного кабинета ruvds.com

        Обратите внимание, что в целях безопасности пароль доступа к серверу рекомендуется сменить при первом заходе на сервер.
      tags:
        - Servers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/start_password'
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
      responses:
        '200':
          $ref: '#/components/responses/start_password'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/not_found'
        '409':
          $ref: '#/components/responses/conflict'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232
            RUVDS_PASSWORD='Password from https://ruvds.com'

            RUVDS_PASSWORD_BASE64=$(echo -n $RUVDS_PASSWORD | base64)
            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d "{ account_password: \"$RUVDS_PASSWORD_BASE64\", response_format: \"base64\" }" \
              "$API_URL/v2/servers/$VIRTUAL_SERVER_ID/start_password"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $VirtualServerId = 1232
            $RuvdsPassword = 'Password from https://ruvds.com'
            $RuvdsPasswordBytes = [System.Text.Encoding]::UTF8.GetBytes($RuvdsPassword)
            $RuvdsPasswordEncodedText =[Convert]::ToBase64String($RuvdsPasswordBytes)
            $StartPassword = Initialize-StartPassword -AccountPassword $RuvdsPasswordEncodedText -ResponseFormat 'base64'
            Invoke-ServersStartPassword -VirtualServerId $VirtualServerId -StartPassword $StartPassword
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import base64
            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))
            RUVDS_PASSWORD = os.environ.get("RUVDS_PASSWORD")

            with pyruvds.ApiClient(configuration) as api_client:
                servers_api = pyruvds.ServersApi(api_client)
                passwordBytes = RUVDS_PASSWORD.encode()
                passwordBase64 = base64.b64encode(passwordBytes)
                passwordBase64Str = passwordBase64.decode()
                start_password = pyruvds.StartPassword(
                    account_password=passwordBase64Str,
                    response_format='base64')
                api_response = servers_api.servers_start_password(
                    VIRTUAL_SERVER_ID,
                    start_password)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;
            const RUVDS_PASSWORD = process.env.RUVDS_PASSWORD;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let serversApi = new RuvdsApi.ServersApi();
            let startPassword = new RuvdsApi.StartPassword();
            startPassword.account_password = btoa(RUVDS_PASSWORD);
            startPassword.response_format = 'base64';
            serversApi.serversStartPassword(VIRTUAL_SERVER_ID, startPassword, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
  /v2/ssh_keys:
    get:
      operationId: ssh_keys_list
      summary: Список SSH ключей загруженных в личный кабинет пользователя.
      description: |
        Для получения списка SSH ключей отправьте GET запрос по адресу `/v2/ssh_keys`.
      tags:
        - SSH Keys
      responses:
        '200':
          $ref: '#/components/responses/all_ssh_keys'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/ssh_keys"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-SshKeysList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                sshkeys_api = pyruvds.SSHKeysApi(api_client)
                api_response = sshkeys_api.ssh_keys_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let sshKeysApi = new RuvdsApi.SSHKeysApi();
            sshKeysApi.sshKeysList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    post:
      operationId: ssh_keys_create
      summary: Добавление публичного SSH ключа.
      description: |
        Для добавления публичного SSH ключа отправьте POST пост запрос по адресу `/v2/ssh_keys`.
        В теле запроса передаются необходимые параметры.
      tags:
        - SSH Keys
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ssh_key_create'
      responses:
        '200':
          $ref: '#/components/responses/ssh_key_create'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            SSH_KEY='ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICIStr8MFw+5kHRu2mdhnfyJCLLJeNuXR80D/0a3bX0Y sample-key'
            SSH_KEY_NAME='sample-key'

            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d "{ public_key: \"$SSH_KEY\", name: \"$SSH_KEY_NAME\" }" \
              "$API_URL/v2/ssh_keys"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $SshKeyCreate = Initialize-SshKeyCreate -PublicKey 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICIStr8MFw+5kHRu2mdhnfyJCLLJeNuXR80D/0a3bX0Y sample-key' -Name 'sample-key'
            Invoke-SshKeysCreate -SshKeyCreate $SshKeyCreate
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            SSH_KEY = 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICIStr8MFw+5kHRu2mdhnfyJCLLJeNuXR80D/0a3bX0Y sample-key'
            SSH_KEY_NAME='sample-key'

            with pyruvds.ApiClient(configuration) as api_client:
                sshkeys_api = pyruvds.SSHKeysApi(api_client)
                ssh_key_create = pyruvds.SshKeyCreate(
                    public_key=SSH_KEY,
                    name=SSH_KEY_NAME)
                api_response = sshkeys_api.ssh_keys_create(
                    ssh_key_create=ssh_key_create)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let sshKeysApi = new RuvdsApi.SSHKeysApi();
            let sshKeyCreate = new RuvdsApi.SshKeyCreate();
            sshKeyCreate.public_key = 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICIStr8MFw+5kHRu2mdhnfyJCLLJeNuXR80D/0a3bX0Y sample-key'
            sshKeyCreate.name = 'sample-key'
            let opts = {
              'sshKeyCreate': sshKeyCreate
            };
            sshKeysApi.sshKeysCreate(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
  /v2/ssh_keys/{ssh_key_id}:
    get:
      operationId: ssh_keys_get
      summary: Получение SSH ключа по ID.
      description: |
        Для получения SSH ключа по ID отправьте GET запрос по адресу `/v2/ssh_keys/$SSH_KEY_ID`.
      tags:
        - SSH Keys
      parameters:
        - $ref: '#/components/parameters/ssh_key_id'
      responses:
        '200':
          $ref: '#/components/responses/ssh_key'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            SSH_KEY_ID='6f21c860-0fc1-ee11-a7cb-ac220bccc098'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/ssh_keys/$SSH_KEY_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-SshKeysGet -SshKeyId '6f21c860-0fc1-ee11-a7cb-ac220bccc098'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            SSH_KEY_ID = '6f21c860-0fc1-ee11-a7cb-ac220bccc098'

            with pyruvds.ApiClient(configuration) as api_client:
                sshkeys_api = pyruvds.SSHKeysApi(api_client)
                api_response = sshkeys_api.ssh_keys_get(SSH_KEY_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const SSH_KEY_ID = process.env.SSH_KEY_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let sshKeysApi = new RuvdsApi.SSHKeysApi();
            sshKeysApi.sshKeysGet(SSH_KEY_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    delete:
      operationId: ssh_keys_delete
      summary: Удаление SSH ключа.
      description: |
        Для удаления SSH ключа отправьте DELETE запрос по адресу `/v2/ssh_keys/$SSH_KEY_ID`.
      tags:
        - SSH Keys
      parameters:
        - $ref: '#/components/parameters/ssh_key_id'
      responses:
        '200':
          description: OK
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            SSH_KEY_ID='6f21c860-0fc1-ee11-a7cb-ac220bccc098'

            curl -X DELETE \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/ssh_keys/$SSH_KEY_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-SshKeysDelete -SshKeyId '6f21c860-0fc1-ee11-a7cb-ac220bccc098'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            SSH_KEY_ID = '6f21c860-0fc1-ee11-a7cb-ac220bccc098'

            with pyruvds.ApiClient(configuration) as api_client:
                sshkeys_api = pyruvds.SSHKeysApi(api_client)
                api_response = sshkeys_api.ssh_keys_delete(SSH_KEY_ID)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const SSH_KEY_ID = process.env.SSH_KEY_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let sshKeysApi = new RuvdsApi.SSHKeysApi();
            sshKeysApi.sshKeysDelete(SSH_KEY_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - remove
  /v2/stat/cpu/daily/{virtual_server_id}:
    get:
      operationId: cpu_daily_stat
      summary: Ежедневная статистика CPU за последние 14 дней.
      description: |
        Для получения ежедневной статистики по использованию CPU отправьте GET запрос по адресу `/v2/stat/cpu/daily/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_cpu_daily'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/cpu/daily/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-CpuDailyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.cpu_daily_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.cpuDailyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/stat/cpu/hourly/{virtual_server_id}:
    get:
      operationId: cpu_hourly_stat
      summary: Почасовая статистика по использованию CPU за последние 24 часа.
      description: |
        Для получения почасовой статистики по использованию CPU отправьте GET запрос по адресу `/v2/stat/cpu/hourly/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_cpu_hourly'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/cpu/hourly/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-CpuHourlyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.cpu_hourly_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.cpuHourlyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/stat/drive/daily/{virtual_server_id}:
    get:
      operationId: drive_daily_stat
      summary: Ежедневная статистика по основному диску за последние 14 дней.
      description: |
        Для получения ежедневной статистики по основному диску отправьте GET запрос по адресу `/v2/stat/drive/daily/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_drive_daily'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/drive/daily/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-DriveDailyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.drive_daily_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.driveDailyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/stat/drive/hourly/{virtual_server_id}:
    get:
      operationId: drive_hourly_stat
      summary: Почасовая статистика по основному диску за последние 24 часа.
      description: |
        Для получения почасовой статистики по основному диску отправьте GET запрос по адресу `/v2/stat/drive/hourly/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_drive_hourly'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/drive/hourly/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-DriveHourlyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.drive_hourly_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.driveHourlyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/stat/network/daily/{virtual_server_id}:
    get:
      operationId: network_daily_stat
      summary: Ежедневная статистика по использованию сети за последние 14 дней.
      description: |
        Для получения ежедневной статистики по использованию сети отправьте GET запрос по адресу `/v2/stat/network/daily/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_network_daily'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/network/daily/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-NetworkDailyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.network_daily_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.networkDailyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/stat/network/hourly/{virtual_server_id}:
    get:
      operationId: network_hourly_stat
      summary: Почасовая статистика по использованию сети за последние 24 часа.
      description: |
        Для получения почасовой статистики по использованию сети отправьте GET запрос по адресу `/v2/stat/network/hourly/$VIRTUAL_SERVER_ID`.
      tags:
        - Statistics
      parameters:
        - $ref: '#/components/parameters/virtual_server_id'
        - $ref: '#/components/parameters/stat_sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          $ref: '#/components/responses/all_network_hourly'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            VIRTUAL_SERVER_ID=1232

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/stat/network/hourly/$VIRTUAL_SERVER_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-NetworkHourlyStat -VirtualServerId 1232
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            VIRTUAL_SERVER_ID = int(os.environ.get("VIRTUAL_SERVER_ID"))

            with pyruvds.ApiClient(configuration) as api_client:
                statistics_api = pyruvds.StatisticsApi(api_client)
                api_response = statistics_api.network_hourly_stat(VIRTUAL_SERVER_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const VIRTUAL_SERVER_ID = process.env.VIRTUAL_SERVER_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let statisticsApi = new RuvdsApi.StatisticsApi();
            let opts = {};
            statisticsApi.networkHourlyStat(VIRTUAL_SERVER_ID, opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/tariffs:
    get:
      operationId: tariffs_list
      summary: Информация о доступных тарифах
      description: |
        Чтобы получить список всех доступных тарифов отправьте GET запрос по адресу `/v2/tariffs`.
      tags:
        - Tariffs
      responses:
        '200':
          $ref: '#/components/responses/all_tariffs'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/tariffs"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-TariffsList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                tariffs_api = pyruvds.TariffsApi(api_client)
                api_response = tariffs_api.tariffs_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let tariffsApi = new RuvdsApi.TariffsApi();
            tariffsApi.tariffsList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/templates:
    get:
      operationId: templates_list
      summary: Список всех шаблонов
      description: |
        Шаблоны виртуальных серверов позволяют создавать сервера с дополнительным установленным и настроенным
        программным обеспечением.

        Данный запрос возвращает шаблоны Маркетплейса [](), также данный список будет содержать Снапшоты
        виртуальных серверов, созданные в личном кабинете.

        Чтобы получить список всех шаблонов отправьте GET запрос по адресу `/v2/templates`.

        В ответе будет JSON объект с ключом `templates`. Он будет содержать массив шаблонов.
      tags:
        - Templates
      responses:
        '200':
          $ref: '#/components/responses/all_templates'
        '401':
          $ref: '#/components/responses/unauthorized'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/templates"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-TemplatesList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                templates_api = pyruvds.TemplatesApi(api_client)
                api_response = templates_api.templates_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let templatesApi = new RuvdsApi.TemplatesApi();
            templatesApi.templatesList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
  /v2/tokens:
    get:
      operationId: tokens_list
      summary: Список всех токенов авторизации API V2
      description: |
        Чтобы получить список всех окенов авторизации API V2 отправьте GET запрос по адресу `/v2/tokens`.
      tags:
        - Tokens
      responses:
        '200':
          $ref: '#/components/responses/all_tokens'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/tokens"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-TokensList
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            with pyruvds.ApiClient(configuration) as api_client:
                tokens_api = pyruvds.TokensApi(api_client)
                api_response = tokens_api.tokens_list()
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let tokensApi = new RuvdsApi.TokensApi();
            tokensApi.tokensList((error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    post:
      operationId: tokens_create
      summary: Создание токена
      description: |
        Для создания токена отправьте POST пост запрос по адресу `/v2/tokens` установив
        необходимые параметры.
      tags:
        - Tokens
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/token_create'
      responses:
        '200':
          $ref: '#/components/responses/token_create'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'

            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              -d '{ "token_name": "sample-api-token", "token_role": "read"}' \
              "$API_URL/v2/tokens"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            $TokenCreate = Initialize-TokenCreate -TokenName 'sample-api-token' -TokenRole 'read'
            Invoke-TokensCreate -TokenCreate $TokenCreate
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            TOKEN_NAME = 'sample-api-token'
            TOKEN_ROLE = 'read'

            with pyruvds.ApiClient(configuration) as api_client:
                tokens_api = pyruvds.TokensApi(api_client)
                token_create = pyruvds.TokenCreate(
                    token_name=TOKEN_NAME,
                    token_role=TOKEN_ROLE)
                api_response = tokens_api.tokens_create(
                    token_create=token_create)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let tokensApi = new RuvdsApi.TokensApi();
            let tokenCreate = new RuvdsApi.TokenCreate(
                tokenName = 'sample-api-token',
                tokenRole = 'write'
            );
            let opts = {
              'tokenCreate': tokenCreate
            };
            tokensApi.tokensCreate(opts, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
  /v2/tokens/{token_id}:
    get:
      operationId: tokens_get
      summary: Получение информации о токене доступа к API.
      description: Для получения информации о токене доступа отправьте GET запрос по адресу `/v2/tokens/$TOKEN_ID`.
      tags:
        - Tokens
      parameters:
        - $ref: '#/components/parameters/token_id'
      responses:
        '200':
          $ref: '#/components/responses/token'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            TOKEN_ID='a340fab9-fdc5-4c2b-b019-b08a4b1b8aa9'

            curl -X GET \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/tokens/$TOKEN_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-TokensGet -TokenId 'a340fab9-fdc5-4c2b-b019-b08a4b1b8aa9'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            TOKEN_ID = 'a340fab9-fdc5-4c2b-b019-b08a4b1b8aa9'

            with pyruvds.ApiClient(configuration) as api_client:
                tokens_api = pyruvds.TokensApi(api_client)
                api_response = tokens_api.tokens_get(TOKEN_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const TOKEN_ID = process.env.TOKEN_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let tokensApi = new RuvdsApi.TokensApi();
            tokensApi.tokensGet(TOKEN_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - read
    put:
      operationId: tokens_put
      summary: Пересоздание токена доступа к API.
      description: |
        Для пересоздания токена доступа отправьте PUT запрос по адресу `/v2/tokens/$TOKEN_ID`.
        Старое значение токена станет невалидным.
      tags:
        - Tokens
      parameters:
        - $ref: '#/components/parameters/token_id'
      responses:
        '200':
          $ref: '#/components/responses/token_recreate'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
        default:
          $ref: '#/components/responses/unexpected_error'
      x-codeSamples:
        - lang: cURL
          source: |-
            # Getting started with cURL API:
            # https://ruvds.com/ru/helpcenter/curl-api/

            RUVDS_TOKEN='Token from https://ruvds.com/my/settings/api'
            API_URL='https://api.ruvds.com'
            TOKEN_ID='417e2c20-d6e3-49d1-b840-061d7ecdd869'

            curl -X PUT \
              -H "Content-Type: application/json" \
              -H "Authorization: Bearer $RUVDS_TOKEN" \
              "$API_URL/v2/tokens/$TOKEN_ID"
        - lang: powershell
          source: |-
            # Getting started with powershell OpenAPI:
            # https://ruvds.com/ru/helpcenter/powershell-script-openapi/

            Invoke-TokensPut -TokenId '417e2c20-d6e3-49d1-b840-061d7ecdd869'
        - lang: Python
          source: |-
            # Getting started with Python OpenAPI:
            # https://ruvds.com/ru/helpcenter/python-api/

            import os
            import pyruvds

            configuration = pyruvds.Configuration(
                access_token=os.environ.get("RUVDS_TOKEN"),
            )

            TOKEN_ID = '417e2c20-d6e3-49d1-b840-061d7ecdd869'

            with pyruvds.ApiClient(configuration) as api_client:
                tokens_api = pyruvds.TokensApi(api_client)
                api_response = tokens_api.tokens_put(TOKEN_ID)
                print(api_response)
        - lang: JavaScript
          source: |-
            // Getting started with JavaScript OpenAPI:
            // https://ruvds.com/ru/helpcenter/javascript-api/

            const RuvdsApi = require('ruvds_api');

            const RUVDS_TOKEN = process.env.RUVDS_TOKEN;
            const TOKEN_ID = process.env.TOKEN_ID;

            let defaultClient = RuvdsApi.ApiClient.instance;
            let bearer_auth = defaultClient.authentications['bearer_auth'];
            bearer_auth.accessToken = RUVDS_TOKEN;

            let tokensApi = new RuvdsApi.TokensApi();
            tokensApi.tokensPut(TOKEN_ID, (error, data, response) => {
                if (error) {
                    throw new Error(error);
                }
                console.log(data);
            });
      security:
        - bearer_auth:
            - write
components:
  securitySchemes:
    bearer_auth:
      type: http
      scheme: bearer
      description: |
        ## Авторизация в API

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

        Токен авторизации можно сгенерировать по адресу [https://ruvds.com/my/settings/api](https://ruvds.com/my/settings/api)

        В целях безопасности токен показывается пользователю один раз в момент создания. При утрате токена нужно сгенерировать новый.
  parameters:
    per_page:
      in: query
      name: per_page
      required: false
      description: Количество элементов на одной странице
      schema:
        type: integer
        minimum: 1
        default: 25
      example: 2
    page:
      in: query
      name: page
      required: false
      description: Номер страницы в результате
      schema:
        type: integer
        minimum: 1
        default: 1
      example: 1
    actions_sort:
      in: query
      name: sort
      required: false
      description: |
        * `id` - Сортировка по полю `id`.
      schema:
        type: string
        enum:
          - id
        default: id
      example: id
    order:
      in: query
      name: order
      required: false
      description: |
        * `asc` - Сортировка по возрастанию.

        * `desc` - Сортировка по убыванию.
      schema:
        type: string
        enum:
          - asc
          - desc
        default: asc
      example: asc
    action_id:
      in: path
      name: action_id
      description: Уникальный ID действия.
      required: true
      schema:
        type: integer
        minimum: 1
      example: 2024
    type:
      in: query
      name: type
      description: |-
        Тип запрашиваемого баланса.
        * `default` - Денежный баланс.
        * `bonus` - Количество бонусных баллов.
        * `partner` - Партнерские начисления.
      schema:
        type: string
        enum:
          - default
          - bonus
          - partner
        default: default
      example: default
    currency_id:
      in: query
      name: currency_id
      description: |-
        В какой валюте получить значение баланса.
        * `1` - RUB
        * `3` - USD
        * `4` - EUR
      schema:
        type: integer
        enum:
          - 1
          - 3
          - 4
        default: 1
      example: 1
    status:
      in: query
      name: status
      description: |-
        Статус оповещения.
        * `all` - Все оповещения.
        * `read` - Все прочитанные оповещения.
        * `unread` - Все непрочитанные оповещения.
      schema:
        type: string
        enum:
          - all
          - read
          - unread
        default: all
      example: all
    notifications_sort:
      in: query
      name: sort
      required: false
      description: |
        * `add_dt` - Сортировка по полю `add_dt`.
      schema:
        type: string
        enum:
          - add_dt
        default: add_dt
      example: add_dt
    notification_id:
      in: path
      name: notification_id
      required: true
      description: Уникальный ID оповещения.
      schema:
        type: string
        format: uuid
    payments_sort:
      in: query
      name: sort
      required: false
      description: |
        * `dt` - Сортировка по полю `dt`.
      schema:
        type: string
        enum:
          - dt
        default: dt
      example: dt
    servers_sort:
      in: query
      name: sort
      required: false
      description: |
        * `virtual_server_id` - Сортировка по полю `virtual_server_id`.

        * `paid_till` - Сортировка по полю `paid_till`.

        Если сортировка по `paid_till`, то у каждого сервера будет заполено поле `paid_till`.
      schema:
        type: string
        enum:
          - virtual_server_id
          - paid_till
        default: virtual_server_id
      example: virtual_server_id
    inactive_first:
      in: query
      name: inactive_first
      required: false
      description: Несозданные, неоплаченные или заблокированные серверы будут всегда вначале списка. Остальные сервера отсортированы в соответствии с параметром `sort`.
      schema:
        type: boolean
        default: false
      example: true
    get_paid_till:
      in: query
      name: get_paid_till
      required: false
      description: Заполняет для каждого сервера дату до которой сервер оплачен.
      schema:
        type: boolean
        default: false
      example: true
    get_network:
      in: query
      name: get_network
      required: false
      description: Заполняет для каждого сервера информацию об IP адресах.
      schema:
        type: boolean
        default: false
      example: true
    search:
      in: query
      name: search
      required: false
      description: URL-encoded строка поиска. Поиск производится по ID / IP / описанию сервера. В ответе будут сервера, который удовлетворяют поисковому запросу. Если передаётся параметр `search`, то у каждого сервера будет заполено поле `network_v4`.
      schema:
        type: string
      example: 192.168
    get_price_only:
      in: query
      name: get_price_only
      required: false
      description: Позволяет получить цену данной конфигурации без реального создания сервера. При рассчете цены учитываются все промокоды и скидки. При изменении сервера возвращается стоимость без реального изменения сервера.
      schema:
        type: boolean
        default: false
      example: true
    virtual_server_id:
      in: path
      name: virtual_server_id
      description: Уникальный ID виртуального сервера.
      required: true
      schema:
        type: integer
        minimum: 1
      example: 1023
    screen_size:
      in: query
      name: screen_size
      required: true
      schema:
        type: string
        enum:
          - 64x48
          - 300x225
          - 640x480
        default: 300x225
      example: 640x480
    response_format:
      in: query
      name: response_format
      required: false
      description: В каком формате будут в ответе представлены байты строки с паролем. По-умолчанию, *base64*. Перевод в байты необходим по той причине, что пароль может содержать специальные симоволы.
      schema:
        type: string
        enum:
          - base64
          - base64url
        default: base64
    ssh_key_id:
      in: path
      name: ssh_key_id
      required: true
      description: Уникальный ID SSH ключа.
      schema:
        type: string
        format: uuid
    stat_sort:
      in: query
      name: sort
      required: false
      description: |
        * `add_dt` - Сортировка по полю `add_dt`.
      schema:
        type: string
        enum:
          - add_dt
        default: add_dt
      example: add_dt
    token_id:
      in: path
      name: token_id
      required: true
      description: Уникальный ID токена.
      schema:
        type: string
        format: uuid
  headers:
    ratelimit-limit:
      schema:
        type: integer
      example: 120
      description: Разрешенное количество запросов в минуту. Значение по-умолчанию 120.
    ratelimit-remaining:
      schema:
        type: integer
      example: 98
      description: Количество запросов, которое осталось в данную минуту.
    ratelimit-reset:
      schema:
        type: integer
      example: 3546
      description: Сколько секунд осталось до обновления лимита.
    retry-after:
      schema:
        type: integer
      example: 37
      description: Сколько секунд необходимо подождать перед следующей отправкой запроса.
  schemas:
    api_error:
      type: object
      nullable: true
      properties:
        id:
          description: Короткий идентификатор, соответствующий возвращаемому коду. Например, для запроса, вернувшего код 404 значение будет "not_found".
          type: string
          enum:
            - json_error
            - forbidden
            - not_found
            - server_error
            - rate_limit_exceeded
            - auth_error
            - conflict
            - unexpected_error
          example: not_found
        message:
          description: Дополнительная информация об ошибке.
          type: string
          example: Virtual server with id 3200 is not found.
      required:
        - id
        - message
    action_error:
      type: object
      properties:
        id:
          description: Короткий идентификатор ошибки.
          type: string
          enum:
            - internal_error
            - insufficient_balance
            - max_ip_reached
            - paid_till_gap
            - server_is_offline
            - insufficient_resource
            - change_config_limit
            - unable_to_start_server
            - unable_to_stop_server
            - unable_to_shrink_drive
            - unable_to_change_configuration
            - no_available_resource
            - server_wait_for_payment
            - too_much_servers_wait_for_payment
          example: insufficient_balance
        message:
          description: |-
            Дополнительная информация об ошибке.
            * `internal_error` - Внутренняя ошибка сервера. При возникновении такой ошибки можно попробовать выполнить запрос позже.
            * `insufficient_balance` - Недостаточно средста на балансе пользователя. Ошибка может возникнуть при создании сервера или изменении конфигурации.
            * `max_ip_reached` - В данный момент недостаточно IP адресов для создания сервера.
            * `paid_till_gap` - Для завершения операции необходимо, чтобы сервер был оплачен.
            * `server_is_offline` - Изменения концигурации сервера в данный момент недоступно.
            * `insufficient_resource` - Недостаточно ресурсов.
            * `change_config_limit` - Достигнуто максимальное количество изменений конфигурации сервера.
            * `unable_to_start_server` - Запуск сервера завершился с ошибкой.
            * `unable_to_stop_server` - Остановка сервера завершилась с ошибкой.
            * `unable_to_shrink_drive` - Уменьшение размера диска завершилось с ошибкой.
            * `unable_to_change_configuration` - Изменение концигурации сервера завершилось с ошибкой.
            * `no_available_resource` - Недостаточно ресурсов для изменения конфигурации.
            * `server_wait_for_payment` - Запрос на создание сервера сохранен. Дальнейшее создание начнется после оплаты сервера.
            * `too_much_servers_wait_for_payment` - Слишком много запросов на создание неоплаченных серверов. Необходимо оплатить предыдущие серверы, ожидающие оплаты.
          type: string
          example: Insufficient balance amount. You need 320.00 RUB but actual balance is 24.53 RUB.
    api_action:
      type: object
      properties:
        id:
          type: integer
          description: Уникальный ID действия.
        type:
          type: string
          enum:
            - server_create
            - server_change
            - server_remove
            - power_on
            - power_off
            - shutdown
            - reboot
            - unknown
          description: |-
            * `server_create` - Действие создается при отправке запроса через API на создание виртуального сервера.
            * `server_change` - Действие создается при отправке запроса через API на изменение конфигурации виртуального сервера.
            * `server_remove` - Действие создается при отправке запроса через API на удаление виртуального сервера.
            * `power_on` - Действие создается при отправке запроса через API на включение виртуального сервера.
            * `power_off` - Действие создается при отправке запроса через API на отключение питания виртуального сервера.
            * `shutdown` - Действие создается при отправке запроса через API на выключение виртуального сервера посредством отправки команды гостевой ОС.
            * `reboot` - Действие создается при отправке запроса через API на перезагрузку виртуального сервера.
            * `unknown` - Неизвестное действие, например, созданное не через API.
        status:
          type: string
          enum:
            - running
            - success
            - error
            - wait_user_action
          description: |-
            * `running` - Действие в процессе выполнения.
            * `success` - Действие успешно завершилось.
            * `error` - Действие завершилось с ошибкой.
            * `wait_user_action` - Для продолжения выполнения необходимо действие со стороны пользователя. Например, внесение оплаты.
        progress:
          type: integer
          minimum: 0
          maximum: 100
          example: 72
          description: Прогресс действия в процентах. У завершенных действий значение 100.
        started:
          type: string
          format: date-time
          description: Время начала действия.
        finished:
          type: string
          format: date-time
          nullable: true
          description: Время окончания действия.
        resource_id:
          type: integer
          description: ID ресурса к которому относится данное действие.
        resource_type:
          type: string
          enum:
            - server
          description: '* `server` - Действие посредством API над виртуальным сервером. Поле `resource_id` содержит ID сервера.'
        action_error:
          $ref: '#/components/schemas/action_error'
      required:
        - id
        - type
        - status
        - progress
        - started
        - resource_id
        - resource_type
    pagination:
      type: object
      properties:
        page:
          type: integer
          example: 1
          description: Текущий номер страницы
        per_page:
          type: integer
          example: 25
          description: Элементов на странице
        previous_page:
          type: integer
          nullable: true
          example: null
          description: Предыдущая страница
        next_page:
          type: integer
          nullable: true
          example: null
          description: Следующая страница
        last_page:
          type: integer
          example: 1
          description: Номер последней страницы
        total_entries:
          type: integer
          example: 2
          description: Всего элементов
    auth_captcha_site_key:
      type: object
      properties:
        captcha_site_key:
          type: string
          description: |
            Site key от Captcha. В данный момент используется hCaptcha: https://docs.hcaptcha.com/
        captcha_is_required:
          type: boolean
          example: true
          description: |
            Если значение `true`, то Captcha обязательна
            для авторизации методом `POST /v2/auth/login`.
      required:
        - captcha_site_key
        - captcha_is_required
    auth_login:
      type: object
      properties:
        token_id:
          type: string
          format: uuid
          nullable: true
          description: |
            Уникальный ID токена.

            Если ID токена не задано или токена с таким ID не найден, то создаётся новый токен.
        token_name:
          type: string
          example: my-api-token
          description: |
            Произвольное имя токена. Задается для удобства, чтобы можно было отличать токены между собой.

            Данное имя используется при создании токена. При пересоздании токена с заданным `token_id` имя не меняется.
        email:
          type: string
          example: example@mail.com
          description: |
            Логин клиента на сайте RUVDS. https://ruvds.com
        account_password:
          type: string
          example: MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8
          description: |-
            Пароль от личного кабинете ruvds.com в формате *base64* либо *base64url*.
            Примеры:
            * `MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8` -> `123abc!@$%^&*(){}|?><\":;ая`
            * `MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8=` -> `123abc!@$%^&*(){}|?><\":;ая`
        captcha_response:
          type: string
          nullable: true
          description: |
            Ответ после разгадывания Captcha. Можно попробовать передать null,
            но в подозрительных случаях сервер может вернуть ошибку `need_captcha` с кодом `403`.

            Если в ответ на запрос `GET /v2/auth/captcha_site_key` значение поля `captcha_is_required=true`,
            то поле `captcha_response` должно быть заполнено.
      required:
        - token_name
        - email
        - account_password
    token_data:
      type: object
      properties:
        token_id:
          type: string
          format: uuid
          description: Уникальный ID токена.
        token_secret:
          type: string
          description: |
            Секретное значение токена. В целях безопасности показывается только один раз при создании.
            В случае его утери потребуется выпустить новый токен.
      required:
        - token_id
        - token_secret
    api_forbidden_error:
      type: object
      properties:
        id:
          description: Короткий идентификатор, соответствующий возвращаемому коду.
          type: string
          enum:
            - forbidden
            - email_not_confirmed
            - phone_not_confirmed
            - server_creation_forbidden
            - captcha_is_required
            - invalid_captcha
            - two_factor_is_required
            - invalid_code
          example: email_not_confirmed
        user_id:
          type: string
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid пользователя в базе.
            Может быть использован при дальнейшей отправки запроса для получения разрешения.

            Поле заполнено, когда `id` ошибки `email_not_confirmed`.
        two_factor_id:
          type: string
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid задачи при необходимости двухфакторной авторизации.

            Поле заполнено, когда `id` ошибки `two_factor_is_required`.
        two_factor_secret:
          type: string
          description: |
            Секретный ключ задачи при необходимости двухфакторной авторизации.

            Поле заполнено, когда `id` ошибки `two_factor_is_required`.
        two_factor_otp:
          type: boolean
          example: true
          description: |
            Возможность использовать OTP для прохожедния двухфакторной авторизации.
            Если значение `true`, то это предпочитаемый метод.

            Поле заполнено, когда `id` ошибки `two_factor_is_required`.
        two_factor_sms:
          type: boolean
          example: true
          description: |
            Возможность отправить SMS для прохождения двухфакторной авторизации.

            Поле заполнено, когда `id` ошибки `two_factor_is_required`.
        two_factor_email:
          type: boolean
          example: true
          description: |
            Возможность отправить код на Email для прохождения двухфакторной авторизации.

            Поле заполнено, когда `id` ошибки `two_factor_is_required`.
        message:
          description: Дополнительная информация об ошибке.
          type: string
          example: The user is not allowed to create a server.
      required:
        - id
        - message
    auth_send_code:
      type: object
      properties:
        two_factor_id:
          type: string
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid задачи двухфакторной авторизации.
            Можно получить из поля `two_factor_id` объекта `api_forbidden_error`.
        destination:
          type: string
          enum:
            - sms
            - email
          example: email_not_confirmed
          description: |-
            Способ доставки кода для двухфакторной авторизации.

            Если в объекте `api_forbidden_error` значение `two_factor_sms=true`, то нужно указать `sms`.

            Если в объекте `api_forbidden_error` значение `two_factor_email=true`, то нужно указать `email`.
      required:
        - two_factor_id
        - destination
    auth_two_factor_otp:
      type: object
      properties:
        two_factor_id:
          type: string
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid задачи двухфакторной авторизации.

            Можно получить из поля `two_factor_id` объекта `api_forbidden_error`.
        two_factor_secret:
          type: string
          description: |
            Секретный ключ задачи при необходимости двухфакторной авторизации.

            Можно получить из поля `two_factor_secret` объекта `api_forbidden_error`.
        otp_code:
          type: string
          example: 331743
          description: |
            OTP код для подтверждения двухфакторной авторизации.
      required:
        - two_factor_id
        - otp_code
    auth_two_factor_code:
      type: object
      properties:
        two_factor_id:
          type: string
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid задачи двухфакторной авторизации.

            Можно получить из поля `two_factor_id` объекта `api_forbidden_error`.
        two_factor_secret:
          type: string
          description: |
            Секретный ключ задачи при необходимости двухфакторной авторизации.

            Можно получить из поля `two_factor_secret` объекта `api_forbidden_error`.
        code:
          type: string
          example: 321743
          description: |
            Код из SMS или Email для подтверждения двухфакторной авторизации.
      required:
        - two_factor_id
        - code
    currency:
      type: integer
      enum:
        - 1
        - 3
        - 4
      example: 1
      description: |-
        * `1` - RUB
        * `3` - USD
        * `4` - EUR
    type:
      type: string
      enum:
        - default
        - bonus
        - partner
      example: default
      description: |-
        * `default` - Денежный баланс.
        * `bonus` - Количество бонусных баллов.
        * `partner` - Партнерские начисления.
    balance:
      type: object
      properties:
        amount:
          type: number
          format: double
          example: 102
          description: Баланс в валюте, указанной в поле `currency`.
        currency:
          $ref: '#/components/schemas/currency'
        type:
          $ref: '#/components/schemas/type'
      required:
        - amount
        - currency
        - type
    datacenter:
      type: object
      properties:
        id:
          type: integer
          example: 1
          description: ID дата-центра.
        name:
          type: string
          example: 'Rucloud: Россия, Королёв'
          description: Название дата-центра.
        vps_tariffs:
          type: array
          items:
            type: integer
          example:
            - 14
            - 15
            - 21
            - 22
          description: Доступные в данном дата-центре IDs тарифных планов виртуальных серверов. Сответствует полю `id` объекта `vps_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
        drive_tariffs:
          type: array
          items:
            type: integer
          example:
            - 1
            - 3
          description: Доступные в данном дата-центре IDs тарифных планов, определяющих типа диска котором установлена ОС. Сответствует полю `id` объекта `drive_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
        additional_drive_tariffs:
          type: array
          items:
            type: integer
          example:
            - 4
          description: Доступные в данном дата-центре IDs тарифных планов дополнительного диска. Сответствует полю `id` объекта `additional_drive_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
        additional_service_tariffs:
          type: array
          items:
            type: integer
          example:
            - 4
          description: Доступные в данном дата-центре IDs тарифных планов дополнительных сервисов. Сответствует полю `id` объекта `additional_service_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
      required:
        - id
        - name
        - vps_tariffs
        - drive_tariffs
        - additional_drive_tariffs
        - additional_service_tariffs
        - tariff_settings
    notification_data:
      type: object
      properties:
        message:
          type: string
          nullable: true
          description: |
            Текст оповещения. Необязательное поле. Заполняется для оповещений с полем `type`:

            * `custom_notification`

            * `server_banned_by_admin`
        amount:
          type: number
          format: double
          nullable: true
          description: |
            Необходимый объем пополнения средств в валюте RUB.
            Необязательное поле. Заполняется для оповещений с полем `type`:

            * `server_blocked`

            * `payment_period_ending`
        must_pay_till:
          type: string
          format: date-time
          nullable: true
          description: |
            Время до которого необходимо оплатить.
            Необязательное поле. Заполняется для оповещений с полем `type`:

            * `server_blocked`

            * `payment_period_ending`
        cost_old:
          type: number
          format: double
          nullable: true
          description: |
            Старая цена виртуального сервера в валюте RUB.
            Необязательное поле. Заполняется для оповещений с полем `type`:

            * `promo_ending`
        cost_new:
          type: number
          format: double
          nullable: true
          description: |
            Новая цена виртуального сервера в валюте RUB.
            Необязательное поле. Заполняется для оповещений с полем `type`:

            * `promo_ending`
    notification:
      type: object
      properties:
        notification_id:
          type: string
          format: uuid
          description: Уникальный ID оповещения.
        status:
          type: string
          enum:
            - read
            - unread
          description: |-
            * `read` - Нотификация прочитана.
            * `unread` - Нотификация непрочитана.
        virtual_server_id:
          type: integer
          description: ID сервера в системе.
        add_dt:
          type: string
          format: date-time
          description: Дата и время добавления оповещения
        status_update_dt:
          type: string
          format: date-time
          nullable: true
          description: Дата и время изменения статуса
        type:
          type: string
          enum:
            - custom_notification
            - server_banned_by_admin
            - server_blocked
            - payment_period_ending
            - promo_ending
            - server_started
            - server_removed
            - violation_smtp
            - cloud_short_of_money
            - violation_dns
            - net_outgoing_violation
            - net_outgoing_warning
            - violation_firewall
            - info_firewall_activated
            - violation_app
            - test
          description: |-
            * `custom_notification` - оповещение общего вида
            * `server_banned_by_admin` - сервер был заблокирован администратором
            * `server_blocked` - сервер был заблокирован
            * `payment_period_ending` - оплаченный период подходит к концу
            * `promo_ending` - промо период подходит к концу
            * `server_started` - сервер был разблокирован
            * `server_removed` - сервер был удален
            * `violation_smtp` - сервер был заблокирован за анонимный smtp
            * `cloud_short_of_money` - недостаточно средств для оплаты сервера за ресурсы
            * `violation_dns` - небезопасный dns
            * `net_outgoing_violation` - заблокирован за большой исходящий трафик
            * `net_outgoing_warning` - предупреждение о большом исходящем трафике
            * `violation_firewall` - на виртуалке неактивен firewall
            * `info_firewall_activated`- на виртуалке активирован firewall
            * `violation_app` - сервер заблокирован за вредоносное ПО
            * `test` - тестовое оповещение для проверки доставки
        notification_data:
          $ref: '#/components/schemas/notification_data'
      required:
        - notification_id
        - status
        - virtual_server_id
        - add_dt
        - status_update_dt
        - type
    notification_change:
      type: object
      properties:
        status:
          type: string
          enum:
            - read
            - unread
          description: |-
            Изменить статус оповещения:
            * `read` - Оповещение прочитано.
            * `unread` - Оповещение не прочитано.
      required:
        - status
    notification_count:
      type: object
      properties:
        status:
          type: string
          enum:
            - all
            - read
            - unread
          description: |
            Статус оповещениий для которых посчитано количество.

            * `all` - Все оповещения.

            * `read` - Все прочитанные оповещения.

            * `unread` - Все непрочитанные оповещения.
        count:
          type: integer
          description: |
            Количество оповещение со статусом `status`.
      required:
        - status
        - count
    os_requirements:
      type: object
      nullable: true
      description: |
        Минимальные требования необходимые для создания сервера с данной ОС.
        Если `null`, то ограничений нет
      properties:
        cpu:
          type: integer
          example: 2
          description: |
            Количество ядер CPU необходимое для создания сервера с данной ОС.
        ram:
          type: number
          format: double
          example: 2
          description: |
            RAM в GB необходимое для создания сервера с данной ОС.
        drive:
          type: integer
          example: 20
          description: |
            Размер основного диска в GB необходимое для создания сервера с данной ОС.
      required:
        - cpu
        - ram
        - drive
    os:
      type: object
      properties:
        id:
          type: integer
          example: 14
          description: ID операционной системы.
        name:
          type: string
          example: Windows Server 2016 (ENG)
          description: Название операционной системы.
        is_active:
          type: boolean
          example: true
          description: Операционная система доступна для создания.
        type:
          type: string
          enum:
            - windows
            - linux
          example: windows
          description: Тип операционной системы.
        ssh_keys_supported:
          type: boolean
          example: true
          description: |
            Возможность добавления SSH ключа при создании.
        os_requirements:
          $ref: '#/components/schemas/os_requirements'
      required:
        - id
        - name
        - is_active
        - type
        - ssh_keys_supported
    payment:
      type: object
      properties:
        dt:
          type: string
          format: date-time
          description: Дата и время транзакции.
        direction:
          type: integer
          enum:
            - 1
            - 2
          description: |-
            * `1` - поступление средств
            * `2` - списание
        pay_source:
          type: string
          nullable: true
          description: Дополнительная информация от платежной системы.
        amount:
          type: number
          format: double
          description: Сумма в валюте пополнения `currency`.
        currency:
          $ref: '#/components/schemas/currency'
        type:
          $ref: '#/components/schemas/type'
      required:
        - dt
        - direction
        - amount
        - currency
        - type
    payment_balance:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 6934
          description: |-
            ID виртуального сервера. Стоимость рассчитается атоматически в соответствии с выбранным периодом.

            Оплаченное время аредны сервера продлится в соответствии с выбранным периодом.
      required:
        - virtual_server_id
    payment_balance_response:
      type: object
      properties:
        amount:
          type: number
          format: double
          example: 500
          description: Сумма в RUB, которая была списана с баланса.
      required:
        - amount
    payment_period:
      type: integer
      enum:
        - 1
        - 2
        - 3
        - 4
        - 5
        - 0
      example: 2
      description: |
        * `1` - тестовый период
        * `2` - 1 месяц
        * `3` - 3 месяца
        * `4` - 6 месяцев
        * `5` - 1 год
        * `0` - Не задан.
    network_v4:
      type: object
      properties:
        ip_address:
          type: string
          example: 186.2.163.33
          description: IPv4 адрес виртуального сервера.
        netmask:
          type: string
          example: 255.255.255.0
          description: Сетевая маска IPv4 адреса.
        gateway:
          type: string
          example: 186.2.163.33
          description: Основной шлюз IPv4 адреса.
      required:
        - ip_address
        - netmask
        - gateway
    server:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 6935
          description: |
            ID сервера в системе.

            Данное поле участвует в поиске при передаче GET параметра `search=<url-encoded text>`.
        status:
          type: string
          enum:
            - initializing
            - active
            - notpaid
            - blocked
            - deleted
          example: active
          description: Одно из возможных значений статуса сервера.
        create_progress:
          type: integer
          minimum: 0
          maximum: 100
          example: 74
          description: Прогресс создания сервера. Для созданного сервера это значение 100.
        datacenter:
          type: integer
          example: 1
          description: ID дата-центра. Сответствует полю `id` объекта `datacenter`. Информацию о дата-центрах можно получить в разделе `Datacenters`.
        tariff_id:
          type: integer
          example: 14
          description: Тарифный план
        payment_period:
          $ref: '#/components/schemas/payment_period'
        os_id:
          type: integer
          nullable: true
          example: 1
          description: Id операционной системы. Может быть null для несозданного сервера.
        template_id:
          type: string
          nullable: true
          format: uuid
          example: a0f1b086-5a53-4dfe-aa14-f4a924b16fac
          description: Шаблон, который использовался при создании сервера. Может быть null если при создании не использовался шаблон.
        cpu:
          type: integer
          example: 2
          description: Количество ядер CPU.
        ram:
          type: number
          format: double
          example: 0.5
          description: RAM в GB.
        vram:
          type: integer
          nullable: true
          enum:
            - 0
            - 64
            - 128
            - 256
            - 512
            - 1024
          example: 64
          description: Объем видеопамяти в Мегабайтах.
        drive:
          type: integer
          example: 20
          description: Размер основного диска в GB
        drive_tariff_id:
          type: integer
          example: 14
          description: Тарифный план определяющий типа диска из массива drive на котором установлена ОС
        additional_drive:
          type: integer
          nullable: true
          example: null
          description: Размер дополнительного диска в GB. В данный момент возможно только подключение Большого диска. `null` если без дополнительного диска
        additional_drive_tariff_id:
          type: integer
          nullable: true
          example: null
          description: Тарифный план дополнительного диска из массива additional_drive. `null`` если без дополнительного диска
        ip:
          type: integer
          example: 1
          description: Количество IP адресов
        ddos_protection:
          type: number
          format: double
          example: 0
          description: Объем полосы для входящего легитимного трафика, кратный 0.5 Мбит/с. 0.0 если DDoS защита не подключена.
        user_comment:
          type: string
          example: My fancy server with SQL
          description: |
            Пользовательский комментарий в ЛК RUVDS. Пустая строка в случае отсутствия.

            Данное поле участвует в поиске при передаче GET параметра `search=<url-encoded text>`.
        paid_till:
          type: string
          format: date-time
          nullable: true
          description: |
            Дата и время UTC до которой оплачен сервер. Данное поле может быть `null`.

            Для того, чтобы поле было заполнено необходимо передать
            `get_paid_till=true` или `servers_sort=paid_till` в GET параметры запроса.
        network_v4:
          type: array
          items:
            $ref: '#/components/schemas/network_v4'
          nullable: true
          description: |
            Список IPv4 адресов сервера. Данное поле может быть `null`.

            Для того, чтобы поле было заполнено необходимо передать
            `get_network=true` или `search=<url-encoded text>` в GET параметры запроса.

            Данное поле участвует в поиске при передаче GET параметра `search=<url-encoded text>`.
      required:
        - virtual_server_id
        - status
        - create_progress
        - datacenter
        - tariff_id
        - payment_period
        - os_id
        - template_id
        - cpu
        - ram
        - drive
        - drive_tariff_id
        - ip
    server_change:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 2343
          description: ID виртуального сервера.
        cpu:
          type: integer
          nullable: true
          example: 2
          description: Новое количество ядер CPU.
        ram:
          type: number
          format: double
          nullable: true
          example: 2
          description: Новое количество RAM в GB.
        vram:
          type: integer
          nullable: true
          enum:
            - 0
            - 64
            - 128
            - 256
            - 512
            - 1024
          example: 64
          description: Новое количество VRAM в Мегабайтах.
        drive:
          type: integer
          nullable: true
          example: 40
          description: Новый размер диска в GB.
        ip:
          type: integer
          nullable: true
          example: 2
          description: Новое количество IP адресов.
      required:
        - virtual_server_id
    server_change_response:
      type: object
      properties:
        cost_rub:
          type: number
          format: double
          example: 22
          description: Количество рублей которое спишется или вернется на баланс после изменения конфигурации. Знак "-" означает, что средства вернутся на баланс.
        action:
          $ref: '#/components/schemas/api_action'
    server_create:
      type: object
      properties:
        datacenter:
          type: integer
          example: 1
          description: ID дата-центра. Сответствует полю `id` объекта `datacenter`. Информацию о дата-центрах можно получить в разделе `Datacenters`.
        tariff_id:
          type: integer
          example: 14
          description: ID тарифного плана виртуального сервера. Сответствует полю `id` объекта `vps_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
        os_id:
          type: integer
          nullable: true
          example: 52
          description: |
            ID операционной системы. Сответствует полю `id` объекта `os`.
            Информацию об операционных системах можно получить в разделе `OS`.
            Взаимоисключающий параметр с `template_id`.
            Необходимо присутствие поля `os_id` либо `template_id`.
        template_id:
          type: string
          nullable: true
          format: uuid
          example: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
          description: |
            Guid шаблона. Взаимоисключающий параметр с `os_id`.
            Необходимо присутствие поля `os_id` либо `template_id`.
        payment_period:
          $ref: '#/components/schemas/payment_period'
        cpu:
          type: integer
          example: 2
          description: Количество ядер CPU.
        ram:
          type: number
          format: double
          example: 2
          description: RAM в GB.
        vram:
          type: integer
          nullable: true
          enum:
            - 0
            - 64
            - 128
            - 256
            - 512
            - 1024
          example: 0
          description: Объем видеопамяти в Мегабайтах.
        drive:
          type: integer
          example: 20
          description: Размер основного диска в GB
        drive_tariff_id:
          type: integer
          example: 1
          description: ID тарифного плана, определяющего типа диска котором установлена ОС. Сответствует полю `id` объекта `drive_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`.
        additional_drive:
          type: integer
          nullable: true
          example: null
          description: Размер дополнительного диска в GB. В данный момент возможно только подключение Большого диска. Значение `null` если без дополнительного диска.
        additional_drive_tariff_id:
          type: integer
          nullable: true
          example: null
          description: ID тарифного плана дополнительного диска. Сответствует полю `id` объекта `additional_drive_tariff`. Информацию о тарифах можно получить в разделе `Tariffs`. Значение `null` если без дополнительного диска.
        ip:
          type: integer
          example: 1
          description: Количество IP адресов
        ddos_protection:
          type: number
          format: double
          nullable: true
          example: 0
          description: Объем полосы для входящего легитимного трафика, кратный 0.5 Мбит/с. 0.0 если DDoS защита не подключена.
        promocode:
          type: string
          nullable: true
          example: AXF-SDF-324
          description: Промокод для получения постоянной скидки
        ssh_key_id:
          type: string
          format: uuid
          nullable: true
          example: 153e8ffa-6b69-47b5-933f-ce632471b06c
          description: Уникальный ID SSH ключа. Соответствует полю `ssh_key_id` в модели `ssh_key`. Управление SSH ключами осуществляется в разделе `SSH Keys`.
        computer_name:
          type: string
          example: SQLSRV-01
          description: Имя компьютера создаваемого виртуального сервера
        user_comment:
          type: string
          nullable: true
          example: Server created via API.
          description: Пользовательский комментарий в ЛК RUVDS
      required:
        - datacenter
        - tariff_id
        - payment_period
        - cpu
        - ram
        - drive
        - drive_tariff_id
        - ip
    server_create_response:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 6732
          description: id виртуального сервера. Используется при получении статуса сервера.
        payment_period:
          $ref: '#/components/schemas/payment_period'
        cost_rub:
          type: number
          format: double
          example: 320
          description: Стоимость сервера в рублях за указанный `payment_period`
        password:
          type: string
          example: abs123
          description: Пароль для подключения сервера.
        action:
          $ref: '#/components/schemas/api_action'
        status:
          $ref: '#/components/schemas/server'
    server_action_create:
      type: object
      properties:
        type:
          type: string
          enum:
            - power_on
            - power_off
            - shutdown
            - reboot
          description: |-
            * `power_on` - включение виртуального сервера
            * `power_off` - выключение питания виртуального сервера (жесткое)
            * `shutdown` - отправка гостевой операционной системе команды на выключение
            * `reboot` - перезагрузка сервера
      required:
        - type
    server_cost:
      type: object
      properties:
        cost_rub:
          type: number
          format: double
          example: 320
          description: Стоимость сервера в рублях за указанный `payment_period`
        payment_period:
          $ref: '#/components/schemas/payment_period'
      required:
        - cost_rub
        - payment_period
    server_paid_till:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 6935
          description: ID сервера в системе.
        paid_till:
          type: string
          format: date-time
          description: Дата и время UTC до которой оплачен сервер.
    server_power_state:
      type: object
      properties:
        virtual_server_id:
          type: integer
          example: 6935
          description: ID сервера в системе.
        power_state:
          type: string
          enum:
            - running
            - 'off'
            - starting
            - stopping
          example: running
          description: |
            Состояние питания виртуального сервера.


            * `running` - Виртуальный сервер запущен.


            * `off` - Виртуальный сервер выключен.


            * `starting` - Виртуальный сервер запускается.


            * `stopping` - Виртуальный сервер останавливается.
      required:
        - virtual_server_id
        - power_state
    start_password_response:
      type: object
      properties:
        login:
          type: string
          example: root
          description: |-
            Логин для доступа к серверу.

            Обратите внимание, что для Linux серверов, рекомендуется при первом заходе создать другого пользователя с правами `sudo` и запретить ssh логин под `root` пользователем. Дополнительно рекомендуется настроить Firewall.

            Для Windows серверов при первом заходе рекомендуется настроить Firewall c целью предотвращения брутфорса.
        login_type:
          type: string
          enum:
            - rdp
            - ssh
          description: |-
            Тип подключения к серверу. Зависит от Операционной системы, установленной на сервере.

            * `rdp` - Подключение к Windows серверу по протоколу *RDP*.

            * `ssh` - Подключение к Linux серверу по протоколу *SSH*.
        password:
          type: string
          example: MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8=
          description: |-
            Байтовое представление `UTF-8` строки с паролем в `base64` либо `base64url` формате. Формат зависит от поля `response_format` в запросе.

            Обратите внимание, что в целях безопасности этот пароль *рекомендуется сменить* при первом заходе на сервер.

            Во избежание брутфорса пароля рекомендуется настроить Firewall.
        password_format:
          type: string
          enum:
            - base64
            - base64url
          description: В каком формате представлены байты строки с паролем. Формат зависит от поля `response_format` в запросе.
    start_password:
      type: object
      properties:
        account_password:
          type: string
          example: MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8
          description: |-
            Пароль от личного кабинете ruvds.com в формате *base64* либо *base64url*.
            Примеры:
            * `MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8` -> `123abc!@$%^&*(){}|?><\":;ая`
            * `MTIzYWJjIUAkJV4mKigpe318Pz48XCI6O9Cw0Y8=` -> `123abc!@$%^&*(){}|?><\":;ая`
        response_format:
          type: string
          enum:
            - base64
            - base64url
          default: base64
          description: В каком формате будут в ответе представлены байты строки с паролем. По-умолчанию, *base64*. Перевод в байты необходим по той причине, что пароль может содержать специальные симоволы.
      required:
        - account_password
    ssh_key:
      type: object
      properties:
        ssh_key_id:
          type: string
          format: uuid
          example: 153e8ffa-6b69-47b5-933f-ce632471b06c
          description: Уникальный ID SSH ключа.
        public_key:
          type: string
          example: ssh-rsa SIMPLEEXAMPLEEAAAABIwAAAQEAklOUpkDHrfHY1 simple@example.local
          description: Публичный ключ SSH.
        name:
          type: string
          example: my key
          description: Произвольное имя ключа указанное при создании.
        md5_fingerprint:
          type: string
          example: MD5:6c:88:d3:d8:3a:be:70:55:4d:84:9d:fc:53:7c:ab:b2
          description: |
            Уникальная подпись ключа в формате MD5. Это значение является выводом команды:

            `ssh-keygen -E md5 -lvf mykey.pub`
        sha256_fingerprint:
          type: string
          example: SHA256:T6sYV2AeCpJWnz23xwRwjn6naFf/++lmsNPMPPmOWS0
          description: |
            Уникальная подпись ключа в формате SHA256. Это значение является выводом команды:

            `ssh-keygen -E sha256 -lvf mykey.pub`

            Обратите внимание, что специальные символы (такие как '\\' и '/') могут быть экранированы в соответствии с требованиями к формату JSON.
      required:
        - ssh_key_id
        - public_key
        - name
        - md5_fingerprint
        - sha256_fingerprint
    ssh_key_create:
      type: object
      properties:
        public_key:
          type: string
          example: ssh-rsa SIMPLEEXAMPLEEAAAABIwAAAQEAklOUpkDHrfHY1 simple@example.local
          description: |
            Публичный ключ SSH.

            Часто этот ключ находится в файле с расширением `pub`, например, `id_ed25519.pub`.
        name:
          type: string
          example: my key
          description: |
            Произвольное имя ключа, придуманное пользователем. Используется как комментарий.
      required:
        - public_key
        - name
    cpu_stat:
      type: object
      properties:
        add_dt:
          type: string
          format: date-time
          description: Время формирования статистики.
        cpu_usage:
          type: number
          format: double
          description: Среднее использование CPU в процентах.
      required:
        - add_dt
        - cpu_usage
    drive_stat:
      type: object
      properties:
        add_dt:
          type: string
          format: date-time
          description: Время формирования статистики.
        read_iops:
          type: number
          format: double
          description: Среднее чтение с диска в IOPS.
        write_iops:
          type: number
          format: double
          description: Средняя запись на диск в IOPS.
      required:
        - add_dt
        - read_iops
        - write_iops
    network_stat:
      type: object
      properties:
        add_dt:
          type: string
          format: date-time
          description: Время формирования статистики.
        inbound_pps:
          type: number
          format: double
          description: Средний входящий трафик в пакетах в секунду.
        outbound_pps:
          type: number
          format: double
          description: Средний исходящий трафик в пакетах в секунду.
        inbound_bps:
          type: number
          format: double
          description: Средний входящий трафик в байтах в секунду.
        outbound_bps:
          type: number
          format: double
          description: Средний исходящий трафик в байтах в секунду.
      required:
        - add_dt
        - inbound_pps
        - outbound_pps
        - inbound_bps
        - outbound_bps
    vps_tariff:
      type: object
      properties:
        id:
          type: integer
          example: 14
          description: ID тарифного плана виртуального сервера.
        name:
          type: string
          example: Regular
          description: Название тарифа.
        cpu:
          type: number
          format: double
          example: 79
          description: Цена RUB за виртуальное ядро CPU.
        ram:
          type: number
          format: double
          example: 195
          description: Цена RUB за 1 Гб оперативной памяти.
        vram:
          type: number
          format: double
          example: 1.953125
          description: Цена RUB за 1 Мб видео памяти.
        ip:
          type: number
          format: double
          example: 100
          description: Цена за 1 дополнительный IP адрес.
        is_active:
          type: boolean
          example: true
          description: Тариф активен.
      required:
        - id
        - name
        - cpu
        - ram
        - vram
        - ip
        - is_active
    drive_tariff:
      type: object
      properties:
        id:
          type: integer
          example: 1
          description: ID тарифа диска.
        name:
          type: string
          example: HDD
          description: Название тарифа
        price:
          type: number
          format: double
          example: 5.5
          description: цена RUB за 1 Гб
        is_active:
          type: boolean
          example: true
          description: Тариф активен.
      required:
        - id
        - name
        - price
        - is_active
    additional_drive_tariff:
      type: object
      properties:
        id:
          type: integer
          example: 4
          description: ID тарифа дополнительного диска.
        name:
          type: string
          example: Huge HDD
          description: Название тарифа
        price:
          type: number
          format: double
          example: 0.48828125
          description: цена RUB за 1 Гб
        is_active:
          type: boolean
          example: true
          description: Тариф активен.
      required:
        - id
        - name
        - price
        - is_active
    additional_service_tariff:
      type: object
      properties:
        id:
          type: integer
          example: 4
          description: ID дополнительного сервиса.
        name:
          type: string
          example: DDoS Protection (ip)
          description: Название дополнительного сервиса.
        price:
          type: number
          format: double
          example: 400
          description: Цена за единицу. Единица зависит от типа сервиса.
        is_active:
          type: boolean
          description: Тариф активен.
      required:
        - id
        - name
        - price
        - is_active
    payment_period_discount:
      type: object
      properties:
        payment_period:
          $ref: '#/components/schemas/payment_period'
        discount:
          type: number
          format: double
          example: 0.05
          description: Размер скидки за платежный период в диапазоне от 0.0 до 1.0.
      required:
        - payment_period
        - discount
    template:
      type: object
      properties:
        template_id:
          type: string
          format: uuid
          example: ec406caa-3583-eb11-80f0-00155d008702
          description: ID шаблона виртуального сервера.
        name:
          type: string
          example: NodeJS - Ubuntu 20.04 LTS
          description: Имя шаблона.
      required:
        - template_id
        - name
    token:
      type: object
      properties:
        token_id:
          type: string
          format: uuid
          description: Уникальный ID токена.
        name:
          type: string
          description: Произвольное имя токена, которое задается при создании.
        role:
          type: string
          enum:
            - read
            - write
            - remove
          description: |
            * `read` - Токен только для чтения. Позволяет выполнять практически все HTTP GET запросы к API.
              Т. е. получать список серверов, платежей и. т. д.

            * `write` - Все права `read` и дополнительно позволяет создавать и изменять новые объект.
              Т. е. HTTP методы POST и PUT. Например, создавать новые сервера и изменять конфигурацию сервера.

            * `remove` - Все права `read` и `write` и дополнительно позволяет удалять виртуальные сервера.
              Т. е. HTTP метод DELETE.
        expiry:
          type: string
          format: date-time
          nullable: true
          description: |
            Дата экспирации токена. Если не задана, то токен работает все время,
            пока не будет удален из личного кабинета [https://ruvds.com/my/settings/api](https://ruvds.com/my/settings/api).
      required:
        - token_id
        - name
        - role
    token_create:
      type: object
      properties:
        token_name:
          type: string
          example: my-api-token
          description: Произвольное имя токена. Задается для удобства, чтобы можно было отличать токены между собой.
        token_role:
          type: string
          enum:
            - read
            - write
          example: read
          description: |
            Роль токена. Через API можно получать токен только для чтения и записи.

            Если требуются права на удаление, то токен можно выпустить в личном кабинете RUVDS
            по адресу [https://ruvds.com/my/settings/api](https://ruvds.com/my/settings/api).
        token_expiry:
          type: string
          format: date-time
          nullable: true
          description: |
            Дата экспирации токена. Можно не задавать - в этому случае токен будет все время валидным вплоть до его удаления.
      required:
        - token_name
        - token_role
  responses:
    unexpected_error:
      description: Неизвестная ошибка
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: unexpected_error
            message: Some error message.
    all_actions:
      description: Список действий пользователя, созданных через API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllActionsResponse
            type: object
            properties:
              actions:
                type: array
                items:
                  $ref: '#/components/schemas/api_action'
              pagination:
                $ref: '#/components/schemas/pagination'
            required:
              - actions
              - pagination
    bad_request:
      description: Неверно сформировано тело запроса.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: json_error
            message: Missing field 'datacenter'.
    unauthorized:
      description: Пользователь неавторизован. Необходима аутентификация.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: auth_error
            message: Please, provide bearer-type Authorization header containing your OAuth token.
    too_many_requests:
      description: Достигнуто максимальное количество запросов к API
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
        retry-after:
          $ref: '#/components/headers/retry-after'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: rate_limit_exceeded
            message: Too Many Requests. Your rate limit will have recovered in 1547 seconds.
    server_error:
      description: Ошибка сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: server_error
            message: Internal Server Error. Try again later or contact support.
    api_action:
      description: 'В ответе содержится JSON объект действия, который соответствует ID в запросе. '
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_action'
    not_found:
      description: Запрошенный объект не найден.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: json_error
            message: Action with id 2313 is not found.
    auth_captcha_site_key:
      description: Ответ при запросе Site Key для генерации Captcha.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/auth_captcha_site_key'
    auth_login:
      description: При успешной авторизации в сервисе возвращается токен доступа к API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token_data'
    forbidden:
      description: Действие запрещено для данного пользователя.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_forbidden_error'
          example:
            id: forbidden
            user_id: 08a4ee34-0b63-4516-a2e6-b8405fa1ab2f
            message: The user is not allowed to create a server.
    auth_two_factor_otp:
      description: При верном OTP коде возвращается токен доступа к API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token_data'
    auth_two_factor_code:
      description: При верном коде возвращается токен доступа к API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token_data'
    balance:
      description: JSON объект с информацией о балансе.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/balance'
    all_datacenters:
      description: Информация о доступных тарифах.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllDatacentersResponse
            type: object
            properties:
              datacenters:
                type: array
                items:
                  $ref: '#/components/schemas/datacenter'
            required:
              - datacenters
    all_notifications:
      description: JSON объект списка нотификаций.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllNotificationsResponse
            type: object
            properties:
              notifications:
                type: array
                items:
                  $ref: '#/components/schemas/notification'
              pagination:
                $ref: '#/components/schemas/pagination'
            required:
              - notifications
              - pagination
    notification:
      description: Оповещение.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/notification'
    notification_count:
      description: Количество оповещений.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/notification_count'
    all_os:
      description: Информация об операционных системах.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllOsResponse
            type: object
            properties:
              os:
                type: array
                items:
                  $ref: '#/components/schemas/os'
            required:
              - os
    all_payments:
      description: JSON объект списка платежей.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllPaymentsResponse
            type: object
            properties:
              payments:
                type: array
                items:
                  $ref: '#/components/schemas/payment'
              pagination:
                $ref: '#/components/schemas/pagination'
            required:
              - payments
              - pagination
    payment_balance:
      description: Ответ при успешном продлении с баланса.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/payment_balance_response'
    all_servers:
      description: JSON объект внутри поля `servers`.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllServersResponse
            type: object
            properties:
              servers:
                type: array
                items:
                  $ref: '#/components/schemas/server'
              pagination:
                $ref: '#/components/schemas/pagination'
            required:
              - servers
              - pagination
          examples:
            Все сервера:
              $ref: '#/components/examples/servers_all'
    server_change:
      description: Ответ при успешном добавлении задачи на изменение сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server_change_response'
    conflict:
      description: Состояние объекта не позволяет провести операцию.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_error'
          example:
            id: conflict
            message: User with current email allready exists.
    server_create:
      description: Ответ при успешном добавлении задачи на создание сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server_create_response'
    server:
      description: Статус сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server'
    server_delete:
      description: Ответ при успешном добавлении задачи на удаление сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_action'
    servers_action_create:
      description: JSON объект действия.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/api_action'
    server_cost:
      description: Стоимость сервера и период оплаты.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server_cost'
    all_networks:
      description: Информация об IP адресах виртуального сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: ServerNetworksResponse
            type: object
            properties:
              v4:
                type: array
                items:
                  $ref: '#/components/schemas/network_v4'
            required:
              - v4
    paid_till_response:
      description: Ответ содержащий дату и время до которого оплачен сервер.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server_paid_till'
    power_state_response:
      description: Ответ о получении статуса питания сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/server_power_state'
    screenshot:
      description: Снимок экрана сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        image/jpeg:
          schema:
            type: string
            format: binary
    start_password:
      description: Ответ при успешном полученнии начального пароля сервера.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/start_password_response'
    all_ssh_keys:
      description: Информация о SSH ключах.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllSshKeys
            type: object
            properties:
              ssh_keys:
                type: array
                items:
                  $ref: '#/components/schemas/ssh_key'
            required:
              - ssh_keys
    ssh_key_create:
      description: Ответ при успешном добавлении SSH ключа.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ssh_key'
    ssh_key:
      description: Ответ при запросе SSH ключа по ID.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ssh_key'
    all_cpu_daily:
      description: Ежедневная статистика по CPU за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: CpuDailyStatResponse
            type: object
            properties:
              cpu_stat:
                type: array
                items:
                  $ref: '#/components/schemas/cpu_stat'
            required:
              - cpu_stat
    all_cpu_hourly:
      description: Почасовая статистика по CPU за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: CpuHourlyStatResponse
            type: object
            properties:
              cpu_stat:
                type: array
                items:
                  $ref: '#/components/schemas/cpu_stat'
            required:
              - cpu_stat
    all_drive_daily:
      description: Ежедневная статистика по диску за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: DriveDailyStatResponse
            type: object
            properties:
              drive_stat:
                type: array
                items:
                  $ref: '#/components/schemas/drive_stat'
            required:
              - drive_stat
    all_drive_hourly:
      description: Почасовая статистика по диску за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: DriveHourlyStatResponse
            type: object
            properties:
              drive_stat:
                type: array
                items:
                  $ref: '#/components/schemas/drive_stat'
            required:
              - drive_stat
    all_network_daily:
      description: Ежедневная статистика по использованию сети за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: NetworkDailyStatResponse
            type: object
            properties:
              network_stat:
                type: array
                items:
                  $ref: '#/components/schemas/network_stat'
            required:
              - network_stat
    all_network_hourly:
      description: Почасовая статистика по использованию сети за 14 дней.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: NetworkHourlyStatResponse
            type: object
            properties:
              network_stat:
                type: array
                items:
                  $ref: '#/components/schemas/network_stat'
            required:
              - network_stat
    all_tariffs:
      description: Информация о доступных тарифах.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllTariffsResponse
            type: object
            properties:
              vps:
                type: array
                items:
                  $ref: '#/components/schemas/vps_tariff'
              drive:
                type: array
                items:
                  $ref: '#/components/schemas/drive_tariff'
              additional_drive:
                type: array
                items:
                  $ref: '#/components/schemas/additional_drive_tariff'
              additional_service:
                type: array
                items:
                  $ref: '#/components/schemas/additional_service_tariff'
              payment_period_discount:
                type: array
                items:
                  $ref: '#/components/schemas/payment_period_discount'
            required:
              - vps
              - drive
              - additional_drive
              - additional_service
              - payment_period_discount
    all_templates:
      description: JSON объект списка шаблонов.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllTemplatesResponse
            type: object
            properties:
              templates:
                type: array
                items:
                  $ref: '#/components/schemas/template'
            required:
              - templates
    all_tokens:
      description: Список токенов доступа к RUVDS API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            title: AllTokensResponse
            type: object
            properties:
              tokens:
                type: array
                items:
                  $ref: '#/components/schemas/token'
            required:
              - tokens
    token_create:
      description: Ответ при успешном созданиие токена.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token_data'
    token:
      description: Информация о токене доступа к API.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token'
    token_recreate:
      description: Ответ при успешном пересоздании токена.
      headers:
        ratelimit-limit:
          $ref: '#/components/headers/ratelimit-limit'
        ratelimit-remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        ratelimit-reset:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/token_data'
  examples:
    servers_all:
      value:
        servers:
          - virtual_server_id: 3295
            status: active
            create_progress: 100
            tariff_id: 14
            payment_period: 2
            os_id: 1
            template_id: null
            cpu: 2
            ram: 2
            vram: 0
            drive: 40
            drive_tariff_id: 14
            additional_drive: null
            additional_drive_tariff_id: null
            ip: 1
            ddos_protection: 0
            user_comment: Тестовый Windows VPS
          - virtual_server_id: 4438
            status: active
            create_progress: 100
            tariff_id: 36
            payment_period: 2
            os_id: 34
            template_id: null
            cpu: 1
            ram: 1
            vram: 0
            drive: 20
            drive_tariff_id: 14
            additional_drive: null
            additional_drive_tariff_id: null
            ip: 1
            ddos_protection: 0
            user_comment: Небольшой сервер под Debian
        pagination:
          page: 1
          per_page: 25
          previous_page: null
          next_page: null
          last_page: 1
          total_entries: 2
