Skip to content

Интеграция биллинга VSAAS.IO и облачного сервиса видеонаблюдения cloud.vsaas.io

Из этой статьи вы узнаете как оператору связи внедрить интегрировать биллинг VSAAS.IO с облачным сервисом видеонаблюдения cloud.vsaas.io, чтобы продавать камеры по подписке и рассчитывать стоимость пользования сервисом абонентами.

Как оператор, выполните следующее:

  1. Зарегистрируйте учётную запись в VSAAS.IO.
  2. Посмотрите типичные сценарии использования биллинга и облачного Watcher.

    1. Создать тариф.
    2. Создать организацию со списком доступных тарифов.
    3. Создать пользователя с правами для чтения.
    4. Создать пользователя для редактирования камеры.
    5. Удалить пользователя с правами на редактирование камер.
    6. Добавить тарифы в существующую организацию.
    7. Изменить тариф по умолчанию.
    8. Отключить камеру.

Глоссарий

  • Оператор связи — клиент компании Эрливидео, который арендует сервисы биллинга и облачного видеонаблюдения.
  • Абонент — клиент оператора связи, пользователь сервиса облачного видеонаблюдения cloud.vsaas.io.
  • Пресет — набор параметров DVR и аналитики, который можно применять как шаблон при добавлении и настройке камер в cloud.vsaas.io. Пресеты соответствуют тарифам в биллинге VSAAS.IO, поэтому они настраиваются перед добавлением камер.
  • VSAAS.IO (my.vsaas.io) — сервис биллинга, отвечающий за определение тарифов на услуги оператора связи и взимание денег с абонентов за пользование cloud.vsaas.io. Пользователи в VSAAS.IO — это Администраторы и бухгалтеры, которые собирают информацию о том, кто, сколько денег и кому должен.
  • cloud.vsaas.io — облачный сервис видеонаблюдения Flussonic Watcher, услугами которого пользуются абоненты. В cloud.vsaas.io определяются все технические возможности сервиса видеонаблюдения: управление учётными записями абонентов и монтажников, камерами и их настройками, наполнением тарифных планов.

Особенности VSAAS.IO и cloud.vsaas.io

VSAAS.IO и cloud.vsaas.io — разные структуры. VSAAS.IO общается с cloud.vsaas.io, но не наоборот. Это значит, что из cloud.vsaas.io вы не получите информацию о биллинге. VSAAS.IO отвечает за тарифы и счета, а cloud.vsaas.io за камеры. Для VSAAS.IO и cloud.vsaas.io есть свой API. Часть методов доступна в VSAAS.IO (my.vsaas.io), но недоступна в cloud.vsaas.io и наоборот. Например, в VSAAS.IO (my.vsaas.io) вы можете создать или изменить организацию, а в cloud.vsaas.io только получить данные об организации.

Биллинг проводит расчет раз в сутки в районе полуночи. Не настраивайте интеграцию так, чтобы она регулярно опрашивала биллинг. Новые камеры добавленные сегодня - вы увидите завтра.

Подробнее о работе с биллингом VSAAS.IO, см. Биллинг облачного сервиса VSAAS.IO

Регистрация оператора в VSAAS.IO

Аккаунт на VSAAS.IO нужен для настройки тарифов и выставления счетов абонентам. Мы создаем учетные записи по запросу, напишите нам письмо, указав имя вашей организации. Мы предоставим вам домен вида YOURNAME.vsaas.io, либо обсудим возможность привязки вашего домена.

В дальнейшем мы сможете заходить напрямую в личный кабинет, используя email, с которого прислали запрос.

Типичные сценарии использования биллинга и облачного Watcher

В этом разделе приведены сценарии использования биллинга VSAAS.IO и облачного сервиса видеонаблюдения cloud.vsaas.io.

Warning

my.vsaas.io и cloud.vsaas.io работают с API версий 1 и 2 соответственно. Мы планируем перевести их на API версии 3, чтобы достичь единого формата и версии API среди всех продуктов экосистемы Flussonic. Об этих и других изменениях вы можете узнать из блога.

Создать тариф

  1. Зайдите в учётную запись Администратора на my.vsass.io.
  2. Создайте тариф, перейдя на вкладку BILLING PLANS и нажав CREATE NEW BILLING PLAN. Заполните форму добавления нового тарифа и нажмите SAVE, чтобы сохранить тариф. Добавленный тариф вместе с датой начала его действия будет отображаться в списке тарифов на вкладке BILLING PLANS.
  3. Посмотрите ID тарифа, вызвав метод GET https://my.vsaas.io/api/v1/tariff_plans. Тарифу присваивается два разных ID: один для my.vsaas.io — id, второй для cloud.vsaas.io — external_id. Используйте этот метод для маппинга в CRM.

Создать организацию со списком доступных тарифов

  1. Создайте организацию, вызвав метод API my.vsaas.io POST https://my.vsaas.io/api/v1/organizations и укажите владельца домена (owner) со списком требуемых тарифов. Этот метод создаёт организацию сразу в биллинге (my.vsaas.io) и облачном Watcher (cloud.vsaas.io), присваивая ей два разных ID: один для my.vsaas.io — id, второй для cloud.vsaas.io — external_id.

Создать пользователя с правами для чтения

Обращение только к облачному Watcher (cloud.vsaas.io).

  1. Создайте пользователя, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/users.
  2. Подключите пользователя к нужной организации, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/users. Узнать ID организации можно с помощью метода получения списка организаций GET /vsaas/api/v2/organizations.
  3. Узнайте ID папки с камерами с помощью метода API cloud.vsaas.io для получения списка папок организации GET vsaas/api/v2/organizations/ORGANIZATION-ID/folders.
  4. Предоставьте права в папках нужной организации пользователю, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/folders/FOLDER-ID/users.
  5. Удалите пользователя из организации по умолчанию, вызвав метод API cloud.vsaas.io DELETE /vsaas/api/v2/organizations/ORGANIZATION-ID/users/USER-ID. Теперь абонент прикреплён только к нужной организации.

Создать пользователя для редактирования камеры

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

Обращение только к облачному Watcher (cloud.vsaas.io).

Note

Создание пользователя для редактирования камер отличается от создания пользователя с правами для чтения (абонент) тем, что при подключении пользователя к организации пользователю выдаются особые права на редактирование камер (см. п. 2).

  1. Создайте пользователя, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/users.
  2. Подключите пользователя с особыми правами на добавление камер: "can_edit_organization_cameras": true к организации. Для этого вызовите метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/users. Узнать ID организации можно с помощью метода получения списка организаций GET /vsaas/api/v2/organizations.
  3. Узнайте ID папки с камерами с помощью метода API cloud.vsaas.io для получения списка папок организации GET vsaas/api/v2/organizations/ORGANIZATION-ID/folders.
  4. Предоставьте права в папках нужной организации пользователю, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/folders/FOLDER-ID/users.
  5. Удалите пользователя из организации по умолчанию, вызвав метод API cloud.vsaas.io DELETE /vsaas/api/v2/organizations/ORGANIZATION-ID/users/USER-ID. Теперь абонент прикреплён только к нужной организации.

Удалить пользователя с правами на редактирование камер

Удалите пользователя с особыми правами на редактирование камер (монтажника) с помощью метода API cloud.vsaas.io DELETE '/vsaas/api/v2/users/USER-ID.

Добавить тарифы в существующую организацию

Обновите тарифы организации с помощью метода API my.vsaas.io PUT /organizations/ORGANIZATION-ID.

Изменить тариф по умолчанию

  1. Зайдите в учётную запись Администратора на my.vsass.io.
  2. Создайте тариф, перейдя на вкладку BILLING PLANS и нажав CREATE NEW BILLING PLAN. Заполните форму добавления нового тарифа и поставьте галочку напротив Apply to Organisations by default.
  3. Сохраните тариф, нажав SAVE. Добавленный тариф вместе с датой начала его действия будет отображаться в списке тарифов на вкладке BILLING PLANS и иметь YES в столбце Default.

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

Отключить камеру

Есть два способа:

  • Через веб-интерфейс VSAAS.IO.

    1. Зайдите в учётную запись Администратора в cloud.vsaas.io.
    2. Перейдите на вкладку Мои камеры.
    3. Нажмите на настройки нужной камеры (шестерёнка), найдите раздел ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ и уберите галочку напротив Включена.
    4. Сохраните настройки, нажав Сохранить либо сочетание клавиш Ctrl+S.
  • С помощью API cloud.vsaas.io.

    Используйте метод PUT vsaas/api/v2/cameras/OBJECT-ID.

VSAAS.IO API

API v1 для работы с биллингом VSAAS.IO.

Авторизация

Только владелец и Администратор домена могут делать запросы к VSAAS.IO API.

Все запросы к VSAAS.IO API требуют авторизацию:

  • по логину (X-USER: ADMIN-EMAIL-ADDRESS),
  • паролю (X-PASSWORD: ADMIN-PASSWORD),
  • ID домена (X-DOMAIN-ID: 000). Узнайте ID домена у вашего менеджера.

Тарифы

Управление тарифами в my.vsaas.io.

Получить список всех доступных тарифов

curl -H "Content-Type: application/json" \
-H "X-USER: ADMIN-EMAIL-ADDRESS" \
-H "X-PASSWORD: ADMIN-PASSWORD" \
-H "X-DOMAIN-ID: 000" \
-X GET 'https://my.vsaas.io/api/v1/tariff_plans'

Пример ответа:

{
  "tariff_plans": [
    {
      "id": 549,
      "name": "Test plan",
      "date_from": "27/04/2024",
      "full_price": "100.0 USD",
      "status": "Active",
      "external_id": 392
    },
    {
      "id": 548,
      "name": "Default",
      "date_from": "27/04/2024",
      "full_price": "0.0 USD",
      "status": "Active",
      "external_id": 391
    }
  ]
}

Организации

Управление организациями в my.vsaas.io.

Получить список всех доступных организаций или данные о конкретной организации

curl -H "Content-Type: application/json" \
-H "X-USER: ADMIN-EMAIL-ADDRESS" \
-H "X-PASSWORD: ADMIN-PASSWORD" \
-H "X-DOMAIN-ID: 000" \
-X GET 'https://my.vsaas.io/api/v1/organizations'

Пример ответа:

{
  "organizations": [
    {
      "id": 736,
      "title": "My organization",
      "domain": {
        "id": 247,
        "title": "YOUR-DOMAIN-NAME"
      },
      "owner": {
        "id": 410,
        "email": "demo@example.org"
      },
      "discount": "0%",
      "trial_expired_at": "",
      "external_id": 753,
      "tariff_plans": [
        {
          "id": 548,
          "name": "Default",
          "date_from": "27/04/2024",
          "full_price": "0.0 USD",
          "status": "Active",
          "external_id": 391
        }
      ]
    }
  ]
}

Добавить организацию с тарифами и без тарифов

В результате выполнения этого вызова организация создаётся сразу в VSAAS.IO и cloud.vsaas.io с тарифом по умолчанию Default.

curl -H "Content-Type: application/json" \
-H "X-USER: ADMIN-EMAIL-ADDRESS" \
-H "X-PASSWORD: ADMIN-PASSWORD" \
-H "X-DOMAIN-ID: 000" \
-X POST 'https://my.vsaas.io/api/v1/organizations'
-d '{"organization": {"title": "Demo org", "owner": "demo@example.org", "tariff_plans": [549]}}'

, где:

  • (обязательный) title — название организации,
  • (обязательный) owner — адрес электронной почты владельца организации. Может быть как существующий, так и произвольный. Если вы указываете произвольный адрес, то будет создан новый пользователь и на указанный адрес придёт письмо с запросом подтверждения и ввода пароля пользователя.
  • tariff_plans — список ID тарифов. Вы можете узнать ID тарифа, получив список всех доступных тарифов.

Пример ответа:

{
    "organization": {
        "id": 797,
        "title": "Demo org",
        "domain": {
            "id": 247,
            "title": "YOUR-DOMAIN-NAME"
        },
        "owner": {
            "id": 410,
            "email": "demo@example.org"
        },
        "discount": "0%",
        "trial_expired_at": "",
        "external_id": 774,
        "tariff_plans": [
            {
                "id": 548,
                "name": "Default",
                "date_from": "27/04/2024",
                "full_price": "0.0 USD",
                "status": "Active",
                "external_id": 391
            },
            {
                "id": 549,
                "name": "Test plan",
                "date_from": "27/04/2024",
                "full_price": "100.0 USD",
                "status": "Active",
                "external_id": 392
            }
        ]
    }
}

Изменить тарифы существующей организации

curl -H "Content-Type: application/json" \
-H "X-USER: ADMIN-EMAIL-ADDRESS" \
-H "X-PASSWORD: ADMIN-PASSWORD" \
-H "X-DOMAIN-ID: 000" \
-X PUT 'https://my.vsaas.io/api/v1/organizations/ORGANIZATION-ID'
-d '{"organization": {"tariff_plans": [550]}}'
  • (обязательный) ORGANIZATION-ID — ID организации,
  • tariff_plans — список ID тарифов. Вы можете узнать ID тарифа, получив список всех доступных тарифов. Если вы передадите пустой список, то у организации удалятся все тарифы, кроме тарифа по умолчанию.

Пример ответа:

{
    "organization": {
        "id": 797,
        "title": "Unedited org",
        "domain": {
            "id": 247,
            "title": "bikbaeva"
        },
        "owner": {
            "id": 410,
            "email": "demo@example.org"
        },
        "discount": "0%",
        "trial_expired_at": "",
        "external_id": 774,
        "tariff_plans": [
            {
                "id": 548,
                "name": "Default",
                "date_from": "27/04/2024",
                "full_price": "0.0 USD",
                "status": "Active",
                "external_id": 391
            },
            {
                "id": 550,
                "name": "My demo plan",
                "date_from": "02/05/2024",
                "full_price": "1500.0 USD",
                "status": "Active",
                "external_id": 393
            }
        ]
    }
}

Удалить существующую организацию

curl -H "Content-Type: application/json" \
-H "X-USER: ADMIN-EMAIL-ADDRESS" \
-H "X-PASSWORD: ADMIN-PASSWORD" \
-H "X-DOMAIN-ID: 000" \
-X DELETE 'https://my.vsaas.io/api/v1/organizations/ORGANIZATION-ID'

, где ORGANIZATION-ID — ID организации для удаления.

Ответ: 204 без тела.

cloud.vsaas.io API

API v2 для работы с сервисом облачного видеонаблюдения cloud.vsaas.io.

В cloud.vsaas.io вы можете настроить для пользователей следующие права:

  • редактировать камеры организации ("can_edit_organization_cameras"),
  • редактировать пользователей организации ("can_edit_organization_users"),
  • редактировать организации ("can_edit_organizations"),
  • просматривать камеры,
  • просматривать статистику просмотров камер по организации ("can_view_organization_stats").

Авторизация

Только владелец и Администратор организации могут делать запросы к cloud.vsaas.io API.

Все запросы к cloud.vsaas.io API требуют авторизацию по ключу API Администратора (x-vsaas-api-key: VSAAS-ADMIN-API-KEY). API-ключ Администратора вы можете скопировать из веб-интерфейса cloud.vsaas.io: Админ > Настройки > ОБЩИЕ НАСТРОЙКИ > Ключ API.

Камеры

Управление камерами в cloud.vsaas.io.

Получить список всех камер и их данных в домене

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras'

, где YOUR-DOMAIN-NAME — имя домена.

Пример ответа:

[
    {
        "name": "camera02-5ca25a2330",
        "onvif_ptz": false,
        "organization_id": 752,
        "stream_url": "fake://fake",
        "substream_url": "",
        "title": "Camera02",
        "user_attributes": {
            "favorite": false,
            "motion_alarm": false
        },
        "video_only": false,
        "transcode_audio": false
        "comment": "",
        "coordinates": "",
        "enabled": false,
        "folder_id": 1155,
        "has_actions": false,
        "last_change": {
            "user": "demo@example.org",
            "domain_id": 143,
            "object_id": "camera02-5ca25a2330",
            "created_at": 1715105180,
            "event_data": {
                "changed_data": {
                    "_enabled": [
                        true,
                        false
                    ]
                }
            },
            "action_type": "change",
            "object_type": "Camera",
            "request_data": {
                "ip": "188.170.86.201,188.170.86.201",
                "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
            }
        },
        "motion_detector_enabled": false,
        "permissions": {
            "view": true,
            "edit": true,
            "ptz": true,
            "dvr": true,
            "dvr_depth_limit": null,
            "actions": true
        },
        "postal_address": "",
        "precise_thumbnails_days": 0,
        "preset": {
            "domain_id": 143,
            "dvr_depth": 0.0,
            "id": 391,
            "is_adjustable": false,
            "is_default": true,
            "is_deleted": false,
            "precise_thumbnails_days": 0,
            "title": "Default",
            "vision_params": {}
        },
        "preset_id": 391,
        "static": true,
        "stream_status": {
            "name": "camera02-5ca25a2330",
            "server": null,
            "alive": false,
            "lifetime": null,
            "bitrate": null,
            "source_error": "no_stream_status",
            "http_port": null,
            "https_port": null
        }
    },
    ...
]

Note

В ответе возвращается ID пресета, но не возвращается ID тарифа, определённого в биллинге. Это значит, что вам нужно сравнивать ID пресета с ID тарифа на вашей стороне.

Получить данные о конкретной камере

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras/OBJECT-ID'

, где:

Ответ будет тот же, что и у списка камер, но в виде одного объекта, а не списка.

Получить список всех камер и их данных для организации

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras?organization_id=ORGANIZATION-ID'

, где:

Пример ответа:

[
    {
        "comment": "",
        "coordinates": "",
        "enabled": false,
        "folder_id": 1155,
        "groups": [],
        "has_actions": false,
        "last_change": {
            "user": "a.bikbaeva@erlyvideo.org",
            "domain_id": 143,
            "object_id": "camera02-5ca25a2330",
            "created_at": 1715105180,
            "event_data": {
                "changed_data": {
                    "_enabled": [
                        true,
                        false
                    ],
                    "extra_config": [
                        null,
                        {
                            "video_only": false,
                            "transcode_audio": false
                        }
                    ]
                }
            },
            "action_type": "change",
            "object_repr": "<CloudStream camera02-5ca25a2330>",
            "object_type": "Camera",
            "request_data": {
                "ip": "188.170.86.201,188.170.86.201",
                "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
            }
        },
        "motion_detector_enabled": false,
        "name": "camera02-5ca25a2330",
        "onvif_ptz": false,
        "organization_id": 752,
        "permissions": {
            "view": true,
            "edit": true,
            "ptz": true,
            "dvr": true,
            "dvr_depth_limit": null,
            "actions": true
        },
        "playback_config": {
            "token": "3.sJXDwZNHAAAAAAAAAAAAAAAAAAAAjylfLugHFgvX5iaFryiQBGFeBkLA"
        },
        "postal_address": "",
        "precise_thumbnails_days": 0,
        "preset": {
            "domain_id": 143,
            "dvr_depth": 0.0,
            "id": 391,
            "is_adjustable": false,
            "is_default": true,
            "is_deleted": false,
            "precise_thumbnails_days": 0,
            "title": "Default",
            "vision_params": {}
        },
        "preset_id": 391,
        "static": true,
        "stream_status": {
            "name": "camera02-5ca25a2330",
            "server": null,
            "alive": false,
            "lifetime": null,
            "bitrate": null,
            "source_error": "no_stream_status",
            "http_port": null,
            "https_port": null
        },
        "stream_url": "fake://fake",
        "provision_required": false,
        "substream_url": "",
        "thumbnails": false,
        "title": "Camera02",
        "user_attributes": {
            "favorite": false,
            "motion_alarm": false
        },
        "video_only": false,
        "transcode_audio": false
    },
    {
        "comment": "",
        "coordinates": "",
        "enabled": true,
        "folder_id": 1155,
        "groups": [],
        "has_actions": false,
        "last_change": {
            "user": "a.bikbaeva@erlyvideo.org",
            "domain_id": 143,
            "object_id": "camera05-6f057b160a",
            "created_at": 1714737887,
            "event_data": {
                "changed_data": {
                    "extra_config": [
                        null,
                        {
                            "video_only": false,
                            "transcode_audio": false
                        }
                    ]
                }
            },
            "action_type": "change",
            "object_repr": "<CloudStream camera05-6f057b160a>",
            "object_type": "Camera",
            "request_data": {
                "ip": "188.242.170.19,188.242.170.19",
                "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
            }
        },
        "motion_detector_enabled": false,
        "name": "camera05-6f057b160a",
        "onvif_ptz": false,
        "organization_id": 752,
        "permissions": {
            "view": true,
            "edit": true,
            "ptz": true,
            "dvr": true,
            "dvr_depth_limit": null,
            "actions": true
        },
        "playback_config": {
            "token": "3.sJXDwZNHAAAAAAAAAAAAAAAAAAAAj9odoI-86sxLhc4uyZT9PcR5TedY"
        },
        "postal_address": "",
        "precise_thumbnails_days": 0,
        "preset": {
            "domain_id": 143,
            "dvr_depth": 0.0,
            "id": 391,
            "is_adjustable": false,
            "is_default": true,
            "is_deleted": false,
            "precise_thumbnails_days": 0,
            "title": "Default",
            "vision_params": {}
        },
        "preset_id": 391,
        "static": true,
        "stream_status": {
            "name": "camera05-6f057b160a",
            "server": "eu-004.vscdn.io",
            "alive": true,
            "lifetime": 385264839,
            "bitrate": 196,
            "source_error": null,
            "http_port": null,
            "https_port": null
        },
        "stream_url": "fake://fake",
        "streamer_hostname": "eu-004.vscdn.io",
        "provision_required": false,
        "substream_url": "",
        "thumbnails": false,
        "title": "Camera05",
        "user_attributes": {
            "favorite": false,
            "motion_alarm": false
        },
        "video_only": false,
        "transcode_audio": false
    }
]

Поменять тариф для камеры

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X PUT 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras/OBJECT-ID'
--data '{"preset_id": 526}'

, где:

Пример ответа:

{
    "comment": "",
    "coordinates": "",
    "enabled": true,
    "folder_id": 1179,
    "groups": [],
    "has_actions": false,
    "last_change": {
        "user": "domain_143_via_apikey",
        "domain_id": 143,
        "object_id": "cam-10-9bdbc979dd",
        "created_at": 1715128188,
        "event_data": {
            "changed_data": {
                "preset": [
                    "<Preset #393 My demo plan>",
                    "<Preset #391 Default>"
                ],
                "dvr_depth": [
                    3.0,
                    null
                ],
                "dvr_space": [
                    6,
                    null
                ],
                "preset_id": [
                    393,
                    391
                ]
            }
        },
        "action_type": "change",
        "object_repr": "<CloudStream cam-10-9bdbc979dd>",
        "object_type": "Camera",
        "request_data": {
            "ip": "188.242.170.19,188.242.170.19",
            "user_agent": "PostmanRuntime/7.32.1"
        }
    },
    "motion_detector_enabled": false,
    "name": "cam-10-9bdbc979dd",
    "onvif_ptz": false,
    "organization_id": 774,
    "permissions": {
        "view": true,
        "edit": true,
        "ptz": true,
        "dvr": true,
        "dvr_depth_limit": null,
        "actions": true
    },
    "playback_config": {
        "token": "3.sJXDwZNHAAAAAAAAAAAAAAAAAAAAj2eRzt7bH5sYfDpRVJ4jlfvwAO4o"
    },
    "postal_address": "",
    "precise_thumbnails_days": 0,
    "preset": {
        "domain_id": 143,
        "dvr_depth": 0.0,
        "id": 391,
        "is_adjustable": false,
        "is_default": true,
        "is_deleted": false,
        "precise_thumbnails_days": 0,
        "title": "Default",
        "vision_params": {}
    },
    "preset_id": 391,
    "static": true,
    "stream_status": {
        "name": "cam-10-9bdbc979dd",
        "server": "eu-004.vscdn.io",
        "alive": true,
        "lifetime": 730640,
        "bitrate": 194,
        "source_error": null,
        "http_port": null,
        "https_port": null
    },
    "stream_url": "fake://fake",
    "streamer_hostname": "eu-004.vscdn.io",
    "provision_required": false,
    "substream_url": "",
    "thumbnails": false,
    "title": "cam-10",
    "user_attributes": {
        "favorite": false,
        "motion_alarm": false
    },
    "video_only": false,
    "transcode_audio": false
}

Отключить камеру

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X PUT 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras/OBJECT-ID'
--data '{"enabled": false}'

, где:

Пример ответа:

{
    "comment": "",
    "coordinates": "",
    "enabled": false,
    "folder_id": 1156,
    "groups": [],
    "has_actions": false,
    "last_change": {
        "user": "domain_143_via_apikey",
        "domain_id": 143,
        "object_id": "demo-cam-219c36899q",
        "created_at": 1715103531,
        "event_data": {
            "changed_data": {
                "_enabled": [
                    true,
                    false
                ]
            }
        },
        "action_type": "change",
        "object_repr": "<CloudStream demo-cam-219c36899q>",
        "object_type": "Camera",
        "request_data": {
            "ip": "188.242.169.75,188.242.169.75",
            "user_agent": "PostmanRuntime/7.32.1"
        }
    },
    "motion_detector_enabled": false,
    "name": "demo-cam-219c36899q",
    "onvif_ptz": false,
    "organization_id": 753,
    "permissions": {
        "view": true,
        "edit": true,
        "ptz": true,
        "dvr": true,
        "dvr_depth_limit": null,
        "actions": true
    },
    "playback_config": {
        "token": "3.sJXDwZNHAAAAAAAAAAAAAAAAAAAj5fUIZsybhtcpRTPPwzvGGht3iDs"
    },
    "postal_address": "",
    "precise_thumbnails_days": 0,
    "preset": {
        "domain_id": 143,
        "dvr_depth": 0.0,
        "id": 391,
        "is_adjustable": false,
        "is_default": true,
        "is_deleted": false,
        "precise_thumbnails_days": 0,
        "title": "Default",
        "vision_params": {}
    },
    "preset_id": 391,
    "static": true,
    "stream_status": {
        "name": "demo-cam-219c36899q",
        "server": null,
        "alive": false,
        "lifetime": null,
        "bitrate": null,
        "source_error": "no_stream_status",
        "http_port": null,
        "https_port": null
    },
    "stream_url": "fake://fake",
    "streamer_hostname": "eu-004.vscdn.io",
    "provision_required": false,
    "substream_url": "",
    "thumbnails": false,
    "title": "demo-cam",
    "user_attributes": {
        "favorite": false,
        "motion_alarm": false
    },
    "video_only": false,
    "transcode_audio": false
}

Включить камеру

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X PUT 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/cameras/OBJECT-ID'
--data '{"enabled": true}'

, где:

Пример ответа:

{
    "comment": "",
    "coordinates": "",
    "enabled": true,
    "folder_id": 1156,
    "groups": [],
    "has_actions": false,
    "last_change": {
        "user": "domain_143_via_apikey",
        "domain_id": 143,
        "object_id": "demo-cam-219c36899q",
        "created_at": 1715128546,
        "event_data": {
            "changed_data": {
                "_enabled": [
                    false,
                    true
                ]
            }
        },
        "action_type": "change",
        "object_repr": "<CloudStream alexandra-bikbaeva-cam-227c37899f>",
        "object_type": "Camera",
        "request_data": {
            "ip": "188.242.170.19,188.242.170.19",
            "user_agent": "PostmanRuntime/7.32.1"
        }
    },
    "motion_detector_enabled": false,
    "name": "demo-cam-219c36899q",
    "onvif_ptz": false,
    "organization_id": 753,
    "permissions": {
        "view": true,
        "edit": true,
        "ptz": true,
        "dvr": true,
        "dvr_depth_limit": null,
        "actions": true
    },
    "playback_config": {
        "token": "3.sJXDwZNHAAAAAAAAAAAAAAAAAAAAj5fUIZsqbhtcpRTPPszvGGht3iDs"
    },
    "postal_address": "",
    "precise_thumbnails_days": 0,
    "preset": {
        "domain_id": 143,
        "dvr_depth": 0.0,
        "id": 391,
        "is_adjustable": false,
        "is_default": true,
        "is_deleted": false,
        "precise_thumbnails_days": 0,
        "title": "Default",
        "vision_params": {}
    },
    "preset_id": 391,
    "static": true,
    "stream_status": {
        "name": "demo-cam-219c36899q",
        "server": null,
        "alive": true,
        "lifetime": 145967640,
        "bitrate": 202,
        "source_error": null,
        "http_port": null,
        "https_port": null
    },
    "stream_url": "fake://fake",
    "provision_required": false,
    "substream_url": "",
    "thumbnails": false,
    "title": "demo-cam",
    "user_attributes": {
        "favorite": false,
        "motion_alarm": false
    },
    "video_only": false,
    "transcode_audio": false
}

Пользователи

Управление пользователями в cloud.vsaas.io.

Получить список всех пользователей

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/users'

, где YOUR-DOMAIN-NAME — имя домена.

Пример ответа:

[
  {
    "id": 1297,
    "domain_id": 111,
    "login": "demo@example.org",
    "apikey": "ajG3NIzOt2CjUyRoWyVeh2U9",
    "is_admin": false,
    "authorized_ip": null,
    "enabled": true,
    "readonly": false,
    "monitoring": false,
    "name": null,
    "locale": "",
    "note": null,
    "phone": null,
    "notification_email": null,
    "external_id": null,
    "max_sessions": null,
    "can_edit_organizations": false,
    "can_edit_settings": true,
    "can_view_organizations": true,
    "organizations": [
      752,
      753
    ]
  },
  {
    "id": 1298,
    "domain_id": 111,
    "login": "another-demo@example.org",
    "apikey": null,
    "is_admin": false,
    "authorized_ip": null,
    "enabled": true,
    "readonly": false,
    "monitoring": false,
    "name": "",
    "locale": "en",
    "note": "",
    "phone": null,
    "notification_email": null,
    "external_id": null,
    "max_sessions": null,
    "can_edit_organizations": false,
    "can_edit_settings": false,
    "can_view_organizations": false,
    "organizations": [
      753,
      762
    ]
  },
  ...

Создать пользователя

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X POST 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/users'
--data-raw '{
    "login": "user@example.com",
    "password": "qwe123"
}
'

, где:

  • login — уникальный логин пользователя.
  • password — пароль, задаваемый для пользователя.

Пример ответа:

{
    "id": 1377,
    "domain_id": 143,
    "login": "user@example.com",
    "apikey": null,
    "is_admin": false,
    "authorized_ip": null,
    "enabled": true,
    "readonly": false,
    "monitoring": false,
    "name": null,
    "locale": "",
    "note": null,
    "phone": null,
    "notification_email": null,
    "external_id": null,
    "max_sessions": null,
    "can_edit_organizations": false,
    "can_edit_settings": false,
    "can_view_organizations": false,
    "organizations": [
        752
    ]
}

Новый пользователь автоматически привязывается к организации по умолчанию Unassigned cameras.

Удалить пользователя

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-X DELETE 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/users/USER-ID'

, где YOUR-DOMAIN-NAME — имя домена.

Ответ:

{
    "success": true
}

Организации

Управление организациями в cloud.vsaas.io.

Получить список всех организаций

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations'

, где YOUR-DOMAIN-NAME — имя домена.

Пример ответа:

[
    {
        "domain": {
            "title": "YOUR-DOMAIN-NAME",
            "id": 143
        },
        "title": "My organization",
        "mosaic_count": 0,
        "camera_count": 4,
        "owner": {
            "login": "demo@example.org",
            "id": 1179
        },
        "can_view_stats": true,
        "can_edit_cameras": true,
        "camera_limit": 1000,
        "dvr_limit": 100,
        "can_edit_users": true,
        "id": 753,
        "user_count": 2,
        "is_member": false,
        "user_limit": 1000,
        "is_default": false
    },
    {
        "domain": {
            "title": "YOUR-DOMAIN-NAME",
            "id": 143
        },
        "title": "Unassigned cameras",
        "mosaic_count": 0,
        "camera_count": 2,
        "owner": {
            "login": "demo@example.org",
            "id": 1179
        },
        "can_view_stats": true,
        "can_edit_cameras": true,
        "camera_limit": 1000,
        "dvr_limit": 100,
        "can_edit_users": true,
        "id": 752,
        "user_count": 1,
        "is_member": false,
        "user_limit": 1000,
        "is_default": true
    }
]

Получить список всех доступных тарифов для организации

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/presets'

, где:

Пример ответа:

[
    {
        "organization_id": null,
        "preset": {
            "dvr_depth": 0.0,
            "dvr_lock_days": null,
            "vision_params": {},
            "vision_gpu": null,
            "vision_alg": null,
            "is_deleted": false,
            "vision_enabled": null,
            "is_adjustable": false,
            "precise_thumbnails_days": 0,
            "id": 391,
            "title": "Default",
            "dvr_space": null,
            "vision_areas": null
        },
        "domain_id": 143,
        "id": null,
        "preset_id": 391
    }
]

Пользователи в организации

Управление пользователями в организации в cloud.vsaas.io.

Получить список всех пользователей организации

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/users'

, где:

Пример ответа:

[
    {
        "notification_email": null,
        "can_view_organization_stats": true,
        "can_view_organization_plists": true,
        "login": "demo@example.org",
        "can_edit_organization_cameras": true,
        "can_edit_organization_plists": true,
        "user_id": 1297,
        "folders_permissions": [],
        "can_edit_organization_users": true
    },
    {
        "notification_email": null,
        "can_view_organization_stats": false,
        "can_view_organization_plists": false,
        "login": "demo-2@example.com",
        "can_edit_organization_cameras": false,
        "can_edit_organization_plists": false,
        "user_id": 1377,
        "folders_permissions": [],
        "can_edit_organization_users": false
    }
]

Подключить пользователя с правами для чтения к конкретной организации

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X POST 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/users'
--data '{
    "user_id": 1378
}'

, где:

Пример ответа:

{
    "notification_email": null,
    "can_view_organization_stats": false,
    "can_view_organization_plists": false,
    "login": "viewer@example.com",
    "can_edit_organization_cameras": false,
    "can_edit_organization_plists": false,
    "user_id": 1378,
    "folders_permissions": [],
    "can_edit_organization_users": false
}

У пользователя нет никаких прав, даже права смотреть камеры: "folders_permissions": [].

Подключить пользователя с правами для редактирования камер к конкретной организации

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X POST 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/users'
--data '{
    "user_id": 1377,
    "can_edit_organization_cameras": true
}'

, где:

Пример ответа:

{
    "notification_email": null,
    "can_view_organization_stats": false,
    "can_view_organization_plists": true,
    "login": "installer@example.com",
    "can_edit_organization_cameras": true,
    "can_edit_organization_plists": true,
    "user_id": 1377,
    "folders_permissions": [],
    "can_edit_organization_users": false
}

У пользователя нет права смотреть камеры: "folders_permissions": [].

Удалить пользователей из организации по умолчанию

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-X DELETE 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID//users/USER-ID'

, где:

Ответ:

{
    "success": true
}

Папки в организациях

Управление папками в организациях в cloud.vsaas.io.

Получить список всех папок в конкретной организации

Все камеры находятся в какой-то папке, то есть нет камер вне папок. При создании организации создаётся папка по умолчанию Cameras.

curl -H "x-vsaas-api-key: VSAAS-USER-API-KEY" \
-X GET 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/folders'

, где:

Пример ответа:

[
    {
        "level": 0,
        "camera_count": 4,
        "organization_id": 753,
        "parent_id": null,
        "map_topleft": null,
        "id": 1156,
        "title": "Cameras",
        "map_bottomleft": null,
        "order_num": 1,
        "map_topright": null,
        "coordinates": null
    }
]

Предоставить права для пользователей в конкретной папке организации

curl -H "x-vsaas-api-key: VSAAS-ADMIN-API-KEY" \
-H 'Content-Type: application/json' \
-X POST 'https://YOUR-DOMAIN-NAME.vsaas.io/vsaas/api/v2/organizations/ORGANIZATION-ID/folders/FOLDER-ID/users'
--data '{
    "user_id": 1378,
    "can_view_dvr": 1,
    "can_use_ptz": 1,
    "can_use_actions": 1,
    "dvr_depth_limit": null
}'

, где:

  • YOUR-DOMAIN-NAME — имя домена,
  • ORGANIZATION-ID — ID организации, присваиваемый при создании организации.
  • FOLDER-ID — ID папки с камерами.

Пример ответа:

{
    "can_use_ptz": true,
    "can_use_actions": true,
    "user_id": 1378,
    "can_view_dvr": true,
    "dvr_depth_limit": null
}