Dokumentácia / Integrácie a tvorba obsahu / API na prepojenie s vaším systémom

API na prepojenie s vaším systémom

Úvod a orientácia

Ako spravovať médiá, kampane a reporty priamo z vášho systému bez prihlasovania do administrácie.

Na čo API slúži

API umožňuje prepojiť systém zákazníka — napríklad e-shop, plánovač reklamných kampaní alebo interný katalóg — priamo so správou obsahu zariadení. Vlastný systém môže nahrávať médiá, zakladať a spúšťať kampane a načítavať ich výsledky bez toho, aby sa ktokoľvek musel prihlasovať do administrácie a vykonávať operácie ručne.

Rozhranie je rovnaké, aké používa webová administrácia. Cez API preto možno vykonávať rovnaké operácie ako v administrácii, v rovnakom rozsahu oprávnení prihláseného používateľa.

Kedy API použiť

Na občasné nahranie niekoľkých médií a ručné spustenie kampane je vhodnejšia administrácia: sprievodca kampaňou zobrazí náhľad, skontroluje formát médií a kapacitu zariadení. API má zmysel vo chvíli, keď ručná práca začne zdržiavať.

PotrebujeteOdporúčaný spôsob
Nahrať niekoľko médií a spustiť kampaňAdministrácia
Pravidelne, ale ručne obmieňať obsahAdministrácia
Hromadne nahrávať médiá z vlastného systémuAPI
Zakladať kampane automaticky podľa vlastného plánovačaAPI
Preberať výsledky kampaní do vlastného reportinguAPI

Rozhranie nie je verzované a jeho podoba sa môže s vývojom platformy meniť. Pred nasadením integráciu ohláste svojmu poskytovateľovi softvéru a po aktualizáciách systému overte jej funkčnosť.

Komu je návod určený a kto čo zabezpečuje

  • Poskytovateľ platformy prevádzkuje rozhranie, oznamuje adresu administrácie a nastavuje režim prehrávania Spoločnosti.
  • Zákazník rozhoduje o rozsahu integrácie a vo svojej Spoločnosti zakladá pre integráciu samostatného používateľa s potrebnými oprávneniami — pozri Vytvorenie používateľa a prvé prihlásenie.
  • Vývojár integrácie napája systém zákazníka na rozhranie. Technické pokyny a ukážky kódu v tomto návode sú určené práve jemu. Ak integráciu vyvíjate sami, túto rolu zastávate vy.

Technická dokumentácia

Technická časť pre vývojárov integrácie

Najprv sa oboznámte so spoločnými pravidlami volania a prihlásením. Potom prejdite postup od nahrania média po spustenie kampane a prehľad dostupných adries.

Spoločné pravidlá volania

  • Adresa: rozhranie beží na rovnakej adrese ako vaša administrácia; všetky cesty začínajú /api/. V ukážkach je adresa nahradená https://admin.example.org. Testovacie prostredie, ak je k dispozícii, vám oznámi poskytovateľ.
  • Prihlásenie: každá požiadavka nesie prihlasovacie údaje metódou HTTP Basic Auth. Relácie ani tokeny sa nepoužívajú.
  • Formát dát: telá požiadaviek aj odpovede sú vo formáte JSON. Výnimkou je nahrávanie súboru, ktorého telo tvoria samotné binárne dáta.
  • Identifikátory a hodnoty: identifikátory sú celé čísla. Dátum a čas sa zapisujú v tvare RRRR-MM-DDTHH:MM:SS, dĺžky zobrazenia v milisekundách (10000 = 10 s).
  • Výsledok: úspech potvrdzuje kód 200. Znamená prijatie požiadavky, nie okamžité prehrávanie na zariadeniach.

Prihlásenie

Prihlasovacím menom nie je e-mail, ale osemznakový kód, ktorý systém vygeneroval pri založení používateľa, napríklad A1B2C3D4. Pre integráciu založte samostatného používateľa s minimálnymi nevyhnutnými oprávneniami; jeho prístup potom možno kedykoľvek odobrať bez vplyvu na ostatných používateľov.

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

Heslo sa odosiela s každou požiadavkou. Uložte ho ako tajný údaj, napríklad v premennej prostredia alebo v trezore hesiel, nikdy nie do zdrojového kódu, repozitára alebo logov.

Ukážky ďalej predpokladajú nastavené premenné:

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

Ukážky používajú nástroj curl, pretože nezávisí od programovacieho jazyka. Rozhranie je bežné HTTP, preto ho možno volať z ľubovoľného jazyka alebo nástroja s podporou Basic Auth, napríklad Python, JavaScript, PHP, Postman alebo Make.

Postup: od súboru k spustenej kampani

  1. Zistite identifikátor Spoločnosti. Použijete ho vo všetkých ďalších volaniach.
  2. Nahrajte médium. Odpoveď vráti jeho identifikátor.
  3. Načítajte šablónu kampane. Server ju predvyplní nastavením Spoločnosti a zoznamom lokalít a zariadení.
  4. Upravte šablónu — názov, termín, cieľové zariadenia a vizuál.
  5. Založte kampaň. Vznikne ako koncept a zatiaľ sa neprehráva.
  6. Aktivujte kampaň. Systém pripraví nový plán prehrávania a odošle ho do zariadení.
  7. Sledujte výsledky v reporte kampane.

1. Identifikátor Spoločnosti

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

Odpoveď (skrátené):

{
  "id": 1715714421868,
  "name": "Integrácia – e-shop",
  "login": "A1B2C3D4",
  "company": { "id": 1698234512001, "name": "Reklamná agentúra s.r.o." },
  "permission": {
    "resource": 12,
    "device_layer_top": 12,
    "report_layer_top": 4
  }
}

Hodnotu company.id si uložte, v ukážkach ako premennú COMPANY. Sekcia permission uvádza oprávnenia používateľa; ich význam opisuje časť Oprávnenia.

2. Nahranie média

Súbor sa odosiela ako binárne telo požiadavky metódou 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: letny-vypredaj.jpg" \
  -H "file-suffix: jpg" \
  --data-binary @letny-vypredaj.jpg
HlavičkaObsah
file-typeDruh média podľa tabuľky Typy médií, napríklad IMAGE.
file-mimeMIME typ súboru, napríklad image/jpeg, video/mp4 alebo application/pdf.
file-nameNázov média v administrácii; prípadnú príponu server odstráni. Názov s diakritikou zakódujte ako URL (encodeURIComponent).
file-suffixPrípona súboru bez bodky.

Rovnaké volanie v jazyku Python:

import requests

with open("letny-vypredaj.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": "letny-vypredaj.jpg",
            "file-suffix": "jpg",
        },
        data=f,
    )
r.raise_for_status()
resource_id = r.json()["id"]

Odpoveď obsahuje identifikátor média (id) a jeho typ (type); obe hodnoty použijete vo vizuáli kampane.

{
  "id": 1724832015443,
  "type": 2,
  "name": "letny-vypredaj",
  "width": 1920,
  "height": 1080,
  "duration": 0,
  "aspectRatio": 32
}
  • Veľkosť: bežné súbory najviac približne 1,1 GB, video s priehľadnosťou približne 2,1 GB. Väčší súbor server odmietne kódom 413.
  • Príprava videa: video sa po nahraní konvertuje na pozadí. Pripravené je, keď detail média (GET /api/resource/single/{companyId}/{id}) obsahuje vyplnenú hodnotu dt_ready. Pri obrázkoch je príprava prakticky okamžitá.
  • Chýbajúca hlavička: bez file-mime, file-name alebo file-suffix server vráti 204 a médium nevytvorí. Pred ďalším krokom preto vždy overte, že odpoveď obsahuje id.

3. Šablóna kampane

Kampaň neskladajte ručne. Vyžiadajte si šablónu, ktorú server predvyplní predvoleným termínom (od dnešného dňa na jeden mesiac), nastavením Spoločnosti a zoznamom všetkých lokalít a zariadení. Každé zariadenie je v nej označené isActive: false.

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

Ukážka šablóny (skrátené):

{
  "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 prehrávania Spoločnosti: 2 = SLOT, 4 = IMPRESSION. Režim nastavuje poskytovateľ a cez API ho zmeniť nemožno.

4. Úprava šablóny

  • name: názov kampane zobrazený v administrácii a reportoch.
  • start, end: začiatok a koniec kampane.
  • isActive: nastavte na true pri zariadeniach, na ktorých sa má kampaň prehrávať.
  • visuals: doplňte vizuál s nahraným médiom.
"visuals": [
  {
    "id": 1,
    "name": "Hlavný vizuál",
    "isPrimary": true,
    "isCustom": true,
    "res": [
      {
        "id": 1,
        "conditionId": 0,
        "resourceId": 1724832015443,
        "name": "letny-vypredaj",
        "duration": 10000,
        "type": 2
      }
    ]
  }
]
PoleVýznam
idĽubovoľné číslo jedinečné v rámci kampane; server ho pri založení prečísluje.
isPrimarytrue pri hlavnom vizuáli, pri ostatných false.
isCustomtrue – vizuál patrí tejto kampani.
resourceIdIdentifikátor média z kroku 2.
durationDĺžka zobrazenia v milisekundách.
typeTyp média; rovnaká hodnota, akú vrátilo nahranie v poli type.

Úpravu možno vykonať skriptom, napríklad nástrojom jq:

jq --argjson res "$RESOURCE" '
  .name = "Letný výpredaj 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: "letny-vypredaj", duration: 10000, type: 2 }]
    }]
' kampan.json > kampan-upravena.json

Ak kampaň cieli na obrazovky na šírku aj na výšku (isHorizontal), pridajte vizuál pre každú orientáciu. Inak sa obsah na časti obrazoviek oreže alebo zmenší. Podrobnosti opisuje návod Vizuály kampane.

5. Založenie kampane

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 v stave koncept a nikde sa neprehráva. Odpoveď obsahuje uloženú kampaň s pridelenými hodnotami id a groupId. Šablóna má stav state: 2 (koncept) nastavený správne; inú hodnotu server odmietne kódom 409.

6. Aktivácia kampane

curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"
  • +01:00: časové pásmo ako posun voči UTC, podľa ktorého sa kampaň riadi. Pre Slovensko +01:00 v zimnom a +02:00 v letnom čase.
  • 0: očakávaný počet zobrazení za celú kampaň. Uplatní sa v režime IMPRESSION; v režime SLOT uveďte 0.

Kampaň s dnešným alebo skorším začiatkom prejde do stavu aktívna a jej začiatok sa nastaví na okamih aktivácie. Kampaň s budúcim začiatkom prejde do stavu publikovaná a spustí sa v naplánovaný deň.

Systém potom prepočíta plán prehrávania a odošle ho do dotknutých zariadení. Pri pripojených zariadeniach to zvyčajne trvá desiatky sekúnd; nepripojené zariadenie plán prevezme po obnovení spojenia. Kapacitu zariadení overíte v administrácii, pozri Kapacita kampane.

7. Výsledky kampane

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

Reporty používajú groupId, nie id kampane. Prvá adresa vracia súhrn kampane, druhá počty zaznamenaných zobrazení. Zariadenia odosielajú záznamy priebežne v dávkach, údaje preto nie sú k dispozícii v reálnom čase. Význam údajov opisuje Report kampane.

Pozastavenie, ukončenie a vymazanie

# pozastavenie aktívnej kampane, opakované volanie ju znova spustí
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"

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

# vymazanie
curl -u "$AUTH" -X DELETE \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN"

Adresa z kroku 6 funguje ako prepínač: aktívnu alebo publikovanú kampaň pozastaví, pozastavenú znova spustí. Pred volaním preto overte aktuálny stav kampane (state v detaile). Ukončenú kampaň už znova spustiť nemožno; zostáva však v zozname aj s reportmi. Vymazaná kampaň zo zoznamu zmizne.

Prehľad adries

Adresy sú relatívne k adrese administrácie. {c} označuje identifikátor Spoločnosti.

Účet

MetódaAdresaČo robí
GET/api/public/loginOverí prihlásenie a vráti profil používateľa vrátane company.id.
GET/api/user/infoInformácie o prihlásenom používateľovi.
GET/api/user/checkRýchle overenie platnosti prihlásenia.

Médiá

MetódaAdresaČo robí
PUT/api/resource/single/{c}Nahrá súbor (hlavičky file-*, telo = binárne dáta).
GET/api/resource/listing/{c}/1Zoznam médií; 1 = bez obmedzenia typu.
GET/api/resource/single/{c}/{id}Detail média.
DELETE/api/resource/single/{c}/{id}Vymaže médium.

Kampane

MetódaAdresaČo robí
GET/api/campaign/company/{c}Šablóna novej kampane.
POST/api/campaign/company/{c}Založí kampaň ako koncept.
PATCH/api/campaign/company/{c}Uloží zmeny existujúcej kampane.
POST/api/campaign/listing/company/{c}Zoznam kampaní; telo požiadavky obsahuje filter.
GET/api/campaign/company/{c}/{id}Detail kampane.
GET/api/campaign/company/{c}/group/{groupId}Detail kampane podľa groupId.
PATCH/api/campaign/company/{c}/{id}/{tz}/{impressions}Aktivuje, pozastaví alebo obnoví kampaň.
PATCH/api/campaign/company/{c}/{id}/{tz}Natrvalo ukončí kampaň.
DELETE/api/campaign/company/{c}/{id}Vymaže kampaň.

Lokality a zariadenia

MetódaAdresaČo robí
GET/api/location/listing/{c}Zoznam lokalít.
GET/api/location/single/{id}Detail lokality vrátane otváracích hodín.
GET/api/device/listing/{c}/{locationId}Zoznam zariadení v lokalite.
GET/api/device/single/{id}/{lang}Detail zariadenia; lang je kód jazyka, napríklad sk.

Reporty

MetódaAdresaČo robí
GET/api/report/{c}/campaign/{groupId}Súhrn kampane.
GET/api/report/{c}/campaign/{groupId}/impressionPočty zaznamenaných zobrazení.

Číselníky

Hodnoty číselníkov sa v JSON zapisujú ako čísla.

Stav kampane (state)

HodnotaStavVýznam
2KonceptUložená kampaň, ktorá sa neprehráva.
4PublikovanáAktivovaná kampaň čakajúca na deň začiatku.
8AktívnaKampaň sa prehráva.
16DokončenáUplynul koniec kampane.
32UkončenáKampaň bola natrvalo ukončená.
64VymazanáKampaň bola vymazaná.
128PozastavenáPrehrávanie je dočasne prerušené.

Typy médií

Hodnota typeHlavička file-typeMédium
2IMAGEObrázok (JPG, PNG, WebP)
4VIDEOVideo
8PDFDokument PDF
16WWW_APPWebová aplikácia
32TEXTDlhý text
128VIDEO_ALPHAVideo s priehľadným pozadím
256AUDIOZvuk

Pre dokument sa v hlavičke file-type používa hodnota PDF, nie DOCUMENT.

Oprávnenia

Rozhranie uplatňuje rovnaké oprávnenia ako administrácia a kontroluje ich pri každej požiadavke. V odpovedi prihlásenia je každá oblasť vyjadrená číslom, ktoré je súčtom čiastkových práv:

HodnotaPrávo vo vlastnej Spoločnosti
4Zobraziť
8Pridať
16Upraviť
32Vymazať

Napríklad resource: 28 (4 + 8 + 16) znamená, že používateľ smie médiá zobraziť, pridať a upraviť, ale nie vymazať. Vyššie hodnoty (128 až 1024) označujú rovnaké práva mimo vlastnej Spoločnosti; integrácia ich nepotrebuje.

OblasťMinimum pre opísaný postup
resource – médiá12 (zobraziť, pridať)
device_layer_top – kampane12 (zobraziť, pridať)
report_layer_top – reporty kampaní4 (zobraziť)
location – lokality4 (zobraziť)
device_info – zariadenia4 (zobraziť)

Aktiváciu, pozastavenie aj ukončenie kampane umožňuje právo Pridať. Na vymazanie aktivovanej kampane alebo média je potrebné právo Vymazať; koncept kampane možno vymazať aj bez neho. Východiskom môže byť rola Správca firemnej reklamy, z ktorej odoberiete nepotrebné práva.

Chybové kódy

KódVýznamOdporúčaný postup
400Chybná požiadavkaSkontrolujte identifikátory v adrese, časové pásmo a povinné údaje.
401Chýba oprávneniePoužívateľ nemá potrebné právo alebo prístup k danej Spoločnosti. Pri kampaniach ide najčastejšie o chýbajúce právo Pridať.
404NenájdenéZáznam neexistuje alebo nepatrí do uvedenej Spoločnosti.
406Nemožno vykonaťChybné prihlasovacie údaje alebo je kampaň v stave, z ktorého požadovaný prechod nie je povolený (napr. ukončená).
409Konflikt stavuZakladaná kampaň nemá stav koncept.
413Súbor je príliš veľkýZmenšite súbor; limity uvádza krok 2.
500Chyba serveraZopakujte požiadavku neskôr; pri opakovanom výskyte kontaktujte poskytovateľa.
Odporúčania pre implementáciu

Integráciu najprv vyskúšajte na testovacom prostredí alebo na zariadení, ktoré nevidí verejnosť — aktivovaná kampaň sa na produkčných zariadeniach skutočne prehráva. Mimo otváracích hodín lokality sa neprehráva žiadny obsah, ani pri kampani s nepretržitým termínom.

Identifikátory médií a kampaní (id, groupId) si ukladajte vo vlastnom systéme; vyhľadávanie kampane podľa názvu rozhranie neponúka. Médiá nahrávajte postupne a reporty nenačítavajte častejšie ako raz za niekoľko minút. Opierajte sa len o adresy uvedené v tomto návode.

Kompletný príklad

Skript vykoná celý postup od nahrania obrázka po aktiváciu kampane na všetkých zariadeniach Spoloč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}"
SUBOR="letny-vypredaj.jpg"
NAZOV="Letný výpredaj 2026"
OD="2026-11-02T00:00:00"
DO="2026-11-09T00:00:00"
TZ_OFFSET="+01:00"

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

# 2) nahranie 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: $SUBOR" \
  -H "file-suffix: jpg" \
  --data-binary "@$SUBOR" | jq -r '.id')

# 3) šablóna kampane
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > sablona.json

# 4) úprava šablóny
jq --argjson res "$RESOURCE" --arg n "$NAZOV" --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ženie 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) aktivácia
curl -sf -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/$TZ_OFFSET/0" > /dev/null

echo "Kampaň $CAMPAIGN aktivovaná, report: $API/api/report/$COMPANY/campaign/$GROUP"
Nenašli ste, čo ste hľadali?
Obráťte sa na svojho poskytovateľa softvéru.