hr.invalid_pnp_rate
HTTP 400 type: validation_error param: consumption_tax.0.rate{ "error": { "type": "validation_error", "code": "hr.invalid_pnp_rate", "message": "Consumption tax rate \"4.00\" is out of range. It must be between 0.00 and 3.00 (restrictive errors 183 and 184).", "param": "consumption_tax.0.rate", "upstream": null, "doc_url": "https://docs.fiskhub.com/errors/hr.invalid_pnp_rate" }}param identifies which line failed, indexed from zero.
What happened
A rate in consumption_tax — porez na potrošnju, Pnp — is outside the permitted range. Two
restrictive errors bound it:
| Code | Rule |
|---|---|
| 183 | The rate must be at least 0.00 |
| 184 | The rate must be at most 3.00 |
Consumption tax is a municipal tax on certain goods, principally drinks. The rate is set by the municipality within that ceiling, so the correct value depends on where the premises is.
Should you retry?
Not unchanged. The range is fixed by law.
The fix
Send the rate set by the municipality where the premises is located, as a decimal string with exactly two places.
{ "vat": [{ "rate": "25.00", "base": "18.00", "amount": "4.50" }], "consumption_tax": [{ "rate": "3.00", "base": "18.00", "amount": "0.54" }]}Common causes:
| Sent | Problem |
|---|---|
"4.00" | Above the 3.00 ceiling. Check the municipal rate. |
"-1.00" | Negative. Not permitted. |
3 | A JSON number. Send "3.00". |
"3" or "3.0" | Wrong precision. Send "3.00". |
"25.00" | A VAT rate in the wrong field — see below. |
If the sale is not subject to consumption tax, omit consumption_tax entirely. Do not send a
zero line unless the tax genuinely applies at a zero rate.
Do not confuse it with VAT
vat and consumption_tax are separate arrays with separate rules.
| Field | Croatian | Permitted rates | Error |
|---|---|---|---|
vat | Pdv | 0.00, 5.00, 13.00, 25.00 | hr.invalid_vat_rate |
consumption_tax | Pnp | 0.00–3.00 | this one |
A VAT rate of 25.00 placed in consumption_tax produces this error, and it is the most common
way to see it.
Getting the rate right
The rate depends on the municipality, so it belongs to the premises, not the device or the integration. Store it against the premises and read it when building the sale — a rate hard-coded per device is wrong the first time a machine moves to another town.