Technical · EPC069-12 Standard

EPC QR Code Generator – EPC069-12 Standard

💡 Quick Answer

An EPC QR Code (European Payments Council QR Code) is the technical name for the GiroCode. The EPC069-12 standard defines the exact structure of the payload: 11 lines containing the service tag, version, encoding, SCT identification, BIC, recipient name, IBAN, amount and payment reference.

EPC069-12

Official Standard

11

Lines in Payload

V001/V002

Versions

Level M

Error Correction (recommended)

EPC069-12 Payload Structure

The EPC069-12 payload is a line-based text format with exactly 11 lines. Each line has a fixed meaning – empty lines are allowed for optional fields:

BCD                      ← Service Tag
002                      ← Version
1                        ← Character Set (1=UTF-8)
SCT                      ← Identification Code (SEPA Credit Transfer)
                         ← BIC (optional, leave empty)
Max Mustermann           ← Name (max 70 characters)
DE89370400440532013000   ← IBAN
EUR99.99                 ← Amount (EUR + amount, e.g. EUR99.99)
                         ← Purpose Code (leave empty)
                         ← Remittance Info (structured, leave empty)
Invoice 2026-001         ← Payment Reference (max 140 characters)

Versions 001 vs. 002

Version 001 requires a BIC, Version 002 makes BIC optional. Recommended: Version 002 for new implementations. Most banking apps accept both versions. With Version 002, the BIC line can be left empty, as the SEPA network identifies the bank from the IBAN.

Error Correction Level

EPC069-12 recommends Level M (15% recovery) for digital display on screens. For printing on invoices or posters, Level H (30% recovery) is recommended for better readability – even if the QR code is slightly damaged or dirty.

JavaScript Implementation Example

This function generates a valid EPC069-12 payload that can be rendered directly with a QR code library (e.g. qrcode or qr-code-styling):

function buildEPCPayload({ name, iban, bic = '', amount, purpose = '' }) {
  const amountStr = amount ? 'EUR' + Number(amount).toFixed(2) : '';
  return [
    'BCD',       // Service Tag
    '002',       // Version
    '1',         // Character Set (UTF-8)
    'SCT',       // SEPA Credit Transfer
    bic.trim(),  // BIC (optional)
    name.trim().slice(0, 70),
    iban.replace(/\s+/g, '').toUpperCase(),
    amountStr,   // EUR + amount or empty
    '',          // Purpose Code (empty)
    '',          // Structured Remittance Info (empty)
    purpose.trim().slice(0, 140)
  ].join('\n');
}

Frequently Asked Questions

What is the difference between EPC QR Code, GiroCode and SEPA QR Code?

They all refer to the same thing: EPC QR Code is the technical name, GiroCode is the German brand name, SEPA QR Code is the functional term. The underlying standard is EPC069-12.

Which version of the EPC069-12 standard should I use?

Version 002 (BIC optional), as newer banks no longer require a BIC. Version 002 is backward compatible and supported by all modern banking apps.

What is the maximum amount in an EPC QR Code?

There is no technical limit in the EPC069-12 standard itself. However, SEPA transfers have a maximum of EUR 999,999,999.99.

How do I integrate the EPC QR Code Generator into my website?

Via API at /api/generate or using the URL parameter approach. See full details in the API documentation at /api-docs.