SecurityFlow Кабинет лицензий , откроется в новой вкладке

Документация / CI/CD и API

API сервера лицензий

Обновлено 20 октября 2026

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

Базовый адрес и доступ

  • Адрес: https://securityflow.ru. В Core он задан переменной LICENSE_SERVER, см. Параметры конфигурации.
  • Аутентификации нет. Ключ лицензии передаётся в теле запроса.
  • Если на сервере включён белый список адресов, методы отвечают только адресам из списка. Остальным - 403 с текстом Доступ с вашего адреса закрыт. (не JSON). Для Core в списке должен быть внешний адрес, с которого кластер выходит в интернет, см. Кабинет лицензий.
  • Ограничение частоты: больше 60 запросов в минуту к /api/ с одного адреса (с запасом 30) - ответ 429.

Активация ключа

POST /api/v1/license/activate/

Параметр Где Описание
license_key JSON или форма ключ лицензии. Пробелы и переносы строк вырезаются, поэтому ключ можно вставить из PDF

Core отправляет ключ формой (application/x-www-form-urlencoded), сервер принимает и JSON.

curl -s -X POST https://securityflow.ru/api/v1/license/activate/ \
  -H 'Content-Type: application/json' \
  -d '{"license_key": "<ключ>"}'

Успех, 200:

{
  "result": true,
  "status": "activated",
  "detail": "Лицензия активирована",
  "license_id": "<id лицензии>",
  "type": "paid",
  "expires_at": "2027-10-10T00:00:00+00:00"
}
  • type - тип лицензии: demo, auditor или paid, см. Лицензирование.
  • expires_at - окончание срока, ISO 8601.
  • Повторная активация того же ключа тоже даёт 200. Сервер отмечает время последней активации и считает активации.

Отказ, 400: result: false, status: "rejected", причина в detail.

detail Причина
Не передан ключ лицензии пустое поле license_key
Лицензия не найдена такого ключа на сервере нет
Лицензия отозвана ключ отключён в кабинете
Срок лицензии истёк срок вышел

Проверка ключа

POST /api/v1/license/status/ с JSON {"license_key": "<ключ>"} или GET /api/v1/license/status/?license_key=<ключ>. Форму этот метод не принимает. Предпочитайте POST: ключ не попадает в адрес запроса.

curl -s -X POST https://securityflow.ru/api/v1/license/status/ \
  -H 'Content-Type: application/json' \
  -d '{"license_key": "<ключ>"}'

Ответ 200:

{
  "is_valid": true,
  "state": "active",
  "type": "paid",
  "license_id": "<id лицензии>",
  "valid_to": "2027-10-10T00:00:00+00:00",
  "activated_at": "2026-10-10T09:00:00+00:00"
}
Код Тело Что значит
200 is_valid, state и данные лицензии ключ найден. is_valid: true только при state: "active". Другие состояния - revoked (отозван) и expired (истёк)
400 {"is_valid": false, "detail": "Не передан ключ лицензии"} ключ не передан
404 {"is_valid": false, "detail": "Лицензия не найдена"} ключа на сервере нет или он удалён

activated_at - время последней активации или null, если ключ не активировали.

Открытый ключ

GET /api/public-key - открытый ключ RSA в формате PEM, text/plain. Им Core проверяет подпись лицензий: значение переменной LICENSE_SERVER_PUBLIC_KEY.

curl -s https://securityflow.ru/api/public-key

Метод подходит для проверки доступности сервера из сети Core.

Как Core использует API

Когда Метод Что делает Core с ответом
Активация и замена лицензии POST /api/v1/license/activate/, форма 200 и result: true - сохраняет ключ. 400 - показывает detail. Если лицензия в Core уже есть - отвечает 420, см. Активация лицензии в Core
Каждые 300 секунд и при работе пользователей, не чаще раза в минуту на процесс POST /api/v1/license/status/, JSON, таймаут 10 секунд см. таблицу ниже

Реакция Core на проверку:

Ответ сервера Решение Core
200, is_valid: true лицензия остаётся
200, is_valid: false (отозвана, истекла) лицензия удаляется, интерфейс показывает экран активации
404 лицензия удаляется
сеть недоступна, таймаут, 5xx, 403 белого списка, ответ не JSON, нет is_valid лицензия остаётся, решение не меняется

Без связи с сервером Core работает до окончания срока в самом ключе: подпись и срок Core проверяет локально открытым ключом. Интервал проверки задаёт LICENSE_CHECK_INTERVAL_SECONDS, таймаут - LICENSE_CHECK_TIMEOUT, см. Параметры конфигурации.