API za povezivanje s vašim sustavom
Uvod i orijentacija
Kako upravljati medijima, kampanjama i izvještajima izravno iz vašeg sustava bez prijave u administraciju.
Čemu služi API
API omogućuje povezivanje sustava korisnika platforme — primjerice web-trgovine, planera reklamnih kampanja ili internog kataloga — izravno s upravljanjem sadržajem uređaja. Vaš sustav može učitavati medije, izrađivati i pokretati kampanje te preuzimati njihove rezultate, a da se nitko ne mora prijavljivati u administraciju i ručno obavljati te radnje.
Sučelje je isto ono koje koristi web-administracija. Putem API-ja stoga 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 te provjerava format medija i kapacitet uređaja. API ima smisla kada vas ručni rad počne usporavati.
| Trebate | Preporučeni način |
|---|---|
| Učitati nekoliko medija i pokrenuti kampanju | Administracija |
| Redovito, ali ručno mijenjati sadržaj | Administracija |
| Skupno učitavati medije iz vlastitog sustava | API |
| Automatski izrađivati kampanje prema vlastitom planeru | API |
| Preuzimati rezultate kampanja u vlastiti sustav izvještavanja | API |
Sučelje nije verzionirano i može se mijenjati s razvojem platforme. Prije uvođenja integraciju najavite svojem pružatelju softvera i nakon ažuriranja sustava provjerite radi li i dalje.
Kome je vodič namijenjen i tko je za što odgovoran
- Pružatelj platforme upravlja sučeljem, priopćuje adresu administracije i postavlja način reprodukcije Tvrtke.
- Korisnik platforme odlučuje o opsegu integracije i u svojoj Tvrtki izrađuje zasebnog korisnika s potrebnim dozvolama — vidi Izrada korisnika i prva prijava.
- Razvojni programer integracije povezuje sustav korisnika sa sučeljem. 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 razvojne 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: sučelje radi na istoj adresi kao vaša administracija; sve putanje počinju s
/api/. U primjerima je adresa zamijenjena shttps://admin.example.org. Testno okruženje, ako je dostupno, priopćit će vam pružatelj. - Prijava: svaki zahtjev nosi pristupne podatke metodom HTTP Basic Auth. Sesije ni tokeni se ne koriste.
- Format podataka: tijela zahtjeva i odgovori u formatu su JSON. Iznimka 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 prihvaćanje zahtjeva, a ne trenutačnu reprodukciju na uređajima.
Prijava
Korisničko ime nije e-adresa, nego kod od osam znakova koji je sustav generirao pri izradi korisnika, primjerice A1B2C3D4. Za integraciju izradite zasebnog korisnika s najmanjim potrebnim dozvolama; njegov pristup tada se u svakom trenutku može ukloniti bez utjecaja na ostale korisnike.
curl -u "A1B2C3D4:vasa-lozinka" https://admin.example.org/api/public/loginLozinka se šalje sa svakim zahtjevom. Pohranite je kao tajni podatak, primjerice u varijablu okruženja ili trezor lozinki, nikada u izvorni kod, repozitorij ili zapisnike.
Primjeri u nastavku pretpostavljaju postavljene varijable:
export API="https://admin.example.org"
export AUTH="A1B2C3D4:vasa-lozinka"Primjeri koriste alat curl jer ne ovisi o programskom jeziku. Sučelje je obični HTTP pa ga je moguće pozivati iz bilo kojeg jezika ili alata s podrškom za Basic Auth, primjerice Python, JavaScript, PHP, Postman ili Make.
Postupak: od datoteke do pokrenute kampanje
- Saznajte identifikator Tvrtke. Koristit ćete ga u svim daljnjim pozivima.
- Učitajte medij. Odgovor vraća njegov identifikator.
- Učitajte predložak kampanje. Poslužitelj ga unaprijed ispunjava postavkama Tvrtke i popisom lokacija i uređaja.
- Uredite predložak — naziv, razdoblje, ciljne uređaje i vizual.
- Izradite kampanju. Nastaje kao skica i zasad se ne reproducira.
- Aktivirajte kampanju. Sustav priprema novi plan reprodukcije i šalje ga na uređaje.
- Pratite rezultate u izvještaju kampanje.
1. Identifikator Tvrtke
curl -u "$AUTH" "$API/api/public/login"Odgovor (skraćeno):
{
"id": 1715714421868,
"name": "Integracija – web-trgovina",
"login": "A1B2C3D4",
"company": { "id": 1698234512001, "name": "Reklamna agencija d.o.o." },
"permission": {
"resource": 12,
"device_layer_top": 12,
"report_layer_top": 4
}
}Spremite 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; njezina 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| Zaglavlje | Sadržaj |
|---|---|
file-type | Vrsta medija prema tablici Vrste medija, primjerice IMAGE. |
file-mime | MIME vrsta datoteke, primjerice image/jpeg, video/mp4 ili application/pdf. |
file-name | Naziv medija u administraciji; eventualni nastavak poslužitelj uklanja. Naziv s dijakritičkim znakovima kodirajte kao URL (encodeURIComponent). |
file-suffix | Nastavak datoteke bez toč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 poslužitelj odbija kodom
413. - Priprema videozapisa: video se nakon učitavanja konvertira u pozadini. Spreman je kada detalj medija (
GET /api/resource/single/{companyId}/{id}) sadrži popunjenu vrijednostdt_ready. Kod slika je priprema praktički trenutačna. - Nedostaje zaglavlje: bez
file-mime,file-nameilifile-suffixposlužitelj vraća204i ne izrađuje medij. Prije sljedećeg koraka zato uvijek provjerite sadrži li odgovorid.
3. Predložak kampanje
Kampanju ne sastavljajte ručno. Zatražite predložak koji poslužitelj unaprijed ispunjava zadanim razdobljem (od danas na mjesec dana), postavkama Tvrtke i popisom 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.jsonPrimjer predloška (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": "Trgovački 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 Tvrtke: 2 = SLOT, 4 = IMPRESSION. Način postavlja pružatelj i nije ga moguće promijeniti putem API-ja.
4. Uređivanje predloška
name: naziv kampanje prikazan u administraciji i izvještajima.start,end: početak i kraj kampanje.isActive: postavite natruekod uređaja na kojima se kampanja treba reproducirati.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
}
]
}
]| Polje | Značenje |
|---|---|
id | Bilo koji broj jedinstven unutar kampanje; poslužitelj ga pri izradi prenumerira. |
isPrimary | true kod glavnog vizuala, kod ostalih false. |
isCustom | true – vizual pripada ovoj kampanji. |
resourceId | Identifikator medija iz koraka 2. |
duration | Trajanje prikaza u milisekundama. |
type | Vrsta medija; ista vrijednost koju je učitavanje vratilo u polju type. |
Uređivanje je moguće obaviti skriptom, primjerice 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-uredena.jsonAko kampanja cilja zaslone u vodoravnom i okomitom položaju (isHorizontal), dodajte vizual za svaku orijentaciju. U suprotnom će se sadržaj na dijelu zaslona obrezati ili smanjiti. Pojedinosti opisuje vodič Vizuali kampanje.
5. Izrada kampanje
curl -u "$AUTH" -X POST \
"$API/api/campaign/company/$COMPANY" \
-H "Content-Type: application/json" \
--data @kampanja-uredena.json \
-o odgovor.json
export CAMPAIGN=$(jq -r '.id' odgovor.json)
export GROUP=$(jq -r '.groupId' odgovor.json)Kampanja nastaje u stanju skice i nigdje se ne reproducira. Odgovor sadrži spremljenu kampanju s dodijeljenim vrijednostima id i groupId. Predložak ima ispravno postavljeno stanje state: 2 (skica); drugu vrijednost poslužitelj 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 Hrvatsku+01:00u zimskom i+02:00u ljetnom računanju vremena.0: očekivani broj prikaza za cijelu kampanju. Primjenjuje se u načinu IMPRESSION; u načinu SLOT navedite0.
Kampanja s današnjim ili ranijim početkom prelazi u stanje aktivna, a njezin se početak postavlja na trenutak aktivacije. Kampanja s budućim početkom prelazi u stanje objavljena i pokreće se na planirani dan.
Sustav zatim ponovno izračunava plan reprodukcije i šalje ga na pogođene uređaje. Kod povezanih uređaja to obično traje desetke sekundi; nepovezani uređaj preuzima plan nakon ponovne uspostave 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 skupinama pa podaci nisu dostupni u stvarnom vremenu. Značenje podataka opisuje Izvještaj kampanje.
Pauziranje, zaustavljanje i brisanje
# pauziranje aktivne kampanje, ponovni poziv je ponovno 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 ponovno pokreće. Prije poziva zato provjerite trenutačno stanje kampanje (state u detalju). Zaustavljenu kampanju nije moguće ponovno pokrenuti, ali ostaje na popisu zajedno s izvještajima. Izbrisana kampanja nestaje s popisa.
Pregled adresa
Adrese su relativne u odnosu na adresu administracije. {c} označava identifikator Tvrtke.
Račun
| Metoda | Adresa | Što radi |
|---|---|---|
GET | /api/public/login | Provjerava prijavu i vraća profil korisnika uključujući company.id. |
GET | /api/user/info | Podaci o prijavljenom korisniku. |
GET | /api/user/check | Brza provjera valjanosti prijave. |
Mediji
| Metoda | Adresa | Što radi |
|---|---|---|
PUT | /api/resource/single/{c} | Učitava datoteku (zaglavlja file-*, tijelo = binarni podaci). |
GET | /api/resource/listing/{c}/1 | Popis medija; 1 = bez ograničenja vrste. |
GET | /api/resource/single/{c}/{id} | Detalj medija. |
DELETE | /api/resource/single/{c}/{id} | Briše medij. |
Kampanje
| Metoda | Adresa | Što radi |
|---|---|---|
GET | /api/campaign/company/{c} | Predložak nove kampanje. |
POST | /api/campaign/company/{c} | Izrađuje kampanju kao skicu. |
PATCH | /api/campaign/company/{c} | Sprema promjene postojeće kampanje. |
POST | /api/campaign/listing/company/{c} | Popis kampanja; tijelo zahtjeva sadrži filtar. |
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
| Metoda | Adresa | Što radi |
|---|---|---|
GET | /api/location/listing/{c} | Popis lokacija. |
GET | /api/location/single/{id} | Detalj lokacije uključujući radno vrijeme. |
GET | /api/device/listing/{c}/{locationId} | Popis uređaja na lokaciji. |
GET | /api/device/single/{id}/{lang} | Detalj uređaja; lang je kod jezika, primjerice hr. |
Izvještaji
| Metoda | Adresa | Što radi |
|---|---|---|
GET | /api/report/{c}/campaign/{groupId} | Sažetak kampanje. |
GET | /api/report/{c}/campaign/{groupId}/impression | Broj zabilježenih prikaza. |
Šifrarnici
Vrijednosti šifrarnika u JSON-u se zapisuju kao brojevi.
Stanje kampanje (state)
| Vrijednost | Stanje | Značenje |
|---|---|---|
2 | Skica | Spremljena kampanja koja se ne reproducira. |
4 | Objavljena | Aktivirana kampanja koja čeka dan početka. |
8 | Aktivna | Kampanja se reproducira. |
16 | Završena | Kraj kampanje je prošao. |
32 | Zaustavljena | Kampanja je trajno zaustavljena. |
64 | Izbrisana | Kampanja je izbrisana. |
128 | Pauzirana | Reprodukcija je privremeno prekinuta. |
Vrste medija
Vrijednost type | Zaglavlje file-type | Medij |
|---|---|---|
2 | IMAGE | Slika (JPG, PNG, WebP) |
4 | VIDEO | Video |
8 | PDF | PDF dokument |
16 | WWW_APP | Web-aplikacija |
32 | TEXT | Dugi tekst |
128 | VIDEO_ALPHA | Video s prozirnom pozadinom |
256 | AUDIO | Zvuk |
Za dokument se u zaglavlju file-type koristi vrijednost PDF, a ne DOCUMENT.
Dozvole
Sučelje primjenjuje iste dozvole kao administracija i provjerava ih kod svakog zahtjeva. U odgovoru na prijavu svako je područje izraženo brojem koji je zbroj pojedinačnih prava:
| Vrijednost | Pravo u vlastitoj Tvrtki |
|---|---|
4 | Pregled |
8 | Dodavanje |
16 | Uređivanje |
32 | Brisanje |
Primjerice, resource: 28 (4 + 8 + 16) znači da korisnik smije pregledavati, dodavati i uređivati medije, ali ne i brisati ih. Više vrijednosti (128 do 1024) označavaju ista prava izvan vlastite Tvrtke; integraciji nisu potrebne.
| Područje | Minimum za opisani postupak |
|---|---|
resource – mediji | 12 (pregled, dodavanje) |
device_layer_top – kampanje | 12 (pregled, dodavanje) |
report_layer_top – izvještaji kampanja | 4 (pregled) |
location – lokacije | 4 (pregled) |
device_info – uređaji | 4 (pregled) |
Aktivaciju, pauziranje i zaustavljanje kampanje omogućuje pravo Dodavanje. Za brisanje aktivirane kampanje ili medija potrebno je pravo Brisanje; skicu kampanje moguće je izbrisati i bez njega. Polazište može biti uloga Upravitelj reklama firme iz koje uklonite nepotrebna prava.
Kodovi pogrešaka
| Kod | Značenje | Preporučeni postupak |
|---|---|---|
400 | Neispravan zahtjev | Provjerite identifikatore u adresi, vremensku zonu i obavezne podatke. |
401 | Nedostaje dozvola | Korisnik nema potrebno pravo ili pristup toj Tvrtki. Kod kampanja najčešće nedostaje pravo Dodavanje. |
404 | Nije pronađeno | Zapis ne postoji ili ne pripada navedenoj Tvrtki. |
406 | Nije moguće izvršiti | Neispravni pristupni podaci ili je kampanja u stanju iz kojeg traženi prijelaz nije dopušten (npr. zaustavljena). |
409 | Sukob stanja | Kampanja koja se izrađuje nije u stanju skice. |
413 | Datoteka je prevelika | Smanjite datoteku; ograničenja navodi korak 2. |
500 | Pogreška poslužitelja | Ponovite zahtjev kasnije; ako se ponavlja, obratite se pružatelju. |
Integraciju najprije isprobajte u testnom okruženju ili na uređaju koji javnost ne vidi — aktivirana kampanja na produkcijskim se uređajima stvarno reproducira. Izvan radnog vremena lokacije ne reproducira se nikakav sadržaj, čak ni kod kampanje s neprekidnim rasporedom.
Identifikatore medija i kampanja (id, groupId) spremajte u vlastiti sustav; sučelje ne nudi pretraživanje kampanja prema nazivu. Medije učitavajte postupno, a izvještaje ne dohvaćajte češće od jednom u nekoliko minuta. Oslanjajte se samo na adrese navedene u ovom vodiču.
Cjeloviti primjer
Skripta obavlja cijeli postupak od učitavanja slike do aktivacije kampanje na svim uređajima Tvrtke. 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 Tvrtke
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) predložak kampanje
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > predlozak.json
# 4) uređivanje predloška
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 }]
}]
' predlozak.json > kampanja.json
# 5) izrada skice
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"Povezane teme i sljedeći koraci
← Natrag na pregled – Integracije i izrada sadržaja
Obratite se svojem pružatelju softvera.
