Skip to main content

beancount-openbanking-io

A Beancount / beangulp importer for open-banking.io — zero-knowledge PSD2 bank sync for EEA & UK banks.

Transactions arrive as zero-knowledge encrypted envelopes and are decrypted locally by the official open-banking-io SDK with a key only you hold. Your statement is never readable off your machine — a good fit for a plaintext-accounting ledger you keep yourself.

Why

If you sync EU/UK banks into Beancount, your options have been thinning out:

  • GoCardless / Nordigen stopped approving new personal Bank-Account-Data accounts, and imposes a 4-requests-per-account-per-day rate limit that breaks routine imports.
  • Other aggregators terminate your bank connection in the clear on their servers.

open-banking.io is an alternative built for self-hosters: client-side decryption, no eIDAS certificate to obtain, no per-account daily rate-limit wall.

Install

pip install beancount-openbanking-io

This pulls in beancount, beangulp, and the open-banking-io SDK.

Configure

Export your credentials bundle from the open-banking.io dashboard, then create a small YAML file whose name ends in openbanking.yaml:

# myfinances.openbanking.yaml
credentials: ./open-banking.io-credentials.json   # path is relative to this file
accounts:
  - id: f1345859-....          # open-banking.io account id (from client.get_accounts())
    account: Assets:Bank:Nordea:Checking
    currency: DKK              # optional guard
    counterpart: Expenses:Uncategorized   # optional; default holding account for the other leg
    assert_balance: true       # optional: emit a booked-balance (ITBD) assertion

To list your account ids:

from open_banking_io import OpenBankingClient

with OpenBankingClient.from_credentials("open-banking.io-credentials.json") as client:
    for account in client.get_accounts():
        print(account.id, account.aspsp_name, account.currency, account.iban)

Use

Wire it into your beangulp import script like any other importer:

# import.py
import beangulp
from beancount_openbanking_io import OpenBankingImporter

if __name__ == "__main__":
    beangulp.Ingest([OpenBankingImporter()]).main()
python import.py extract myfinances.openbanking.yaml >> ledger.beancount

Re-running is safe: each entry is stamped with its stable open-banking.io transaction id (obio-id), so already-imported transactions are skipped.

Mapping

open-banking.io Beancount
amount (unsigned) + creditDebitIndicator signed posting amount — DBIT → negative, CRDT → positive
creditorName (DBIT) / debtorName (CRDT) payee
remittanceInformation / note narration
bookingDate (→ valueDate → transactionDate) entry date
status PDNG ! (flagged/uncleared); BOOK → *
transaction id obio-id metadata (dedup key)
ITBD booked balance optional balance assertion

Each transaction gets a second, amount-elided posting to the counterpart account (default Expenses:Uncategorized) so entries balance on import; reclassify it later (e.g. with smart_importer). Transactions whose direction cannot be determined are skipped, never imported with a guessed sign.

License

MIT — see LICENSE.

Metadata

Release files for beancount-openbanking-io 0.1.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 beancount-openbanking-io 0.1.0
File Size Uploaded
beancount_openbanking_io-0.1.0.tar.gz 8.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for beancount-openbanking-io 0.1.0
File Interpreter ABI Platform
beancount_openbanking_io-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.2 kB

Release files / beancount_openbanking_io-0.1.0.tar.gz

Download URL beancount_openbanking_io-0.1.0.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a38cc422bf557b241bb203e219a9564f529e482b4518df7d7d433e782f3ebf54
BLAKE2b-256 checksum
How to use checksums
58bf4d0e8a0ad8bc7ea7a6dedc3cc48b26d6a4b6029d3a1a2ecfe202349bb007
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.

Transparency log

Release files / beancount_openbanking_io-0.1.0-py3-none-any.whl

Download URL beancount_openbanking_io-0.1.0-py3-none-any.whl
Size 7.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4619a824b8aef0642ee921ae1a9db2e35ca4511e5c8a5b71f6d70e62c2255945
BLAKE2b-256 checksum
How to use checksums
9758a0010bb290bedfe279a4a3c6368d422f4533a2bdf391622cfbc8da4c8f04
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

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