Skip to main content

CI - build CI - coverage Static Badge PyPI - Version PyPI - Status PyPI - Python Version License

お金かね 【okane】

okane is a pure Python parser for bank statements in camt.053 XML format [1], in dialect used by the Czech Banking Association (ČBA) [2].

It parses BkToCstmrStmt XML element into okane.models.BankToCustomerStatement which is a Pydantic model. It can also work as a CLI tool, converting camt.053 XML files to JSON or CSV.

Installation

pip install okane

# or, if you'd like to use the CSV export features and access the data as `pl.DataFrame`
pip install okane[polars]

Example

Python API

>>> import okane
>>> statement = okane.BankToCustomerStatement.from_file("./tests/data/test2.xml")
>>> statement.opening_balance
Balance(amount=Decimal('1000.00'), currency='CZK', date=datetime.date(2023, 3, 1))
>>> statement.transactions[5].amount
Decimal('1000.00')
>>> statement.transactions[5].currency
'CZK'
>>> statement.transactions[5].related_account_id
AccountId(iban='LT6632xxxxxx', id=None)
>>> statement.transactions[5].related_account_bank_id
BankId(bic='REVOLT21', id=None)
>>> statement.transactions[3].ref
TransactionRef(message_id='XXX', end_to_end_id='XXX', account_servicer_ref=None, payment_invocation_id=None, instruction_id=None, mandate_id=None, cheque_number=None, clearing_system_ref=None)
>>> tx_df = statement.get_transaction_dataframe()
>>> balance_df = statement.get_balance_dataframe()

Command-line interface

head ./tests/data/test2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
    <BkToCstmrStmt>
        <GrpHdr>
            <MsgId>camt.053-2023-04-01-001</MsgId>
            <CreDtTm>2023-04-01T12:00:00.000+02:00</CreDtTm>
            <MsgRcpt>
                <Nm>John Doe</Nm>
# okane ./tests/data/test*.xml -f json --no-indent -o output.jsonl
# okane ./tests/data/test*.xml -f csv -o output.csv

okane ./tests/data/test2.xml
{
    "statement_id": "XXX-STATEMENT-ID",
    "created_time": "2023-04-01T12:00:00+02:00",
    "from_time": "2023-03-01T00:00:00+01:00",
    "to_time": "2023-03-31T23:59:59.999000+02:00",
    "account_id": {
        "iban": "XXX-IBAN",
        "id": null
    },
    "opening_balance": {
        "amount": "1000.00",
        "currency": "CZK",
        "date": "2023-03-01"
    },
    "closing_balance": {
        "amount": "2000.00",
        "currency": "CZK",
        "date": "2023-03-31"
    },
    "transactions": [
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": "XXX",
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-1",
            "amount": "-100.00",
            "currency": "CZK",
            "val_date": "2023-03-01",
            "remote_info": "Nákup dne 27.2.2023, částka 100.00 CZK",
            "additional_transaction_info": "Nákup dne 27.2.2023, částka 100.00 CZK",
            "related_account_id": null,
            "related_account_bank_id": null,
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        },
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": "XXX",
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-2",
            "amount": "-200.00",
            "currency": "CZK",
            "val_date": "2023-03-02",
            "remote_info": null,
            "additional_transaction_info": "transaction note",
            "related_account_id": {
                "iban": null,
                "id": "XXX-OTHER-ACC"
            },
            "related_account_bank_id": {
                "bic": null,
                "id": "XXX-OTHER-BANK"
            },
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        },
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": null,
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-3",
            "amount": "1000.00",
            "currency": "CZK",
            "val_date": "2023-03-07",
            "remote_info": null,
            "additional_transaction_info": null,
            "related_account_id": {
                "iban": null,
                "id": "XXX-OTHER-ACC"
            },
            "related_account_bank_id": {
                "bic": null,
                "id": "XXX-OTHER-BANK"
            },
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        },
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": "XXX",
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-4",
            "amount": "400.00",
            "currency": "CZK",
            "val_date": "2023-03-08",
            "remote_info": "description",
            "additional_transaction_info": "RECIPIENT NAME",
            "related_account_id": {
                "iban": null,
                "id": "XXX-OTHER-ACC"
            },
            "related_account_bank_id": {
                "bic": null,
                "id": "XXX-OTHER-BANK"
            },
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        },
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": "XXX",
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-5",
            "amount": "-100.00",
            "currency": "CZK",
            "val_date": "2023-03-31",
            "remote_info": "transaction description",
            "additional_transaction_info": null,
            "related_account_id": null,
            "related_account_bank_id": null,
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        },
        {
            "ref": {
                "message_id": "XXX",
                "end_to_end_id": null,
                "account_servicer_ref": null,
                "payment_invocation_id": null,
                "instruction_id": null,
                "mandate_id": null,
                "cheque_number": null,
                "clearing_system_ref": null
            },
            "entry_ref": "XXX-REF-6",
            "amount": "1000.00",
            "currency": "CZK",
            "val_date": "2023-03-07",
            "remote_info": null,
            "additional_transaction_info": null,
            "related_account_id": {
                "iban": "LT6632xxxxxx",
                "id": null
            },
            "related_account_bank_id": {
                "bic": "REVOLT21",
                "id": null
            },
            "bank_transaction_code": {
                "domain_code": null,
                "family_code": null,
                "sub_family_code": null,
                "proprietary_code": "XXX",
                "proprietary_issuer": "Czech Banking Association"
            }
        }
    ]
}

License

MIT – see LICENSE.txt.

Changelog

0.5.0 (2026-10-01)

  • Added a method to read data from memory: BankToCustomerStatement.from_bytes()
  • The library can now serialize back into camt.053 XML using BankToCustomerStatement.to_bytes() or BankToCustomerStatement.to_file()
  • To make sure that the camt.053 output is valid, we now parse <BkTxCd> into BankTransactionCode
  • Code passes Pyrefly check as well as MyPy

0.4.0 (2026-05-20)

  • Changed dataframe methods: BankToCustomerStatement.as_dataframe() → BankToCustomerStatement.get_transaction_dataframe(), added new method BankToCustomerStatement.get_balance_dataframe()
  • Switched dataframe library from Pandas to Polars
  • Fields opening_balance, closing_balance of BankToCustomerStatement are now mandatory

0.3.0 (2026-05-16)

  • Refactored code into a package (it should not break most callers)
  • Upgraded dependencies (works with Pandas 2.x or 3.x, lxml 5.x or 6.x)
  • Added support for Python 3.13, 3.14; removed support for Python 3.10, 3.11
  • Switched project management from Poetry to uv

0.2.0 (2023-11-17)

  • Added AccountId, BankId models to handle IBAN/BIC codes
  • Added TransactionRef model to store transaction references, eg. end-to-end reference
  • Pandas integration: BankToCustomerStatement.as_dataframe()
  • Pandas integration: okane CLI tool can merge multiple input XMLs into one CSV/XLSX
  • Upgraded Pydantic version from 1.10 to 2.5

0.1.0 (2023-11-17)

  • Initial release

Metadata

Release files for okane 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for okane 0.5.0
File Size Uploaded
okane-0.5.0.tar.gz 15.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for okane 0.5.0
File Interpreter ABI Platform
okane-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.5 kB

Release files / okane-0.5.0.tar.gz

Download URL okane-0.5.0.tar.gz
Size 15.3 kB
Tags Source
SHA-256 checksum
How to use checksums
1af89fd048bbbd23ef035684cb6558045df9dbc42044a72bc752a896b794e3b5
BLAKE2b-256 checksum
How to use checksums
b1b270007123ae8ca7ae9fd68b5895dc6d132ee69db6c50ba89a1190f803fabd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / okane-0.5.0-py3-none-any.whl

Download URL okane-0.5.0-py3-none-any.whl
Size 13.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7da80f9137f8e57a64b300026a7255fc18712a226fe91c6956a2d84be74a36ae
BLAKE2b-256 checksum
How to use checksums
48a18ad85575dd2a4466f791607c73067724975e5521fc00024f8320f91ee758
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page