# EPC QR / Stuzza

> Source: https://docs.barcoder.ai/docs/standards/epc-qr
> research date 2026-05-30 · extracted at 2026-10-06
> Publisher: Barcoder — encyclopedia of QR, barcode and payment-code standards

Specifications:
- [EPC069-12 v3.x — Quick Response Code Guidelines (EPC)](https://www.europeanpaymentscouncil.eu/document-library/guidance-documents/quick-response-code-guidelines-enable-data-capture-initiation)
- [EPC QR code — Wikipedia](https://en.wikipedia.org/wiki/EPC_QR_code)

## Overview

The EPC QR code (also called **SEPA Credit Transfer QR Code** or **SCT QR**) is a European Payments Council standard for encoding the data needed to initiate a SEPA Credit Transfer into a [QR Code](https://docs.barcoder.ai/docs/standards/qr-code) symbol <sup>[1][1], [2][2]</sup>. The payload is plain-text, line-separated, in a format called **BCD** — "Beneficiary Credit Data." A user scans the code in any compliant mobile banking app, which auto-populates the transfer form (recipient name, IBAN, amount, reference). The standard was pioneered by Austria's STUZZA in 2012 and adopted by the EPC in February 2013 <sup>[3][3], [4][4]</sup>. The latest revision is v2.10, published 17 June 2024 <sup>[1][1]</sup>.

## History

The Austrian payment-standards organisation **STUZZA** (Studiengesellschaft für Zusammenarbeit im Zahlungsverkehr) defined the original QR payment standard in 2012, deployed locally under the name *Stuzza QR* or "Zahlen mit Code" <sup>[3][3]</sup>. The European Payments Council adopted and generalised it as **EPC069-12** in February 2013, making it a pan-European standard <sup>[1][1], [4][4]</sup>.

Country adoption rolled out incrementally — Austria from 2012, Finland in 2015, Germany in 2015 (as *Girocode*), Netherlands in 2016, Belgium and others following <sup>[1][1], [3][3]</sup>. The standard is now supported by all major banks in the eurozone for invoice / payment-slip QR scanning <sup>[3][3]</sup>.

Version evolution:
- **v001** (2013) — BIC field mandatory.
- **v002** (current generation) — BIC optional within the EEA, since IBAN alone is now sufficient for SEPA routing <sup>[3][3]</sup>.
- **v2.10** (17 June 2024) — current EPC guideline revision <sup>[1][1]</sup>.

## Technical specification

The payload is a **plain-text, newline-separated set of 11 fields** (BCD format) <sup>[1][1], [3][3]</sup>:

| # | Field | Max length | Required |
|---|---|---|---|
| 1 | Service Tag | 3 | Yes — always `BCD` |
| 2 | Version | 3 | Yes — `001` or `002` |
| 3 | Character set | 1 | Yes — `1`–`8` (see below) |
| 4 | Identification | 3 | Yes — always `SCT` (SEPA Credit Transfer) |
| 5 | BIC | 11 | Mandatory in v001; optional within EEA in v002 |
| 6 | Beneficiary name | 70 | Yes |
| 7 | IBAN | 34 | Yes |
| 8 | Amount | 12 | Optional, format `EUR<value>` (max EUR 999 999 999.99) |
| 9 | Purpose code | 4 | Optional, ISO 20022 purpose codes |
| 10 | Structured reference (RF) | 35 | Optional (mutually exclusive with field 11) |
| 11 | Unstructured remittance info | 140 | Optional (mutually exclusive with field 10) |

**Character set codes** <sup>[3][3]</sup>:

| Code | Encoding |
|---|---|
| 1 | UTF-8 |
| 2 | ISO 8859-1 |
| 3 | ISO 8859-2 |
| 4 | ISO 8859-4 |
| 5 | ISO 8859-5 |
| 6 | ISO 8859-7 |
| 7 | ISO 8859-10 |
| 8 | ISO 8859-15 |

**QR symbology constraints** per the EPC guideline <sup>[3][3]</sup>:

- Underlying symbology: [QR Code](https://docs.barcoder.ai/docs/standards/qr-code) (ISO/IEC 18004)
- Error correction level: **M** (mandated)
- Maximum QR version: **13** (i.e. ≤ 331 bytes of payload)
- Encoding mode: Byte (most implementations) or auto

**Sample payload** (Austrian example) <sup>[3][3]</sup>:

```
BCD
002
1
SCT
BKAUATWW
Musterempfänger GmbH
AT611904300234573201
EUR123.45
SALA

Rechnung 12345
```

## Use cases

The EPC QR code is designed for one use case — initiating a SEPA Credit Transfer from printed media — but the deployment contexts are broad:

- **Printed invoices** in Austria, Germany, Netherlands, Belgium, Finland and other SEPA countries — utility bills, telecom invoices, insurance premiums, donation requests <sup>[3][3], [4][4]</sup>.
- **Payment slips** — replacing or supplementing OCR-readable reference lines on bank-issued forms.
- **Donation campaigns** — NGOs and religious institutions print QR codes on flyers; donors scan and approve in one tap.
- **E-commerce checkout** as an alternative to card payment, particularly for high-value transactions where the merchant avoids card fees by accepting a bank transfer initiated via QR.
- **Cross-border SEPA payments** — the same QR works in any SEPA country with a compliant banking app; the standard's pan-European scope was a deliberate EPC design goal <sup>[1][1]</sup>.

**Country-specific brandings** of the same underlying EPC QR standard <sup>[Austria report](https://docs.barcoder.ai/docs/payments/AT), [3][3]</sup>:
- *Stuzza QR* / *Zahlen mit Code* (Austria)
- *Girocode* (Germany)
- *Bezahlcode* (older German alternative, mostly superseded)

## Implementations

The BCD format is simple newline-separated text + a standard QR encoder, so library support exists in every major language. Banking apps in supporting countries scan EPC QR natively.

**Open-source libraries with explicit EPC QR / BCD support**:

| Repo | Language | Stars | License | Last release | Notes |
|---|---|---:|---|---|---|
| [smhg/sepa-qr-data-php](https://github.com/smhg/sepa-qr-data-php) | PHP | 61 | MIT | v3.0.0, 31 May 2025 | The maintained PHP 8 successor to the deprecated `smhg/sepa-qr-php`; **explicitly tracks the EPC069-12 standard** and emits the BCD payload string for a downstream QR encoder <sup>[5][5]</sup> |
| [heuer/segno](https://github.com/heuer/segno) | Python | 782 | BSD-3-Clause | v1.6.6, Mar 2025 | Pure-Python ISO/IEC 18004 QR encoder with a built-in `segno.helpers.make_epc_qr()` helper that takes name/IBAN/amount and emits a valid EPC QR symbol <sup>[7][7]</sup> |
| [RikudouSage/QrPaymentEU](https://github.com/RikudouSage/QrPaymentEU) | PHP | 18 | MIT | v1.4.0, Sep 2021 | EU-payment library that produces the canonical BCD/SCT string (`BCD\nSCT\n…`) for printing as a QR <sup>[6][6]</sup> |
| [paulmillr/qr](https://github.com/paulmillr/qr) | TypeScript | 339 | MIT / Apache-2.0 | v0.6.0, Apr 2026 | Generic zero-dep QR encoder + reader for the symbology layer; pairs with any of the above EPC BCD-string generators <sup>[12][12]</sup> |
| [smhg/sepa-qr-php](https://github.com/smhg/sepa-qr-php) (deprecated) | PHP | 51 | MIT | v3.1.0, Feb 2020 | Predecessor of `sepa-qr-data-php`; left in place for legacy installs only — new projects should use the successor <sup>[5][5]</sup> |

**Commercial / other**:
- **.NET** — DevExpress XtraReports ships `QRCodeEPCGenerator` as part of its barcode component <sup>[8][8]</sup>.

**Decoders:** any QR Code decoder produces the text payload; the BCD field-parsing is trivial (split by newline). [QR Code](https://docs.barcoder.ai/docs/standards/qr-code) decoders such as [zxing/zxing][zx] handle the QR side; the application reads the resulting plain-text payload.

**Hosted tools:** `zv.psa.at` (Austria's PSA reference generator); the PSA also publishes the BCD documentation for downstream implementers <sup>[Austria report](https://docs.barcoder.ai/docs/payments/AT)</sup>.

## Comparison

**vs. [HUB3](https://docs.barcoder.ai/docs/standards/hub3) (Croatian PDF417 standard)** — HUB3 carries similar payment data but uses the [PDF417](https://docs.barcoder.ai/docs/standards/pdf417) symbology and 14 newline-separated fields rather than QR Code and 11. HUB3's payload includes a Croatia-specific *model + reference number* field structure that doesn't map cleanly to EPC QR; this is why Croatia maintains both standards in parallel [[hub3-ref]]. EPC QR is supported in Croatia for cross-border SEPA payments, HUB3 remains the domestic norm.

**vs. national EMVCo-MPM QR standards (SGQR, DuitNow QR, PromptPay, QRIS, Bharat QR)** — These use the **EMVCo TLV** binary-ish format with a CRC, support consumer-presented as well as merchant-presented modes, and typically initiate an instant-payment rail transaction (settles in seconds). EPC QR uses BCD plain text and initiates a SEPA Credit Transfer (which historically settled in a business day, though SEPA Instant changes that). Different design lineages: EPC QR comes from the European banking community via Austria; EMVCo MPM comes from the global card-networks via Singapore.

**vs. *Wero* (next-generation pan-European wallet, rolling out 2024–2026)** — Wero is the European Payments Initiative's successor wallet, designed for instant P2P / merchant transactions across SEPA, and likely to overlap EPC QR's invoice-payment niche over time. Wero supports QR-based payments natively. EPC QR is not formally being replaced, but Wero's growth may slowly cannibalise the invoice-payment workflow <sup>[Austria report](https://docs.barcoder.ai/docs/payments/AT)</sup>.

**A regional banking standard adopted pan-Europe in 12 months.** The EPC QR specification is a rare case where **a single small country wrote the spec and the European Payments Council adopted essentially the same format within a year**. STUZZA, Austria's payment-standards body (now folded into PSA), published the original Stuzza QR specification in 2012; the EPC formalised it as EPC069-12 in February 2013 <sup>[3][3], [4][4]</sup>. Most pan-European banking standards take a decade of multi-country negotiation.

**Mandated Austrian visual chrome around every payment QR.** The Austrian branding **"Zahlen mit Code"** (literally "Pay with code") is printed next to every EPC QR on Austrian invoices, with vertical text and a distinctive frame. This visual identity is mandated by PSA so consumers can recognise payment-enabled QRs at a glance — German *Girocode* uses similar but slightly different framing <sup>[Austria report](https://docs.barcoder.ai/docs/payments/AT)</sup>.

**A 14-character ASCII header decides everything.** The first three newlines of every EPC QR payload are literally `BCD\n` + a version line (`001` or `002`) + `SCT\n` ("SEPA Credit Transfer") — three short ASCII tokens that mark this as an EPC-compliant SCT QR. A scanner that doesn't recognise the `BCD` marker treats the rest as free text and the payment flow never starts; downstream every implementation hardcodes this exact prefix.

**BIC stopped being mandatory mid-life.** The v001 spec (2013) required the recipient's BIC; the v002 generation (still current under v2.10) made BIC **optional** within the EEA, because IBAN-only routing became sufficient under the SEPA Regulation <sup>[3][3]</sup>. EPC QR is therefore one of the few payment-standard formats whose *required-field set shrank* over time as the rail it rides got smarter.

**SEPA Instant turns EPC QR into a real-time rail.** From **9 October 2025**, all SEPA PSPs were required to *send* SEPA instant payments (receiving had been mandatory since 9 January 2025) <sup>[1][1]</sup>. The EPC QR payload format did not change, but the rail behind it now settles in seconds — converting a 12-year-old "scan a paper bill and wait a business day" workflow into a "scan and the money is there" experience without touching the standard.

## Status

**Active and pan-European.** Maintained by the European Payments Council as guideline document **EPC069-12**, current revision v2.10 dated 17 June 2024 <sup>[1][1]</sup>. Supported by essentially all eurozone banks for invoice scanning, with country-specific brandings (Stuzza QR / Girocode / etc.) <sup>[3][3]</sup>. SEPA Instant Credit Transfer (mandatory across SEPA from 9 October 2025) is making the rail behind EPC QR settle instantly, which removes the historical "QR scan → next-day settlement" awkwardness without changing the EPC QR payload format [[hub3-ref]].

No deprecation planned. The pan-European Wero wallet may eventually overlap this niche, but for now EPC QR remains the default for printed-invoice payment initiation across the eurozone.

## Sources

[1]: https://en.wikipedia.org/wiki/EPC_QR_code
[2]: https://www.europeanpaymentscouncil.eu/document-library/guidance-documents/quick-response-code-guidelines-enable-data-capture-initiation
[3]: https://www.europeanpaymentscouncil.eu/
[4]: https://www.yowpay.com/2025/09/08/what-is-the-epc-qr-code/
[5]: https://github.com/smhg/sepa-qr-php
[6]: https://github.com/RikudouSage/QrPaymentEU
[7]: https://segno.readthedocs.io/en/latest/epc-qrcodes.html
[8]: https://docs.devexpress.com/XtraReports/404607/detailed-guide-to-devexpress-reporting/use-report-controls/use-bar-codes/epc-qr-code
[12]: https://github.com/paulmillr/qr
[13]: https://github.com/smhg/sepa-qr-data-php
[zx]: https://github.com/zxing/zxing
[at-cro]: https://docs.barcoder.ai/docs/payments/AT
[hub3-ref]: https://docs.barcoder.ai/source/standards/hub3

1. [EPC QR code — Wikipedia][1]
2. [Quick Response Code: Guidelines (EPC069-12) — European Payments Council][2]
3. [European Payments Council documentation][3]
4. [What is the EPC QR Code? — Yowpay][4]
5. [smhg/sepa-qr-php (deprecated predecessor) — GitHub][5]
6. [RikudouSage/QrPaymentEU — GitHub][6]
7. [EPC QR Codes — Segno documentation][7]
8. [EPC QR Code — DevExpress XtraReports][8]
9. [zxing/zxing][zx] — QR decoder
10. [AT-austria.md]<sup>[Austria report](https://docs.barcoder.ai/docs/payments/AT)</sup> — internal country report (STUZZA, PSA, bank apps)
11. [HUB3 entry][hub3-ref] — comparison
12. [paulmillr/qr — GitHub][12]
13. [smhg/sepa-qr-data-php — GitHub (active successor)][13]

## Deployments

Found in the following country reports (grep across `reports/countries/`):

- **AT** — [AT-austria.md](https://docs.barcoder.ai/docs/payments/AT)
- **BE** — [BE-belgium.md](https://docs.barcoder.ai/docs/payments/BE)
- **BG** — [BG-bulgaria.md](https://docs.barcoder.ai/docs/payments/BG)
- **CH** — [CH-switzerland.md](https://docs.barcoder.ai/docs/payments/CH)
- **DE** — [DE-germany.md](https://docs.barcoder.ai/docs/payments/DE)
- **EE** — [EE-estonia.md](https://docs.barcoder.ai/docs/payments/EE)
- **ES** — [ES-spain.md](https://docs.barcoder.ai/docs/payments/ES)
- **FI** — [FI-finland.md](https://docs.barcoder.ai/docs/payments/FI)
- **FR** — [FR-france.md](https://docs.barcoder.ai/docs/payments/FR)
- **GB** — [GB-united-kingdom.md](https://docs.barcoder.ai/docs/payments/GB)
- **GR** — [GR-greece.md](https://docs.barcoder.ai/docs/payments/GR)
- **HR** — [HR-croatia.md](https://docs.barcoder.ai/docs/payments/HR)
- **IE** — [IE-ireland.md](https://docs.barcoder.ai/docs/payments/IE)
- **IT** — [IT-italy.md](https://docs.barcoder.ai/docs/payments/IT)
- **LT** — [LT-lithuania.md](https://docs.barcoder.ai/docs/payments/LT)
- **LU** — [LU-luxembourg.md](https://docs.barcoder.ai/docs/payments/LU)
- **LV** — [LV-latvia.md](https://docs.barcoder.ai/docs/payments/LV)
- **MC** — [MC-monaco.md](https://docs.barcoder.ai/docs/payments/MC)
- **MT** — [MT-malta.md](https://docs.barcoder.ai/docs/payments/MT)
- **NL** — [NL-netherlands.md](https://docs.barcoder.ai/docs/payments/NL)
- **SI** — [SI-slovenia.md](https://docs.barcoder.ai/docs/payments/SI)
- **SK** — [SK-slovakia.md](https://docs.barcoder.ai/docs/payments/SK)
- **SM** — [SM-san-marino.md](https://docs.barcoder.ai/docs/payments/SM)
- **VA** — [VA-vatican.md](https://docs.barcoder.ai/docs/payments/VA)
- **XK** — [XK-kosovo.md](https://docs.barcoder.ai/docs/payments/XK)
