Back to Changelog

All 28 Countries Covered

May 17, 2026

Country coverage doubles from 14 to 28. New format slots qr-bill (CH) and peppol-ubl (PL/PT/RO), Peppol-BIS UBL on AT/CZ/ES/FR, and several request fields relaxed to optional.

14 → 28 countries

CY, DK, EE, FI, GB, GR, IE, LT, LU, LV, MT, NO, SE, SI added — each with its own adapter.

qr-bill (CH)

32-line SPC payload as plain text — render the Swiss QR yourself.

peppol-ubl

Pure Peppol BIS 3.0 UBL for PL/PT/RO, alongside the national CIUS.

Schema relaxation

Fields the generator already defaults at runtime are now explicitly optional in the request schema.

New Country Coverage

Previously: AT, BE, BG, CH, CZ, DE, ES, FR, HU, IT, NL, PL, PT, RO (14). The 14 new countries all support pdf and ubl (Peppol BIS 3.0 UBL for cross-border B2B):

CountryEASNotes
SE0007Org-Nr (Luhn), F-skatt-Notice, SEK
NO0192Mod-11 Org-Nr, NOK
DK0184CVR, FIK/Giro Payment-Slips
FI0213Y-tunnus, EUR
IE9925VAT IE1234567X, EUR
GB0096UK-VAT, GBP
LU9938Matricule, EUR
MT0235C-Number, EUR
CY0096HE-Number, EUR
SI9952EUR, SI-UBL-2.0-CIUS unter ubl
EE0208Reg-Code, EUR
LV0233Reg-Number, EUR
LT0200Imones-Kodas, EUR
GR0196AFM, EUR, mydata als nationaler Slot

Per-country /api/v1/invoice/formats now returns 28 entries.

Example: Sweden UBL generation

bash
1POST /api/v1/invoice/SE/ubl/generate
2 
3{
4 "invoice": {
5 "invoiceNumber": "SE-2026-0001",
6 "type": "invoice",
7 "issueDate": "2026-05-17",
8 "currency": "SEK",
9 "seller": {
10 "name": "Helvetia AB",
11 "street": "Storgatan 1",
12 "city": "Stockholm",
13 "postalCode": "11122",
14 "countryCode": "SE",
15 "vatId": "SE556677889901",
16 "countrySpecific": { "orgnr": "5566778899" }
17 },
18 "buyer": { "name": "Kunde GmbH", "countryCode": "DE", "vatId": "DE123456789" },
19 "items": [ { "description": "Beratung Mai 2026", "quantity": 8, "unitPrice": 1200, "taxRate": 25 } ],
20 "subtotal": 9600.00,
21 "total": 12000.00
22 }
23}

New Format Slots

POST

/api/v1/invoice/CH/qr-bill/generate

Emits the structured 32-line SPC payload (UTF-8 text/plain) — the content that encodes into the Swiss QR-Code receipt section. Not XML, not PDF. Render externally.

POST

/api/v1/invoice/{PL|PT|RO}/peppol-ubl/generate

Pure Peppol BIS 3.0 UBL for cross-border B2B from the three countries whose ubl slot is occupied by the national CIUS (KSeF, CIUS-PT, eFactura). Previously unreachable.

POST

/api/v1/invoice/{AT|CZ|ES|FR}/ubl/generate

Peppol-BIS UBL on four additional countries — previously these endpoints returned „Unsupported format“ even though the generators existed. Now wired through.

Example: Swiss QR-Bill payload

bash
1POST /api/v1/invoice/CH/qr-bill/generate
2 
3# Returns UTF-8 text/plain the 32-line SPC payload that
4# encodes into the Swiss QR code. Use this to render the
5# QR code yourself (custom PDF layout, mobile preview, etc.).
6 
7Content-Type: text/plain; charset=utf-8
8 
9SPC
100200
111
12CH4431999123000889012
13S
14Helvetia Solutions AG
15...
16SCOR
17RF18539007547034
18Rechnung CH-2026-1010
19EPD

Format Profiles

POST /api/v1/invoice/DE/zugferd/generate accepts formatOptions.profile; the same applies to FR/facturx with EN16931 | BASIC.

ProfileURNUse Case
EN16931urn:cen.eu:en16931:2017Comfort profile, full EN 16931
BASICurn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:basicMinimal set for simple invoices
EXTENDEDurn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extendedSub-lines, construction-phase invoices, third-party payers

Schema Relaxation in the Request Body

Fields the generator already defaults at runtime are now explicitly optional in the Zod schema. Purely additive — old clients keep sending them, new clients no longer need to.

Now optional

  • party.street/city/postalCode
  • items[].position
  • items[].grossAmount
  • paymentTerms (whole block, falls back to dueDays: 30)

paymentMethods[].type aliases

  • credit_transfer — alias for bank_transfer (UNTDID 4461 code 30)
  • danish_fik — UNTDID 93
  • giro — UNTDID 50