API za programere
Otvoreni API platforme Vitrina: jelovnik, narudžbe, rezervacije, gosti i prodaja za vašu blagajnu, kuhinjski zaslon, CRM ili računovodstvo. REST i JSON, ključevi s ovlastima, potpisani webhookovi.
Što možete raditi
- Jelovnik: kategorije, jela, cijene i dostupnost po lokacijama te popis rasprodanog: povući jelo iz prodaje ili ga vratiti
- Uređivanje jelovnika: kategorije i jela, nazivi i opisi na jezicima gostiju, cijene, porcije, modifikatori, redoslijed i vidljivost
- Narudžbe: popis s filtrima, stavke i iznosi, statusi kuhinje i izdavanja (prihvaćena, priprema se, gotova, izdana)
- Nove narudžbe iz pozivnog centra, kioska ili druge web-stranice, s istim cijenama i pravilima dostave kao na vašoj web-stranici; blagajna i kuhinja vide ih odmah, a gost plaća pri preuzimanju
- Dostava: tko vozi (samo ime dostavljača), kada je preuzeo i kada je dostavio narudžbu: u samoj narudžbi i kao događaj
- Plaćanja i povrati novca za svaku narudžbu za usklađivanje, samo za čitanje
- Rezervacije: popis, nova rezervacija i promjena statusa (potvrditi, odbiti, gost je došao ili nije došao)
- Gosti: profili i kontakti, samo uz posebno dopuštenje
- Bodovi gostiju: dodijeliti ili oduzeti uz razlog, uz posebno dopuštenje; stanje ne ide u minus, a svaka se operacija bilježi u dnevnik
- Prodaja po danima za računovodstvo: narudžbe, prihod, popusti, povrati novca i napojnice po načinima plaćanja i kanalima
- Lokacije: adrese, kontakti i radno vrijeme
- Događaji (nova narudžba, promjena statusa, plaćanje, otkazivanje, povrat novca, dostava, nova rezervacija, popis rasprodanog i promjene jelovnika) webhookom na vaš poslužitelj
API ne može naplatiti, vratiti novac ni otkazati narudžbu: novcem gostiju upravlja samo sam lokal. Zato gost narudžbe iz API-ja plaća pri preuzimanju.
Pristup i ovlasti
Ključ izrađuje vlasnik lokala na upravljačkoj ploči, u odjeljku „API i webhookovi”: daje integraciji naziv te odabire ovlasti i lokacije. Ključ se prikazuje samo jednom (u bazi ostaje samo njegov otisak) i može se opozvati u bilo kojem trenutku. Imena, telefone i adrese gostiju integracija vidi samo uz ovlast customers:read.
Ovlasti ključa
locations:read- Lokacije: adrese, kontakti i radno vrijeme
menu:read- Jelovnik, cijene i dostupnost jela
menu:write- Popis rasprodanog: povući jelo iz prodaje ili ga vratiti
menu:manage- Uređivanje jelovnika: kategorije, jela, cijene, porcije i redoslijed
orders:read- Narudžbe: popis i pojedinosti, bez kontakata gosta
orders:write- Statusi kuhinje i izdavanja
orders:create- Nove narudžbe s plaćanjem pri preuzimanju
payments:read- Plaćanja i povrati novca za narudžbe, samo za čitanje
reservations:read- Rezervacije: popis i pojedinosti
reservations:write- Nova rezervacija i promjena njezina statusa
customers:read- Ime, telefon, e-pošta i adresa gosta u narudžbama, rezervacijama i popisu gostiju
loyalty:write- Dodjela i oduzimanje bodova gosta, samo zajedno s pristupom gostima
reports:read- Prodaja po danima za računovodstvo
Prvi zahtjev
API radi na poslužitelju lokala: svaki klijent platforme Vitrina ima vlastiti poslužitelj i vlastitu domenu. Ključ se šalje u zaglavlju Authorization: Bearer vit_live_…, a odgovor je JSON uvijek u istoj omotnici: podaci, servisna polja i pogreška s kodom i tekstom na jeziku zahtjeva.
curl https://api.example.com/api/open/v1/ping \
-H "Authorization: Bearer vit_live_…"{
"data": {
"ok": true,
"brand": "my-bistro",
"apiVersion": "2026-10-13",
"serverTime": "2026-10-13T09:30:00.000Z",
"clientName": "POS integration",
"scopes": ["menu:read", "orders:read", "orders:write"],
"cafeIds": []
},
"meta": null,
"error": null
}Webhookovi
Adrese za događaje vlasnik dodaje u istom odjeljku ploče i za svaku odabire koje joj događaje slati. Svaki je zahtjev potpisan: zaglavlje Vitrina-Signature sadrži vrijeme slanja i HMAC-SHA256 vremena i tijela zahtjeva, izračunat tajnim ključem adrese. Imena i kontakti gostiju u događajima idu samo na adrese s uključenom opcijom „Slati kontakte gosta”.
Događaji
order.created- Nova narudžba
order.status_changed- Promijenio se status narudžbe
order.paid- Narudžba je plaćena
order.cancelled- Narudžba je otkazana
order.refunded- Gostu su vraćeni novac ili bodovi
order.delivery_updated- Dostavljač je dodijeljen ili uklonjen, narudžba je preuzeta ili dostavljena
reservation.created- Nova rezervacija
reservation.status_changed- Promijenio se status rezervacije
menu.availability_changed- Jelo je povučeno iz prodaje ili vraćeno
menu.changed- Promijenio se jelovnik: kategorije, jela, cijene ili redoslijed
import { createHmac, timingSafeEqual } from 'node:crypto'
const TOLERANCE_SECONDS = 300
export function isFromVitrina(rawBody, header, secret) {
const parts = header.split(',').map((part) => part.trim().split('='))
const t = parts.find(([name]) => name === 't')?.[1] ?? ''
const age = Math.abs(Date.now() / 1000 - Number(t))
if (!/^\d+$/.test(t) || age > TOLERANCE_SECONDS) return false
const hmac = createHmac('sha256', secret).update(`${t}.${rawBody}`)
const want = Buffer.from(hmac.digest('hex'))
return parts
.filter(([name]) => name === 'v1')
.map(([, value]) => Buffer.from(value ?? ''))
.some((got) => got.length === want.length && timingSafeEqual(got, want))
}Potpis se računa iz sirovog tijela zahtjeva, prije parsiranja JSON-a. Odbacite potpis stariji od 5 min; ponovna dostava istog događaja nosi isti Vitrina-Event-Id; po njemu uklonite duplikate.
Ograničenja i pouzdanost
- 600 zahtjeva u minuti po ključu, vršno do 60 odjednom; iznad ograničenja stiže odgovor 429 i zaglavlje
Retry-After - Zaglavlje
Idempotency-Keyu POST, PUT i PATCH: ponavljanje s istim ključem unutar 24 h vraća prvi odgovor umjesto stvaranja duplikata; kod novih narudžbi i bodova je obavezno - Popisi po stranicama: limit do 200 i offset, u odgovoru ukupan broj
- Ako vaš poslužitelj ne odgovori u roku od 10 s, događaj šaljemo ponovno s rastućom stankom: 8 pokušaja tijekom gotovo dva dana
- Adresa koja nije primila 20 dostava zaredom sama se isključuje; dnevnik dostava čuva se 30 dana, a svaki događaj iz njega može se ponovno poslati
Verzije
Verzija je u adresi: /api/open/v1. Nekompatibilne promjene izlaze samo kao nova verzija uz staru, a stara odgovara dok je se koristi. Datum revizije sučelja je u polju apiVersion svakog događaja, trenutačno 2026-10-13.
Potpuni opis
Svi zahtjevi, odgovori i kodovi pogrešaka nalaze se u OpenAPI specifikaciji na poslužitelju lokala: stranica /api/open/v1/docs i datoteka /api/open/v1/openapi.json za generatore klijenata.
Za integratore
Razvijate integraciju za više lokala, na primjer blagajnu, dostavnu službu ili računovodstvo? Pišite nam: dat ćemo vam testni pristup i pomoći s prvim povezivanjem.
Koliko košta
API i webhookovi uključeni su u pakete „Potpuni” i „Lanac”. Za „Start” i „Restoran” na upit.