Минимальный путь до первого эфира — три запроса и один энкодер. Базовый адрес API — https://api.kadr-cloud.online/v1, ответы в JSON, кодировка UTF-8.
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"}'
{
"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_… и подписывайте ссылки на своей стороне.
| Поле | Тип | Описание |
|---|---|---|
title | string | Название для панели и отчётов. До 200 знаков. |
record | bool | Сохранять ли эфир в запись. По умолчанию true. |
ladder | string | sd, hd или custom. Определяет набор дорожек. |
private | bool | Требовать подписанную ссылку для просмотра. По умолчанию true. |
ttl_hours | int | Через сколько часов после эфира удалить запись. 0 — хранить по тарифу. |
idle — создана, потока нет. live — идёт эфир. ending — поток прекратился, идёт сборка записи. vod — запись готова. failed — приём прервался с ошибкой, подробности в last_error.
Всё воспроизведение живёт под общим префиксом /media/live/. Он один для эфира и для записей, чтобы плеер на стороне клиента не менял адрес после окончания трансляции.
Мастер-плейлист идущего эфира. Отдаёт список дорожек, каждая — своим плейлистом сегментов. Заголовок Cache-Control: no-cache, сегменты кешируются краями на 60 секунд.
То же самое для записи. Идентификатор записи возвращается в вебхуке stream.ended и в поле record.id.
#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_…).
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% пакета часов или трафика |
{
"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"
}
}
429 с заголовком Retry-After.409.Текущее состояние приёма, перекодирования и краёв доставки. Обновляется каждую минуту, история инцидентов — за последние 90 дней.
| Компонент | Состояние | Доступность за 30 дней |
|---|---|---|
| Приём RTMP / SRT | Работает | 99,98% |
| Перекодирование | Работает | 99,95% |
| Доставка HLS | Работает | 99,99% |
| API и панель | Работает | 99,97% |
| Хранение записей | Работает | 100% |
Последний инцидент: 14 июля 2026 — 22 минуты повышенной задержки на краях в Екатеринбурге и Новосибирске из-за работ у оператора связи. Эфиры не прерывались, задержка доходила до 14 секунд.
Подписаться на уведомления об инцидентах — письмом на support@kadr-cloud.online с темой «статус».