Sigurnosne preporuke za API ključeve
API ključ nikada nije pohranjen u bazi u čistom tekstu - pohranjuje se samo SHA256 hash. U korisničkom sučelju vidljivo je samo zadnjih 8 znakova ključa (referenca). Savjetujemo da:
Rotirajte ključeve periodično - kreirajte novi ključ, ažurirajte integraciju, obrišite stari.
Postavite datum isteka za ključeve koji se koriste privremeno.
Pratite
lastUsedAt- deaktivirajte nekorištene ključeve.Ne dijelite ključeve između različitih sustava - kreirajte zasebne ključeve za svaku integraciju.
Pohranite ključ sigurno - koristite environment varijable ili secret manager, nikad hardkodirajte.
Ako sumnjate da je ključ kompromitiran, odmah ga deaktivirajte i kreirajte novi.
Postoji li Parra Sandbox (testno) okruženje za API integraciju?
Parra Sandbox okruženje je dostupno za testiranje API integracije putem linka koji ste zaprimili u emailu nakon generiranja API ključa. Preporučamo da ga koristite.
Kako konfigurirati ovo okruženje pročitajte na ovom linku.
Preporuka za upravljanje rate limitom
Pratite response headere
Implementirajte praćenje
X-RateLimit-Remainingheadera u vašoj integraciji. Kada se približite limitu, usporite zahtjeve.Implementirajte exponential backoff
Kada dobijete
429odgovor:1. pokušaj: čekaj 1 sekundu
2. pokušaj: čekaj 2 sekunde
3. pokušaj: čekaj 4 sekunde
4. pokušaj: čekaj 8 sekundi
...
Koristite Retry-After header
Retry-Afterheader govori koliko sekundi trebate čekati prije sljedećeg zahtjeva.Batchajte zahtjeve
Umjesto da šaljete puno pojedinačnih zahtjeva, grupirajte operacije gdje je moguće.
Cache-irajte podatke
Šifrarnike (valute, zemlje, jedinice mjere) dohvaćajte jednom i cache-irajte lokalno.
Verzioniranje - specifikacija verzije
API koristi zadanu verziju 1.0. Preporučujemo uvijek eksplicitno navesti verziju da izbjegnete neočekivano ponašanje. Uvijek koristite v1.1 za nove integracije. Verzija 1.0 je deprecated i bit će uklonjena u budućnosti.
Kako specificirati verziju:
Preporučeno: URL putanja (path versioning)
GET /v1.1/123/customers GET /v1/123/invoices
Ako koristite v1 bez minor verzije, sustav koristi zadanu verziju 1.0.
Alternativa 1: Query string
GET /123/customers?api-version=1.1
Alternativa 2: HTTP header
X-API-Version: 1.1
Checklist za migraciju v1.0 > v1.1.
[ ] Promijenite verziju u URL-u na /v1.1/
[ ] Zamijenite currencyId s currencyMark
[ ] Zamijenite countryId s countryCode
[ ] Zamijenite unitOfMeasureId s unitOfMeasureCode
[ ] Zamijenite operatorId s operatorOib
[ ] Zamijenite taxExcludeBasisId s taxExcludeBasisMark
[ ] Ažurirajte parsiranje enum vrijednosti (objekt umjesto int)
[ ] Ažurirajte parsiranje lista kupaca/artikala (paginacija)
[ ] Ažurirajte obradu odgovora pri kreiranju računa (objekt umjesto int)
[ ] Za B2C: uklonite documentDate iz zahtjeva
[ ] Dodajte logiranje X-Correlation-ID headera za debugging
[ ] Testirajte sve endpointe s /v1.1/ verzijom
Preporuke za korištenje šifrarnika
Cache-irajte šifrarnike - podaci se rijetko mijenjaju, dovoljno ih je dohvaćati jednom dnevno.
Koristite enum endpointe za prikaz opcija korisniku ili za validaciju prije slanja zahtjeva.
Preporuke za error handling
Uvijek provjerite HTTP status kod - ne oslanjajte se samo na body odgovora
Parsirajte
errorCodepolje - koristite ga za programsku obradu grešakaLogirajte cijeli odgovor - uključujući headere, za debugging
Implementirajte retry logiku za
429i500greške s exponential backoffNE ponavljajte zahtjeve za
400i401greške - one zahtijevaju ispravku ulaznih podataka
API ne radi, što da provjerim?
Redom provjerite sve sljedeće:
Je li API ključ aktivan i nije istekao?
Koristite li ispravan
businessSubjectId?Je li
Authorization: Bearer {ključ}header ispravno formatiran?Je li vaša IP adresa na whitelisti (ako je konfigurirano)?
Jeste li prekoračili rate limit?
Provjerite
/diagnostics/pingza dijagnostiku.
Prikazuje se: 500 Internal Server Error. Što da radim?
Pokušajte ponovo s exponential backoff. Ako se ponavlja, kontaktirajte Parra podršku na [email protected] sa sljedećim informacijama:
Točnim vremenom greške
Endpoint koji pozivate
Request body (bez API ključa!)
Response body - CorrelationId
Zašto dobivam InvoiceNumberMismatchWithFormatSettings?
Broj računa mora točno odgovarati formatu iz postavki. Uvijek koristite /next-invoice-number endpoint.
Što znači draftInvoiceId query parameter?
Ako ste prethodno kreirali skicu (draft) računa, možete je finalizirati slanjem na isti endpoint s draftInvoiceId parametrom.
Mogu li koristiti API iz browsera (JavaScript)?
Ne preporučujemo jer bi API ključ bi bio vidljiv u kodu. Koristite server-side integraciju.
Ostali česti scenariji i primjeri najbolje prakse
Scenarij 1: Prva integracija - test poziv
Cilj: Provjeriti da API ključ radi i da je konfiguracija ispravna.
GET /v1.1/diagnostics/ping Authorization: Bearer {vaš_api_ključ}Ako dobijete:
200 OK → sve je ispravno, u odgovoru vidite
businessSubjectId401 → ključ je neispravan, istekao ili deaktiviran
403 → IP adresa nije dozvoljena - 429 → rate limit prekoračen
Scenarij 2: Automatsko kreiranje B2B računa iz ERP sustava
Tijek rada
1. Cache-iraj šifrarnike (jednom dnevno):
GET /codebooks/currencies
GET /codebooks/countries
GET /codebooks/units-of-measure
GET /settings/workspaces
GET /settings/payment-devices?workspaceId=...
GET /settings/operators
GET /settings/bank-accounts
2. Za svaki račun: .
a) GET /invoices/next-invoice-number?invoiceDateTime=...&workSpaceMark=PP1&paymentDeviceMark=NU1
b) POST /invoices/b2b (s podacima iz koraka a)
c) Provjeri odgovor - spremi invoice ID
3. Opcionalno:
GET /invoices/{id}/download/xml (za B2B eRačune)
GET /invoices/{id}/download/pdf (obični PDF račun)
Ključne napomene
Uvijek koristite
/next-invoice-number- na taj način se Parra brine o slijednosti računaŠaljite račune sekvencijalno (ne paralelno) za isti poslovni prostor/naplatni uređaj. U suprotnom je moguće da dođe do pogreške zbog neispravne slijednosti.
Provjerite odgovor - v1.1 vraća puni InvoiceDetailsDto pa možete odmah vidjeti status fiskalizacije
Scenarij 3: Automatska obrada dolaznih eRačuna
Tijek rada
1. Periodično (npr. svakih 15 minuta):
GET /incoming-einvoices/unprocessed?page=1&pageSize=100
2. Za svaku neobrađeni eRačun:
a) GET /incoming-einvoices/{id} (dohvati detalje)
b) Procesiraj prema poslovnim pravilima
c1) PATCH /incoming-einvoices/{id}/send-to-accounting
ILI
c2) POST /incoming-einvoices/{id}/reject
3. Nastavi s paginacijom dok ima neobrađenih
Ključne napomene
Koristite
/unprocessedendpoint umjesto/incoming-einvoicesza efikasniji pollingImplementirajte idempotentnost - ako je eRačun već obrađen, API vraća grešku (ne duplikat)
Logirajte sve akcije za revizijski trag
Scenarij 4: Sinkronizacija kupaca
1. GET /customers - dohvati sve kupce
2. Usporedi s lokalnom bazom
3. Ažuriraj lokalne zapise
Kupci se mogu samo čitati putem API-ja. Kreiranje/uređivanje je moguće samo kroz Parra aplikaciju.
Scenarij 5: Dohvat i preuzimanje računa
1. GET /invoices?page=1&pageSize=100 (dohvati listu)
2. Za svaki račun koji trebate: GET /invoices/{id} (detalji)
3. Za preuzimanje datoteka:
GET /invoices/{id}/download/xml (eRačun)
GET /invoices/{id}/download/pdf (obični PDF račun)
4. Preuzmi datoteku s SAS URI-ja
SAS URI je privremeni! Koristite ga odmah nakon dohvata. Ako istekne, pozovite endpoint ponovo.
Primjeri najbolje prakse
1. Error handling
try:
response = api.call(endpoint)
if response.status == 200:
process(response.data)
elif response.status == 429:
wait(response.headers['Retry-After'])
retry()
elif response.status == 400:
log_error(response.body.errorCode, response.body.detail)
# NE pokušavaj ponovo - ispravi zahtjev
elif response.status == 401:
alert("API ključ je neispravan!")
elif response.status >= 500:
retry_with_backoff()
2. Rate limit management
Pratite
X-RateLimit-RemainingheaderKad padne ispod 10%, usporite zahtjeve
Implementirajte red čekanja za zahtjeve
3. Retry logika
HTTP status | Pokušaj ponovo? | Strategija |
200 | Ne | Uspjeh |
400 | Ne | Ispravi zahtjev |
401 | Ne | Provjeri API ključ |
403 | Ne | Provjeri businessSubjectId / IP |
404 | Ne | Resurs ne postoji |
429 | Da | Čekaj Retry-After sekundi |
500 | Da | Exponential backoff (1s, 2s, 4s, 8s) |
502/503 | Da | Exponential backoff |
4. Caching strategija
Resurs | Koliko često osvježiti | Razlog |
Valute | 1x dnevno | Rijetko se mijenjaju |
Države | 1x dnevno | Statični podatak |
Jedinice mjere | 1x dnevno | Rijetko se mijenjaju |
KPD | 1x tjedno | Gotovo nikad se ne mijenja |
Operateri | 1x po sesiji | Mogu se dodavati |
Bankovni računi | 1x po sesiji | Rijetko se mijenjaju |
Poslovni prostori | 1x po sesiji | Rijetko se mijenjaju |
Naplatni uređaji | 1x po sesiji | Rijetko se mijenjaju |
5. Sigurnost integracije
Pohranite API ključ u environment varijable ili secret manager
Nikad ne logirajte API ključ u logove
Implementirajte circuit breaker za zaštitu od kaskadnih grešaka
Postavite timeout na zahtjeve (preporučeno: 30 sekundi)
6. Monitoring
Pratite sljedeće metrike u vašoj integraciji:
Broj uspješnih vs neuspješnih zahtjeva
Prosječno vrijeme odgovora
Rate limit iskorištenost
Broj 429 i 500 grešaka
Vrijeme zadnjeg uspješnog poziva
