Документация · API

API лицензирования v1

REST API для активации, проверки и деактивации лицензий SlabCalc и RnDstr. Подходит для веб- и десктоп-приложений; токен лицензии можно проверять офлайн.

Общие сведения

Базовый адрес API: http://95.31.174.223:8093/api/v1. Все запросы и ответы — JSON в кодировке UTF-8, без cookie и CSRF-токена. Ответы API не кэшируются (Cache-Control: no-store).

Эндпоинты API v1
МетодПутьНазначение
POST/licenses/activateАктивация лицензии на устройстве, выдача токена
POST/licenses/validateПроверка статуса лицензии и обновление токена
POST/licenses/deactivateОсвобождение места активации на устройстве
GET/products/{code}/releases/latestПоследний релиз продукта для загрузки
GET/public-keyПубличный ключ проверки токенов

Формат ошибок одинаков для всех эндпоинтов:

{
  "error": {
    "code": "invalid_key",
    "message": "Лицензионный ключ не найден"
  }
}

Активация лицензии

POST /api/v1/licenses/activate

Поля запроса активации
ПолеТипОписание
license_keystring, обязательноКлюч вида TRS-XXXX-XXXX-XXXX-XXXX
product_codestring, обязательноКод продукта: slabcalc или rndstr
device_fingerprintstring, обязательноСтабильный отпечаток устройства
device_namestringПонятное имя устройства
os, app_versionstringСведения для поддержки (необязательно)

Ответ содержит идентификатор активации, подписанный токен лицензии и срок его действия. Повторная активация того же устройства идемпотентна.

Пример запроса
curl -sS -X POST http://95.31.174.223:8093/api/v1/licenses/activate -H "Content-Type: application/json" -d '{"license_key":"TRS-XXXX-XXXX-XXXX-XXXX","product_code":"slabcalc","device_fingerprint":"sha256-device","device_name":"Workstation 1","os":"Windows 11"}'
{
  "activation_id": "0198c0de-0000-7000-8000-000000000000",
  "license_id": "0198c0de-0000-7000-8000-000000000001",
  "product_code": "slabcalc",
  "plan_code": "yearly",
  "seats": 5,
  "status": "active",
  "expires_at": "2027-10-31T00:00:00Z",
  "token": "TRS1.eyJ2IjoxLCJraWQiOiJ0cnMtMjAyNi0wMSJ9.signature",
  "token_expires_at": "2026-11-07T00:00:00Z",
  "features": {"reports": true, "exports": ["pdf", "xlsx", "docx"]},
  "grace_days": 14
}

Проверка лицензии

POST /api/v1/licenses/validate

Поля запроса проверки
ПолеТипОписание
activation_idstring, обязательноИдентификатор активации
device_fingerprintstring, обязательноОтпечаток устройства
product_codestringДополнительная проверка соответствия продукту

При отзыве, приостановке или истечении лицензии возвращается ответ с valid: false и статусом — приложение должно перейти в ограниченный режим.

Пример запроса
curl -sS -X POST http://95.31.174.223:8093/api/v1/licenses/validate -H "Content-Type: application/json" -d '{"activation_id":"0198c0de-0000-7000-8000-000000000000","device_fingerprint":"sha256-device"}'

Деактивация устройства

POST /api/v1/licenses/deactivate

Освобождает место активации, чтобы лицензию можно было использовать на другом компьютере. Требуются activation_id и device_fingerprint. При успехе возвращается {"deactivated": true}, для неизвестной активации — ошибка not_found.

Пример запроса
curl -sS -X POST http://95.31.174.223:8093/api/v1/licenses/deactivate -H "Content-Type: application/json" -d '{"activation_id":"0198c0de-0000-7000-8000-000000000000","device_fingerprint":"sha256-device"}'

Последний релиз продукта

GET /api/v1/products/{code}/releases/latest?os=windows&channel=stable

Возвращает версию, ссылку на загрузку, контрольную сумму SHA-256 и описание изменений. Для отсутствующего релиза — ошибка not_found.

Пример запроса
curl -sS "http://95.31.174.223:8093/api/v1/products/slabcalc/releases/latest?os=windows&channel=stable"

Публичный ключ

GET /api/v1/public-key — возвращает идентификатор ключа, алгоритм и публичный ключ Ed25519 для офлайн-проверки подписи токена.

{
  "kid": "trs-2026-01",
  "algorithm": "Ed25519",
  "public_key": "base64-public-key"
}

Коды ошибок

Коды ошибок API
HTTPКодКогда возникает
400product_mismatchЛицензия относится к другому продукту
401invalid_keyКлюч не найден или недействителен
403license_inactiveЛицензия отозвана, приостановлена или истекла
404not_foundАктивация или релиз не найдены
409seats_exhaustedЗакончились доступные активации по лицензии
429rate_limitedСлишком много неудачных попыток — повторите позже
500internal_errorВнутренняя ошибка сервера

Офлайн-проверка токена

Токен лицензии подписан алгоритмом Ed25519 и содержит продукт, тариф, набор возможностей, число мест, срок действия и идентификатор устройства. Приложение проверяет подпись публичным ключом без обращения к серверу и учитывает grace_days после истечения срока токена.

  • Публичный ключ получайте только по HTTPS и кэшируйте с учётом kid.
  • Токен не является секретом, но не передавайте его третьим лицам без необходимости.
  • При офлайн-проверке обязательно сверяйте device и prod с контекстом приложения.

Вопросы и ответы

Нужен ли CSRF-токен для API?

Нет. API v1 работает без cookie и CSRF: запросы передают ключ лицензии и идентификатор активации в теле JSON.

Как часто нужно вызывать validate?

Токен проверяется приложением офлайн. validate нужен для обновления токена и проверки статуса лицензии — например, при запуске и периодически.

Что делать при ошибке seats_exhausted?

Освободить одно из устройств через deactivate или увеличить тариф: количество активаций задаётся лицензией.

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