easy-fints
Python library with an optional FastAPI HTTP API adapter around python-fints.
PyPI package:
easy-fints
Python import package:
easy_fints
It currently supports:
- anonymous bank info lookup
- account listing
- balances
- transactions
- SEPA transfers
- TAN / decoupled confirmation flows
- payee verification (
VoP) continuation
The package can be used in three ways:
- as a Python library
- as a FastAPI-based REST server
- as a Dockerized REST server
Quick Start
Requirements:
- Python 3.11+
- a bank account with FinTS/HBCI access
- valid FinTS credentials and server URL
Install from PyPI:
pip install easy-fints
For local development:
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
Minimal .env:
FINTS_PRODUCT_ID=YourProductID
FINTS_PRODUCT_NAME=YourProductName
FINTS_PRODUCT_VERSION=YourProductVersion
FINTS_SESSION_TTL_SECONDS=300
FINTS_DEBUG_LEVEL=off
FINTS_DEBUG_FAIL_ONLY=0
A FinTS product ID can be requested via the official registration page:
https://www.fints.org/de/hersteller/produktregistrierung
Usage Modes
Library: importFinTSdirectly in your Python applicationREST server: run the built-in FastAPI service locallyDocker: run the REST server throughDockerfileordocker-compose.yml
Library
Use the package directly in Python:
from easy_fints import (
FinTS,
TanRequiredError,
)
with FinTS(
product_id="YourProductID",
bank="12345678",
user="your-user",
pin="your-pin",
server="https://bank.example/fints",
) as fints:
try:
accounts = fints.accounts()
transactions = fints.transactions(days=30)
except TanRequiredError as exc:
print(exc.challenge.message)
REST Server
Run the optional local HTTP server with the bundled CLI:
fints-rest-server start
fints-rest-server status
fints-rest-server stop
Configuration priority for the CLI:
- explicit CLI flags like
--hostor--port - values loaded from
--env-file - process environment variables
- built-in defaults
Installed CLI defaults:
- server host:
0.0.0.0 - server port:
8000 - PID file:
.fints-rest-server.pid - log file:
.fints-rest-server.log
CLI examples:
fints-rest-server start --host 127.0.0.1 --port 9686
fints-rest-server start --env-file /etc/easy-fints.env
fints-rest-server stop
OpenAPI:
http://127.0.0.1:8000/docshttp://127.0.0.1:8000/openapi.json
Docker
The repository includes both Dockerfile and docker-compose.yml.
Start the REST server with Docker Compose:
docker compose up --build -d
docker compose logs -f api
docker compose down
Current Docker defaults:
- container port:
9686 - published port:
9686 - env file:
.env - log volume:
./logs:/app/logs
Docker OpenAPI:
http://127.0.0.1:9686/docshttp://127.0.0.1:9686/openapi.json
REST API
Optional HTTP endpoints:
GET /healthPOST /readinessPOST /bank-infoPOST /accountsPOST /balancePOST /transactionsPOST /transferPOST /transfer/retry-with-namePOST /confirmGET /sessions/{session_id}DELETE /sessions/{session_id}
All operation endpoints accept a JSON body with a config object. Request values override env defaults.
Supported config fields:
bankuserpinserver
Transfer Support
POST /transfer supports a single SEPA credit transfer per request.
Transfer request fields:
source_accountaccount_namerecipient_namerecipient_ibanrecipient_bicamountpurposeendtoend_idinstant_paymentexecution_date
Current behavior:
account_nameis required becausepython-fints.simple_sepa_transfer(...)expects the sender name explicitlyinstant_payment=truerequests SCT Inst when the bank supports itexecution_date=YYYY-MM-DDrequests a dated transferinstant_paymentandexecution_datecannot be combined- unsupported transfer products return HTTP
422witherror="unsupported_transfer_product" - transfer challenge responses and final transfer responses include
transfer_overview
Confirmation Flow
The API uses a session-based confirmation flow.
Typical sequence:
POST /transferor another operation endpoint- either immediate
200, or a challenge response like409 tan_required - continue with
POST /confirm - repeat
/confirmfor decoupled app confirmation if needed - for payee verification, call
/confirmwithapprove_vop=true - if the recipient name should be corrected after VoP, call
POST /transfer/retry-with-name
Session helpers:
GET /sessions/{session_id}inspects the current stateDELETE /sessions/{session_id}cancels the active session
Session states currently used:
awaiting_tanawaiting_decoupledawaiting_voprunningresuming
Sessions are:
- stored in memory only
- process-local
- expired after an inactivity TTL
The TTL defaults to 300 seconds and can be changed with FINTS_SESSION_TTL_SECONDS.
Examples
The repository includes small scripts for manual API testing:
Library examples:
examples/bank_info_lib.pyexamples/accounts_lib.pyexamples/balance_lib.pyexamples/transactions_lib.pyexamples/single_account_lib.pyexamples/transfer_lib.py
They use examples/lib_helper.py and talk directly to FinTS.
REST API examples:
examples/bank_info_api.pyexamples/accounts_api_tan.pyexamples/balance_api_tan.pyexamples/transactions_api_tan.pyexamples/single_account_api_tan.pyexamples/transfer_api_tan.py
They use examples/api_tan_helper.py and read credentials from .env.
Optional helper-script env vars for manual transfer runs only:
FINTS_TRANSFER_INSTANT_PAYMENT=trueFINTS_TRANSFER_EXECUTION_DATE=YYYY-MM-DD
Documentation
Detailed REST API reference:
Transfer workflow:
High-level testing/verification notes:
Development
Canonical entry points:
easy_fints/library.pyfor Python callerseasy_fints/api.pyfor the FastAPI/ASGI app
Core internal layering:
easy_fints/client.pykeeps the publicFinTSClientfacade stableeasy_fints/_client_runtime.py,easy_fints/_client_reads.py,easy_fints/_client_transfer.py, andeasy_fints/_client_confirmation.pysplit the main FinTS workflows by responsibilityeasy_fints/transaction_mapping/contains the transaction normalization modules and debug source tracking
Important files:
easy_fints/library.pyeasy_fints/api.pyeasy_fints/client.pyeasy_fints/helpers.pyeasy_fints/models.pyeasy_fints/transaction_mapping/
Basic checks:
python -m compileall easy_fints examples
.venv/bin/python -m pytest tests -q
Package build:
python -m build
GitHub Actions:
- CI runs on pushes to
mainand on pull requests - publishing to PyPI runs when a GitHub Release is published
Packaging
Package name on PyPI:
easy-fints
Import package in Python:
easy_fints
Install from PyPI after the first published release:
pip install easy-fints
Deployment Notes
This project intentionally keeps the API simple:
- no server-side profile model
- no persistent credential store
- no server-managed account data
- no built-in authentication layer
Recommended deployment style:
- trusted network only
- TLS at the edge
- optional reverse proxy, VPN, mTLS, or network isolation depending on your stack
- operation logs are sanitized by default and do not store raw PINs, TANs, or raw FinTS payloads
Current limitation:
- active confirmation sessions are in-memory and process-local, so the simplest supported runtime is a single API process
Debug Logging
Optional transaction debugging can be enabled with environment variables:
FINTS_DEBUG_LEVEL=off|summary|mapping|record_rawFINTS_DEBUG_FAIL_ONLY=1to emit debug output only when a transaction is missing dates or amount after normalization
Debug entries are written to logs/debug.log.
Recommended troubleshooting setup for normalization issues:
FINTS_DEBUG_LEVEL=record_raw
FINTS_DEBUG_FAIL_ONLY=1
Notes:
summarywrites one compact entry per transaction fetchmappingadds selected field sources and visible raw key names per recordrecord_rawalso includes the raw transaction payload/representation and may contain sensitive bank data- normalization happens through the modules in
easy_fints/transaction_mapping/
Metadata
Release files for easy-fints 1.5.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 | Provenance | Actions |
|---|---|---|---|---|
| easy_fints-1.5.0.tar.gz | 54.8 kB | With provenance | Details for easy_fints-1.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| easy_fints-1.5.0-py3-none-any.whl | Python 3 | none | any | Details for easy_fints-1.5.0-py3-none-any.whl |
Total release size: 105.8 kB
Release files / easy_fints-1.5.0.tar.gz
| Download URL | easy_fints-1.5.0.tar.gz |
|---|---|
| Size | 54.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c6a0ecdcc28ebc1ae41817c4b6c93b952b84285cb89357a1372c5fc16327b712
|
|
BLAKE2b-256 checksum How to use checksums |
f57935a23314c737bc2f69f776c7fad4339d67c7f64da4ce66b1baac4bee5ab7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 21, 2026.
Transparency logRelease files / easy_fints-1.5.0-py3-none-any.whl
| Download URL | easy_fints-1.5.0-py3-none-any.whl |
|---|---|
| Size | 51.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3326f588019fba50240a38bb5140f6262b691cd2bed4d0d441aafef0b810ba52
|
|
BLAKE2b-256 checksum How to use checksums |
1b35099cf0170fc79f89837b765a7feaa0a75a4503298d700e05e9b2078f2ea5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 21, 2026.
Transparency logSecurity for easy-fints 1.5.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for easy_fints-1.5.0.tar.gz
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 Apr 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.