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)
| File | Size | Uploaded | |
|---|---|---|---|
| beancount_openbanking_io-0.1.0.tar.gz | 8.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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