Dokumentace / Integrace a tvorba obsahu / API pro propojení s vaším systémem

API pro propojení s vaším systémem

Úvod a orientace

Jak spravovat média, kampaně a reporty přímo z vašeho systému bez přihlašování do administrace.

K čemu API slouží

API umožňuje propojit systém zákazníka — například e-shop, plánovač reklamních kampaní nebo interní katalog — přímo se správou obsahu zařízení. Vlastní systém může nahrávat média, zakládat a spouštět kampaně a načítat jejich výsledky, aniž by se kdokoli musel přihlašovat do administrace a operace provádět ručně.

Rozhraní je stejné, jaké používá webová administrace. Přes API proto lze provádět stejné operace jako v administraci, ve stejném rozsahu oprávnění přihlášeného uživatele.

Kdy API použít

Pro občasné nahrání několika médií a ruční spuštění kampaně je vhodnější administrace: průvodce kampaní zobrazí náhled, zkontroluje formát médií a kapacitu zařízení. API má smysl ve chvíli, kdy ruční práce začne zdržovat.

PotřebujeteDoporučený způsob
Nahrát několik médií a spustit kampaňAdministrace
Pravidelně, ale ručně obměňovat obsahAdministrace
Hromadně nahrávat média z vlastního systémuAPI
Zakládat kampaně automaticky podle vlastního plánovačeAPI
Přebírat výsledky kampaní do vlastního reportinguAPI

Rozhraní není verzované a jeho podoba se může s vývojem platformy měnit. Před nasazením integraci ohlaste svému poskytovateli softwaru a po aktualizacích systému ověřte její funkčnost.

Komu je návod určen a kdo co zajišťuje

  • Poskytovatel platformy provozuje rozhraní, sděluje adresu administrace a nastavuje režim přehrávání Společnosti.
  • Zákazník rozhoduje o rozsahu integrace a ve své Společnosti zakládá pro integraci samostatného uživatele s potřebnými oprávněními — viz Vytvoření uživatele.
  • Vývojář integrace napojuje systém zákazníka na rozhraní. Technické pokyny a ukázky kódu v tomto návodu jsou určeny právě jemu. Pokud integraci vyvíjíte sami, tuto roli zastáváte vy.

Technická dokumentace

Technická část pro vývojáře integrace

Nejprve se seznamte se společnými pravidly volání a přihlášením. Poté projděte postup od nahrání média po spuštění kampaně a přehled dostupných adres.

Společná pravidla volání

  • Adresa: rozhraní běží na stejné adrese jako vaše administrace; všechny cesty začínají /api/. V ukázkách je adresa nahrazena https://admin.example.org. Testovací prostředí, pokud je k dispozici, vám sdělí poskytovatel.
  • Přihlášení: každý požadavek nese přihlašovací údaje metodou HTTP Basic Auth. Relace ani tokeny se nepoužívají.
  • Formát dat: těla požadavků i odpovědi jsou ve formátu JSON. Výjimkou je nahrávání souboru, jehož tělo tvoří samotná binární data.
  • Identifikátory a hodnoty: identifikátory jsou celá čísla. Datum a čas se zapisují ve tvaru RRRR-MM-DDTHH:MM:SS, délky zobrazení v milisekundách (10000 = 10 s).
  • Výsledek: úspěch potvrzuje kód 200. Ten znamená přijetí požadavku, nikoli okamžité přehrávání na zařízeních.

Přihlášení

Přihlašovacím jménem není e-mail, ale osmiznakový kód, který systém vygeneroval při založení uživatele, například A1B2C3D4. Pro integraci založte samostatného uživatele s minimálními nutnými oprávněními; jeho přístup pak lze kdykoli odebrat, aniž by se to dotklo ostatních uživatelů.

curl -u "A1B2C3D4:vase-heslo" https://admin.example.org/api/public/login

Heslo se odesílá s každým požadavkem. Uložte je jako tajný údaj, například v proměnné prostředí nebo trezoru hesel, nikdy ne do zdrojového kódu, repozitáře nebo logů.

Ukázky dále předpokládají nastavené proměnné:

export API="https://admin.example.org"
export AUTH="A1B2C3D4:vase-heslo"

Ukázky používají nástroj curl, protože nezávisí na programovacím jazyce. Rozhraní je běžné HTTP, lze jej proto volat z libovolného jazyka nebo nástroje s podporou Basic Auth, například Python, JavaScript, PHP, Postman nebo Make.

Postup: od souboru ke spuštěné kampani

  1. Zjistěte identifikátor Společnosti. Použijete jej ve všech dalších voláních.
  2. Nahrajte médium. Odpověď vrátí jeho identifikátor.
  3. Načtěte šablonu kampaně. Server ji předvyplní nastavením Společnosti a seznamem lokalit a zařízení.
  4. Upravte šablonu — název, termín, cílová zařízení a vizuál.
  5. Založte kampaň. Vznikne jako koncept a zatím se nepřehrává.
  6. Aktivujte kampaň. Systém připraví nový plán přehrávání a odešle jej na zařízení.
  7. Sledujte výsledky v reportu kampaně.

1. Identifikátor Společnosti

curl -u "$AUTH" "$API/api/public/login"

Odpověď (zkráceno):

{
  "id": 1715714421868,
  "name": "Integrace – e-shop",
  "login": "A1B2C3D4",
  "company": { "id": 1698234512001, "name": "Reklamní agentura s.r.o." },
  "permission": {
    "resource": 12,
    "device_layer_top": 12,
    "report_layer_top": 4
  }
}

Hodnotu company.id si uložte, v ukázkách jako proměnnou COMPANY. Sekce permission uvádí oprávnění uživatele; jejich význam popisuje část Oprávnění.

2. Nahrání média

Soubor se odesílá jako binární tělo požadavku metodou PUT; jeho vlastnosti určují hlavičky.

curl -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: letni-vyprodej.jpg" \
  -H "file-suffix: jpg" \
  --data-binary @letni-vyprodej.jpg
HlavičkaObsah
file-typeDruh média podle tabulky Typy médií, například IMAGE.
file-mimeMIME typ souboru, například image/jpeg, video/mp4 nebo application/pdf.
file-nameNázev média v administraci; případnou příponu server odstraní. Název s diakritikou zakódujte jako URL (encodeURIComponent).
file-suffixPřípona souboru bez tečky.

Stejné volání v jazyce Python:

import requests

with open("letni-vyprodej.jpg", "rb") as f:
    r = requests.put(
        f"{API}/api/resource/single/{COMPANY}",
        auth=("A1B2C3D4", "vase-heslo"),
        headers={
            "file-type": "IMAGE",
            "file-mime": "image/jpeg",
            "file-name": "letni-vyprodej.jpg",
            "file-suffix": "jpg",
        },
        data=f,
    )
r.raise_for_status()
resource_id = r.json()["id"]

Odpověď obsahuje identifikátor média (id) a jeho typ (type); obě hodnoty použijete ve vizuálu kampaně.

{
  "id": 1724832015443,
  "type": 2,
  "name": "letni-vyprodej",
  "width": 1920,
  "height": 1080,
  "duration": 0,
  "aspectRatio": 32
}
  • Velikost: běžné soubory nejvýše přibližně 1,1 GB, video s průhledností přibližně 2,1 GB. Větší soubor server odmítne kódem 413.
  • Příprava videa: video se po nahrání konvertuje na pozadí. Připravené je, jakmile detail média (GET /api/resource/single/{companyId}/{id}) obsahuje vyplněnou hodnotu dt_ready. U obrázků je příprava prakticky okamžitá.
  • Chybějící hlavička: bez file-mime, file-name nebo file-suffix server vrátí 204 a médium nevytvoří. Před dalším krokem proto vždy ověřte, že odpověď obsahuje id.

3. Šablona kampaně

Kampaň neskládejte ručně. Vyžádejte si šablonu, kterou server předvyplní výchozím termínem (od dnešního dne na jeden měsíc), nastavením Společnosti a seznamem všech lokalit a zařízení. Každé zařízení je v ní označeno isActive: false.

curl -u "$AUTH" "$API/api/campaign/company/$COMPANY" > kampan.json

Ukázka šablony (zkráceno):

{
  "id": -1,
  "groupId": -1,
  "state": 2,
  "name": "",
  "start": "2026-11-01T10:00:00",
  "end": "2026-12-01T10:00:00",
  "isCommercial": true,
  "isNonCommercial": false,
  "settings": {
    "type": 2,
    "companyCount": 10,
    "companyDuration": 10000,
    "campaignCount": 1,
    "campaignDuration": 10000
  },
  "locations": [
    {
      "id": 1698234512100,
      "name": "OC Centrum",
      "days": [ { "day": 1, "start": "09:00", "end": "21:00" } ],
      "devices": [
        {
          "id": 1698234512201,
          "name": "Vchod A",
          "screenRatio": 32,
          "isHorizontal": true,
          "isActive": false
        }
      ]
    }
  ],
  "visuals": []
}

Hodnota settings.type určuje režim přehrávání Společnosti: 2 = SLOT, 4 = IMPRESSION. Režim nastavuje poskytovatel a přes API jej změnit nelze.

4. Úprava šablony

  • name: název kampaně zobrazený v administraci a reportech.
  • start, end: začátek a konec kampaně.
  • isActive: nastavte na true u zařízení, na kterých se má kampaň přehrávat.
  • visuals: doplňte vizuál s nahraným médiem.
"visuals": [
  {
    "id": 1,
    "name": "Hlavní vizuál",
    "isPrimary": true,
    "isCustom": true,
    "res": [
      {
        "id": 1,
        "conditionId": 0,
        "resourceId": 1724832015443,
        "name": "letni-vyprodej",
        "duration": 10000,
        "type": 2
      }
    ]
  }
]
PoleVýznam
idLibovolné číslo jedinečné v rámci kampaně; server jej při založení přečísluje.
isPrimarytrue u hlavního vizuálu, u ostatních false.
isCustomtrue – vizuál patří této kampani.
resourceIdIdentifikátor média z kroku 2.
durationDélka zobrazení v milisekundách.
typeTyp média; stejná hodnota, jakou vrátilo nahrání v poli type.

Úpravu lze provést skriptem, například nástrojem jq:

jq --argjson res "$RESOURCE" '
  .name = "Letní výprodej 2026"
  | .start = "2026-11-02T00:00:00"
  | .end   = "2026-11-09T00:00:00"
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Hlavní vizuál", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: "letni-vyprodej", duration: 10000, type: 2 }]
    }]
' kampan.json > kampan-upravena.json

Pokud kampaň cílí na obrazovky na šířku i na výšku (isHorizontal), přidejte vizuál pro každou orientaci. Jinak se obsah na části obrazovek ořízne nebo zmenší. Podrobnosti popisuje návod Vizuály kampaně.

5. Založení kampaně

curl -u "$AUTH" -X POST \
  "$API/api/campaign/company/$COMPANY" \
  -H "Content-Type: application/json" \
  --data @kampan-upravena.json \
  -o odpoved.json

export CAMPAIGN=$(jq -r '.id' odpoved.json)
export GROUP=$(jq -r '.groupId' odpoved.json)

Kampaň vznikne ve stavu koncept a nikde se nepřehrává. Odpověď obsahuje uloženou kampaň s přidělenými hodnotami id a groupId. Šablona má stav state: 2 (koncept) nastaven správně; jinou hodnotu server odmítne kódem 409.

6. Aktivace kampaně

curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"
  • +01:00: časové pásmo jako posun proti UTC, podle kterého se kampaň řídí. Pro Českou republiku +01:00 v zimním a +02:00 v letním čase.
  • 0: očekávaný počet zobrazení za celou kampaň. Uplatní se v režimu IMPRESSION; v režimu SLOT uveďte 0.

Kampaň s dnešním nebo dřívějším začátkem přejde do stavu aktivní a její začátek se nastaví na okamžik aktivace. Kampaň s budoucím začátkem přejde do stavu publikovaná a spustí se v naplánovaný den.

Systém poté přepočítá plán přehrávání a odešle jej na dotčená zařízení. U připojených zařízení to obvykle trvá desítky sekund; nepřipojené zařízení plán převezme po obnovení spojení. Kapacitu zařízení ověříte v administraci, viz Kapacita kampaní.

7. Výsledky kampaně

curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP"
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP/impression"

Reporty používají groupId, nikoli id kampaně. První adresa vrací souhrn kampaně, druhá počty zaznamenaných zobrazení. Zařízení odesílají záznamy průběžně v dávkách, údaje proto nejsou k dispozici v reálném čase. Význam údajů popisuje Report kampaně.

Pozastavení, ukončení a smazání

# pozastavení aktivní kampaně, opakované volání ji znovu spustí
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"

# trvalé ukončení
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00"

# smazání
curl -u "$AUTH" -X DELETE \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN"

Adresa z kroku 6 funguje jako přepínač: aktivní nebo publikovanou kampaň pozastaví, pozastavenou znovu spustí. Před voláním proto ověřte aktuální stav kampaně (state v detailu). Ukončenou kampaň již znovu spustit nelze; zůstává však v seznamu i s reporty. Smazaná kampaň ze seznamu zmizí.

Přehled adres

Adresy jsou relativní k adrese administrace. {c} označuje identifikátor Společnosti.

Účet

MetodaAdresaCo dělá
GET/api/public/loginOvěří přihlášení a vrátí profil uživatele včetně company.id.
GET/api/user/infoInformace o přihlášeném uživateli.
GET/api/user/checkRychlé ověření platnosti přihlášení.

Média

MetodaAdresaCo dělá
PUT/api/resource/single/{c}Nahraje soubor (hlavičky file-*, tělo = binární data).
GET/api/resource/listing/{c}/1Seznam médií; 1 = bez omezení typu.
GET/api/resource/single/{c}/{id}Detail média.
DELETE/api/resource/single/{c}/{id}Smaže médium.

Kampaně

MetodaAdresaCo dělá
GET/api/campaign/company/{c}Šablona nové kampaně.
POST/api/campaign/company/{c}Založí kampaň jako koncept.
PATCH/api/campaign/company/{c}Uloží změny existující kampaně.
POST/api/campaign/listing/company/{c}Seznam kampaní; tělo požadavku obsahuje filtr.
GET/api/campaign/company/{c}/{id}Detail kampaně.
GET/api/campaign/company/{c}/group/{groupId}Detail kampaně podle groupId.
PATCH/api/campaign/company/{c}/{id}/{tz}/{impressions}Aktivuje, pozastaví nebo obnoví kampaň.
PATCH/api/campaign/company/{c}/{id}/{tz}Trvale ukončí kampaň.
DELETE/api/campaign/company/{c}/{id}Smaže kampaň.

Lokality a zařízení

MetodaAdresaCo dělá
GET/api/location/listing/{c}Seznam lokalit.
GET/api/location/single/{id}Detail lokality včetně otevírací doby.
GET/api/device/listing/{c}/{locationId}Seznam zařízení v lokalitě.
GET/api/device/single/{id}/{lang}Detail zařízení; lang je kód jazyka, například cs.

Reporty

MetodaAdresaCo dělá
GET/api/report/{c}/campaign/{groupId}Souhrn kampaně.
GET/api/report/{c}/campaign/{groupId}/impressionPočty zaznamenaných zobrazení.

Číselníky

Hodnoty číselníků se v JSON zapisují jako čísla.

Stav kampaně (state)

HodnotaStavVýznam
2KonceptUložená kampaň, která se nepřehrává.
4PublikovanáAktivovaná kampaň čekající na den začátku.
8AktivníKampaň se přehrává.
16DokončenáUplynul konec kampaně.
32UkončenáKampaň byla trvale ukončena.
64SmazanáKampaň byla smazána.
128PozastavenáPřehrávání je dočasně přerušeno.

Typy médií

Hodnota typeHlavička file-typeMédium
2IMAGEObrázek (JPG, PNG, WebP)
4VIDEOVideo
8PDFDokument PDF
16WWW_APPWebová aplikace
32TEXTDlouhý text
128VIDEO_ALPHAVideo s průhledným pozadím
256AUDIOZvuk

Pro dokument se v hlavičce file-type používá hodnota PDF, nikoli DOCUMENT.

Oprávnění

Rozhraní uplatňuje stejná oprávnění jako administrace a kontroluje je u každého požadavku. V odpovědi přihlášení je každá oblast vyjádřena číslem, které je součtem dílčích práv:

HodnotaPrávo ve vlastní Společnosti
4Zobrazit
8Přidat
16Upravit
32Vymazat

Například resource: 28 (4 + 8 + 16) znamená, že uživatel smí média zobrazit, přidat a upravit, ale ne vymazat. Vyšší hodnoty (128 až 1024) označují stejná práva mimo vlastní Společnost; integrace je nepotřebuje.

OblastMinimum pro popsaný postup
resource – média12 (zobrazit, přidat)
device_layer_top – kampaně12 (zobrazit, přidat)
report_layer_top – reporty kampaní4 (zobrazit)
location – lokality4 (zobrazit)
device_info – zařízení4 (zobrazit)

Aktivaci, pozastavení i ukončení kampaně umožňuje právo Přidat. Ke smazání aktivované kampaně nebo média je potřeba právo Vymazat; koncept kampaně lze smazat i bez něj. Výchozím bodem může být role Správce firemní reklamy, ze které odeberete nepotřebná práva.

Chybové kódy

KódVýznamDoporučený postup
400Chybný požadavekZkontrolujte identifikátory v adrese, časové pásmo a povinné údaje.
401Chybí oprávněníUživatel nemá potřebné právo nebo přístup k dané Společnosti. U kampaní jde nejčastěji o chybějící právo Přidat.
404NenalezenoZáznam neexistuje nebo nepatří do uvedené Společnosti.
406Nelze provéstChybné přihlašovací údaje, nebo kampaň je ve stavu, ze kterého požadovaný přechod není povolen (např. ukončená).
409Konflikt stavuZakládaná kampaň nemá stav koncept.
413Soubor je příliš velkýZmenšete soubor; limity uvádí krok 2.
500Chyba serveruOpakujte požadavek později; při opakovaném výskytu kontaktujte poskytovatele.
Doporučení pro implementaci

Integraci nejprve vyzkoušejte na testovacím prostředí nebo na zařízení, které nevidí veřejnost — aktivovaná kampaň se na produkčních zařízeních skutečně přehrává. Mimo otevírací dobu lokality se nepřehrává žádný obsah, ani u kampaně s nepřetržitým termínem.

Identifikátory médií a kampaní (id, groupId) si ukládejte ve vlastním systému; vyhledávání kampaně podle názvu rozhraní nenabízí. Média nahrávejte postupně a reporty nenačítejte častěji než jednou za několik minut. Opírejte se pouze o adresy uvedené v tomto návodu.

Kompletní příklad

Skript provede celý postup od nahrání obrázku po aktivaci kampaně na všech zařízeních Společnosti. Vyžaduje nástroje curl a jq.

#!/usr/bin/env bash
set -euo pipefail

API="https://admin.example.org"
AUTH="${INTEGRATION_AUTH:?nastavte INTEGRATION_AUTH=login:heslo}"
SOUBOR="letni-vyprodej.jpg"
NAZEV="Letní výprodej 2026"
OD="2026-11-02T00:00:00"
DO="2026-11-09T00:00:00"
TZ_OFFSET="+01:00"

# 1) identifikátor Společnosti
COMPANY=$(curl -sf -u "$AUTH" "$API/api/public/login" | jq -r '.company.id')

# 2) nahrání média
RESOURCE=$(curl -sf -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: $SOUBOR" \
  -H "file-suffix: jpg" \
  --data-binary "@$SOUBOR" | jq -r '.id')

# 3) šablona kampaně
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > sablona.json

# 4) úprava šablony
jq --argjson res "$RESOURCE" --arg n "$NAZEV" --arg from "$OD" --arg to "$DO" '
  .name = $n
  | .start = $from
  | .end = $to
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Hlavní vizuál", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: $n, duration: 10000, type: 2 }]
    }]
' sablona.json > kampan.json

# 5) založení konceptu
ODPOVED=$(curl -sf -u "$AUTH" -X POST \
  "$API/api/campaign/company/$COMPANY" \
  -H "Content-Type: application/json" \
  --data @kampan.json)
CAMPAIGN=$(echo "$ODPOVED" | jq -r '.id')
GROUP=$(echo "$ODPOVED" | jq -r '.groupId')

# 6) aktivace
curl -sf -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/$TZ_OFFSET/0" > /dev/null

echo "Kampaň $CAMPAIGN aktivována, report: $API/api/report/$COMPANY/campaign/$GROUP"
Nenašli jste, co jste hledali?
Obraťte se na svého poskytovatele softwaru.