Skip to main content

dkb-robo

GitHub release GitHub last commit (branch) GitHub last commit (branch) PyPI - Downloads

Codecov main Codecov devel

Security Rating Maintainability Rating Reliability Rating Quality Gate Status

dkb-robo is a python library to access the internet banking area of "Deutsche Kreditbank" to fetch

  • account information and current balances
  • transactions from creditcards and checking accounts (Girokonten)
  • query the content of "DKB Postbox"
  • get standing orders (Dauerauftrag)
  • get information about credit limits and exemption orders (Freistellungsauftrag)

Starting from version 0.9 dkb-robo can handle the 2nd factor DKB introduced to fulfill the PSD2 obligations. Starting from September 2019 logins must be confirmed by either

The introduction of a 2nd factor does limit the usage of dkb-robo for automation purposes. DKB is unfortunately not willing/ not able not allowed to open their PSD2-API for non-Fintechs. I discussed this with them for weeks at some point they stopped responding to my emails so I gave up.

DKB introduced a new web-frontend in July 2023 which is using a REST-API as backend. The migration to the new REST endpoints started with v0.22 and has been completed with v0.27.

Getting Started

These instructions will get you a copy of the project up and running on your local machine.

Prerequisites

To run dkb-robo on your system you need

Please make sure python and all the above modules had been installed successfully before you start any kind of testing.

Installing

via Pypi

> pip install dkb_robo

manually for all users

  1. download the archive and unpack it
  2. enter the directory and run the setup script
> python setup.py install

manually for a single user

  1. download the archive and unpack it
  2. move the "dkb_robo" subfolder into the directory your script is located

SBOM

A bill of material of the packages coming along wiht dkb-robo will be automatically created during build process and stored in my SBOM respository

Usage

you need to import dkb-robo into your script

> from dkb_robo import DKBRobo

create a new DKBRobo context handler and login to DKB portal

> with DKBRobo(dkb_user=<login username>, dkb_password=<password>, chip_tan=True|False|qr, mfa_device=<m|int>, debug=True|False, unfiltered=True|False) as dkb:
  • dbk_user: username to access the dkb portal
  • dkb_password: corresponding login password
  • chip_tan: (True/False/qr) TAN usage - when not "False" dbk-robo will ask for a TAN during login. So far this library only supports "chipTAN manuell" and "chipTAN QR. "qr" foces the usage of "chipTAN QR" all other values will trigger the usage of "chipTAN Manuell"
  • mfa_device: ('m'/Integer) optional - preselect MFA device to be used for 2nd factor - 'm' - main device, otherwise number from device-list
  • debug: (True/False) Debug mode
  • unfiltered: (True/False) Unfiltered mode

After login you can return a dictionary containing a list of your accounts, the actual balance and a link to fetch the transactions

from pprint import pprint
pprint(dkb.account_dic)
{0: {
     'amount': '1458.00',
     'currencycode': 'EUR',
     'date': '22.01.2023',
     'holdername': 'Firstname Lastname',
     'iban': 'DEXXXXXXXXXXXXXXXXXXXXX',
     'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
     'limit': '2500.00',
     'name': 'Girokonto',
     'productgroup': 'Meine Konten',
     'transactions': 'https://banking.dkb.de/api/accounts/accounts/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
     'type': 'account'},
 1: {
     'amount': -1000.23,
     'currencycode': 'EUR',
     'date': '22.01.2023',
     'holdername': 'Firstname Lastname',
     'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
     'limit': '2000.00',
     'maskedpan': '1234XXXXXXXX5678',
     'name': 'Visa CC',
     'productgroup': 'Meine Konten',
     'transactions': 'https://banking.dkb.de/api/credit-card/cards/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
     'type': 'creditcard'},
 2: {
     'amount': 100000.23,
     'currencycode': 'EUR',
     'date': '22.01.2023',
     'holdername': 'Firstname lastname',
     'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
     'limit': '0.00',
     'maskedpan': '5678XXXXXXXX1234',
     'name': 'Another Visa',
     'productgroup': 'Meine Konten',
     'transactions': 'https://banking.dkb.de/api/credit-card/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
     'type': 'creditcard'},
 3: {
     'amount': '123456,79',
     'currencycode': 'EUR',
     'holdername': 'Firstname Lastname',
     'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
     'name': 'Mein Depot',
     'productgroup': 'Meine Konten',
     'transactions': 'https://banking.dkb.de/api/broker/brokerage-accounts/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(positions?include=instrument%2Cquote',
     'type': 'depot'}}

to get the list of transactions for a certain checking account or a credit card use the following method

tlist = dkb.get_transactions(link, type, date_from, date_to)
  • link - link to get transactions for a specific account - see former step if you do not know how to get it
  • type - account type (either "account" or "creditcard") - see former step if you do not know how to get it
  • date_from - start date in European notation (DD.MM.YYYY)
  • date_to - end date in European notation (DD.MM.YYYY)
  • transaction_type - optional: "booked" (default if not specified) or "pending" ("vorgemerkt")

this method returns a list of transactions.

A list of transactions for a regular checking account follows the below format.

from pprint import pprint
pprint(tlist)
[{'amount': -44.98,
  'bdate': '2023-01-22',
  'currencycode': 'EUR',
  'customerreferenz': 'XXXXXX',
  'peer': 'PayPal Europe S.a.r.l. et Cie S.C.A',
  'peeraccount': 'XXXXXXXXX',
  'peerbic': 'XXXXXXXXX',
  'peerid': 'XXXXXXXXXXX',
  'postingtext': 'FOLGELASTSCHRIFT',
  'reasonforpayment': 'XXXXXX PP.XXXXX.PP . Foo-bar AG, Ihr Einkauf bei '
                      'Foo-bar AG',
  'vdate': '2023-01-22'},
 {'amount': -70.05,
  'bdate': '2023-01-22',
  'currencycode': 'EUR',
  'customerreferenz': '68251782022947180823144926',
  'peer': 'FEFASE GmbH',
  'peeraccount': 'XXXXXXXXX',
  'peerbic': 'XXXXXXXXX',
  'peerid': 'XXXXXXXXX',
  'postingtext': 'SEPA-ELV-LASTSCHRIFT',
  'reasonforpayment': 'ELV68251782 18.08 14.49 MEFAS ',
  'vdate': '2023-01-22'},
 {'amount': -7.49,
  'bdate': '2023-01-22',
  'currencycode': 'EUR',
  'customerreferenz': '3REFeSERENC',
  'peer': 'PEER',
  'peeraccount': 'XXXXXXXXX',
  'peerbic': 'XXXXXXXXX',
  'peerid': 'XXXXXXXXX',
  'postingtext': 'FOLGELASTSCHRIFT',
  'reasonforpayment': 'VIELEN DANK VON BAR-FOO GMBH',
  'vdate': '2023-01-22'}]

The list of transactions from a creditcard will look as below:

[{'amount': 500.0,
  'bdate': '2023-08-18',
  'currencycode': 'EUR',
  'text': 'Berliner Sparkasse',
  'vdate': '2023-08-18'},
 {'amount': 125.95,
  'bdate': '2023-08-14',
  'currencycode': 'EUR',
  'text': 'Zara Deutschland 3742',
  'vdate': '2023-08-14'},
 {'amount': 500.0,
  'bdate': '2023-08-14',
  'currencycode': 'EUR',
  'text': 'Commerzbank Berlin',
  'vdate': '2023-08-14'}]

A brokerage account (depot) will not show the list of transactions but rather a list of positions:

[{'currencycode': 'EUR',
  'isin_wkn': 'DE0005140008',
  'lastorderdate': '2017-01-01',
  'market': 'Frankfurt',
  'price': 9.872,
  'price_euro': '39488.00',
  'quantity': 4000.0,
  'shares_unit': 'pieces',
  'text': 'DEUTSCHE BANK AG NA O.N.'},
 {'currencycode': 'EUR',
  'isin_wkn': 'DE0005557508',
  'lastorderdate': '2017-10-01',
  'market': 'Frankfurt',
  'price': 19.108,
  'price_euro': '28.662.00',
  'quantity': 1500.0,
  'shares_unit': 'pieces',
  'text': 'DT.TELEKOM AG NA'}]

to get the credit limits per account or credit-card the method get_credit_limits() must be used

> c_list = dkb.get_credit_limits()

This method returns a dictionary of all identified accounts including the credit limit per account

{u'XXXX********XXXX': 100.00,
 u'4748********XXXX': 10000.00,
 u'XXXX********XXXX': 10000.00,
 u'DEXX XXXX XXXX XXXX XXXX XX': 200.00,
 u'DEXX XXXX XXXX XXXX XXXX XX': 2000.00}

A list of standing orders (Daueraufträge) can be obtained by calling get_standing_orders() method

> so = dkb.get_standing_orders(account_id)
  • account_id - 'id' field from account dictionary (dkb.account_dic[x]['id'])

A list of standing orders will be returned containing a dictionary per standing order

> pprint(so)
[{'amount': 30.0,
  'creditoraccount': {'bic': 'BIC-1', 'iban': 'IBAN-1'},
  'currencycode': 'EUR',
  'interval': {'frequency': 'monthly',
               'from': '2019-01-05',
               'holidayExecutionStrategy': 'following',
               'nextExecutionAt': '2023-10-01',
               'until': '2025-12-01'},
  'purpose': 'Purpose-1',
  'recpipient': 'Recipient-1'},
 {'amount': 58.0,
  'creditoraccount': {'bic': 'BIC-2', 'iban': 'IBAN-2'},
  'currencycode': 'EUR',
  'interval': {'frequency': 'monthly',
               'from': '2022-12-30',
               'holidayExecutionStrategy': 'following',
               'nextExecutionAt': '2023-12-01'},
  'purpose': 'Purpose-2',
  'recpipient': 'Recipient-2'},]

The method get_exemption_order() can be used to get the exemption orders (Freistellungsaufträge)

> exo = dkb.get_exemption_order()

A dictionary similar to the one below will be returned

> pprint(exo)
[{'amount': 2000.0,
  'currencycode': 'EUR',
  'partner': {'dateofbirth': '1980-01-01',
              'firstname': 'Jane',
              'lastname': 'Doe',
              'salutation': 'Frau',
              'taxid': '1234567890'},
  'receivedat': '2017-01-01',
  'type': 'joint',
  'used': 567.89,
  'validfrom': '2020-01-01',
  'validto': '9999-12-31'}]

To get the amount of dkb points the below method can be used

> points_dic = dkb.get_points()

A dictionary similar to the below will be returned

> pprint(points_dic)
{u'DKB-Punkte': 99999,
 u'davon verfallen zum  31.12.2018': 999}

To scan the DKB postbox for documents the below method can be used

> document_dic = dkb.scan_postbox(path, download_all, archive, prepend_date)
  • path - optional argument. If specified, documents will be downloaded and stored
  • dowload_all (True/False) - optional argument. By default only unread documents from DKB postbox will get downloaded and marked as "read". By setting this parameter all documents will be downloaded
  • archive (True/False) - optional argument. When set to True the "Archiv" folder in the Postbox will be scanned and documents will be downloaded if a path variable is specificed. Handle this parameter with care as the amount of documents to be downloaded can be huge.
  • prepend_date (True/False) - optional argument. Prepend document date in YYYY-MM-DD_ format to each document to allow easy sorting of downloaded files

The method will return a dictionary containing the different postbox folders and links to download the corresponding documents

Check the scripts dkb_example.py and dkb_docdownload.py for further examples.

dkb_robo command line interface (CLI)

Starting with v0.20 dkb_robo comes with a CLI tool

$ dkb --help
Usage: dkb [OPTIONS] COMMAND [ARGS]...

Options:
  -d, --debug                     Show additional debugging
  -t, --chip-tan TEXT             use [ChipTan](https://www.dkb.de/fragen-antworten/was-ist-das-chiptan-verfahren) for login ("qr" for chipTan-QR "manual" for chipTan-manuell)
  -u, --username TEXT             username to access the dkb portal
                                  [required]
  -p, --password TEXT             corresponding login password
  --format [pprint|table|csv|json]
                                  output format to use
  --help                          Show this message and exit.

Commands:
  accounts
  credit-limits
  download
  scan-postbox
  last-login
  standing-orders
  transactions

Example command to fetch account list

py dkb -u <user> -p <password> accounts

Example commands to fetch transactions via CLI tool

py dkb -u <user> -p <password> transactions --name Girokonto
py dkb -u <user> -p <password> transactions --account "DE75xxxxxxxxxxxxxxxxxxx"
py dkb -u <user> -p <password> transactions --account "DE75xxxxxxxxxxxxxxxxxxx" --date-from 2023-08-01  --date-to 2023-08-15"

Further documentation

please check the doc folder of the project. You will find further documentation and an example scripts of all dkb-robo methods there.

Contributing

Please read CONTRIBUTING.md for details on my code of conduct, and the process for submitting pull requests. Please note that I have a life besides programming. Thus, expect a delay in answering.

Versioning

I use SemVer for versioning. For the versions available, see the tags on this repository.

License

This project is licensed under the GPLv3 - see the LICENSE.md file for details

Release files for dkb-robo 0.31.2

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

Source distribution (sdist)

Source distribution for dkb-robo 0.31.2
File Size Uploaded
dkb_robo-0.31.2.tar.gz 82.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dkb-robo 0.31.2
File Interpreter ABI Platform
dkb_robo-0.31.2-py3-none-any.whl Python 3 none any Details

Total release size: 138.8 kB

Release files / dkb_robo-0.31.2.tar.gz

Download URL dkb_robo-0.31.2.tar.gz
Size 82.7 kB
Tags Source
SHA-256 checksum
How to use checksums
35ad6eb93672b1cd89cbf7843216a0e7390236b7b75a97280386c1cefc198199
BLAKE2b-256 checksum
How to use checksums
74cfe9b7b9926f9b31ebfed794459ca762de8dd47dab1f9f4bc85f9800ab1913
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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 Aug 5, 2025.

Transparency log

Release files / dkb_robo-0.31.2-py3-none-any.whl

Download URL dkb_robo-0.31.2-py3-none-any.whl
Size 56.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
62bdd2f575597ebaf8352ea2ff7f1d49962e35ea5239a75ff72a6bacb1d61cb2
BLAKE2b-256 checksum
How to use checksums
1d3cef7159fef45bb66e59d5cc0715f917a61492c610947fa58cc5eafcd9ed47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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 Aug 5, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.31.2 This release

2 release files

0.31.1

2 release files

0.31

2 release files

0.30.1

2 release files

0.30

2 release files

0.29.3

2 release files

0.29

2 release files

0.28.2

2 release files

0.28.1

2 release files

0.28

2 release files

0.27.1

1 release file

0.27

1 release file

0.26

1 release file

0.25

1 release file

0.24.1

1 release file

0.24

1 release file

0.23.2

1 release file

0.23.1

1 release file

0.23

1 release file

0.22

1 release file

0.21

1 release file

0.20.1

1 release file

0.20

1 release file

0.19.1

1 release file

0.19

1 release file

0.18.2

1 release file

0.18.1

1 release file

0.18

1 release file

0.17

1 release file

0.16

1 release file

0.15

1 release file

0.14

1 release file

0.13.1

1 release file

0.13

1 release file

0.12

1 release file

0.11

1 release file

0.10.7

1 release file

0.10.6

1 release file

0.10.4

1 release file

0.10.3

1 release file

0.10.2

1 release file

0.10.1

1 release file

0.10

1 release file

0.9

1 release file

0.8.3

1 release file

0.8.2

1 release file

0.8.1

1 release file

0.8

1 release file

0.7.3

1 release file

0.7.2

2 release files

0.7

1 release file

0.6

1 release file

0.4

1 release file

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