Pređi na sadržaj

API dokumentacija

Greške

Svaki neuspeh ima HTTP status, kod i jasno pravilo šta sme da se ponovi. Ovde je katalog kodova koje integrator sreće, šifre odbijanja V-PFR-a i preporuke za robusnu obradu.

Ažurirano: 29. 8. 2026. · Verzija ugovora 1.0.0

Oblici odgovora

  • { "code": "..." } sa opcionim message i dodatnim poljima (invalidLabels, module, operationId): pravilo BokaPOS-a, licenca ili okruženje.
  • RFC 9457 problem sa errors po polju (application/problem+json): validacija oblika zahteva, uvek 422.
  • Fiskalni dokument sa fiscalized: false (503): V-PFR nedostupan ili nepoznat ishod; status, failureCode i retryable kažu šta dalje.
  • Tok (refundacija, predračun, avans) sa svojim status/state i ugrađenim dokumentima: greška se čita iz stanja toka.
422: validacija polja (application/problem+json)
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.21",
  "title": "One or more validation errors occurred.",
  "status": 422,
  "errors": {
    "totals": [
      "The item and payment totals must match after the mandated two-decimal currency rounding."
    ]
  }
}
403: modul nije u licenci
{
  "code": "MODULE_NOT_LICENSED",
  "module": "advance",
  "message": "This module is not included in the organization's licence. Contact BokaPOS Administration to enable it."
}
422: oznaka nije u svežoj konfiguraciji
{
  "code": "TAX_LABEL_NOT_CURRENT",
  "invalidLabels": ["Ђ"],
  "message": "Every tax label must be present in the freshly fetched current PFR configuration."
}
503: V-PFR nedostupan pre slanja (retryable: true)
{
  "id": "9f8e7d6c-5b4a-4321-8765-0fedcba98761",
  "taxpayerId": "3f9c2a8e-6b1d-4e5a-9c47-1d2b8e6f0a11",
  "businessPremiseId": "b7d4e2c1-9a3f-4c8e-8f21-6e5a0c9d3b22",
  "idempotencyKey": "order-4127-sale-1",
  "clientReference": "ORDER-4127",
  "invoiceType": "NORMAL",
  "transactionType": "SALE",
  "cashierId": "web-shop",
  "buyerId": null,
  "buyerDetails": null,
  "status": "NOT_FISCALIZED",
  "fiscalized": false,
  "failureCode": "PFR_SUBMISSION_FAULT",
  "retryable": true,
  "pfr": null,
  "receipt": null,
  "createdAt": "2026-09-01T08:15:31.902Z",
  "updatedAt": "2026-09-01T08:15:32.611Z"
}

Katalog kodova

Kolona Ponavljanje: *isti ključ* znači da isti zahtev sa istim Idempotency-Key ima smisla; *ispravi zahtev* znači nov sadržaj i nov ključ; *kasnije* znači da se stanje menja van vašeg sistema (licenca, podešavanja); *nikad* znači da ponavljanje ne može da pomogne.

HTTPKodZnačenjeŠta uraditiPonavljanje
401401Token nedostaje, istekao je (važi 300 sekundi) ili nije izdat za ovaj API.Zatražite nov token client credentials tokom i ponovite poziv.isti ključ
403CREDENTIAL_ENVIRONMENT_MISMATCHSandbox kredencijal pokušava da koristi produkcioni bezbednosni element ili obrnuto. Retko: obveznici, prodajna mesta i dokumenti drugog okruženja su za vaš ključ nevidljivi (404), pa se ovo vidi samo ako element i prodajno mesto ne pripadaju istom okruženju.Proverite koji kredencijal je u konfiguraciji; okruženje određuje kredencijal, ne adresa.ispravi zahtev
403CREDENTIAL_ENVIRONMENT_REQUIREDKredencijal ne nosi okruženje (boka_env), pa ne može da registruje obveznika. Kredencijali koje izdaje BokaPOS uvek ga nose.Koristite kredencijal koji je izdala BokaPOS administracija; ako ga imate i dalje vidite ovo, javite se podršci.nikad
403LICENSE_REQUIREDOrganizacija nema licencu, a poziv cilja produkcioni element.Sandbox nastavlja da radi. Za produkciju kontaktirajte BokaPOS administraciju.kasnije
403LICENSE_NOT_STARTEDLicenca postoji, ali počinje kasnije.Pročitajte GET /v1/license za datum početka.kasnije
403LICENSE_EXPIREDLicenca je istekla.Kontaktirajte BokaPOS administraciju. Refundacije i storna avansa i dalje rade.kasnije
403LICENSE_SUSPENDEDBokaPOS je suspendovao licencu.Kontaktirajte BokaPOS administraciju.kasnije
403MODULE_NOT_LICENSEDOsnovna licenca važi, ali modul iz polja module (advance ili email) nije uključen.Uključite modul preko BokaPOS administracije ili ne koristite tu funkciju u produkciji.kasnije
404TAXPAYER_NOT_FOUNDObveznik ne postoji u vašoj organizaciji i okruženju ili nije aktivan.Pročitajte GET /v1/taxpayers istim ključem i koristite tačan id; obveznik drugog okruženja je nevidljiv.ispravi zahtev
404BUSINESS_PREMISE_NOT_FOUNDProdajno mesto ne postoji u vašem okruženju ili ne pripada navedenom obvezniku.Pročitajte GET /v1/taxpayers/{taxpayerId}/business-premises.ispravi zahtev
404FISCAL_DOCUMENT_NOT_FOUNDDokument ne postoji u vašoj organizaciji i okruženju.Proverite identifikator; dokumenti druge organizacije i drugog okruženja su nevidljivi.ispravi zahtev
409IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_REQUESTIsti Idempotency-Key je već upotrebljen sa drugačijim sadržajem zahteva. Odgovor nosi operationId originala.Pročitajte original preko GET /v1/operations/{operationId}. Nova prodaja mora dobiti nov ključ.nikad
409IDEMPOTENCY_KEY_REUSED_IN_OTHER_ENVIRONMENTIsti Idempotency-Key je vaša organizacija već upotrebila kredencijalom drugog okruženja (na primer u sandbox testiranju). Ključevi su jedinstveni po organizaciji u oba okruženja.Pošaljite zahtev ponovo sa novim ključem. Ništa nije izdato.nikad
422LPFR_REQUIRED_FOR_IN_PERSON_SALESProdajno mesto nije za prodaju na daljinu. BokaPOS fiskalizuje samo prodaju na daljinu preko V-PFR-a.Za prodaju licem u lice potreban je L-PFR (na primer BokaLPFR).nikad
422BUSINESS_PREMISE_INACTIVEProdajno mesto je suspendovano ili zatvoreno.Aktivirajte ga u portalu ili koristite drugo.kasnije
422PAYMENT_TYPE_NOT_ALLOWED_ON_PREMISEProdajno mesto radi u ograničenom režimu plaćanja (OTHER, CASH, WIRE_TRANSFER, VOUCHER), a zahtev nosi drugi način.Promenite način plaćanja ili režim prodajnog mesta u portalu.ispravi zahtev
422ACTIVE_SECURITY_ELEMENT_REQUIREDProdajno mesto nema aktivan bezbednosni element.U sandboxu BokaPOS dodeljuje element; u produkciji vlasnik ga otprema u portalu, BokaPOS ga aktivira.kasnije
422TAX_LABEL_NOT_CURRENTBar jedna poreska oznaka nije u svežoj konfiguraciji V-PFR-a (polje invalidLabels).Pročitajte GET /v1/tax-rates i koristite samo oznake koje vrati; sandbox i produkcija imaju različit skup.ispravi zahtev
422TAX_LABEL_NOT_ALLOWED_OUTSIDE_VATObveznik je označen kao van sistema PDV-a, a stavka nosi PDV oznaku.Koristite oznaku bez PDV-a ili ispravite PDV status obveznika u portalu.ispravi zahtev
422REFERENCE_DOCUMENT_NOT_FOUNDReferentni dokument (reference.fiscalDocumentId) ne postoji.Proverite identifikator iz odgovora originalnog računa.ispravi zahtev
422REFERENCE_DOCUMENT_NOT_FISCALIZEDReferentni dokument nije fiskalizovan, pa ne može biti referenca.Referenca sme da pokazuje samo na dokument sa statusom FISCALIZED.ispravi zahtev
422REFERENCE_DOCUMENT_SCOPE_MISMATCHReferentni dokument pripada drugom obvezniku ili prodajnom mestu.Referenca mora biti na istom obvezniku i prodajnom mestu.ispravi zahtev
422REFERENCE_DOCUMENT_TYPE_NOT_ALLOWEDKombinacija vrste računa i transakcije ne sme da se poziva na tu vrstu izvornog dokumenta (zvanična matrica referenci).Pogledajte tabelu referenci na stranici Konvencije.ispravi zahtev
422REFUND_QUANTITY_EXCEEDS_ORIGINALVraćena količina je veća od količine na izvornoj liniji.Smanjite količinu; delimična refundacija je dozvoljena.ispravi zahtev
422REFUND_CUMULATIVE_QUANTITY_EXCEEDEDZbir svih dosadašnjih refundacija te linije premašio bi izvornu količinu.Proverite ranije refundacije u dnevniku.nikad
422REFUND_ITEM_MUST_MATCH_ORIGINAL_LINENaziv, cena, oznake ili GTIN se ne poklapaju sa izvornom linijom originalLineIndex.Prepišite stavku iz izvornog računa (GET /v1/fiscal-documents/{id}/representations/canonical-json).ispravi zahtev
422REFUND_ORIGINAL_LINE_NOT_FOUNDoriginalLineIndex ne postoji na izvornom računu.Indeksi su od nule, po redosledu stavki originala.ispravi zahtev
422COPY_SOURCE_NOT_COPYABLEKopija, predračun i obuka se ne mogu kopirati.Kopirajte samo račun za promet ili avans.nikad
422COPY_SOURCE_NOT_FISCALIZEDIzvor kopije nije fiskalizovan.Kopija postoji samo za dokument sa statusom FISCALIZED.nikad
409ADVANCE_CASE_NOT_OPENSlučaj je zatvoren, neuspešan ili čeka razrešenje ishoda.Pročitajte GET /v1/advance-cases/{id} i polje state.nikad
422ADVANCE_CANCELLATION_TARGET_NOT_LATESTMože se stornirati samo poslednja fiskalizovana avansna prodaja.Pošaljite id poslednje stavke iz advanceSales koja nije u cancelledAdvanceSaleIds.ispravi zahtev
422ADVANCE_CLOSE_TOTAL_MISMATCHremainingPayments nije jednako konačnom iznosu umanjenom za ukupan avans.Izračunajte razliku iz advanceSales i pošaljite je; kad je nula, jedan element sa iznosom 0.ispravi zahtev
422ADVANCE_CASE_HAS_NO_FISCALIZED_SALENe može se zatvoriti slučaj bez ijedne fiskalizovane avansne prodaje (osim kad postoji externalAdvance).Prvo fiskalizujte uplatu.nikad
409ADVANCE_PAYMENT_SUPERSEDEDPonovljeni zahtev cilja uplatu koja više nije poslednja u lancu.Pročitajte slučaj i nastavite od aktuelnog stanja.nikad
409ADVANCE_CASE_CLOSE_ALREADY_RESERVEDZatvaranje je već rezervisano drugim ključem.Ponovite zatvaranje istim Idempotency-Key ključem kojim je započeto.isti ključ
503ADVANCE_REFUND_NOT_FISCALIZEDPoreska uprava je odbila avansnu refundaciju pri zatvaranju: slučaj je FAILED sa šifrom odbijanja, a rezervisani konačni račun nikad nije poslat i ima ovaj failureCode, NOT_FISCALIZED, retryable: false.Pročitajte failureCode slučaja i advanceRefund.pfrRejection, ispravite podatke i otvorite nov slučaj. Ponavljanje istog zatvaranja ne šalje ništa.nikad
409PROFORMA_TRAINING_WORKFLOW_RESERVATION_CONFLICTIzvorni dokument već ima nerazrešenu ili završenu refundaciju.Pročitajte tok iz workflowId u odgovoru.nikad
409PROFORMA_TRAINING_SOURCE_ALREADY_REFUNDEDPredračun ili obuka je već refundirana u celosti.Nema dalje akcije.nikad
409CATALOGUE_SKU_ALREADY_EXISTSŠifra (sku) već postoji kod tog obveznika.Izmenite postojeći proizvod (PUT) ili upotrebite drugu šifru.ispravi zahtev
422CATALOGUE_IMPORT_TOO_MANY_ROWSCSV ima više od 1.000 redova.Podelite uvoz na više datoteka.ispravi zahtev
422CATALOGUE_IMPORT_HEADERS_INVALIDZaglavlje CSV-a nema očekivane kolone.Preuzmite GET /v1/products/export kao šablon.ispravi zahtev
422JOURNAL_EXPORT_RESULT_LIMIT_EXCEEDEDViše od 10.000 redova odgovara filterima izvoza.Suzite period (createdFrom, createdTo) i izvezite u delovima.ispravi zahtev
422RECEIPT_DELIVERY_DISABLEDObveznik nije uključio dostavu e-poštom u podešavanjima portala.Uključite dostavu u portalu (Dokumenti, E-mail računi) ili šaljite račun iz svog sistema.kasnije
422RECEIPT_DELIVERY_DOCUMENT_NOT_FISCALIZEDDokument nije fiskalizovan, pa nema šta da se dostavi.Šaljite samo dokumente sa fiscalized: true.nikad
422RECEIPT_DELIVERY_DOCUMENT_NOT_ISSUED_TO_BUYERRačun Avans-Refundacija se ne izdaje kupcu, pa ga BokaPOS ne šalje na adresu kupca. Isto važi i za njegovu kopiju.Pošaljite završni račun avansnog slučaja (Promet-Prodaja). Avans-Refundacija ostaje dostupna za štampu i u elektronskom dnevniku.nikad
503RECEIPT_DELIVERY_UNAVAILABLEPlatformski e-mail transport nije konfigurisan ili nije dostupan. Ništa nije stavljeno u red.Ponovite kasnije istim ključem ili pošaljite račun iz svog sistema; fiskalizacija je već završena.isti ključ
503PFR_SANDBOX_NOT_CONFIGUREDFiskalni adapter nije konfigurisan na ovoj instalaciji. Odgovor je dokument sa fiscalized: false.Ne dešava se na api.bokapos.rs; javlja se samo na lokalnim instalacijama bez adaptera.isti ključ
503PFR_ENVIRONMENT_DISABLEDFiskalni promet je isključen za okruženje ovog elementa (produkcija do njenog uključenja).Sandbox radi; produkcija se uključuje po odluci BokaPOS-a.kasnije
503CURRENT_TAX_CONFIGURATION_UNAVAILABLEV-PFR nije vratio svežu poresku konfiguraciju, pa zahtev nije ni rezervisan.Ponovite kasnije istim ključem.isti ključ
503PFR_SUBMISSION_FAULTV-PFR nije bio dostupan pre slanja; dokument je NOT_FISCALIZED, retryable: true.Ponovite isti zahtev istim Idempotency-Key ključem posle kratke pauze.isti ključ
503OUTCOME_UNKNOWNZahtev je možda stigao do V-PFR-a, ali odgovor nije stigao nazad. Status OUTCOME_UNKNOWN, retryable: false. Nije račun, ali može da postane.Ne šaljite nov zahtev za istu prodaju. Proveravajte GET /v1/operations/{id}; BokaPOS sam razrešava ishod čitanjem, nikad ponovnim slanjem.nikad
422REJECTEDV-PFR je odbio zahtev. Dokument ima status REJECTED, a GET /v1/fiscal-documents/{id} vraća pfrRejection sa putanjom polja i šifrom (2310 nepostojeća oznaka; 2800 do 2808 obavezno polje, dužina, opseg, vrednost, format, veličina liste).Ispravite zahtev i pošaljite ga sa novim ključem.ispravi zahtev

Šifre odbijanja V-PFR-a

Kada V-PFR odbije zahtev, dokument dobija status REJECTED, failureCode: PFR_VALIDATION_REJECTED, a pojedinačno čitanje (GET /v1/fiscal-documents/{id}) nosi pfrRejection.items sa putanjom polja iz vašeg zahteva i šifrom:

ŠifraZnačenjeTipičan uzrok
2310nepostojeća poreska oznakaoznaka nije u aktuelnoj grupi (BokaPOS to obično uhvati ranije kao TAX_LABEL_NOT_CURRENT)
2800obavezno polje nedostajeprazan naziv, kasir, plaćanje
2801dužinapredugačak naziv, kasir ili referenca
2802opsegkoličina ili iznos van dozvoljenog opsega
2803vrednostnedozvoljena vrednost enumeracije
2804formatviše od dve decimale u ceni ili iznosu, pogrešan format vremena
2805 do 2808veličina liste i srodne provereprazna lista stavki ili plaćanja

Robusna integracija

  • Izvedite Idempotency-Key iz porudžbine i sačuvajte ga pre slanja, da posle prekida možete da ponovite isti zahtev.
  • Na 503 sa retryable: true ponovite istim ključem uz eksponencijalno čekanje (na primer 2, 5, 15 sekundi), najviše nekoliko puta; zatim označite porudžbinu za operatera.
  • Na OUTCOME_UNKNOWN nikad ne šaljite nov zahtev: zapamtite id i proveravajte GET /v1/operations/{id} sve dok status ne postane FISCALIZED ili operater ne odluči.
  • Na 422 i REJECTED beležite errors odnosno pfrRejection uz porudžbinu, ispravite izvor podataka i pošaljite sa novim ključem.
  • Na 401 uzmite nov token i ponovite isti zahtev. Na 403 pročitajte GET /v1/license.
  • Osvežite poreske oznake kad dobijete TAX_LABEL_NOT_CURRENT, ne pre svakog računa.
  • Postavite HTTP timeout na fiskalnim pozivima velikodušno (na primer 60 sekundi): V-PFR odgovara obično za oko dve sekunde, ali prekid veze sa vaše strane pretvara siguran ishod u nepoznat.
  • Logujte id, status, failureCode i pfr.invoiceNumber; nikad ne logujte token ni tajnu.