Što je Kigo Cloud API
Kigo Cloud API je programsko sučelje (REST, format JSON) preko kojega se vanjski sustavi povezuju s vašim Kigo Cloud računom. Najčešće ga koriste webshopovi i drugi poslovni programi za automatsku razmjenu podataka: sinkronizaciju artikala i zaliha, prijenos klijenata te izradu i fiskalizaciju računa izravno iz narudžbi, bez ručnog prepisivanja.
Osnovne informacije
| Osnovna adresa | https://app.kigo.cloud/hr/api/v1/ |
| Format podataka | JSON (zahtjevi i odgovori) |
| Autentikacija | Zaglavlja X-USERNAME i X-PASSWORD u svakom pozivu |
| Interaktivna dokumentacija | https://app.kigo.cloud/apiclouddoc/index.html (Swagger) |
Do interaktivne dokumentacije dolazite i iz aplikacije: Opcije → Integracije → API Dokumentacija.
Autentikacija
Svaki poziv šalje dva zaglavlja (header):
- X-USERNAME: korisničko ime, isto ono kojim se prijavljujete u Kigo Cloud.
- X-PASSWORD: lozinka istog korisnika kao MD5 sažetak (32 znamenke), nikad kao čisti tekst.
Korisnički račun mora biti aktivan. Primjer poziva koji dohvaća popis artikala:
curl -H "X-USERNAME: vase-korisnicko-ime" -H "X-PASSWORD: md5-hash-lozinke" https://app.kigo.cloud/hr/api/v1/item/list
Svi dostupni pozivi
Grupe artikala
GET category/list | Popis svih grupa |
GET category/{id} | Jedna grupa po ID-u |
POST category/create | Nova grupa (naziv, opis, aktivna) |
PATCH category/update/{id} | Izmjena grupe |
Artikli
GET item/list | Popis artikala; filtri: itemType, hidden, idCategory, barcode, page, pageSize |
GET item/{id} | Jedan artikl po ID-u |
GET item/getByReference | Artikl po šifri (reference) |
GET item/getAmountByReference | Zaliha artikla po šifri: vraća kolicina_na (količinu zabilježenu na artiklu) i kolicina (knjižno stanje izračunato iz skladišnog prometa) |
POST item/create | Novi artikl (naziv, šifra, prodajna cijena, PDV, grupa, jedinica mjere, KPD šifra...) |
PATCH item/update/{id} | Izmjena artikla |
Klijenti
GET client/list | Popis klijenata |
GET client/{id} | Jedan klijent po ID-u |
GET client/getByVat | Klijent po OIB-u (oib) |
GET client/getByReference | Klijent po vlastitoj referenci |
POST client/create | Novi klijent (naziv, OIB, adresa, kontakt, rabat...); fizičkoj osobi OIB nije obavezan, dodijeli se interna oznaka |
PATCH client/update/{id} | Izmjena klijenta |
Računi i ponude
GET invoice/list | Popis dokumenata vaše poslovnice, zadano računi. Filtri: document_type (tip dokumenta; vrijednost 30 vraća račune za predujam), status (0 otvoren, 1 zatvoren, 2 storno, 3 storniran), payment (G/T/K/O), created_from i created_to (format Y-m-d H:i:s, krivi format vraća 400), show_items=1 uključuje i stavke, page, pageSize |
GET invoice/view/{id} | Jedan dokument po ID-u |
GET invoice/getAsPdf/{id} | Dokument kao PDF datoteka ({id} je id_pos) |
POST invoice/create | Novi račun ili ponuda (detalji niže) |
POST invoice/cancel | Storniranje računa (detalji niže) |
PATCH invoice/update/{id} | Mijenja samo tri polja: pay_status_id (dozvoljene vrijednosti ovise o tipu dokumenta, kriva vraća 400), due_date i delivery_date (format Y-m-d H:i:s) |
Načini i statusi plaćanja
GET paymentCard/list | Popis kartičnih načina plaćanja |
GET paymentOther/list | Popis ostalih načina plaćanja |
GET payStatus/list | Popis statusa plaćanja (filtar pos_type) |
Izrada računa kroz API
Najvažniji poziv za webshopove je POST invoice/create. Ključna polja:
- pin: PIN aktivnog djelatnika; dokument dobiva tog operatera. Obavezno.
- pos_type: 1 račun, 2 ponuda (zadano), 3 servisna ponuda, 4 nabavna ponuda. Za pravi račun obavezno pošaljite
1. - payment: G gotovina, T transakcijski (zadano), K kartica, O ostalo. Za karticu pošaljite i
id_payment_card, a za ostaloid_payment_other: ID-evi izpaymentCard/listipaymentOther/list, nepostojeći ID vraća grešku. Gotovina, kartica i ostalo odmah se označavaju plaćenima; transakcijski račun ostaje neplaćen dok uplatu ne evidentirate. Samo dokumenti sTmogu se kasnije slati kao eRačun. - items: stavke računa, najviše 200 po dokumentu. Artikl se traži po šifri (
reference); ako šifra nije poslana, po nazivu (item_name). Ako se ne pronađe, automatski se kreira novi artikl u vašem šifrarniku: s poslanom ili dodijeljenom šifrom, PDV-om izvat_percentili 25% i općom grupom. Ista šifra poslana dvaput zbraja količine na jednoj stavci. Sve cijene šalju se s uključenim PDV-om; bez poslane cijene vrijedi prodajna cijena artikla.item_nameuz postojeći artikl mijenja naziv samo na toj stavci računa, ne i u šifrarniku. - Rabati: ako pošaljete
discount_percent, vrijedi točno taj postotak (0 znači bez rabata). Ako rabat ne pošaljete, a poslana cijena je niža od prodajne cijene artikla, razlika se na računu automatski iskazuje kao rabat. Cijena 0 znači gratis stavku (rabat 100%). Uzapply_client_discountsstavke koje su ostale bez rabata dobivaju rabat klijenta, a ako ga klijent nema, rabat grupe artikla. - client: obrađuje se samo ako sadrži
oib; po njemu se kupac prepoznaje, a ako ne postoji, automatski se kreira iz poslanih podataka (naziv, adresa, kontakt, e-mail). Bez OIB-a račun se izdaje bez kupca, što je za maloprodajni B2C račun uredno. Novi kupac je po zadanom tvrtka; poljeclient_vat_typeto mijenja: 0 tvrtka, 1 fizička osoba, 2 javna ustanova, 3 EU tvrtka, 4 tvrtka izvan EU. Vrsta kupca određuje fiskalizaciju transakcijskih računa, vidi f1 i F2 niže. - internal_number: broj narudžbe iz vašeg sustava. Jedinstven po tipu dokumenta: ako dokument s istim brojem već postoji, API vraća grešku 400 i ne radi duplikat. Zato je ponavljanje poziva nakon prekida veze sigurno.
Primjer 1: gotovinski maloprodajni račun (f1), bez kupca. Odmah se fiskalizira (u odgovoru jir i zki), označava plaćenim i ulazi u blagajnu:
{
"pin": "1234",
"pos_type": 1,
"payment": "G",
"items": [ { "reference": "ART-001", "quantity": 2 } ]
}
Primjer 2: transakcijski račun tvrtki (F2, eRačun). U odgovoru nema jir/zki, račun je neplaćen dok uplatu ne evidentirate, a na listi izdanih računa čeka slanje kao eRačun. U primjeru nije poslan client_vat_type, pa se novi kupac sprema kao tvrtka (zadana vrijednost 0) i upravo zato račun ide kao F2; za fizičku osobu poslali biste client_vat_type 1 i račun bi bio f1. OIB u primjeru prolazi kontrolnu znamenku: s neispravnim OIB-om kupac bi se spremio kao fizička osoba i račun bi također otišao kao f1, s fiskalizacijom:
{
"pin": "1234",
"pos_type": 1,
"payment": "T",
"internal_number": "WEB-1001",
"due_date": "2026-09-15",
"client": { "oib": "12345678903", "company_name": "Tvrtka d.o.o.", "street": "Ilica", "house_number": "1", "city": "Zagreb", "zip": "10000" },
"items": [ { "reference": "ART-001", "quantity": 2, "price": 25.00 } ]
}
Primjer 3: rabati po stavkama. Prva stavka dobiva točno 10%, drugoj se rabat izračuna iz snižene cijene prema prodajnoj cijeni artikla, treća je gratis (rabat 100%), a četvrta, bez ičega poslanog, dobiva rabat grupe artikla jer je uključen apply_client_discounts; kad je na računu i kupac s rabatom, njegov rabat ima prednost pred grupnim:
{
"pin": "1234",
"pos_type": 1,
"payment": "G",
"apply_client_discounts": true,
"items": [
{ "reference": "ART-001", "quantity": 1, "discount_percent": 10 },
{ "reference": "ART-002", "quantity": 1, "price": 80.00 },
{ "reference": "ART-003", "quantity": 1, "price": 0 },
{ "reference": "ART-004", "quantity": 1 }
]
}
Rezultat tog zahtjeva, uz pretpostavku da artikli imaju prodajnu cijenu 100,00 (ART-003 50,00), a grupa artikla ART-004 rabat 5%:
- ART-001: rabat točno 10%, naplaćuje se 90,00.
- ART-002: poslana cijena 80,00 uz prodajnu 100,00, pa se na stavci automatski iskazuje rabat 20% i naplaćuje 80,00.
- ART-003: cijena 0 znači gratis stavku: rabat 100%, naplaćuje se 0,00.
- ART-004: ništa nije poslano, pa se zbog
apply_client_discountsprimjenjuje rabat grupe od 5% i naplaćuje 95,00.
Odgovor poziva: polje data sadrži id_pos, pos_number, iznose (price, tax_pdv), način i status plaćanja te fiskalne podatke jir i zki s poveznicom QR koda (qrcode_link). Popunjeno jir polje znači da je račun uspješno fiskaliziran.
PDF i slanje kupcu: odgovor ne sadrži gotov URL PDF-a. PDF dohvaćate zasebnim pozivom GET invoice/getAsPdf/{id}, gdje je {id} vrijednost id_pos iz odgovora (ne pos_number); odgovor tog poziva je sama PDF datoteka. API račun ne šalje kupcu e-mailom (email iz client bloka samo se sprema na karticu klijenta), pa slanje računa kupcu radi vaš sustav s dohvaćenim PDF-om.
Fiskalizacija: koji račun ide kao f1, koji kao F2, a koji NF
Svaki račun (pos_type 1) pri zatvaranju automatski dobiva oznaku fiskalizacije prema načinu plaćanja i vrsti kupca; ponude se ne fiskaliziraju. Iste oznake vidite i na listi izdanih računa.
- f1 (klasična fiskalizacija): računi plaćeni gotovinom, karticom ili ostalim načinima, bez obzira na kupca, te transakcijski računi izdani fizičkoj osobi ili bez kupca. Račun se odmah šalje na fiskalizaciju i dobiva ZKI i JIR: u odgovoru su polja
zkiijirpopunjena. Za to u aplikaciji mora biti učitan fiskalni certifikat. - F2 (Fiskalizacija 2.0, obveza eRačuna): transakcijski račun (
paymentT) izdan domaćoj tvrtki ili javnoj ustanovi s ispravnim OIB-om. Ne dobiva JIR pri izdavanju (poljajirizkiu odgovoru ostaju prazna) nego se šalje kao eRačun: na listi izdanih računa nosi F2 oznaku, crvenu dok eRačun nije poslan, zelenu nakon slanja. - NF (nefiskalizirano): račun koji ne podliježe ni jednom ni drugom, na primjer transakcijski račun stranoj tvrtki ili gotovinski račun čije su sve stavke u prijenosu porezne obveze.
Storniranje računa
Poziv POST invoice/cancel uz pin djelatnika i id_pos (ID dokumenta) radi storno dokument, jednako kao storniranje u aplikaciji, i vraća ga u odgovoru. Originalni račun tada prelazi u status 3 (storniran), a novi storno dokument nosi status 2; zaliha skinuta originalnim računom se vraća.
Ograničenja i greške
| 401 | Nedostaju ili su neispravni podaci za prijavu |
| 400 | Neispravni podaci u zahtjevu; opis greške stiže u polju message |
| 404 | Traženi zapis ne postoji |
| 429 | Previše zahtjeva u kratkom vremenu; pričekajte pa pokušajte ponovno |
Popisi su straničeni, zadano 200 zapisa po stranici; stranicu i veličinu birate parametrima page i pageSize. Broj poziva u minuti po korisniku ograničen je paketom: Starter 5, Standard 15, Business 30, Premium 60. Iznad toga popisni pozivi vraćaju grešku 429, pričekajte minutu pa nastavite.
Isprobavanje poziva
U interaktivnoj dokumentaciji svaki poziv možete isprobati gumbom Try it out: iz padajućeg izbornika servera odaberite svoju adresu, upišite zaglavlja i parametre i odmah vidite stvarni odgovor.
Trebate pomoć?
Ako imate pitanja oko povezivanja ili vam za vaš slučaj nedostaje neki poziv, javite se na [email protected].