hr.amount_out_of_range
HTTP 400 type: validation_error param: total{ "error": { "type": "validation_error", "code": "hr.amount_out_of_range", "message": "total 12500.00 is outside the permitted range of ±10,000.00 EUR for a cash or card sale at a self-service device.", "param": "total", "upstream": null, "doc_url": "https://docs.fiskhub.com/errors/hr.amount_out_of_range" }}What happened
total is outside the permitted range for a cash or card sale at a self-service device. The
specification caps it at ±10,000.00 EUR, and FiskHub checks it locally before sending.
Should you retry?
Not unchanged. The limit is fixed by the specification.
The fix
Almost always, the amount is not what you think it is.
The amount is in the wrong unit
The commonest cause by far. total is in euros, as a decimal string:
{ "total": "125.00" } // €125.00 — right{ "total": "12500.00" } // €12,500.00 — the same amount sent in centsIf your device works in cents internally, convert before sending. Note that this is the opposite
convention from the QR payload’s izn parameter, which is in cents — FiskHub builds that
for you, so you never construct it by hand.
A separator was misread
{ "total": "1.500.00" } // rejected as malformed{ "total": "1500.00" } // €1,500.00{ "total": "1,500.00" } // rejected — no thousands separatorThere is no thousands separator, and the decimal separator is a dot.
The sale really is that large
Above €10,000, a cash or card sale at an unattended device cannot be fiscalized as one receipt. That is a business question rather than an integration one — the operator should raise it with their accountant. Do not split one sale into several receipts to get under the limit; each receipt is a fiscal record of a transaction that must have actually happened.
Negative amounts
Negative totals are permitted and stay within the same range — a refund is -105.50, and the QR
payload’s izn keeps the sign as -10550.
The precision rules still apply
total must be a decimal string with exactly two places. "125", "125.0" and 125.00 (a JSON
number) are all rejected with invalid_request rather than this code.
See getting started.