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:




Date/Time indication at which the report was created


Transaction Reference Number


Related Reference Number


Account Identification


Statement Number


The floor limit for debit and credit


Opening Balance


Intermediate Balance


Closing Balance


Statement Line


Closing Balance


Intermediate Closing Balance


Final Closing Balance


Available Balance


Forward Available Balance


Transaction Information


Total number and amount of debit entries


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(*args, **kwargs)[source]

Bases: 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(*args, **kwargs)[source]

Bases: BalanceBase

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

Bases: 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(*args, **kwargs)[source]

Bases: BalanceBase

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

Bases: 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(*args, **kwargs)[source]

Bases: ClosingBalance

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

Bases: BalanceBase

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

Bases: 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(*args, **kwargs)[source]

Bases: BalanceBase

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

Bases: ClosingBalance

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

Bases: BalanceBase

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

Bases: 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: Transaction, 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(*args, **kwargs)[source]

Bases: BalanceBase

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

Bases: 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(*args, **kwargs)[source]

Bases: 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 Transaction

slug = 'statement'
class mt940.tags.StatementASNB(*args, **kwargs)[source]

Bases: 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(*args, **kwargs)[source]

Bases: 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(*args, **kwargs)[source]

Bases: SumEntries

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

Bases: SumEntries

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

Bases: 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(*args, **kwargs)[source]

Bases: object

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

alias of Transactions

class mt940.tags.Tags(value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]

Bases: Enum

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(*args, **kwargs)[source]

Bases: 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 Transaction

slug = 'transaction_details'
class mt940.tags.TransactionReferenceNumber(*args, **kwargs)[source]

Bases: 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'