API manuál
Rozhraní centrální telemetrie RI-Playout. Všechny odpovědi jsou JSON a vždy obsahují ok.
Základ
Základ adresy je tenhle server, tedy http://<adresa>:<port> — stejná adresa, na které čtete tuhle stránku. Token se posílá v hlavičce:
curl -H "Authorization: Bearer <token>" http://ADRESA:PORT/api/ping
Odpověď:
{ "ok": true, "app": "ri-playout-telemetry", "ts": "2026-09-17T12:00:00.000Z" }
Token jde poslat i jako ?token=… v adrese — hodí se pro rychlé vyzkoušení v prohlížeči, ale zůstává v historii a v logu proxy, takže v aplikaci patří do hlavičky.
Tokeny a oprávnění
Server rozeznává šest druhů přístupu. Tokeny pro cizí aplikace se vydávají v dashboardu pod Přístupy k API.
| Přístup | Odkud | Co smí |
|---|---|---|
admin | proměnná prostředí TELEMETRY_ADMIN_TOKEN | všechno, včetně správy tokenů |
write | vydaný token se zápisem | čtení i zápis, kromě správy tokenů |
read | vydaný token pro čtení | jen GET a HEAD |
ingest | TELEMETRY_INGEST_TOKEN, zabalený v aplikaci | jen hlášení stanice a spárování; nic nepřečte |
station | vlastní token stanice po spárování | jen hlášení za sebe sama |
sezení | přihlášení jménem a heslem v dashboardu (cookie) | podle role účtu: dohled jako read, spravce jako admin |
HttpOnly cookie, platí 30 dní a jde ho zrušit. Aplikace se prokazuje tokenem — ten se dá odvolat jmenovitě a nezmizí s odhlášením. Ověřuje se nejdřív token, teprve pak sezení, takže přidání účtů nezměnilo chování cizích aplikací.Stanice a stav
Seznam stanic i se stavem (online, verze, poslední kontakt, stav playlistů, disky, watchdog) a seznam skupin.
Události z denního logu. Parametry: station, type, exclude, day (YYYY-MM-DD), limit (výchozí 500). Nejnovější první.
Dostupnost jedné stanice. Povinně station, volitelně hours (1–168, výchozí 24). Vrací procento, počet a délku výpadků a koše pro pruh.
Průběh CPU, RAM, GPU a sítě jedné stanice. Povinně station, volitelně minutes.
Poslední hlášená konfigurace CasparCG stanice. Povinně station.
Obsah playlistů stanice (klipy, délky, chybějící soubory). Povinně station.
Zátěž samotného serveru telemetrie: zátěž CPU proti počtu jader, paměť stroje i procesu, volné místo, velikost dat a příjem událostí za poslední hodinu včetně pořadí stanic.
Odebere stanici z přehledu a založí náhrobek, aby se nevracela kvůli starým řádkům v logu.
Hlášení ze stanice
Pravidelné hlášení stanice. Tělo je JSON s station a volitelným state. Když chybí type, doplní se heartbeat.
curl -X POST http://ADRESA:PORT/api/heartbeat -H "Authorization: Bearer <ingest token>" -H "Content-Type: application/json" -d '{"station":"SP2026-0001","type":"heartbeat","version":"2.4.6"}'Jednotlivá událost (změna klipu, spuštění playlistu, chyba). Stejné tělo, jen s vlastním type a payload.
Spárování stanice: výměnou za sdílený ingest token dostane stanice vlastní tajemství, kterým se pak prokazuje jen za sebe.
Uložení balíku playlistů ke stanici (do 2 MB). Sourozenec /api/playout-state-import pro celý stav (do 12 MB).
Dávky (playlisty a reklamy pro stanice)
Stanice si o dávku řekne sama, až na ni obsluha klikne v záložce Správa dat. Soubory jí tenhle server podává pod svojí adresou — odkud jsou doopravdy, se stanice nedozví a dozvědět nemá.
Seznam toho, co dávka obsahuje: soubory (cesta, velikost, sha256, kanál) a balíčky playlistů.
Adresy souborů jsou přepsané na /api/batch/file/<id> — náhodné id, ze kterého nejde odvodit původ.
Když zdroj není nastavený, vrací 503 s no-source; nedostupný dodavatel je 502
s source-unavailable, nesmyslná odpověď source-manifest-invalid.
Samotný soubor. Podá se jen id, které je v některém uloženém manifestu — jinak 404. Tím se z toho
nedá udělat otevřená proxy. Hlavičky dodavatele se nepřeposílají.
Nastavení zdroje (adresa manifestu u dodavatele a případná přihlašovací hlavička) a přehled posledních dávek.
POST ho mění. Hodnota přihlašovací hlavičky se nevrací nikdy, ani adminovi — jen příznak,
jestli je nastavená. Prázdná hodnota při zápisu nechá stávající beze změny; smaže ji až clearHeaderValue.
X-RI-Station. Když jméno není čistě ASCII, posílá se procentově zakódované a přidá se X-RI-Station-Encoding: url — jinak by hlavička odešla vůbec.Přehledy a grafy
Jedním průchodem logem podklady pro celý úvodní přehled: dostupnost a vysílání po stanicích, odvysílané klipy v čase a žebříček klipů.
| Parametr | Význam |
|---|---|
hours | délka okna v hodinách (strop 90 dní) |
days | alternativa k hours, 1–90 (výchozí 7) |
buckets | počet košů pruhu, 24–240 (výchozí 96) |
top | délka žebříčku klipů, 1–50 (výchozí 15) |
station | čárkou oddělený výběr stanic |
group | omezení na skupinu |
Odpověď nese cached a cachedAgeMs: počítá se nejvýš jednou za 20 s a souběžné dotazy sdílí jeden výpočet.
Dálkové ovládání
Zásah do vysílání se prokazuje zvlášť — jmenným tokenem ze seznamu TELEMETRY_CONTROL_TOKENS. Bez něj vrátí server control-token-required, aby v auditu nestálo navždy jen „admin".
Které stanice jsou spárované a připojené, a seznam povolených akcí.
Pošle stanici příkaz (například spuštění playlistu). Tělo: station, action, případně další pole podle akce.
Historie zásahů z auditu na disku. Parametry station a limit (1–100, výchozí 25).
Stanice si příkazy vyzvedává sama přes /api/control/enroll, /api/control/pull a /api/control/ack; tyhle tři se prokazují tajemstvím stanice, ne admin tokenem.
Správa
Vydané tokeny (bez tajemství). POST vydá nový (name, scope: read nebo write), DELETE /api/tokens/<id> ho zruší.
Nastavení serveru měnitelné bez restartu (retence, komprese, držení deníku). U každé položky se vrací i to, odkud hodnota je — uložená přebíjí proměnnou prostředí. POST uloží jen změněné klíče a odmítnuté vrátí v odmitnuto; DELETE /api/settings/<klic> položku vrátí na výchozí.
Deník volání API: co přišlo s vydaným tokenem a každé odmítnutí. Parametry day, limit, only=errors, token. Hlášení stanic ani dotazy dashboardu se nezapisují. Token z adresy (_t) se do deníku nikdy neopíše.
Skupiny stanic. POST /api/groups zakládá, POST /api/groups/reorder mění pořadí.
Rozvržení dlaždic na detailu stanice; šablony se ukládají přes /api/layouts/template, výchozí přes /api/layouts/default a hromadně nasazují přes /api/layouts/apply.
Vyrobí klíč pro stanice z adresy serveru (url). Jeden klíč platí pro libovolný počet stanic — nekóduje identitu, jen adresu a ingest token.
Kontrola dostupnosti a tokenu.
Přihlášení účtem: {"jmeno":"…","heslo":"…"}. Při úspěchu vrátí ucet a nastaví cookie se sezením. Neznámý účet i špatné heslo vrací stejnou chybu spatne-prihlaseni (401) — rozdíl by prozradil, která jména existují. Po osmi neúspěšných pokusech za 15 minut se zavře účet a po třiceti se zavře adresa — strop jen na jméno by stačilo obejít tím, že se jméno pokaždé změní, a každý pokus přitom stojí jeden scrypt (49 ms). Souběžně se počítají nejvýš čtyři otisky, nad tím se odpovídá 429 hned. Otisk se počítá mimo hlavní smyčku, takže hlášení stanic ani ovládací kanál nečekají. Vše platí 429. Spolu s POST /api/logout a GET /api/me jsou to jediné cesty přístupné bez přihlášení; /api/me hlásí jen maUcty, ne počet účtů.
Účty (bez otisků hesel). POST zakládá (jmeno, heslo, role: dohled nebo spravce), POST /api/users/<jmeno>/password mění heslo (a odhlásí všechna sezení toho účtu), POST /api/users/<jmeno>/role mění roli (platí okamžitě), DELETE /api/users/<jmeno> maže. Posledního správce smazat nelze. Stejná hranice jako u /api/tokens: zápisový token sem nesmí, jinak by si založil správce a povýšil se.
Živý stream
Server-Sent Events: server posílá každou přijatou událost, jak přijde. Dashboard z toho žije, takže nemusí dotazovat dokola.
curl -N -H "Authorization: Bearer <admin token>" http://ADRESA:PORT/api/streamLimity a chyby
| Limit | Hodnota |
|---|---|
| Tělo požadavku | 256 kB |
| Import playlistů | 2 MB |
| Import celého stavu | 12 MB |
| Hlášení z jedné stanice | 120 za minutu (dál 429) |
| Okno přehledu flotily | nejvýš 90 dní |
| Držení denních logů | podle TELEMETRY_RETENTION_DAYS |
| Držení deníku API | podle nastavení „Držet deník volání API" (okno Nastavení), jinak TELEMETRY_API_LOG_RETENTION_DAYS, jinak 90 dní |
| Kód | Kdy |
|---|---|
400 | chybí nebo je vadný parametr (missing-station, bad-body) |
401 | chybí nebo neplatný token |
403 | token na tuhle cestu nestačí (forbidden, control-token-required) |
404 | stanice neexistuje |
413 | tělo je nad limit |
429 | překročený strop hlášení za minutu |
503 | dálkové ovládání není k dispozici |
Podrobnosti k datovému modelu jsou v telemetry-server/TELEMETRY-SPEC.md v repozitáři.