Kadr Cloud
Документация

Разработчикам

Главная/Разработчикам

Быстрый старт

Минимальный путь до первого эфира — три запроса и один энкодер. Базовый адрес API — https://api.kadr-cloud.online/v1, ответы в JSON, кодировка UTF-8.

POST/v1/streams
Создать трансляциюcurl
curl -X POST https://api.kadr-cloud.online/v1/streams \
  -H "Authorization: Bearer $KADR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Вебинар 12 марта", "record": true, "ladder": "hd"}'
Ответ200 OK
{
  "id": "lv_8fk2n4",
  "state": "idle",
  "ingest": {
    "rtmp": "rtmp://in.kadr-cloud.online/live",
    "stream_key": "sk_live_3d91c7a4e2"
  },
  "playback": {
    "hls": "https://kadr-cloud.online/media/live/stream/lv_8fk2n4/index.m3u8",
    "embed": "https://kadr-cloud.online/embed/lv_8fk2n4"
  }
}

Дальше укажите rtmp и stream_key в OBS (Настройки → Вещание → Особый сервер) и нажмите «Запустить трансляцию». Через 10–15 секунд состояние перейдёт в live, а плейлист станет доступен.

Ключи и доступ

Все запросы к API подписываются токеном из панели, раздел «Разработчикам → Ключи». Токен передаётся заголовком Authorization: Bearer …. Отдельно выпускаются ключи только на чтение — их удобно отдавать внутренним дашбордам.

Тип ключаЧто можетСрок
sk_live_…Создавать и останавливать трансляции, читать записидо отзыва
sk_read_…Только чтение: список эфиров, статистикадо отзыва
tk_play_…Подписывать ссылки на воспроизведение90 дней
Ключ sk_live_… нельзя класть в код фронтенда. Для браузера выпускайте tk_play_… и подписывайте ссылки на своей стороне.

Трансляции

POST/v1/streams
GET/v1/streams/{id}
GET/v1/streams/{id}/stats
POST/v1/streams/{id}/stop

Поля при создании

ПолеТипОписание
titlestringНазвание для панели и отчётов. До 200 знаков.
recordboolСохранять ли эфир в запись. По умолчанию true.
ladderstringsd, hd или custom. Определяет набор дорожек.
privateboolТребовать подписанную ссылку для просмотра. По умолчанию true.
ttl_hoursintЧерез сколько часов после эфира удалить запись. 0 — хранить по тарифу.

Состояния

idle — создана, потока нет. live — идёт эфир. ending — поток прекратился, идёт сборка записи. vod — запись готова. failed — приём прервался с ошибкой, подробности в last_error.

Адреса плейлистов

Всё воспроизведение живёт под общим префиксом /media/live/. Он один для эфира и для записей, чтобы плеер на стороне клиента не менял адрес после окончания трансляции.

GET/media/live/stream/{stream_id}/index.m3u8

Мастер-плейлист идущего эфира. Отдаёт список дорожек, каждая — своим плейлистом сегментов. Заголовок Cache-Control: no-cache, сегменты кешируются краями на 60 секунд.

GET/media/live/vod/{record_id}/index.m3u8

То же самое для записи. Идентификатор записи возвращается в вебхуке stream.ended и в поле record.id.

Мастер-плейлистindex.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=6000000,RESOLUTION=1920x1080
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1200000,RESOLUTION=854x480
480p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=426x240
240p/index.m3u8

Сегменты лежат рядом с плейлистом дорожки: /media/live/stream/{stream_id}/720p/seg-00184.m4s. Имена последовательные, длина сегмента — 4 секунды (2 секунды при LL-HLS).

Не привязывайтесь к именам сегментов и не собирайте адреса вручную — берите их из плейлиста. Схема именования может измениться без предупреждения, адреса index.m3u8 — нет.

Подписанные ссылки

Приватная трансляция открывается только по ссылке с параметрами exp (время истечения, unix) и sig (HMAC-SHA256 от пути и exp на ключе tk_play_…).

Подпись на стороне сервераPython
import hmac, hashlib, time

path = "/media/live/stream/lv_8fk2n4/index.m3u8"
exp  = int(time.time()) + 3600
sig  = hmac.new(KEY.encode(), f"{path}:{exp}".encode(), hashlib.sha256).hexdigest()

url = f"https://kadr-cloud.online{path}?exp={exp}&sig={sig}"

Просроченная или испорченная подпись даёт 403 с пустым телом. Ссылка на встраиваемый плеер подписывается так же, только путь начинается с /embed/.

Вебхуки

Адрес приёмника указывается в панели. Мы шлём POST с JSON и заголовком X-Kadr-Signature. Повторяем до шести раз с нарастающей паузой, пока не получим 2xx.

СобытиеКогда
stream.startedПриём потока начался, первый сегмент готов
stream.endedПоток прекратился, сборка записи запущена
record.readyЗапись готова, в теле — адрес VOD и длительность
stream.failedПриём оборвался с ошибкой, в теле — причина
quota.warningИзрасходовано 80% пакета часов или трафика
record.readyPOST на ваш адрес
{
  "event": "record.ready",
  "stream_id": "lv_8fk2n4",
  "record": {
    "id": "vd_2c77b1",
    "duration_sec": 4127,
    "hls": "https://kadr-cloud.online/media/live/vod/vd_2c77b1/index.m3u8",
    "mp4": "https://kadr-cloud.online/media/live/vod/vd_2c77b1/source.mp4"
  }
}

Лимиты

  • 60 запросов в минуту на ключ, ответ 429 с заголовком Retry-After.
  • Максимальный битрейт на входе — 12 Мбит/с, разрешение до 1920×1080, до 60 кадров.
  • Один ключ потока — одно активное подключение. Второе получает 409.
  • Длительность одного эфира — до 12 часов; дальше поток закрывается, запись собирается.
  • Разрыв входа до 30 секунд не считается концом эфира: плеер держит паузу и продолжает.

Статус систем

Текущее состояние приёма, перекодирования и краёв доставки. Обновляется каждую минуту, история инцидентов — за последние 90 дней.

КомпонентСостояниеДоступность за 30 дней
Приём RTMP / SRT Работает99,98%
Перекодирование Работает99,95%
Доставка HLS Работает99,99%
API и панель Работает99,97%
Хранение записей Работает100%

Последний инцидент: 14 июля 2026 — 22 минуты повышенной задержки на краях в Екатеринбурге и Новосибирске из-за работ у оператора связи. Эфиры не прерывались, задержка доходила до 14 секунд.

Подписаться на уведомления об инцидентах — письмом на support@kadr-cloud.online с темой «статус».