German banking API client for account data and transactions
Project description
geldstrom
Pure-Python FinTS 3.0 client for German banking. Handles protocol parsing, dialog management, decoupled TAN (SecureGo+, pushTAN, …), and exposes a synchronous API for reading accounts, balances, and transaction history.
Package layout
geldstrom/
├── clients/
│ ├── base.py # BankClient protocol
│ ├── fints3.py # FinTS3Client — blocking, context-manager
│ └── fints3_decoupled.py # FinTS3ClientDecoupled + PollResult
├── domain/
│ └── model/
│ ├── accounts.py # Account, AccountOwner, AccountCapabilities
│ ├── balances.py # BalanceSnapshot, BalanceAmount
│ ├── bank.py # BankRoute, BankCapabilities, BankCredentials
│ └── transactions.py # TransactionEntry, TransactionFeed
└── infrastructure/
└── fints/
├── challenge/ # Challenge, ChallengeHandler, TANConfig,
│ # DecoupledTANPending, DetachingChallengeHandler
├── credentials.py # GatewayCredentials (FinTS connection bundle)
├── dialog/ # Wire-level FinTS dialog (connection, security,
│ # message, responses, TAN strategies)
├── exceptions.py # FinTSClientPINError, FinTSConnectionError, …
├── operations/ # FinTS operations (accounts, balances,
│ └── transactions/ # transactions: mt940, camt, feed pipelines)
├── protocol/ # Tokenizer, parser, segment/DEG definitions
├── services/ # High-level service objects used by clients
│ # (FinTSAccountService, FinTSBalanceService,
│ # FinTSTransactionService, FinTSMetadataService)
├── session.py # FinTSSessionState, SessionToken protocol
├── support/ # FinTSConnectionHelper, serialization helpers
└── tan.py # TANMethod value object
Quick start
from geldstrom import FinTS3Client
with FinTS3Client(
bank_code="12345678",
server_url="https://banking.example.com/fints",
user_id="your_user",
pin="your_pin",
product_id="YOUR_PRODUCT_ID",
tan_method="946", # required by most banks even for read-only ops
) as client:
accounts = client.list_accounts()
balance = client.get_balance(accounts[0])
feed = client.get_transactions(accounts[0])
Clients
FinTS3Client
Standard blocking client. Call connect() (or use as a context manager) to open a dialog and discover accounts. Subsequent method calls reuse the cached session. Use session_state to persist the session across process restarts.
FinTS3ClientDecoupled
Subclass of FinTS3Client that raises DecoupledTANPending instead of blocking when the bank requires an app-based confirmation. The live connection context is kept alive internally; call poll_tan() in a loop until status == "approved". The gateway uses this variant for all requests.
from geldstrom import FinTS3ClientDecoupled, DecoupledTANPending
client = FinTS3ClientDecoupled(...)
try:
feed = client.get_transactions(account)
except DecoupledTANPending:
while True:
result = client.poll_tan()
if result.status == "approved":
feed = result.data
break
elif result.status == "pending":
time.sleep(2)
else:
raise RuntimeError(result.error)
TAN handling
Most German banks require a TAN (2FA) even for read-only operations.
- Pass
tan_method(e.g."946"for SecureGo+/decoupled TAN) to avoid a runtime warning. - Call
client.get_tan_methods()to discover all methods advertised by the bank; this performs a lightweight sync dialog that does not require a TAN. TANConfigcontrols polling behaviour (poll_interval,timeout_seconds).ChallengeHandleris a protocol for custom challenge presentation — the defaultDetachingChallengeHandlerraisesDecoupledTANPendingfor decoupled challenges.
Session persistence
FinTS3Client.session_state returns a FinTSSessionState after connect(). Serialize it with .serialize() and reconstruct with FinTSSessionState.deserialize(data). Pass the reconstructed state as session_state=... to skip the initial sync dialog on subsequent runs.
Examples
See examples/ in the repository root for runnable demos (account listing, balance fetching, transaction history, TAN flow walkthrough).
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geldstrom-0.1.3.tar.gz.
File metadata
- Download URL: geldstrom-0.1.3.tar.gz
- Upload date:
- Size: 83.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdb3b9995b3fc7ac1bd4581330e48b50b7e2f73b152d52ac3fcb438a04aa9d8e
|
|
| MD5 |
c3d011f21bc255e144340d5cc85e6419
|
|
| BLAKE2b-256 |
343f98a7ab77bbca15c67ddee9364931cd83738380c1de3cf03f308894e92741
|
Provenance
The following attestation bundles were made for geldstrom-0.1.3.tar.gz:
Publisher:
geldstrom-publish.yml on maltewinckler/geldstrom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geldstrom-0.1.3.tar.gz -
Subject digest:
fdb3b9995b3fc7ac1bd4581330e48b50b7e2f73b152d52ac3fcb438a04aa9d8e - Sigstore transparency entry: 1396668290
- Sigstore integration time:
-
Permalink:
maltewinckler/geldstrom@60cea2dd25e301eecf14469beee9871c1cac511d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/maltewinckler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
geldstrom-publish.yml@60cea2dd25e301eecf14469beee9871c1cac511d -
Trigger Event:
push
-
Statement type:
File details
Details for the file geldstrom-0.1.3-py3-none-any.whl.
File metadata
- Download URL: geldstrom-0.1.3-py3-none-any.whl
- Upload date:
- Size: 125.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc280aed524f0c387915821c501ff98eaf1694ee824b37f8fe0022df145dcc5c
|
|
| MD5 |
70b0c959b4c4696dca8dc4a5d47ec0ff
|
|
| BLAKE2b-256 |
83366af7b0a199021417e7b354669c766655cd36a6ff312e550a17a8dca743ff
|
Provenance
The following attestation bundles were made for geldstrom-0.1.3-py3-none-any.whl:
Publisher:
geldstrom-publish.yml on maltewinckler/geldstrom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geldstrom-0.1.3-py3-none-any.whl -
Subject digest:
bc280aed524f0c387915821c501ff98eaf1694ee824b37f8fe0022df145dcc5c - Sigstore transparency entry: 1396668295
- Sigstore integration time:
-
Permalink:
maltewinckler/geldstrom@60cea2dd25e301eecf14469beee9871c1cac511d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/maltewinckler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
geldstrom-publish.yml@60cea2dd25e301eecf14469beee9871c1cac511d -
Trigger Event:
push
-
Statement type: