mt940.tags module

The MT940 format is a standard for bank account statements. It is used by many banks in Europe and is based on the SWIFT MT940 format.

The MT940 tags are:

Tag Description
:13: Date/Time indication at which the report was created
:20: Transaction Reference Number
:21: Related Reference Number
:25: Account Identification
:28: Statement Number
:34: The floor limit for debit and credit
:60F: Opening Balance
:60M: Intermediate Balance
:60E: Closing Balance
:61: Statement Line
:62: Closing Balance
:62M: Intermediate Closing Balance
:62F: Final Closing Balance
:64: Available Balance
:65: Forward Available Balance
:86: Transaction Information
:90: Total number and amount of debit entries
:NS: Bank specific Non-swift extensions containing extra information



The pattern for the tags use the following syntax:

[] = optional
! = fixed length
a = Text
x = Alphanumeric, seems more like text actually. Can include special
    characters (slashes) and whitespace as well as letters and numbers
d = Numeric separated by decimal (usually comma)
c = Code list value
n = Numeric
class mt940.tags.AccountIdentification[source]

Bases: mt940.tags.Tag

Account identification

Pattern: 35x

id = 25
logger = <Logger mt940.tags.AccountIdentification (WARNING)>
name = 'AccountIdentification'
pattern = '(?P<account_identification>.{0,35})'
slug = 'account_identification'
class mt940.tags.AvailableBalance[source]

Bases: mt940.tags.BalanceBase

id = 64
logger = <Logger mt940.tags.AvailableBalance (WARNING)>
name = 'AvailableBalance'
slug = 'available_balance'
class mt940.tags.BalanceBase[source]

Bases: mt940.tags.Tag

Balance base

Pattern: 1!a6!n3!a15d

pattern = '^\n (?P<status>[DC]) # 1!a Debit/Credit\n (?P<year>\\d{2}) # 6!n Value Date (YYMMDD)\n (?P<month>\\d{2})\n (?P<day>\\d{2})\n (?P<currency>.{3}) # 3!a Currency\n (?P<amount>[0-9,]{0,16}) # 15d Amount (includes decimal sign, so 16)\n '
class mt940.tags.ClosingBalance[source]

Bases: mt940.tags.BalanceBase

id = 62
logger = <Logger mt940.tags.ClosingBalance (WARNING)>
name = 'ClosingBalance'
slug = 'closing_balance'
class mt940.tags.DateTimeIndication[source]

Bases: mt940.tags.Tag

Date/Time indication at which the report was created

Pattern: 6!n4!n1! x4!n

id = 13
logger = <Logger mt940.tags.DateTimeIndication (WARNING)>
name = 'DateTimeIndication'
pattern = '^\n (?P<year>\\d{2})\n (?P<month>\\d{2})\n (?P<day>\\d{2})\n (?P<hour>\\d{2})\n (?P<minute>\\d{2})\n (\\+(?P<offset>\\d{4})|)\n '
slug = 'date_time_indication'
class mt940.tags.FinalClosingBalance[source]

Bases: mt940.tags.ClosingBalance

id = '62F'
logger = <Logger mt940.tags.FinalClosingBalance (WARNING)>
name = 'FinalClosingBalance'
slug = 'final_closing_balance'
class mt940.tags.FinalOpeningBalance[source]

Bases: mt940.tags.BalanceBase

id = '60F'
logger = <Logger mt940.tags.FinalOpeningBalance (WARNING)>
name = 'FinalOpeningBalance'
slug = 'final_opening_balance'
class mt940.tags.FloorLimitIndicator[source]

Bases: mt940.tags.Tag

Floor limit indicator indicates the minimum value reported for debit and credit amounts

Pattern: :34F:GHSC0,00

id = 34
logger = <Logger mt940.tags.FloorLimitIndicator (WARNING)>
name = 'FloorLimitIndicator'
pattern = '^\n (?P<currency>[A-Z]{3}) # 3!a Currency\n (?P<status>[DC ]?) # 2a Debit/Credit Mark\n (?P<amount>[0-9,]{0,16}) # 15d Amount (includes decimal sign, so 16)\n $'
slug = 'floor_limit_indicator'
class mt940.tags.ForwardAvailableBalance[source]

Bases: mt940.tags.BalanceBase

id = 65
logger = <Logger mt940.tags.ForwardAvailableBalance (WARNING)>
name = 'ForwardAvailableBalance'
slug = 'forward_available_balance'
class mt940.tags.IntermediateClosingBalance[source]

Bases: mt940.tags.ClosingBalance

id = '62M'
logger = <Logger mt940.tags.IntermediateClosingBalance (WARNING)>
name = 'IntermediateClosingBalance'
slug = 'intermediate_closing_balance'
class mt940.tags.IntermediateOpeningBalance[source]

Bases: mt940.tags.BalanceBase

id = '60M'
logger = <Logger mt940.tags.IntermediateOpeningBalance (WARNING)>
name = 'IntermediateOpeningBalance'
slug = 'intermediate_opening_balance'
class mt940.tags.NonSwift[source]

Bases: mt940.tags.Tag

Non-swift extension for MT940 containing extra information. The actual definition is not consistent between banks so the current implementation is a tad limited. Feel free to extend the implementation and create a pull request with a better version :)

It seems this could be anything so we’ll have to be flexible about it.

Pattern: 2!n35x | *x

id = 'NS'
logger = <Logger mt940.tags.NonSwift (WARNING)>
name = 'NonSwift'
pattern = '\n (?P<non_swift>\n (\n (\\d{2}.{0,})\n (\\n\\d{2}.{0,})*\n )|(\n [^\\n]*\n )\n )\n $'
class scope(transactions, data=None)[source]

Bases: mt940.models.Transaction, mt940.models.Transactions

slug = 'non_swift'
sub_pattern = '\n (?P<ns_id>\\d{2})(?P<ns_data>.{0,})\n '
sub_pattern_m = re.compile('\n (?P<ns_id>\\d{2})(?P<ns_data>.{0,})\n ', re.IGNORECASE|re.VERBOSE)
class mt940.tags.OpeningBalance[source]

Bases: mt940.tags.BalanceBase

id = 60
logger = <Logger mt940.tags.OpeningBalance (WARNING)>
name = 'OpeningBalance'
slug = 'opening_balance'
class mt940.tags.RelatedReference[source]

Bases: mt940.tags.Tag

Related reference

Pattern: 16x

id = 21
logger = <Logger mt940.tags.RelatedReference (WARNING)>
name = 'RelatedReference'
pattern = '(?P<related_reference>.{0,16})'
slug = 'related_reference'
class mt940.tags.Statement[source]

Bases: mt940.tags.Tag

The MT940 Tag 61 provides information about a single transaction that has taken place on the account. Each transaction is identified by a unique transaction reference number (Tag 20) and is described in the Statement Line (Tag 61).

Pattern: 6!n[4!n]2a[1!a]15d1!a3!c23x[//16x]

The fields are:

  • value_date: transaction date (YYMMDD)
  • entry_date: Optional 4-digit month value and 2-digit day value of the entry date (MMDD)
  • funds_code: Optional 1-character code indicating the funds type ( the third character of the currency code if needed)
  • amount: 15-digit value of the transaction amount, including commas for decimal separation
  • transaction_type: Optional 4-character transaction type identification code starting with a letter followed by alphanumeric characters and spaces
  • customer_reference: Optional 16-character customer reference, excluding any bank reference
  • bank_reference: Optional 23-character bank reference starting with “//”
  • supplementary_details: Optional 34-character supplementary details about the transaction.

The Tag 61 can occur multiple times within an MT940 file, with each occurrence representing a different transaction.

id = 61
logger = <Logger mt940.tags.Statement (WARNING)>
name = 'Statement'
pattern = "^\n (?P<year>\\d{2}) # 6!n Value Date (YYMMDD)\n (?P<month>\\d{2})\n (?P<day>\\d{2})\n (?P<entry_month>\\d{2})? # [4!n] Entry Date (MMDD)\n (?P<entry_day>\\d{2})?\n (?P<status>R?[DC]) # 2a Debit/Credit Mark\n (?P<funds_code>[A-Z])? # [1!a] Funds Code (3rd character of the currency\n # code, if needed)\n [\\n ]? # apparently some banks (sparkassen) incorporate newlines here\n # cuscal can also send a space here as well\n (?P<amount>[\\d,]{1,15}) # 15d Amount\n (?P<id>[A-Z][A-Z0-9 ]{3})? # 1!a3!c Transaction Type Identification Code\n # We need the (slow) repeating negative lookahead to search for // so we\n # don't acciddntly include the bank reference in the customer reference.\n (?P<customer_reference>((?!//)[^\\n]){0,16}) # 16x Customer Reference\n (//(?P<bank_reference>.{0,23}))? # [//23x] Bank Reference\n (\\n?(?P<extra_details>.{0,34}))? # [34x] Supplementary Details\n $"

alias of mt940.models.Transaction

slug = 'statement'
class mt940.tags.StatementASNB[source]

Bases: mt940.tags.Statement


Pattern: 6!n[4!n]2a[1!a]15d1!a3!c16x[//16x] [34x]

But ASN bank puts the IBAN in the customer reference, which is acording to Wikipedia at most 34 characters.

So this is the new pattern:

Pattern: 6!n[4!n]2a[1!a]15d1!a3!c34x[//16x] [34x]

pattern = '^\n (?P<year>\\d{2}) # 6!n Value Date (YYMMDD)\n (?P<month>\\d{2})\n (?P<day>\\d{2})\n (?P<entry_month>\\d{2})? # [4!n] Entry Date (MMDD)\n (?P<entry_day>\\d{2})?\n (?P<status>[A-Z]?[DC]) # 2a Debit/Credit Mark\n (?P<funds_code>[A-Z])? # [1!a] Funds Code (3rd character of the currency\n # code, if needed)\n \\n? # apparently some banks (sparkassen) incorporate newlines here\n (?P<amount>[\\d,]{1,15}) # 15d Amount\n (?P<id>[A-Z][A-Z0-9 ]{3})? # 1!a3!c Transaction Type Identification Code\n (?P<customer_reference>.{0,34}) # 34x Customer Reference\n (//(?P<bank_reference>.{0,16}))? # [//16x] Bank Reference\n (\\n?(?P<extra_details>.{0,34}))? # [34x] Supplementary Details\n $'
class mt940.tags.StatementNumber[source]

Bases: mt940.tags.Tag

Statement number / sequence number

Pattern: 5n[/5n]

id = 28
logger = <Logger mt940.tags.StatementNumber (WARNING)>
name = 'StatementNumber'
pattern = '\n (?P<statement_number>\\d{1,5}) # 5n\n (?:/?(?P<sequence_number>\\d{1,5}))? # [/5n]\n $'
slug = 'statement_number'
class mt940.tags.SumCreditEntries[source]

Bases: mt940.tags.SumEntries

id = '90C'
logger = <Logger mt940.tags.SumCreditEntries (WARNING)>
name = 'SumCreditEntries'
slug = 'sum_credit_entries'
status = 'C'
class mt940.tags.SumDebitEntries[source]

Bases: mt940.tags.SumEntries

id = '90D'
logger = <Logger mt940.tags.SumDebitEntries (WARNING)>
name = 'SumDebitEntries'
slug = 'sum_debit_entries'
status = 'D'
class mt940.tags.SumEntries[source]

Bases: mt940.tags.Tag

Number and Sum of debit Entries

id = 90
logger = <Logger mt940.tags.SumEntries (WARNING)>
name = 'SumEntries'
pattern = '^\n (?P<number>\\d*)\n (?P<currency>.{3}) # 3!a Currency\n (?P<amount>[\\d,]{1,15}) # 15d Amount\n '
slug = 'sum_entries'
class mt940.tags.Tag[source]

Bases: object

id = 0
parse(transactions, value)[source]

alias of mt940.models.Transactions

class mt940.tags.Tags[source]

Bases: enum.Enum

An enumeration.

ACCOUNT_IDENTIFICATION = <mt940.tags.AccountIdentification object>
AVAILABLE_BALANCE = <mt940.tags.AvailableBalance object>
CLOSING_BALANCE = <mt940.tags.ClosingBalance object>
DATE_TIME_INDICATION = <mt940.tags.DateTimeIndication object>
FINAL_CLOSING_BALANCE = <mt940.tags.FinalClosingBalance object>
FINAL_OPENING_BALANCE = <mt940.tags.FinalOpeningBalance object>
FLOOR_LIMIT_INDICATOR = <mt940.tags.FloorLimitIndicator object>
FORWARD_AVAILABLE_BALANCE = <mt940.tags.ForwardAvailableBalance object>
INTERMEDIATE_CLOSING_BALANCE = <mt940.tags.IntermediateClosingBalance object>
INTERMEDIATE_OPENING_BALANCE = <mt940.tags.IntermediateOpeningBalance object>
NON_SWIFT = <mt940.tags.NonSwift object>
OPENING_BALANCE = <mt940.tags.OpeningBalance object>
RELATED_REFERENCE = <mt940.tags.RelatedReference object>
STATEMENT = <mt940.tags.Statement object>
STATEMENT_NUMBER = <mt940.tags.StatementNumber object>
SUM_CREDIT_ENTRIES = <mt940.tags.SumCreditEntries object>
SUM_DEBIT_ENTRIES = <mt940.tags.SumDebitEntries object>
SUM_ENTRIES = <mt940.tags.SumEntries object>
TRANSACTION_DETAILS = <mt940.tags.TransactionDetails object>
TRANSACTION_REFERENCE_NUMBER = <mt940.tags.TransactionReferenceNumber object>
class mt940.tags.TransactionDetails[source]

Bases: mt940.tags.Tag

Transaction details

Pattern: 6x65x

id = 86
logger = <Logger mt940.tags.TransactionDetails (WARNING)>
name = 'TransactionDetails'
pattern = '\n (?P<transaction_details>(([\\s\\S]{0,65}\\r?\\n?){0,8}[\\s\\S]{0,65}))\n '

alias of mt940.models.Transaction

slug = 'transaction_details'
class mt940.tags.TransactionReferenceNumber[source]

Bases: mt940.tags.Tag

Transaction reference number

Pattern: 16x

id = 20
logger = <Logger mt940.tags.TransactionReferenceNumber (WARNING)>
name = 'TransactionReferenceNumber'
pattern = '(?P<transaction_reference>.{0,16})'
slug = 'transaction_reference_number'