Интеграция биллинга VSAAS.IO и облачного сервиса видеонаблюдения cloud.vsaas.io¶
Из этой статьи вы узнаете как оператору связи внедрить интегрировать биллинг VSAAS.IO с облачным сервисом видеонаблюдения cloud.vsaas.io, чтобы продавать камеры по подписке и рассчитывать стоимость пользования сервисом абонентами.
Как оператор, выполните следующее:
- Зарегистрируйте учётную запись в VSAAS.IO.
-
Посмотрите типичные сценарии использования биллинга и облачного Watcher.
- Создать тариф.
- Создать организацию со списком доступных тарифов.
- Создать пользователя с правами для чтения.
- Создать пользователя для редактирования камеры.
- Удалить пользователя с правами на редактирование камер.
- Добавить тарифы в существующую организацию.
- Изменить тариф по умолчанию.
- Отключить камеру.
Глоссарий¶
- Оператор связи — клиент компании Эрливидео, который арендует сервисы биллинга и облачного видеонаблюдения.
- Абонент — клиент оператора связи, пользователь сервиса облачного видеонаблюдения 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. Об этих и других изменениях вы можете узнать из блога.
Создать тариф¶
- Зайдите в учётную запись Администратора на my.vsass.io.
- Создайте тариф, перейдя на вкладку BILLING PLANS и нажав CREATE NEW BILLING PLAN. Заполните форму добавления нового тарифа и нажмите SAVE, чтобы сохранить тариф. Добавленный тариф вместе с датой начала его действия будет отображаться в списке тарифов на вкладке BILLING PLANS.
- Посмотрите ID тарифа, вызвав метод GET https://my.vsaas.io/api/v1/tariff_plans. Тарифу присваивается два разных ID: один для my.vsaas.io —
id
, второй для cloud.vsaas.io —external_id
. Используйте этот метод для маппинга в CRM.
Создать организацию со списком доступных тарифов¶
- Создайте организацию, вызвав метод 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).
- Создайте пользователя, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/users.
- Подключите пользователя к нужной организации, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/users. Узнать ID организации можно с помощью метода получения списка организаций GET /vsaas/api/v2/organizations.
- Узнайте ID папки с камерами с помощью метода API cloud.vsaas.io для получения списка папок организации GET vsaas/api/v2/organizations/ORGANIZATION-ID/folders.
- Предоставьте права в папках нужной организации пользователю, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/folders/FOLDER-ID/users.
- Удалите пользователя из организации по умолчанию, вызвав метод API cloud.vsaas.io DELETE /vsaas/api/v2/organizations/ORGANIZATION-ID/users/USER-ID. Теперь абонент прикреплён только к нужной организации.
Создать пользователя для редактирования камеры¶
В качестве пользователя с правами редактирования камеры может выступать монтажник.
Обращение только к облачному Watcher (cloud.vsaas.io).
Note
Создание пользователя для редактирования камер отличается от создания пользователя с правами для чтения (абонент) тем, что при подключении пользователя к организации пользователю выдаются особые права на редактирование камер (см. п. 2).
- Создайте пользователя, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/users.
- Подключите пользователя с особыми правами на добавление камер:
"can_edit_organization_cameras": true
к организации. Для этого вызовите метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/users. Узнать ID организации можно с помощью метода получения списка организаций GET /vsaas/api/v2/organizations. - Узнайте ID папки с камерами с помощью метода API cloud.vsaas.io для получения списка папок организации GET vsaas/api/v2/organizations/ORGANIZATION-ID/folders.
- Предоставьте права в папках нужной организации пользователю, вызвав метод API cloud.vsaas.io POST /vsaas/api/v2/organizations/ORGANIZATION-ID/folders/FOLDER-ID/users.
- Удалите пользователя из организации по умолчанию, вызвав метод 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.
Изменить тариф по умолчанию¶
- Зайдите в учётную запись Администратора на my.vsass.io.
- Создайте тариф, перейдя на вкладку BILLING PLANS и нажав CREATE NEW BILLING PLAN. Заполните форму добавления нового тарифа и поставьте галочку напротив Apply to Organisations by default.
- Сохраните тариф, нажав SAVE. Добавленный тариф вместе с датой начала его действия будет отображаться в списке тарифов на вкладке BILLING PLANS и иметь YES в столбце Default.
Предыдущий тариф по умолчанию перейдёт в разряд обычных тарифов, потому что тариф по умолчанию может быть только один.
Отключить камеру¶
Есть два способа:
-
Через веб-интерфейс VSAAS.IO.
- Зайдите в учётную запись Администратора в cloud.vsaas.io.
- Перейдите на вкладку Мои камеры.
- Нажмите на настройки нужной камеры (шестерёнка), найдите раздел ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ и уберите галочку напротив Включена.
- Сохраните настройки, нажав Сохранить либо сочетание клавиш 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'
, где:
YOUR-DOMAIN-NAME
— имя домена,OBJECT-ID
— ID камеры. Узнайте ID камеры с помощью GET /vsaas/api/v2/cameras или GET /vsaas/api/v2/cameras?organization_id=ORGANIZATION-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'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— 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}'
, где:
YOUR-DOMAIN-NAME
— имя домена,OBJECT-ID
— ID камеры. Узнайте ID камеры с помощью GET /vsaas/api/v2/cameras или GET /vsaas/api/v2/cameras?organization_id=ORGANIZATION-ID.preset_id
— ID пресета, который вы хотите установить для камеры. Узнайте ID пресета с помощью GET /vsaas/api/v2/cameras.
Пример ответа:
{
"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}'
, где:
YOUR-DOMAIN-NAME
— имя домена,OBJECT-ID
— ID камеры. Узнайте ID камеры с помощью GET /vsaas/api/v2/cameras или GET /vsaas/api/v2/cameras?organization_id=ORGANIZATION-ID.
Пример ответа:
{
"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}'
, где:
YOUR-DOMAIN-NAME
— имя домена,OBJECT-ID
— ID камеры. Узнайте ID камеры с помощью GET /vsaas/api/v2/cameras или GET /vsaas/api/v2/cameras?organization_id=ORGANIZATION-ID.
Пример ответа:
{
"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'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации.
Пример ответа:
[
{
"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'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации.
Пример ответа:
[
{
"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
}'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации.user_id
— ID пользователя, присваиваемый при создании пользователя.
Пример ответа:
{
"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
}'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации,user_id
— ID пользователя, присваиваемый при создании пользователя.
Пример ответа:
{
"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'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации.USER-ID
— 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'
, где:
YOUR-DOMAIN-NAME
— имя домена,ORGANIZATION-ID
— ID организации, присваиваемый при создании организации.
Пример ответа:
[
{
"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
}