Skip to main content

SWIFT MT942 Interim Transaction Report loader for the bankstatementparser library — parses MT942 into bankstatementparser Transaction objects.

Project description

bankstatementparser-loader-mt942: SWIFT MT942 loader

PyPI Version Python Versions License Tests Quality

Parse SWIFT MT942 Interim Transaction Report files into bankstatementparser Transaction objects. A single load_mt942(text) call returns a list of bankstatementparser.transaction_models.Transaction, ready for every downstream consumer that already works with the core library's parser output (deduplication, categorisation, exports).

The core bankstatementparser library parses PDF and CSV statements but does not understand the SWIFT MT942 wire format. This loader fills that gap without changing the core data model.

Contents

Overview

bankstatementparser-loader-mt942 is a small, focused companion to the bankstatementparser library. It does one thing well: parse the SWIFT MT942 Interim Transaction Report grammar and hand back the same Transaction objects the core PDF/CSV parsers produce. Every transaction is stamped with source="mt942" so you can tell where it came from.

MT942 is an interim statement. Unlike MT940 it carries no :60F: opening or :62F: closing balance — it reports a floor limit, an optional date/time stamp, the statement lines accumulated so far, and debit/credit summaries. This loader models that structure faithfully and never invents balances that are not present in the source.

Install

bankstatementparser-loader-mt942 runs on macOS, Linux, and Windows and requires Python 3.10+ and pip. It pulls in bankstatementparser (>= 0.0.9) automatically.

pip install bankstatementparser-loader-mt942

Quick Start

from bankstatementparser_loader_mt942 import load_mt942

mt942 = """:20:MT942REF001
:25:COBADEFFXXX/DE89370400440532013000
:28C:42/1
:34F:EURD0,00
:34F:EURC0,00
:13D:2506241200+0100
:61:2506240624C500,00NTRFINV-123//BANKREF1
:86:Incoming payment for invoice 123
:61:2506240624D200,50NTRFRENT//BANKREF2
:86:Monthly rent debit
:90D:1EUR200,50
:90C:1EUR500,00
-
"""

transactions = load_mt942(mt942)

for txn in transactions:
    print(txn.value_date, txn.currency, txn.amount, txn.description)
# 2025-06-24 EUR 500.00 Incoming payment for invoice 123
# 2025-06-24 EUR -200.50 Monthly rent debit

Those are bankstatementparser.transaction_models.Transaction objects — debit lines carry a negative amount, credit lines a positive one, and amounts are exact Decimal values (SWIFT's comma decimal separator 500,00 is converted to Decimal("500.00")).

To read from a file instead of a string:

from bankstatementparser_loader_mt942 import load_mt942_file

transactions = load_mt942_file("statement.mt942")

Supported Fields

Tag Meaning Cardinality
:20: Transaction reference number mandatory
:25: Account identification (the account id) mandatory
:28C: Statement / sequence number optional
:34F: Floor limit indicator <CCY>[D|C]<amount> (provides the currency) one or two
:13D: Date/time stamp YYMMDDHHMM±HHMM optional
:61: Statement line (one per booked entry) repeatable
:86: Information to account owner (attaches to the preceding :61:) optional, per line
:90D: Debit summary <count><CCY><amount> optional
:90C: Credit summary <count><CCY><amount> optional

Unrecognised tags (and the trailing - end-of-message marker) are silently ignored, so future SWIFT additions do not break parsing — this follows Postel's law: be liberal in what you accept. A malformed :61: statement line is skipped rather than fatal, so one bad row never aborts the whole parse.

Field Mapping

Each :61: statement line becomes one Transaction:

Transaction field Source
account_id :25:
currency :34F:
amount :61: amount, negated for debit (D) lines, as Decimal
value_date :61: value date (YYMMDD)
booking_date :61: optional entry date (MMDD, inherits the value-date year)
transaction_id the bank reference in the :61: tail (left of //)
reference the customer reference in the :61: tail (right of //)
description the following :86: free-form text
source always "mt942"
source_index the zero-based line index within the message

The two-digit YY year uses the standard SWIFT sliding window: 00-79 map to 20YY, 80-99 to 19YY.

Summaries

When you want the message metadata and the :90D:/:90C: roll-ups rather than the individual transactions, call summarize_mt942:

from bankstatementparser_loader_mt942 import summarize_mt942

summary = summarize_mt942(mt942)
print(summary.reference)          # MT942REF001
print(summary.currency)           # EUR
print(summary.debit_count)        # 1
print(summary.debit_sum)          # Decimal("200.50")
print(summary.credit_sum)         # Decimal("500.00")
print(summary.transaction_count)  # 2

Mt942Summary is a frozen dataclass with reference, account_id, currency, statement_datetime, debit_count, debit_sum, credit_count, credit_sum, and transaction_count. Optional fields (no :90x: / :13D: present) default to None.

Errors

A payload missing the mandatory :20: reference or :25: account identification raises ValueError with a message naming the missing tag:

load_mt942(":25:ACC\n:61:250624C10,00NTRFX\n")
# ValueError: MT942 payload missing required :20: reference

Examples

Two runnable examples live in examples/:

Both are exercised in CI on every commit.

When not to use this loader

  • You have a PDF or CSV statement. Use the core bankstatementparser parsers directly — this loader is only for the SWIFT MT942 wire format.
  • You have MT940 (final statements with balances). MT940 is a different message; this loader handles the interim MT942 report. The :61: / :86: grammar is shared, but MT942 has no :60F: / :62F: balances.
  • You need bank-specific :86: sub-field parsing (e.g. Deutsche Bank's ?20 / ?30 / ?32 GVC codes). The raw :86: value is preserved verbatim as the transaction description; downstream tooling can parse it if needed.
  • Your MT942 is PGP / GPG encrypted. Decrypt upstream and pass the plaintext to the loader.

Development

git clone https://github.com/sebastienrousseau/bankstatementparser-loader-mt942
cd bankstatementparser-loader-mt942
python -m venv .venv && source .venv/bin/activate
pip install -e .
pip install pytest pytest-cov ruff mypy interrogate
pytest --cov=bankstatementparser_loader_mt942 --cov-branch --cov-fail-under=100
ruff check bankstatementparser_loader_mt942 tests examples
mypy bankstatementparser_loader_mt942
interrogate -c pyproject.toml bankstatementparser_loader_mt942

Security

bankstatementparser-loader-mt942 parses a flat text format with no XML envelope, so the XXE / billion-laughs surface does not apply. Field regexes are anchored and bounded, so catastrophic backtracking is not a concern. Reporting practice and supported versions are documented in SECURITY.md. Vulnerabilities go via GitHub Private Vulnerability Reporting, not public issues.

Documentation

License

Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.

Contributing

Contributions are welcome. Open an issue or PR on the repository.

Acknowledgements

Built on the bankstatementparser library. The MT942 grammar follows the SWIFT User Handbook MT942 Interim Transaction Report specification and the common-denominator subset shipped by major EU and UK commercial banks.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bankstatementparser_loader_mt942-0.0.11.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file bankstatementparser_loader_mt942-0.0.11.tar.gz.

File metadata

File hashes

Hashes for bankstatementparser_loader_mt942-0.0.11.tar.gz
Algorithm Hash digest
SHA256 b59283d14ebdb692c7b292df5e02b79e787dc1b91fbf5a8f101d6f7623dedb57
MD5 a4e14374c9c5fe56ae15d1bb817d149f
BLAKE2b-256 044a4230ce762cf642dcc5357b52e3d02da3eb2ccc59cd81e6c92581c7e9c383

See more details on using hashes here.

Provenance

The following attestation bundles were made for bankstatementparser_loader_mt942-0.0.11.tar.gz:

Publisher: release.yml on sebastienrousseau/bankstatementparser-loader-mt942

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bankstatementparser_loader_mt942-0.0.11-py3-none-any.whl.

File metadata

File hashes

Hashes for bankstatementparser_loader_mt942-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 442661deb8fb0a7b68206bf16bb329832d0ae4c2bb759407ed3ac55bcded04ad
MD5 df566ed587711a57e5134d7eebb3b3b0
BLAKE2b-256 07a26cde5f4e02121f382efc650f4daa13c5974f8744e7a08cb9abbc6bd8c383

See more details on using hashes here.

Provenance

The following attestation bundles were made for bankstatementparser_loader_mt942-0.0.11-py3-none-any.whl:

Publisher: release.yml on sebastienrousseau/bankstatementparser-loader-mt942

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page