expand all
Projects Research Private Contact

Michael Pfeiffer
Imprint, Disclaimer


The sepa(1) program creates pain xml files for uploading to an online banking portal for batch booking. The transactions which are to put into the pain files are read from a so called CONTROL_FILE.


The control file format is derived from the dtaus(1) program. It is parted into one main configuration section additionally named with BEGIN and one section for each transaction. All section are put into braces.

The most simple CONTROL_FILE consist of two sections as shown in the following sample

  Art           TRANSACTION_TYPE
  Name          INITIATOR
  Ausfuehrung   TRANSACT_DATE
  Transaktion   TRANSACT_SUBTYPE
  Name          CRED_DEB_NAME
  BIC           CRED_DEB_BIC
  Betrag        AMOUNT
  Zweck         PURPOSE_TEXT
  Text          PURPOSE_TEXT_CONT

sepa supports two pain formats which are selected by TRANSACTION_TYPE in the main configuration section.

Transfer: pain.001.002.03

This is the transfer transaction. This transaction is selected by setting TRF for TRANSACTION_TYPE.

INITIATOR, INIT_ACCOUNT_IBAN and INIT_ACCOUNT_BIC must be set to the initiator account data. For this tranaction this is the debitor account.

TRANSACT_DATE might be set to an execution date which must be a future or the actual date. If this line is omitted the actual date is taken for the transaction.

The BatchBooking line might be omitted. If set the so called BtchBookg mode is set so that all transaction are booked as one transaction in the bank statement. If the line is omitted each transaction of the list has it's own entry in the bank statement.

For each transfer a transaction block is following. Here only the entries for a transfer transaction are taken into account, the entries for debit transactions are ignored here (but might be set).

This is the structure of a transfer transaction:

  Transaktion   TRANSACT_SUBTYPE
  Name          CREDITOR_NAME
  BIC           CREDITOR_BIC
  Betrag        AMOUNT
  Zweck         PURPOSE_TEXT
  Text          PURPOSE_TEXT_CONT

TRANSACT_SUBTYPE must be set to Gutschrift (credit) or Lohn (salary) for all entries of this transaction type.

CREDITOR_NAME, CREDITOR_IBAN and CREDITOR_BIC are to set to the account data of the creditor.

AMOUNT is the money amount in EUROs

PURPOSE_TEXT and PURPOSE_TEXT_CONT are concatenated to one purpose string. The maximumn length of the purpose text is 140 characters. It is mentioned here that no special character like german umlauts are allowed in neither the purpose string nor the creditor or the debitor names. The Text line might be repeated in the transaction entry.

debit: pain.008.002.02

The transaction type for debit transaction is selected by the entry DDCORE for TRANSACTION_TYPE.

For debit transactions CREDITOR_REFERECE_NUMBER is mandatory and must be set to the initators reference number.

Because all debit transactions are to anounce the TRANSACT_DATE must set to a date in the future.

The transaction data consist of the following entries:

  Transaktion   TRANSACT_SUBTYPE
  Mandat        MANDATE_ID
  SigDatum      MAND_SIG_DATE
  Name          DEBITOR_NAME
  BIC           DEBITOR_BIC
  Betrag        AMOUNT
  Zweck         PURPOSE_TEXT
  Text          PURPOSE_TEXT_CONT

The debit transaction has four different sub types (TRANSACT_SUBTYPE). Einzug-Erster (FRST) indicates a first time transaction with the mandate which is handled as repeatable mandate. This entry might be used but it isn’t necessary. If it’s a repeatable mandate one can set Einzug-Wiederholung (RCUR) even if it's the first debit. sepa knows about all mandates so it can decide which is the right sub type here. If a mandate should terminate one can set Einzug-Letzter (FNAL) for the transaction. If it's a one time debit you have to use Einzug-Einmalig (OOFF) for sub type.

All transaction have two additional entries MANDATE_ID and MAND_SIG_DATE. If a mandate is used for the first time these entries are to fill with the mandate data the unique MANDATE_ID and the date of mandate’s signature. Once these data are set and linked with DEBITOR_IBAN and DEBITOR_BIC to the unique MANDATE_ID only the MANDATE_ID and DEBITOR_NAME are necessary to set for a debit transaction.

In the case that debitors bank account data has changed you can proceed using the mandate with different bank data entries (DEBITOR_IBAN and DEBITOR_BIC). In this case you have to put these two entries into the transaction record for this one time.

For the remaining entries see TRANSFER: PAIN.001.002.03.

character encoding

sepa assumes that the input files are coded in UTF-8 format.


sepa(1), dtaus(1), dtaus(5)