Every 4xx and 5xx has the same body. code is the stable, machine-readable identifier —
branch on it , never on message.
"type" : " validation_error " ,
"code" : " hr.device_missing_isu " ,
"message" : " Device VM-0043 has no ISU number assigned. Register the premises in ePorezna and add the ISU number before fiscalizing. " ,
"doc_url" : " https://docs.fiskhub.com/errors/hr.device_missing_isu "
Field Notes typeThe broad category. A closed set — useful for handling a code you do not recognise. codeStable forever. Never renamed, never repurposed. New codes may be added. messageHuman-readable and actionable. Not part of the contract — reworded freely. paramThe offending request field or header, when there is one. upstreamRaw detail from the Tax Administration, for debugging. Not part of the contract. doc_urlThe page for this exact code. Always resolves.
Errors are 4xx and 5xx only
A 200 with jir: null is not an error. It is a valid, legally complete sale that the
device must finish. See handling the no-JIR response .
fiscal_error inside a 200 body is a status report about the reporting , not a failure of the
sale.
Types
typeHTTP Meaning validation_error400 The request is wrong. Retrying it unchanged cannot help. authentication_error401 The key is missing, unknown or revoked. authorization_error403 The key is valid but not allowed to do this. not_found404 No such resource is visible to this key. conflict409 The request conflicts with existing state. rate_limit_error429 Too many requests. Back off and retry with the same key. fiscal_error— Carried inside a 200 invoice body, not as an HTTP error. upstream_error— Reported through the invoice’s fiscal_error, not as an HTTP error. internal_error500 Our fault. Retry with the same Idempotency-Key.
Handle an unrecognised code by falling back to its type:
case " hr.device_missing_isu " :
return alertOperator ( error );
case " upstream_unavailable " :
return error . type === " validation_error " ? alertOperator ( error ) : retryLater ( error );
All codes
Request shape
Authentication and authorization
Fleet and configuration
The caller’s setup is incomplete. Each of these blocks fiscalization until someone changes
something.
Croatian restrictive errors
Validated locally, before anything leaves our network, so you get a precise error in milliseconds
instead of a round trip and an opaque upstream code.
hr.tax_line_inconsistent and hr.total_mismatch are the two entries with no upstream rule behind them, and they are a pair: one asks whether a tax line fits its own base, the other whether those figures describe the receipt at all. The Tax
Administration verifies no arithmetic at all — a receipt whose VAT line reads 25% of 10.00 = 5.50
is well-formed, gets a JIR, and is wrong only in your books, where it can no longer be amended.
We refuse it rather than file it.
Restrictive errors 180 and 181 judge OibPrimateljaRacuna, which is not part of the
unattended message at all. They are dormant for unattended sales and live for
attended receipts .
Upstream
These appear inside a 200 invoice body as fiscal_error, not as HTTP errors. The sale is
valid in every case.
Rate limiting
Code HTTP Retry? rate_limited429 Yes — after Retry-After, with the same Idempotency-Key
Internal