VAT & Currency
Tax categories, VAT calculation modes, rounding modes, supported currencies, and locale formatting.
InvoicePDF produces a baseline VAT-correct visual PDF. All money math runs in exact integer arithmetic — floats never touch a calculation.
Tax categories
Each line item declares a taxCategory. The category is explicit input — the API never infers it from country codes.
| Category | taxRate | Behavior |
|---|---|---|
standard | the standard rate, e.g. "19" | VAT charged at the given rate. |
reduced | the reduced rate, e.g. "7" | VAT charged at the given (reduced) rate. |
zero | must be "0" | Zero-rated. No VAT charged; the line is still reported. |
exempt | must be "0" | VAT-exempt. No VAT charged. |
reverse_charge | must be "0" | VAT = 0 on the line. The invoice renders the mandatory reverse-charge legal note, and buyer.vatId is required. |
A non-zero taxRate on zero, exempt, or reverse_charge returns 422 INVOICE_ERR_VAT_INCONSISTENT.
Reverse charge renders this note on the document: "Reverse charge — VAT to be accounted for by the recipient (Article 196, Directive 2006/112/EC)."
taxMode
| Value | Behavior |
|---|---|
summary (default) | Lines are grouped by rate. Each group's VAT is computed once from the summed net. The document shows a VAT breakdown table: one row per rate (rate, taxable base, VAT amount). This is the EU-standard method and avoids per-line penny drift. |
per_line | VAT is computed and rounded per line. The document shows a VAT column on each line; totals sum the rounded line VATs. |
rounding
| Value | Behavior |
|---|---|
per_rate (default) | VAT is rounded once per rate group. |
per_line | VAT is rounded per line. |
Both modes are legal; they can legitimately differ by cents on the same invoice data, depending on jurisdiction convention. Rounding uses half-away-from-zero, the EU commercial default.
Supported currencies
20 ISO 4217 currencies. Decimal places come from the currency, never from locale — most use 2 decimals; JPY and ISK use 0.
| Currency | Decimals |
|---|---|
| EUR | 2 |
| USD | 2 |
| GBP | 2 |
| JPY | 0 |
| CHF | 2 |
| SEK | 2 |
| PLN | 2 |
| NOK | 2 |
| DKK | 2 |
| CZK | 2 |
| HUF | 2 |
| RON | 2 |
| BGN | 2 |
| ISK | 0 |
| CAD | 2 |
| AUD | 2 |
| NZD | 2 |
| TRY | 2 |
| ILS | 2 |
| ZAR | 2 |
A currency code outside this table returns 422 INVOICE_ERR_INVALID_FIELD.
Locale formatting
locale (BCP 47, default en-IE) controls the decimal separator, grouping separator, currency symbol placement, and date formatting — never the number of decimal places, which always comes from the currency.
| Locale | Amount | Date |
|---|---|---|
de-DE | 1.234,56 € | 08.07.2026 |
en-IE | €1,234.56 | 08/07/2026 |
Limits
| Limit | Value |
|---|---|
| Max line items | 200 — INVOICE_ERR_TOO_MANY_LINES above this |
| Max rendered pages | 50 — INVOICE_ERR_TOO_MANY_PAGES above this |
| Max request body size | 256 KB |