Sidrocjenici

Dokumentacija

API

REST API v1 za vlastite sustave, ERP i blagajne.

Baza: https://sidro-cjenici.vercel.app/api/v1 · OpenAPI 3.1: /api/v1/openapi.json

Autentikacija

Authorization: Bearer sidro_live_…

Ključ stvara administrator u ploči (Izvori podataka ili API i webhookovi). Prikazuje se jednom; u bazi se čuva samo sažetak. Svaki ključ je vezan uz vlastiti izvor: potpuna sinkronizacija s tim ključem deaktivira samo stavke koje je poslao on.

Greške i ograničenja

{ "error": { "code": "invalid_request", "message": "…", "details": {} } }

400 invalid_request · 401 unauthorized · 402 plan_limit · 403 forbidden (paket bez API-ja) · 404 not_found · 409 conflict · 429 rate_limited (120 zahtjeva u minuti po ključu, zaglavlje Retry-After) · 500 internal.

Upis kataloga

curl -X PUT https://sidro-cjenici.vercel.app/api/v1/items \
  -H "Authorization: Bearer $SIDRO_KEY" -H "Content-Type: application/json" \
  -d '{"items":[{"sku":"KR-500","name":"Kruh bijeli 500 g","brand":"Pekara Primjer","price":1.99,"unit":"g","unit_qty":500,"barcode":"3850000000014"}]}'

Do 500 stavki po zahtjevu. Neispravne stavke vraćaju se u errors, ostale se upisuju. Cijeli katalog u dijelovima: isti full_sync.id (UUID) u svim dijelovima i "final": true u zadnjem — tada se stavke tog izvora koje se nisu pojavile označe neaktivnima (ako sinkronizacija nije vidjela nijednu stavku, ništa se ne gasi). Izostavljeno polje znači „ne mijenjaj", izričit null briše vrijednost. Promijeni li se šifra uz isti source_ref, Sidro preimenuje stavku i zadrži sidrenu cijenu i povijest.

// Node.js 18+
const dijelovi = razlomi(katalog, 500);
const syncId = crypto.randomUUID();
for (const [i, items] of dijelovi.entries()) {
  const r = await fetch('https://sidro-cjenici.vercel.app/api/v1/items', {
    method: 'PUT',
    headers: { Authorization: `Bearer ${process.env.SIDRO_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ items, full_sync: { id: syncId, final: i === dijelovi.length - 1 } }),
  });
  if (!r.ok) throw new Error(await r.text());
}
// PHP
$ch = curl_init('https://sidro-cjenici.vercel.app/api/v1/items');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'PUT',
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('SIDRO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(['items' => $stavke], JSON_UNESCAPED_UNICODE),
  CURLOPT_RETURNTRANSFER => true,
]);
$odgovor = json_decode(curl_exec($ch), true);

Sidrena cijena preko API-ja

Pri upisu stavke anchor_price se primjenjuje samo ako stavka još nema potvrđenu sidrenu cijenu. Za svjesnu izmjenu: anchor_override: true + anchor_reason, ili PUT /anchors/{sku} s razlogom. Izmjena ide u revizijski zapis s nazivom ključa.

Ispod je puni popis krajnjih točaka.

Krajnje točke

get/api/v1/pingRačun

Test veze

Odgovori: 200, 401

get/api/v1/orgRačun

Organizacija, paket, ograničenja i javne adrese

Odgovori: 200

get/api/v1/itemsStavke

Popis stavki

ParametarGdjeTip
updated_sincequerystring
statusquerystring (potvrdjena | za_provjeru | nedostaje)
qquerystring
limitqueryinteger
cursorquerystring

Odgovori: 200

put/api/v1/itemsStavke

Skupni upis (upsert) do 500 stavki

Stavke se prepoznaju po `sku`. Neispravne stavke vraćaju se u `errors`, ostale se upisuju. Za cijeli katalog u više dijelova pošaljite isti `full_sync.id` u svim dijelovima i `final: true` u zadnjem — tada se deaktiviraju stavke istog izvora koje se nisu pojavile.

{
  "items": [
    {
      "sku": "KR-500",
      "name": "Kruh bijeli 500 g",
      "brand": "Pekara Primjer",
      "price": 1.99,
      "unit": "g",
      "unit_qty": 500,
      "barcode": "3850000000014"
    }
  ]
}

Odgovori: 200, 402

get/api/v1/items/{sku}Stavke

Stavka s poviješću cijena i revizijskim zapisom

ParametarGdjeTip
sku *pathstring

Odgovori: 200, 404

patch/api/v1/items/{sku}Stavke

Djelomična izmjena

ParametarGdjeTip
sku *pathstring

Odgovori: 200

delete/api/v1/items/{sku}Stavke

Deaktivacija (nikad brisanje)

ParametarGdjeTip
sku *pathstring

Odgovori: 200

get/api/v1/anchorsSidrene cijene

Sidrene cijene za prikaz uz cijenu

ParametarGdjeTip
updated_sincequerystring
limitqueryinteger
cursorquerystring

Odgovori: 200

put/api/v1/anchors/{sku}Sidrene cijene

Namjerna izmjena sidrene cijene (s razlogom)

ParametarGdjeTip
sku *pathstring
{
  "anchor_price": 12.49,
  "anchor_date": "2026-09-10",
  "reason": "Ispravak prema blagajni 10. 9."
}

Odgovori: 200

get/api/v1/storesLokacije

Popis lokacija s javnim adresama

Odgovori: 200

post/api/v1/storesLokacije

Nova lokacija

Odgovori: 201, 409

patch/api/v1/stores/{code}Lokacije

Izmjena lokacije

ParametarGdjeTip
code *pathstring

Odgovori: 200

post/api/v1/publishObjava

Objavi cjenik odmah

Odgovori: 200

get/api/v1/publicationsObjava

Arhiva objava

ParametarGdjeTip
storequerystring
fromquerystring
toquerystring

Odgovori: 200

get/api/v1/validationObjava

Nalazi zadnje provjere i stanje sidrenih cijena

Odgovori: 200

Polja stavke

PoljeTipOpis
sku *stringŠifra; ključ stavke unutar organizacije.
kindstringproizvod, usluga
name *string
brandstring | null
unitstring | nullkg, g, l, ml, m, m2, m3, kom, par, sat…
unit_qtynumber | nullNeto količina izražena u `unit`.
barcodestring | null
categorystring | null
legal_categorystringhrana, pice, kozmetika, sredstva_za_ciscenje, toaletne_potrepstine, proizvodi_za_kucanstvo, ostalo, usluga
price *numberRedovna maloprodajna cijena (bez akcije).
special_pricenumber | null
special_namestring | null
special_fromstring | null
special_tostring | null
availableboolean
activeboolean
storestring | nullOznaka lokacije za cijenu po lokaciji (paket Lanac).
source_refstring | nullStalni vanjski ID. Promijeni li se šifra uz isti source_ref, Sidro preimenuje stavku i zadrži sidrenu cijenu i povijest.
source_created_atstring | null
source_modified_atstring | nullZadnja izmjena u izvoru — dokaz za automatsku sidrenu cijenu.
anchor_pricenumber | nullPrimjenjuje se samo ako stavka još nema potvrđenu sidrenu cijenu, osim uz anchor_override.
anchor_datestring | null
anchor_overrideboolean
anchor_reasonstring