EPC Girocode
EPC Girocode is the European Payments Council's QR format for SEPA Credit Transfer. A scanned Girocode pre-fills the payee's IBAN, amount, and remittance message in the payer's banking app — saving a manual copy-paste of bank details. Supported natively by Sparkasse, Volksbank, Deutsche Bank, ING, N26, Revolut, and most German/Austrian/Dutch banking apps. Outside SEPA, Girocode does nothing.
Encoding: Plain UTF-8 text — not TLV, not structured. Twelve fixed-position fields separated by
\n (LF, U+000A). Max payload 331 bytes.Scheme: SEPA Credit Transfer (SCT) or SEPA Instant Credit Transfer (SCT Inst). The QR triggers a one-off credit transfer; no direct debit / standing order.
Payload structure — 12 lines, newline-separated
| Line | Field | Length | Required | Notes |
|---|---|---|---|---|
| 1 | Service tag | 3 | Yes | Fixed value BCD. |
| 2 | Version | 3 | Yes | 001 (original spec) or 002 (v2 — BIC now optional within EEA). |
| 3 | Character set | 1 | Yes | 1=UTF-8, 2=ISO-8859-1, 3=ISO-8859-2, etc. 1 is the only safe choice. |
| 4 | Identification | 3 | Yes | SCT (standard Credit Transfer). SCT Inst uses the same tag — instant/standard is an acquirer decision. |
| 5 | BIC | 0, 8, or 11 | No (v002) | Required in v001; optional in v002 for SEPA payments. Include it for non-EEA receivers. |
| 6 | Beneficiary name | 1–70 | Yes | Natural-language name. Character set per line 3. |
| 7 | IBAN | 1–34 | Yes | No spaces or formatting. DE89370400440532013000, not DE89 3704 0044 0532 0130 00. |
| 8 | Amount | 4–12 | No | Format: EUR10.00. Omit to let the payer enter the amount at scan time. |
| 9 | Purpose | 0–4 | No | ISO 20022 External Purpose Code. Examples: GDDS (goods), CHAR (charity). |
| 10 | Structured remittance reference | 0–35 | No | ISO 11649 RF creditor reference — for automated reconciliation. Mutually exclusive with line 11. |
| 11 | Unstructured remittance info | 0–140 | No | Free-text payment reason. Mutually exclusive with line 10. |
| 12 | Beneficiary-to-originator info | 0–70 | No | Optional hint text shown to the payer in the bank app (e.g. "Rechnung 2026-0042"). |
Canonical test vector — v002 minimal
Transfer of €12.50 to Max Mustermann at Commerzbank, IBAN DE89370400440532013000, no BIC, unstructured reference "Rechnung 42":
BCD
002
1
SCT
Max Mustermann
DE89370400440532013000
EUR12.50
Rechnung 42
Note the empty lines at positions 5 (no BIC), 9 (no purpose), 10 (no structured reference). They're required — the line count must be exactly 12 (or 11 if line 12 is omitted).
Live IBAN validator (mod-97)
Girocode rejects any IBAN that fails the ISO 13616 mod-97 checksum. Below is the same validator Abundera runs inline inside the Girocode generator — runs in your browser.
Common pitfalls
- Line endings. EPC069-12 mandates LF (
\n, U+000A). CR+LF (\r\n) breaks some Android banking apps. If you copy-paste the payload out of Windows Notepad you'll end up with CR+LF; strip the CRs before QR encoding. - BIC required for v001, optional for v002. Always emit version
002for SEPA-internal transfers — saves 8–11 chars of payload and works with every modern banking app. Include BIC only for legacy v001 apps (mostly retired) or non-EEA receivers. - Amount format strict.
EUR10.00— currency code prefix, dot separator, exactly two decimals.EUR10,EUR10,00,10.00 EURall fail. - Cannot mix structured + unstructured reference. Line 10 and line 11 are mutually exclusive. If both are non-empty, the spec says the QR is invalid; in practice some apps accept it and drop one, which creates reconciliation mismatches.
- IBAN spaces. The IBAN field (line 7) accepts no whitespace. Human-readable
DE89 3704 0044 0532 0130 00must be stripped toDE89370400440532013000before encoding. - Max payload 331 bytes. QR payload exceeding 331 bytes is rejected by the spec. Long beneficiary names + long remittance messages + BIC + IBAN can push over. Banking apps display an error on scan; the QR doesn't self-warn during encoding.
- Character set trap. Line 3 says which charset applies to lines 6, 11, 12. UTF-8 (value
1) is the only realistic choice for international names. ISO-8859-1 can't encode anything outside Western European Latin. - SEPA zone only. Girocode payments only work between SEPA-participating accounts (EU + EEA + Switzerland + UK + Monaco + San Marino + Andorra + Vatican). Scanning a Girocode in a non-SEPA banking app either fails or opens a normal transfer screen with blank fields.
- No direct debit. Girocode is SEPA Credit Transfer only. Pull/subscription flows (standing orders, recurring mandates) aren't expressible in Girocode. For those, pair the QR with a SEPA mandate document.
- PSD2 return rights. SEPA Credit Transfer is push-based and consumer-authorised at scan. Consumer refund rights under PSD2 still apply (e.g. unauthorised transaction within 13 months). Merchants must retain the signed authorisation trail separately — the QR itself isn't a contract.
Banking-app compatibility
| App / region | Girocode support | Notes |
|---|---|---|
| Sparkasse (DE) | Native | The original target for Girocode. Full support. |
| Volksbank / Raiffeisen (DE, AT) | Native | Full support in the VR-BankingApp. |
| Deutsche Bank, Commerzbank, Postbank (DE) | Native | Scan via their mobile app's "Überweisung" flow. |
| ING (DE / NL) | Native | Also scans iDEAL QRs in the NL app. |
| N26, Revolut | Native | Full support across all supported countries. |
| Erste Bank, Bank Austria (AT) | Native | Austria adopted Girocode alongside Germany. |
| Crédit Agricole, BNP Paribas (FR) | Partial | Some French banks scan Girocode, most prefer the older paper reference format. |
| Generic iOS/Android camera | No | Native cameras don't parse the BCD text format as a payment intent. User must open their banking app first. |
See also
- /epc-girocode-qr-code/ — the Girocode generator with IBAN validation and live encoding.
- /sepa-qr-code/ — SEPA Credit Transfer QR generator (same underlying format).
- /standards/swiss-qr-bill/ — Swiss QR-bill, the regional alternative for CHF/Swiss-IBAN transfers.
- /standards/ — back to the standards index.