Dokumentacija / Integracije i izrada sadržaja / API za povezivanje s vašim sistemom

API za povezivanje s vašim sistemom

Uvod i orijentacija

Kako upravljati medijima, kampanjama i izvještajima direktno iz vašeg sistema bez prijave u administraciju.

Čemu služi API

API omogućava povezivanje sistema korisnika platforme — naprimjer web-prodavnice, planera reklamnih kampanja ili internog kataloga — direktno s upravljanjem sadržajem uređaja. Vaš sistem može učitavati medije, kreirati i pokretati kampanje te preuzimati njihove rezultate, a da se niko ne mora prijavljivati u administraciju i ručno obavljati te radnje.

Interfejs je isti onaj koji koristi web-administracija. Putem API-ja zato je moguće obavljati iste radnje kao u administraciji, u opsegu dozvola prijavljenog korisnika.

Kada koristiti API

Za povremeno učitavanje nekoliko medija i ručno pokretanje kampanje prikladnija je administracija: čarobnjak kampanje prikazuje pregled i provjerava format medija i kapacitet uređaja. API ima smisla kada vas ručni rad počne usporavati.

TrebatePreporučeni način
Učitati nekoliko medija i pokrenuti kampanjuAdministracija
Redovno, ali ručno mijenjati sadržajAdministracija
Masovno učitavati medije iz vlastitog sistemaAPI
Automatski kreirati kampanje prema vlastitom planeruAPI
Preuzimati rezultate kampanja u vlastiti sistem izvještavanjaAPI

Interfejs nije verzionisan i može se mijenjati s razvojem platforme. Prije uvođenja integraciju najavite svom pružaocu softvera i nakon ažuriranja sistema provjerite radi li i dalje.

Kome je vodič namijenjen i ko je za šta odgovoran

  • Pružalac platforme upravlja interfejsom, saopštava adresu administracije i postavlja način reprodukcije Kompanije.
  • Korisnik platforme odlučuje o opsegu integracije i u svojoj Kompaniji kreira zasebnog korisnika s potrebnim dozvolama — vidi Kreiranje korisnika i prva prijava.
  • Programer integracije povezuje sistem korisnika s interfejsom. Tehničke upute i primjeri koda u ovom vodiču namijenjeni su upravo njemu. Ako sami razvijate integraciju, preuzimate i tu ulogu.

Tehnička dokumentacija

Tehničke upute za programere integracije

Najprije se upoznajte sa zajedničkim pravilima pozivanja i prijavom. Zatim prođite postupak od učitavanja medija do pokretanja kampanje i pregled dostupnih adresa.

Zajednička pravila pozivanja

  • Adresa: interfejs radi na istoj adresi kao vaša administracija; sve putanje počinju s /api/. U primjerima je adresa zamijenjena s https://admin.example.org. Testno okruženje, ako je dostupno, saopštit će vam pružalac.
  • Prijava: svaki zahtjev nosi pristupne podatke metodom HTTP Basic Auth. Sesije ni tokeni se ne koriste.
  • Format podataka: tijela zahtjeva i odgovori su u formatu JSON. Izuzetak je učitavanje datoteke, čije tijelo čine sami binarni podaci.
  • Identifikatori i vrijednosti: identifikatori su cijeli brojevi. Datum i vrijeme pišu se u obliku GGGG-MM-DDTHH:MM:SS, trajanja prikaza u milisekundama (10000 = 10 s).
  • Rezultat: uspjeh potvrđuje kod 200. On znači prihvatanje zahtjeva, a ne trenutnu reprodukciju na uređajima.

Prijava

Korisničko ime nije e-mail adresa, nego kod od osam znakova koji je sistem generisao pri kreiranju korisnika, naprimjer A1B2C3D4. Za integraciju kreirajte zasebnog korisnika s najmanjim potrebnim dozvolama; njegov pristup tada se u svakom trenutku može ukloniti bez uticaja na ostale korisnike.

curl -u "A1B2C3D4:vasa-lozinka" https://admin.example.org/api/public/login

Lozinka se šalje sa svakim zahtjevom. Sačuvajte je kao tajni podatak, naprimjer u varijabli okruženja ili trezoru lozinki, nikada u izvornom kodu, repozitoriju ili logovima.

Primjeri u nastavku pretpostavljaju postavljene varijable:

export API="https://admin.example.org"
export AUTH="A1B2C3D4:vasa-lozinka"

Primjeri koriste alat curl jer ne zavisi od programskog jezika. Interfejs je obični HTTP pa ga je moguće pozivati iz bilo kojeg jezika ili alata s podrškom za Basic Auth, naprimjer Python, JavaScript, PHP, Postman ili Make.

Postupak: od datoteke do pokrenute kampanje

  1. Saznajte identifikator Kompanije. Koristit ćete ga u svim daljnjim pozivima.
  2. Učitajte medij. Odgovor vraća njegov identifikator.
  3. Učitajte šablon kampanje. Server ga unaprijed popunjava postavkama Kompanije i listom lokacija i uređaja.
  4. Uredite šablon — naziv, period, ciljne uređaje i vizual.
  5. Kreirajte kampanju. Nastaje kao nacrt i zasad se ne reprodukuje.
  6. Aktivirajte kampanju. Sistem priprema novi plan reprodukcije i šalje ga na uređaje.
  7. Pratite rezultate u izvještaju kampanje.

1. Identifikator Kompanije

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

Odgovor (skraćeno):

{
  "id": 1715714421868,
  "name": "Integracija – web-prodavnica",
  "login": "A1B2C3D4",
  "company": { "id": 1698234512001, "name": "Reklamna agencija d.o.o." },
  "permission": {
    "resource": 12,
    "device_layer_top": 12,
    "report_layer_top": 4
  }
}

Sačuvajte vrijednost company.id; u primjerima se koristi kao varijabla COMPANY. Odjeljak permission navodi dozvole korisnika; njihovo značenje opisuje dio Dozvole.

2. Učitavanje medija

Datoteka se šalje kao binarno tijelo zahtjeva metodom PUT; njena svojstva određuju zaglavlja.

curl -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: ljetno-snizenje.jpg" \
  -H "file-suffix: jpg" \
  --data-binary @ljetno-snizenje.jpg
ZaglavljeSadržaj
file-typeVrsta medija prema tabeli Vrste medija, naprimjer IMAGE.
file-mimeMIME vrsta datoteke, naprimjer image/jpeg, video/mp4 ili application/pdf.
file-nameNaziv medija u administraciji; eventualnu ekstenziju server uklanja. Naziv s dijakritičkim znakovima kodirajte kao URL (encodeURIComponent).
file-suffixEkstenzija datoteke bez tačke.

Isti poziv u jeziku Python:

import requests

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

Odgovor sadrži identifikator medija (id) i njegovu vrstu (type); obje vrijednosti koristite u vizualu kampanje.

{
  "id": 1724832015443,
  "type": 2,
  "name": "ljetno-snizenje",
  "width": 1920,
  "height": 1080,
  "duration": 0,
  "aspectRatio": 32
}
  • Veličina: obične datoteke najviše oko 1,1 GB, video s prozirnošću oko 2,1 GB. Veću datoteku server odbija kodom 413.
  • Priprema videosnimka: video se nakon učitavanja konvertuje u pozadini. Spreman je kada detalj medija (GET /api/resource/single/{companyId}/{id}) sadrži popunjenu vrijednost dt_ready. Kod slika je priprema praktično trenutna.
  • Nedostaje zaglavlje: bez file-mime, file-name ili file-suffix server vraća 204 i ne kreira medij. Prije sljedećeg koraka zato uvijek provjerite sadrži li odgovor id.

3. Šablon kampanje

Kampanju ne sastavljajte ručno. Zatražite šablon koji server unaprijed popunjava zadanim periodom (od danas na mjesec dana), postavkama Kompanije i listom svih lokacija i uređaja. Svaki je uređaj u njemu označen s isActive: false.

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

Primjer šablona (skraćeno):

{
  "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": "Tržni centar",
      "days": [ { "day": 1, "start": "09:00", "end": "21:00" } ],
      "devices": [
        {
          "id": 1698234512201,
          "name": "Ulaz A",
          "screenRatio": 32,
          "isHorizontal": true,
          "isActive": false
        }
      ]
    }
  ],
  "visuals": []
}

Vrijednost settings.type određuje način reprodukcije Kompanije: 2 = SLOT, 4 = IMPRESSION. Način postavlja pružalac i nije ga moguće promijeniti putem API-ja.

4. Uređivanje šablona

  • name: naziv kampanje prikazan u administraciji i izvještajima.
  • start, end: početak i kraj kampanje.
  • isActive: postavite na true kod uređaja na kojima se kampanja treba reprodukovati.
  • visuals: dodajte vizual s učitanim medijem.
"visuals": [
  {
    "id": 1,
    "name": "Glavni vizual",
    "isPrimary": true,
    "isCustom": true,
    "res": [
      {
        "id": 1,
        "conditionId": 0,
        "resourceId": 1724832015443,
        "name": "ljetno-snizenje",
        "duration": 10000,
        "type": 2
      }
    ]
  }
]
PoljeZnačenje
idBilo koji broj jedinstven unutar kampanje; server ga pri kreiranju prenumeriše.
isPrimarytrue kod glavnog vizuala, kod ostalih false.
isCustomtrue – vizual pripada ovoj kampanji.
resourceIdIdentifikator medija iz koraka 2.
durationTrajanje prikaza u milisekundama.
typeVrsta medija; ista vrijednost koju je učitavanje vratilo u polju type.

Uređivanje je moguće obaviti skriptom, naprimjer alatom jq:

jq --argjson res "$RESOURCE" '
  .name = "Ljetno sniženje 2026"
  | .start = "2026-11-02T00:00:00"
  | .end   = "2026-11-09T00:00:00"
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Glavni vizual", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: "ljetno-snizenje", duration: 10000, type: 2 }]
    }]
' kampanja.json > kampanja-uredjena.json

Ako kampanja cilja ekrane u horizontalnom i vertikalnom položaju (isHorizontal), dodajte vizual za svaku orijentaciju. U suprotnom će se sadržaj na dijelu ekrana odsjeći ili smanjiti. Pojedinosti opisuje vodič Vizuali kampanje.

5. Kreiranje kampanje

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

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

Kampanja nastaje u stanju nacrta i nigdje se ne reprodukuje. Odgovor sadrži sačuvanu kampanju s dodijeljenim vrijednostima id i groupId. Šablon ima ispravno postavljeno stanje state: 2 (nacrt); drugu vrijednost server odbija kodom 409.

6. Aktivacija kampanje

curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"
  • +01:00: vremenska zona kao pomak u odnosu na UTC prema kojoj se kampanja ravna. Za Bosnu i Hercegovinu +01:00 u zimskom i +02:00 u ljetnom računanju vremena.
  • 0: očekivani broj prikaza za cijelu kampanju. Primjenjuje se u načinu IMPRESSION; u načinu SLOT navedite 0.

Kampanja s današnjim ili ranijim početkom prelazi u stanje aktivna, a njen se početak postavlja na trenutak aktivacije. Kampanja s budućim početkom prelazi u stanje objavljena i pokreće se na planirani dan.

Sistem zatim ponovo izračunava plan reprodukcije i šalje ga na pogođene uređaje. Kod povezanih uređaja to obično traje desetine sekundi; nepovezani uređaj preuzima plan nakon ponovnog uspostavljanja veze. Kapacitet uređaja provjerite u administraciji, vidi Kapacitet kampanje.

7. Rezultati kampanje

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

Izvještaji koriste groupId, a ne id kampanje. Prva adresa vraća sažetak kampanje, druga broj zabilježenih prikaza. Uređaji šalju zapise kontinuirano u grupama pa podaci nisu dostupni u stvarnom vremenu. Značenje podataka opisuje Izvještaj kampanje.

Pauziranje, zaustavljanje i brisanje

# pauziranje aktivne kampanje, ponovni poziv je ponovo pokreće
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"

# trajno zaustavljanje
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00"

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

Adresa iz koraka 6 radi kao prekidač: aktivnu ili objavljenu kampanju pauzira, a pauziranu ponovo pokreće. Prije poziva zato provjerite trenutno stanje kampanje (state u detalju). Zaustavljenu kampanju nije moguće ponovo pokrenuti, ali ostaje na listi zajedno s izvještajima. Izbrisana kampanja nestaje s liste.

Pregled adresa

Adrese su relativne u odnosu na adresu administracije. {c} označava identifikator Kompanije.

Račun

MetodaAdresaŠta radi
GET/api/public/loginProvjerava prijavu i vraća profil korisnika uključujući company.id.
GET/api/user/infoPodaci o prijavljenom korisniku.
GET/api/user/checkBrza provjera valjanosti prijave.

Mediji

MetodaAdresaŠta radi
PUT/api/resource/single/{c}Učitava datoteku (zaglavlja file-*, tijelo = binarni podaci).
GET/api/resource/listing/{c}/1Lista medija; 1 = bez ograničenja vrste.
GET/api/resource/single/{c}/{id}Detalj medija.
DELETE/api/resource/single/{c}/{id}Briše medij.

Kampanje

MetodaAdresaŠta radi
GET/api/campaign/company/{c}Šablon nove kampanje.
POST/api/campaign/company/{c}Kreira kampanju kao nacrt.
PATCH/api/campaign/company/{c}Čuva promjene postojeće kampanje.
POST/api/campaign/listing/company/{c}Lista kampanja; tijelo zahtjeva sadrži filter.
GET/api/campaign/company/{c}/{id}Detalj kampanje.
GET/api/campaign/company/{c}/group/{groupId}Detalj kampanje prema groupId.
PATCH/api/campaign/company/{c}/{id}/{tz}/{impressions}Aktivira, pauzira ili nastavlja kampanju.
PATCH/api/campaign/company/{c}/{id}/{tz}Trajno zaustavlja kampanju.
DELETE/api/campaign/company/{c}/{id}Briše kampanju.

Lokacije i uređaji

MetodaAdresaŠta radi
GET/api/location/listing/{c}Lista lokacija.
GET/api/location/single/{id}Detalj lokacije uključujući radno vrijeme.
GET/api/device/listing/{c}/{locationId}Lista uređaja na lokaciji.
GET/api/device/single/{id}/{lang}Detalj uređaja; lang je kod jezika, naprimjer bs.

Izvještaji

MetodaAdresaŠta radi
GET/api/report/{c}/campaign/{groupId}Sažetak kampanje.
GET/api/report/{c}/campaign/{groupId}/impressionBroj zabilježenih prikaza.

Šifarnici

Vrijednosti šifarnika se u JSON-u zapisuju kao brojevi.

Stanje kampanje (state)

VrijednostStanjeZnačenje
2NacrtSačuvana kampanja koja se ne reprodukuje.
4ObjavljenaAktivirana kampanja koja čeka dan početka.
8AktivnaKampanja se reprodukuje.
16ZavršenaKraj kampanje je prošao.
32ZaustavljenaKampanja je trajno zaustavljena.
64IzbrisanaKampanja je izbrisana.
128PauziranaReprodukcija je privremeno prekinuta.

Vrste medija

Vrijednost typeZaglavlje file-typeMedij
2IMAGESlika (JPG, PNG, WebP)
4VIDEOVideo
8PDFPDF dokument
16WWW_APPWeb-aplikacija
32TEXTDugi tekst
128VIDEO_ALPHAVideo s prozirnom pozadinom
256AUDIOZvuk

Za dokument se u zaglavlju file-type koristi vrijednost PDF, a ne DOCUMENT.

Dozvole

Interfejs primjenjuje iste dozvole kao administracija i provjerava ih kod svakog zahtjeva. U odgovoru na prijavu svako je područje izraženo brojem koji je zbir pojedinačnih prava:

VrijednostPravo u vlastitoj Kompaniji
4Pregled
8Dodavanje
16Uređivanje
32Brisanje

Naprimjer, resource: 28 (4 + 8 + 16) znači da korisnik smije pregledati, dodavati i uređivati medije, ali ne i brisati ih. Više vrijednosti (128 do 1024) označavaju ista prava izvan vlastite Kompanije; integraciji nisu potrebne.

PodručjeMinimum za opisani postupak
resource – mediji12 (pregled, dodavanje)
device_layer_top – kampanje12 (pregled, dodavanje)
report_layer_top – izvještaji kampanja4 (pregled)
location – lokacije4 (pregled)
device_info – uređaji4 (pregled)

Aktivaciju, pauziranje i zaustavljanje kampanje omogućava pravo Dodavanje. Za brisanje aktivirane kampanje ili medija potrebno je pravo Brisanje; nacrt kampanje moguće je izbrisati i bez njega. Polazište može biti uloga Upravitelj reklama firme iz koje uklonite nepotrebna prava.

Kodovi grešaka

KodZnačenjePreporučeni postupak
400Neispravan zahtjevProvjerite identifikatore u adresi, vremensku zonu i obavezne podatke.
401Nedostaje dozvolaKorisnik nema potrebno pravo ili pristup toj Kompaniji. Kod kampanja najčešće nedostaje pravo Dodavanje.
404Nije pronađenoZapis ne postoji ili ne pripada navedenoj Kompaniji.
406Nije moguće izvršitiNeispravni pristupni podaci ili je kampanja u stanju iz kojeg traženi prelaz nije dozvoljen (npr. zaustavljena).
409Konflikt stanjaKampanja koja se kreira nije u stanju nacrta.
413Datoteka je prevelikaSmanjite datoteku; ograničenja navodi korak 2.
500Greška serveraPonovite zahtjev kasnije; ako se ponavlja, obratite se pružaocu.
Preporuke za implementaciju

Integraciju najprije isprobajte u testnom okruženju ili na uređaju koji javnost ne vidi — aktivirana kampanja se na produkcijskim uređajima stvarno reprodukuje. Izvan radnog vremena lokacije ne reprodukuje se nikakav sadržaj, čak ni kod kampanje s neprekidnim rasporedom.

Identifikatore medija i kampanja (id, groupId) čuvajte u vlastitom sistemu; interfejs ne nudi pretraživanje kampanja prema nazivu. Medije učitavajte postepeno, a izvještaje ne preuzimajte češće od jednom u nekoliko minuta. Oslanjajte se samo na adrese navedene u ovom vodiču.

Kompletan primjer

Skripta obavlja cijeli postupak od učitavanja slike do aktivacije kampanje na svim uređajima Kompanije. Potrebni su alati curl i jq.

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

API="https://admin.example.org"
AUTH="${INTEGRATION_AUTH:?postavite INTEGRATION_AUTH=login:lozinka}"
DATOTEKA="ljetno-snizenje.jpg"
NAZIV="Ljetno sniženje 2026"
OD="2026-11-02T00:00:00"
DO="2026-11-09T00:00:00"
TZ_OFFSET="+01:00"

# 1) identifikator Kompanije
COMPANY=$(curl -sf -u "$AUTH" "$API/api/public/login" | jq -r '.company.id')

# 2) učitavanje medija
RESOURCE=$(curl -sf -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: $DATOTEKA" \
  -H "file-suffix: jpg" \
  --data-binary "@$DATOTEKA" | jq -r '.id')

# 3) šablon kampanje
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > sablon.json

# 4) uređivanje šablona
jq --argjson res "$RESOURCE" --arg n "$NAZIV" --arg from "$OD" --arg to "$DO" '
  .name = $n
  | .start = $from
  | .end = $to
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Glavni vizual", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: $n, duration: 10000, type: 2 }]
    }]
' sablon.json > kampanja.json

# 5) kreiranje nacrta
ODGOVOR=$(curl -sf -u "$AUTH" -X POST \
  "$API/api/campaign/company/$COMPANY" \
  -H "Content-Type: application/json" \
  --data @kampanja.json)
CAMPAIGN=$(echo "$ODGOVOR" | jq -r '.id')
GROUP=$(echo "$ODGOVOR" | jq -r '.groupId')

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

echo "Kampanja $CAMPAIGN aktivirana, izvještaj: $API/api/report/$COMPANY/campaign/$GROUP"
Niste pronašli ono što ste tražili?
Obratite se svom pružaocu softvera.