ValidateFin

Payment QR codes EPC & Swiss QR-bill

Build a scan-to-pay QR code for a SEPA transfer, or drop a picture of one and find out why a bank refuses it. Nothing is uploaded.

EPC069-12 v3.1Swiss QR-billQR-IBANISO 11649100% local
100% Lokaal

What is an EPC QR code, and how does a Swiss QR-bill differ?

An EPC QR code — defined by EPC069-12 — is the "scan to pay" square printed on European invoices. Its payload is twelve lines of plain text: a BCD service tag, a version, a character set, the SCT identifier, then the beneficiary's BIC, name and IBAN, the amount in euro, a purpose code and either a structured creditor reference or an unstructured message. The whole thing is capped at 331 bytes. A Swiss QR-bill is a different standard (SIX Implementation Guidelines): its payload is 31 to 34 lines, it accepts only Swiss and Liechtenstein IBANs in Swiss francs or euro, and its defining rule is the pairing of account and reference — a QR-IBAN (an IBAN whose institution ID falls between 30000 and 31999) requires a QRR reference, while a standard IBAN forbids one and takes an ISO 11649 SCOR reference or none at all.

QR-code voor SEPA-overschrijving (EPC069-12)

Vul de begunstigde in en krijg de "scan om te betalen"-QR-code die Europese bank-apps lezen. Alles wordt in uw browser berekend.

002 — de BIC is alleen vereist als de bank van de begunstigde een SEPA-deelnemer buiten de EER is.

Geschreven als EUR gevolgd door de waarde, bijv. EUR12.30. Tussen 0,01 en 999999999,99.

Grootte van de payload: 54 / 331

Geldig

Payload

BCD
002
1
SCT

ACME SA
DE71110220330123456789
EUR12.30

Kernpunten

  • De EPC-QR-code (EPC069-12 v3.1) is het "scan om te betalen"-vierkant op Europese facturen. De payload telt 12 regels en is begrensd op 331 BYTES — geen tekens: in UTF-8 kost een letter met accent er twee.
  • Een gestructureerde referentie en een vrije mededeling sluiten elkaar uit: een betaal-QR draagt een crediteurreferentie óf vrije tekst, nooit beide.
  • Een Zwitserse QR-factuur gebruikt een QR-IBAN wanneer de instellings-ID (posities 5-9 van de IBAN) tussen 30000 en 31999 ligt. Een QR-IBAN vereist een QRR-referentie; een gewone IBAN verbiedt die en neemt SCOR of NON. Elke verkeerde combinatie is een geweigerde betaling.
  • Het controlecijfer van de QRR is een recursief modulo 10 — niet de modulo 97 van de IBAN-wereld. De RF-crediteurreferentie (ISO 11649) wordt ook gecontroleerd.
  • Een Zwitserse factuur van precies 0.00 met de melding "niet gebruiken voor betaling" is legitiem: het is een kennisgeving, geen kapotte factuur.
  • Zowel de generator als de decoder draaien volledig in uw browser — een factuur-QR bevat een IBAN en verlaat uw machine nooit.

Two payment QR standards, checked against the specifications that define them

The generator produces an EPC069-12 v3.1 payload and renders it at error-correction level M, as the guidelines require. It enforces what the specification actually says: the 331-byte cap is on bytes, not characters, so an accented beneficiary name costs more than its length suggests; the structured reference and the unstructured message are mutually exclusive; and the BIC is mandatory in version 001 but only conditional in version 002.

The decoder reads both standards, from a pasted payload or from a picture of the QR code itself — decoded in the browser canvas, never uploaded. For a Swiss QR-bill it performs the check the guidelines explicitly ask a decoder to make: the account/reference pairing, the recursive modulo-10 check digit of the QR reference, and the mod-97 check digits of an ISO 11649 creditor reference. It also knows that a bill of exactly 0.00 carrying a "do not use for payment" message is a legitimate notification, not a broken document.

Key takeaways

  • The EPC payload is capped at 331 BYTES of the declared character set — not 331 characters. In UTF-8, an accented letter costs two.
  • A QR-IBAN is nothing more than an IBAN whose institution ID (positions 5-9) falls in 30000-31999. It requires a QRR reference; a standard IBAN forbids one.
  • The QR reference check digit is a recursive modulo 10, not the modulo 97 of the IBAN world. The two give different answers, and only one is right.
  • A Swiss QR-bill of exactly 0.00 with a "do not use for payment" message is valid by design — a validator that enforces a 0.01 minimum rejects a document the standard itself defines.

Frequently asked questions

What is the difference between EPC QR code version 001 and 002?

Exactly one thing: whether the BIC is mandatory. In version 001 the beneficiary BIC must always be present. In version 002 it is only required when the beneficiary's payment service provider is a SEPA scheme participant outside the EEA. Nothing else about the structure changes between the two.

Why does my Swiss QR-bill get refused even though the IBAN is correct?

Almost always because the account and the reference type do not match. If the IBAN's institution identification (positions 5 to 9) falls between 30000 and 31999, it is a QR-IBAN and the reference type must be QRR. If it is any other IBAN, a QR reference is forbidden and the reference type must be SCOR (an ISO 11649 creditor reference) or NON. A QR-IBAN with SCOR, or a standard IBAN with QRR, cannot be booked.

Can an EPC QR code carry a currency other than the euro?

No. EPC069-12 defines the amount as "the amount of the SEPA Credit Transfer in euro", and there is no separate currency field. The amount is written as EUR followed by the value, between 0.01 and 999999999.99.

Is my QR code image uploaded to a server?

No. The picture is drawn to a canvas and decoded by JavaScript in your browser. That matters here more than almost anywhere else: a payment QR code contains an IBAN, an amount and often an invoice reference.