Skip to main content
Send every monetary amount as a decimal string ("100.00", "-19.00", "0.19"). There is no wire-level cap on fractional digits.

tax_amount consistency

For each line_items[].taxes[] on a sale / return / exchange, OpenFiskal recomputes the expected tax_amount from the line’s total_amount (gross) and the rates on the same line, and rejects with 422 tax_amount_precision_invalid if it disagrees.
The divisor sums every rate on the line. Single-tax lines collapse to gross × rate / (1 + rate); multi-tax stacking (e.g. US state + municipal) checks every row against the full rate set. Comparison is strict at 8 decimal places: expected is rounded half-up to 8 dp and compared by numeric equality. Submit tax_amount rounded to 8 dp. The operation-level identity pretax_amount + tax_amount + tip_amount = total_amount is enforced separately and exactly.