[![Build Status](](
[![Coverage Status](](

An Elixir-based client library for **HBCI 2.2** and **FinTS 3.0**.

In 1995 German banks announced a common online banking standard called *Homebanking Computer Interface* (HBCI). In 2003 they published the next generation and named it *Financial Transaction Services* (FinTS). Today more than 2,000 German banks support HBCI/FinTS.

This client library supports both APIs, HBCI 2.2 and FinTS 3.0. It can be used to read the balance of a bank account, receive an account statement, and make a SEPA payment using PIN/TAN.

# Installation
Include a dependency in your `mix.exs`:
deps: [
  {:fintex, "~> 0.1.0"}
  {:ibrowse, tag: "v4.2", github: "cmullaparthi/ibrowse"},
  {:xml_builder, commit: "1e381db0b7d289ee18c2f7fd682d8e47215a141c", github: "joshnuss/xml_builder"}
To use FinTex modules, add `use FinTex` to the top of each module you plan on referencing FinTex from.

# Usage
First and foremost you need bank-specific connection data of the bank you try to connect to (payment industry jargon: *[FinBanks](*). A full list of connection data can be obtained from the [official DK website]( Please keep in mind that these connection details are subject to change.
use FinTex
bank = %FinTex.User.FinBank{
  blz: "12345678",            # 8 digits bank code
  url: "", # URL of the bank server
  version: "300"              # API version
Feel free to instead implement the [Bank protocol]( for your own struct, e.g., a custom data model.

## Ping
Some, but not all, banks support the “anonymous login” feature, so you can send a ping request:

## Initialize the dialog
In order to authenticate , you need credentials to a real-life bank account (usually login and PIN). Note that repeated failed attempts to log in might cause the bank to block the bank account.
credentials = %FinTex.User.FinCredentials{
  login: "username",
  pin: "secret"
f =, credentials)
# %FinTex{bank: %FinTex.User.FinBank{blz: "12345678", url: "", version: "300"}, client_system_id: "321", tan_scheme_sec_func: "999"}

## Retrieve all bank accounts
Retrieve account-specific data, such as an account's balance:
FinTex.accounts(f, credentials) |> Enum.to_list # retrieve a list of bank accounts
Feel free to instead implement the [Credentials protocol]( for your own struct.

## Retrieve all transactions of a bank account
Request all transactions of one of the bank accounts:
FinTex.transactions(f, credentials, account) |> Enum.to_list # retrieve a list of transactions

## Make a SEPA payment
A bank account contains a list of supported TAN schemes each of which can be used to make a SEPA payment. Pick a sender bank account (see above), add the receiver bank account (IBAN/BIC) and define the details:

payment = %FinTex.Model.Payment{
  sender_account: %FinTex.Model.Account{
    iban:  "DE89370400440532013000",
    bic:   "COBADEFFXXX",
    owner: "John Doe"
  receiver_account: %FinTex.Model.Account{
    iban:  "FR1420041010050500013M02606",
    bic:   "ABNAFRPPXXX",
    owner: "Jane Doe"
  amount: "1.00",
  currency: "EUR",
  purpose: "A new test payment",
  tan_scheme: %FinTex.Model.TANScheme{
    sec_func: "921"

FinTex.initiate_payment(f, credentials, payment)

# Documentation

API documentation is available at [](

# Specification

For exact information please refer to the [German version of the specification]( There is also an [unauthorized English translation](

# Copyright & License

Copyright (c) 2015 [Florian J. Breunig](

Licensed under MIT, see LICENSE file.