Интеграция в существующую систему биллинга¶
В этой статье описаны типовые сценарии внедрения Flussonic Watcher с контролируемой продажей камер по подписке и учетом абонентов и их услуг в сторонней системе. Справочник API: Watcher Client API и Watcher Admin API.
Далее будут использоваться термины:
- оператор связи — клиент компании Эрливидео, владелец сервиса
- абонент — абонент у оператора связи, пользователь сервиса
- биллинг — система внешняя к Watcher, в ней ведется тарификация услуг оператора связи абонентам и взимание денег
Концепция использования биллинга подразумевает, что именно он является центральным местом хранения данных в системе, а не Flussonic Watcher. Такая практика является стандартной и позволяет централизованно управлять услугами в разных системах, связывая, например, умный дом и видеонаблюдение в едином проекте.
Warning
Устаревший API (/vsaas/api/v1, /vsaas/api/v2) и глобальный ключ домена X-Vsaas-Api-Key удалены. Все запросы в этой статье используют API v3. Если ваша интеграция построена на v2, обновите ее по этой статье; соответствие старых и новых запросов приведено в конце страницы.
Механизм сопоставления тарифных планов биллинга и пресетов Watcher, а также логика, которая будет влиять на доступ, глубину архива и прочие настройки, находится на стороне биллинга.
Сервисная учетная запись и авторизация запросов¶
В API v2 запросы от биллинга авторизовались глобальным ключом домена, не привязанным к учетной записи. В API v3 такого ключа нет: каждый запрос выполняется от имени пользователя. Поэтому сначала создайте сервисную учетную запись — пользователя с уровнем доступа администратора (access_level: admin), от имени которого биллинг будет выполнять все запросы к Watcher.
Роли в этой схеме распределяются так:
- Абонент — владелец своей организации. Он видит видео, работает в мобильном приложении, добавляет камеры и других пользователей. Его
external_idпопадает в отчеты как идентификатор счета. - Сервисная учетная запись — администратор Watcher. Она управляет камерами, тарифами и блокировками через Admin API (
/watcher/admin-api/v3/...): запросы Admin API доступны администратору для любой организации домена и не требуют членства или прав в ней. Организации создаются через Client API — администратор проходит по доменным правам.
Не пытайтесь управлять камерами абонентов от имени администратора через Client API: его запросы проверяют права в конкретной организации, и администратор, не будучи ее владельцем или участником, получит ошибку 403. Для операций биллинга используйте Admin API.
Note
В старых инсталляциях с несколькими доменами (созданных до января 2026) создавать организации может только пользователь с логином billing или логином с суффиксом _master. Рекомендуем называть сервисную учетную запись billing — это имя работает в любой конфигурации.
Авторизоваться можно двумя способами:
- JWT-токен — выдается запросом POST /watcher/client-api/v3/login с Basic-авторизацией. Срок действия
access_token— один час; новый токен выдается повторным запросом/loginс заголовкомAuthorization: Bearer <refresh_token>. - Персональный API-ключ — имеет неограниченный срок действия и не требует обновления; это рекомендуемый способ для серверной интеграции. Ключ выпускается один раз:
POST /watcher/client-api/v3/users/{user_id}/apikey
Authorization: Bearer <access_token>
Полученный ключ передавайте в заголовке Authorization: Bearer <ключ> каждого запроса.
Note
Не выполняйте /login перед каждым запросом: при частых обращениях сервер вернет ошибку 429 Too Many Requests. Используйте постоянный API-ключ либо повторно используйте access_token до истечения его срока действия.
Создание пресетов¶
Пресет — это предварительно заданный набор настроек архива и аналитики, которые можно применить на камере. Пресеты соответствуют тарифам в биллинге, поэтому их нужно настроить перед добавлением камер.
Как правило при интеграции с биллингом абоненты не должны менять задаваемые пресетом настройки на камере. Для выполнения этого требования достаточно сделать пресет ненастраиваемым ("is_adjustable": false). Тогда, даже если у абонента будут права владельца организации с возможностью редактирования настроек камер, он не сможет изменить заданные пресетом настройки. Они будут видны ему, но недоступны для редактирования.

Владельцы организаций не могут создавать, редактировать и удалять пресеты: такие права есть только у администратора Watcher. Если к организации привязано несколько пресетов, то владелец организации сможет поменять один пресет на другой в настройках камеры.
Помимо тарифных пресетов, заранее создайте технический пресет — пресет с нулевой глубиной архива и без аналитики. Он используется как тариф при приостановке услуг за неуплату.
Пресеты создаются из биллинга через Admin API:
POST /watcher/admin-api/v3/presets
Обязательный параметр title — название пресета. В поле billing_external_id можно сохранить идентификатор соответствующего тарифа во внешнем биллинге, чтобы не вести таблицу соответствия на стороне биллинга.
Также доступны запросы GET/PUT/DELETE для получения/изменения/удаления пресета с заданным идентификатором.
Чтобы тариф стал доступен организации абонента, привяжите пресет к организации:
PUT /watcher/client-api/v3/organizations/{organization_id}/presets
{"preset_id": 42}
Подключение абонента¶
Подключение абонента выполняется в два шага. Идентификаторы для каждого следующего шага возвращаются в ответе на предыдущий, поэтому шаги выполняются строго по порядку.
Шаг 1. Создать пользователя¶
Абонент создается через Admin API, без указания организации — своя организация появится на следующем шаге, а пока пользователь будет числиться в организации домена по умолчанию:
POST /watcher/admin-api/v3/users
{
"name": "ivanov",
"password": "секрет",
"external_id": "billing-account-123"
}
Поля:
- name — логин пользователя (не отображаемое имя).
- password — пароль абонента; обычно генерируется биллингом и передается абоненту. Поле необязательное, однако без пароля абонент не сможет войти в сервис, пока пароль не будет установлен запросом обновления пользователя.
- external_id — идентификатор абонента в биллинге. Попадает в отчеты Watcher как идентификатор счета — заполняйте его при создании.
- email — необязательная почта для уведомлений.
Note
Не передавайте в этом запросе organization_id чужой организации: создание пользователя в конкретной организации требует прав на управление ее пользователями, которых у администратора нет, и запрос завершится ошибкой 403.
Из ответа сохраните id пользователя.
Шаг 2. Создать организацию с абонентом-владельцем¶
Каждому абоненту соответствует своя организация. Владелец назначается сразу при создании:
POST /watcher/client-api/v3/organizations
{
"title": "Иванов И.И., ул. Ленина 1",
"owner": {"id": 15}
}
В поле owner.id передайте идентификатор пользователя из шага 1. Из ответа сохраните id организации; соответствие между организацией и абонентом храните на стороне биллинга. Вместе с организацией автоматически создается папка Cameras.
Как владелец организации абонент видит живое видео и архив всех ее камер, работает в мобильном приложении, добавляет камеры и других пользователей (например, членов семьи) и сам выдает им права на папки. Выдавать абоненту какие-либо права отдельными запросами не требуется.
При необходимости удалите абонента из организации по умолчанию, в которой он был создан на шаге 1:
DELETE /watcher/client-api/v3/organizations/{default_organization_id}/users/{user_id}
Note
Владелец организации может переключать пресет камеры, если к организации привязано несколько пресетов. Чтобы абонент не менял настройки тарифа самостоятельно, используйте ненастраиваемые пресеты и привязывайте к организации только те тарифы, которые доступны абоненту для выбора.
Камеры с агентом¶
Камеры с Flussonic Agent не создаются запросом добавления камеры: камера появляется в Watcher автоматически после активации агента по ключу активации.
Ключ активации создается запросом POST /watcher/client-api/v3/agent_activation_token от имени пользователя с правом управления камерами в организации. Администратору, не являющемуся владельцем организации, этот запрос недоступен, поэтому сценарий зависит от того, кто активирует камеру:
-
Основной сценарий: камеру активирует абонент. Владелец организации добавляет камеру из мобильного приложения или веб-интерфейса Watcher — создание ключа активации встроено в интерфейс, участие биллинга не требуется. Так же действует монтажник, работающий под учетной записью абонента.
-
Подготовка ключей оператором заранее (например, прошивка партии камер). В этом случае создайте организацию сначала с сервисной учетной записью в роли владельца (запрос из шага 2 без поля
owner), создайте ключи активации, а затем передайте владение абоненту:POST /watcher/client-api/v3/agent_activation_token { "organization_id": 7, "preset_id": 42, "title": "Подъезд 1" }Поля
preset_id(тариф; по умолчанию — пресет организации) иtitle(имя камеры; по умолчанию генерируется) необязательные. Из ответа сохранитеtoken— это ключ активации; полеstream_nameна этом этапе пустое. После активации агента имя камеры возвращается запросомGET /watcher/client-api/v3/agent_activation_token/{token}в полеstream_name.Передача владения абоненту после подготовки ключей:
PUT /watcher/client-api/v3/organizations/{organization_id} {"owner": {"id": 15}}
В обоих сценариях биллинг обнаруживает появившиеся камеры абонента списком по организации:
GET /watcher/admin-api/v3/streams?organization_id={organization_id}
Из ответа сохраните поле name каждой камеры — дальнейшее управление (смена тарифа, отключение, чтение статуса) выполняется по нему, как для обычных камер.
Note
В системе учета биллинга привязывайте камеру к абоненту по серийному номеру камеры: идентификатор агента может поменяться, если камеру сбросили или передали другому абоненту, а серийный номер остается неизменным.
Камера без агента¶
Сценарий интеграции для камер без агента (например, RTSP, ONVIF) обычно следующий:
- Камера подключается к внутренней сети оператора связи
- Абонент оставляет оператору связи запрос на подключение к камере.
- Запрос на добавление камеры абоненту или выдачу абоненту прав на камеру поступает от оператора связи в биллинг.
-
Если подключается новая личная камера абонента, например, в систему умного дома:
-
Предполагается, что в Watcher уже создан пользователь и организация для абонента. Если их нет, создайте их по цепочке из раздела Подключение абонента.
-
Биллинг заполняет необходимые атрибуты камеры в соответствии с тарифом.
-
Биллинг отправляет в Watcher запрос на добавление камеры абоненту (см. пример ниже).
-
-
Если абонент хочет подключиться к общей камере, например, к домофону или к системе "Безопасный город":
-
Общие камеры размещаются в отдельной организации оператора, владельцем которой является сервисная учетная запись, — тогда она вправе управлять пользователями и папками этой организации через Client API.
-
Биллинг добавляет абонента в организацию с общими камерами запросом
PUT /watcher/client-api/v3/organizations/{organization_id}/users/{user_id}— если абонент еще не состоит в организации, запрос добавит его как участника. -
Биллинг выдает абоненту права на папку с камерой:
PUT /watcher/client-api/v3/organizations/{organization_id}/folders/{folder_id}/users/{user_id} { "can_view": true, "can_view_dvr": true, "dvr_depth_limit": 0, "can_use_ptz": false }Флаги:
can_view— живое видео,can_view_dvr— архив,dvr_depth_limit— ограничение глубины архива в секундах (0— без ограничения),can_use_ptz— управление поворотными камерами. Права применяются рекурсивно ко вложенным папкам. Идентификаторы папок возвращает запросGET /watcher/client-api/v3/organizations/{organization_id}/folders.
-
Добавление камеры¶
Камера создается и обновляется одним и тем же запросом Admin API (отдельного POST-запроса на создание в v3 нет — если камера не найдена, она будет создана):
PUT /watcher/admin-api/v3/streams/{name}
{
"title": "Подъезд 1",
"preset_id": 42,
"organization_id": 7,
"folder_id": 15,
"inputs": [{"url": "rtsp://..."}]
}
Warning
Имя камере присваивает Watcher. При создании значение {name} из URL не используется: имя генерируется на основе title со случайным суффиксом и возвращается в поле name ответа. Передайте в URL любое значение, например new, а из ответа обязательно сохраните name на стороне биллинга — по нему выполняются все дальнейшие операции с камерой: смена тарифа, отключение, чтение статуса.
В запросе на добавление камеры обязательно должны быть указаны следующие параметры:
- preset_id (целое число) — идентификатор пресета Watcher, соответствующего тарифу в биллинге.
- organization_id (целое число) — идентификатор организации. Организация должна быть уже создана в Watcher, вместе с пользователем.
Если не указать в запросе идентификатор пресета и организации, то камера будет добавлена в организацию по умолчанию с пресетом по умолчанию.
Запрос массового импорта POST /watcher/client-api/v3/streams/import (см. Импорт камер по API) в этой схеме не используется: он относится к Client API и требует прав на управление камерами в организациях, которых у сервисной учетной записи нет. Добавляйте камеры по одной запросом PUT /watcher/admin-api/v3/streams/{name} — его ответ содержит присвоенное камере имя.
Добавление пользователя¶
Пользователь создается запросом POST /watcher/admin-api/v3/users — см. Подключение абонента.
Альтернатива добавлению пользователей - внешний авторизационный бекенд.
Смена тарифа¶
Тариф камеры меняется сменой пресета:
PUT /watcher/admin-api/v3/streams/{name}
{"preset_id": 43}
Для массовой смены тарифа (например, при изменении условий тарифного плана для всех камер сразу) используйте запрос:
POST /watcher/admin-api/v3/streams/multiedit
{
"streams": [
{"name": "cam-001", "preset_id": 43},
{"name": "cam-002", "preset_id": 43}
]
}
Особенности multiedit:
- Изменить можно только поля
preset_idиdvr. - Успешный ответ —
204без тела. - Если хотя бы одна камера из списка не найдена, вернется
404и изменения не применятся ни к одной камере.
Приостановка услуг¶
В случае, если абонент по какой-то причине не должен больше пользоваться услугами (например, отключил услугу или не внес оплату вовремя), биллинг должен отправить в Watcher соответствующий запрос.
Самый простой вариант — отключить пользователя:
PUT /watcher/admin-api/v3/users/{user_id}
{"disabled": true}
Все активные сессии абонента (веб и мобильное приложение) при этом завершаются немедленно. Для возобновления услуги отправьте тот же запрос с {"disabled": false}.
Варианты ограничения без отключения пользователя:
- Отключить камеру абонента, которой не пользуется никто, кроме него:
PUT /watcher/admin-api/v3/streams/{name}
{"disabled": true}
- Перевести камеры на технический пресет через multiedit — видео останется доступным, а платные услуги (архив, аналитика) отключатся.
Отзыв доступа и удаление¶
- Исключить пользователя из организации с общими камерами (удаляются и права в организации, и права на папки):
DELETE /watcher/client-api/v3/organizations/{organization_id}/users/{user_id}
- Удалить пользователя полностью (удаляются сессии и все связи):
DELETE /watcher/admin-api/v3/users/{user_id}
- Сменить пароль абонента (отдельного запроса нет — используется обновление пользователя; все сессии абонента завершаются):
PUT /watcher/admin-api/v3/users/{user_id}
{"password": "новый-пароль"}
Статус камер¶
Состояние камер читается запросами GET /watcher/admin-api/v3/streams (список; параметр organization_id ограничивает выборку организацией абонента) и GET /watcher/admin-api/v3/streams/{name} (одна камера). Полей online/offline в ответе нет; используйте:
- stats.alive (bool) — камера отдает поток; становится
falseпри задержке потока больше 12 секунд. - stats.status —
running,waitingилиerror. - stats.last_online_at — время, когда камера была в сети в последний раз; поле присутствует только у камер, которые сейчас не в сети.
Поле disabled в конфигурации камеры показывает, что камера выключена административно (см. Приостановка услуг) — это не то же самое, что потеря связи.
Типичные ошибки¶
- Ошибка 403 в Client API у администратора. Запросы Client API проверяют права в конкретной организации, и права администратора их не заменяют. Это касается создания пользователя с
organization_id, выдачи прав на папки и создания ключей активации. Операции с камерами и пользователями выполняйте через Admin API; операции, доступные только владельцу организации, — от имени владельца (см. Сервисная учетная запись). - Право на редактирование камер включает просмотр видео. Пользователь с правом
can_edit_streamsавтоматически получает иcan_view_streams— доступ к живому видео и архиву всех камер организации. Настроить учетную запись, которая управляет камерами, но не имеет доступа к видео, невозможно. - Ответ не повторяет отправленные значения. В ответе на
PUT /organizations/{id}/users/{id}флагcan_view_streams: trueвозвращается всегда, когда у пользователя есть право редактирования камер или владение организацией, независимо от отправленных значений. Не проверяйте успешность запроса сравнением отправленных и полученных флагов. - В поле
nameпользователя передается логин. Почта для уведомлений указывается в полеemail.
Соответствие запросов v2 и v3¶
| Запрос в v2 | Запрос в v3 |
|---|---|
X-Vsaas-Api-Key: <ключ домена> |
Authorization: Bearer <токен> или персональный API-ключ (см. Сервисная учетная запись) |
POST /vsaas/api/v2/auth/login |
POST /watcher/client-api/v3/login |
POST /vsaas/api/v2/cameras |
PUT /watcher/admin-api/v3/streams/{name} — создает камеру, если она не найдена; имя присваивает Watcher (см. Добавление камеры) |
PUT /vsaas/api/v2/cameras/{name} |
PUT /watcher/admin-api/v3/streams/{name} |
POST /vsaas/api/v2/cameras/import |
добавление камер по одной запросом PUT /watcher/admin-api/v3/streams/{name} (см. Добавление камеры) |
POST /vsaas/api/v2/users |
POST /watcher/admin-api/v3/users |
PUT /vsaas/api/v2/users/{id} |
PUT /watcher/admin-api/v3/users/{user_id} |
GET /vsaas/api/v2/organizations |
GET /watcher/client-api/v3/organizations |
.../organizations/{id}/folders/... |
те же пути под /watcher/client-api/v3/... — от имени владельца организации |
GET/POST /vsaas/api/v2/presets |
GET /watcher/client-api/v3/presets, POST /watcher/admin-api/v3/presets |
POST /vsaas/api/v2/agent-activation-tokens |
POST /watcher/client-api/v3/agent_activation_token — от имени владельца организации |
Прочие отличия v3:
- Списки возвращаются с курсорной пагинацией: поля
estimated_count,next,prev. - Ресурс
camerasпереименован вstreams.