{"id":37057812,"url":"https://github.com/libfintx/libfintx","last_synced_at":"2026-01-14T06:32:14.465Z","repository":{"id":211066821,"uuid":"727894468","full_name":"libfintx/libfintx","owner":"libfintx","description":"🏦 .NET banking client library for HBCI 2.2, FinTS 3.0, EBICS H004 and EBICS H005.","archived":false,"fork":false,"pushed_at":"2025-10-13T17:18:50.000Z","size":80693,"stargazers_count":51,"open_issues_count":13,"forks_count":11,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-01-08T18:26:01.384Z","etag":null,"topics":["bank","banking","banking-api","banking-applications","banking-system","deutsche-bank","dotnet","ebics","finance","fintech","fintech-api","fints","hbci","pintan","transfer-money"],"latest_commit_sha":null,"homepage":"https://libfintx.github.io/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/libfintx.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-05T19:49:45.000Z","updated_at":"2025-11-29T10:48:55.000Z","dependencies_parsed_at":"2024-05-22T15:49:49.212Z","dependency_job_id":null,"html_url":"https://github.com/libfintx/libfintx","commit_stats":null,"previous_names":["libfintx/libfintx"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/libfintx/libfintx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libfintx%2Flibfintx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libfintx%2Flibfintx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libfintx%2Flibfintx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libfintx%2Flibfintx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/libfintx","download_url":"https://codeload.github.com/libfintx/libfintx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libfintx%2Flibfintx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28412211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bank","banking","banking-api","banking-applications","banking-system","deutsche-bank","dotnet","ebics","finance","fintech","fintech-api","fints","hbci","pintan","transfer-money"],"created_at":"2026-01-14T06:32:13.727Z","updated_at":"2026-01-14T06:32:14.457Z","avatar_url":"https://github.com/libfintx.png","language":"C#","funding_links":[],"categories":["Payments and Banking"],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/mrklintscher/libfintx/blob/master/res/logo.png\" align=\"right\"\u003e\n\n# libfintx\n\n[![Build \u0026 Test](https://github.com/libfintx/libfintx/actions/workflows/dotnet.yml/badge.svg)](https://github.com/libfintx/libfintx/actions/workflows/dotnet.yml)\n[![NuGet version (libfintx.FinTS)](https://img.shields.io/nuget/v/libfintx.FinTS.svg)](https://www.nuget.org/packages/libfintx.FinTS/)\n[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)\n\nA .NET client library for **HBCI 2.2**, **FinTS 3.0**, **EBICS H004** and **EBICS H005**.\n\nIn 1995 the ZKA announced a common online banking standard called *Homebanking Computer Interface* (HBCI). In 2003 they published the next generation of this protocol standard and named it *Financial Transaction Services* (FinTS).\n\nToday most of all german banks support this online banking standards.\n\nThe Electronic Banking Internet Communication Standard (EBICS) is a German transmission protocol developed by the German Banking Industry Committee for sending payment information between banks over the Internet. It grew out of the earlier BCS-FTAM protocol that was developed in 1995, with the aim of being able to use internet connections and TCP/IP. It is mandated for use by German banks and has also been adopted by France and Switzerland. [Wikipedia](https://en.wikipedia.org/wiki/Electronic_Banking_Internet_Communication_Standard).\n\nThis client library supports all four APIs, HBCI 2.2, FinTS 3.0 and EBICS H004 and H005.\n\nIt can be used to read the balance of a bank account, receive an account statement, and make a SEPA payment using **PIN/TAN** and **EBICS**.\n\n# Usage\n\nThere are many reasons why you need to use a banking library which can exchange data from your application with the bank. One reason for example is to found a [Fintech](https://de.wikipedia.org/wiki/Finanztechnologie).\n\n# Target platforms\n\n* .NET 6.0+ (EBICS, FinTS)\n\n# Sample\n\nLook at the demo projects inside the master branch.\n\n# Features\n\n* Get Balance (**HKSAL**)\n* Request Transactions (**HKKAZ**)\n* Transfer money (**HKCCS**)\n* Transfer money at a certain time (**HKCCS**)\n* Collective transfer money (**HKCCM**)\n* Collective transfer money terminated (**HKCME**)\n* Rebook money from one to another account (**HKCUM**)\n* Collect money (**HKDSE**)\n* Collective collect money (**HKDME**)\n* Load mobile phone prepaid card (**HKPPD**)\n* Submit banker's order (**HKCDE**)\n* Get banker's orders (**HKCSB**)\n* Send Credit Transfer Initiation (**CCT**)\n* Send Direct Debit Initiation (**CDD**)\n* Pick up Swift daily statements (**STA**)\n* EBICS **E002** for encryption\n* EBICS **X002** for authentication\n* EBICS **A005** and **A006** for signatures\n\n# Specification\n\nFor exact information please refer to the [german version of the specification](http://www.hbci-zka.de/spec/spezifikation.htm).\n\n# Tested banks\n\n* Raiffeisenbanken\n* Sparkassen\n* DKB\n* DiBa\n* Consorsbank\n* Sparda\n* Postbank\n* Norisbank\n* Deutsche Bank\n* Unicredit Bank\n* Commerzbank\n\n# Sample code (FinTS)\n\nCheck account balance.\n\n```csharp\n/// \u003csummary\u003e\n/// Kontostand abfragen\n/// \u003c/summary\u003e\n/// \u003cparam name=\"sender\"\u003e\u003c/param\u003e\n/// \u003cparam name=\"e\"\u003e\u003c/param\u003e\nprivate async void btn_kontostand_abfragen_Click(object sender, EventArgs e)\n{\n    var connectionDetails = GetConnectionDetails();\n    var client = new FinTsClient(connectionDetails);\n    var sync = await client.Synchronization();\n\n    HBCIOutput(sync.Messages);\n\n    if (sync.IsSuccess)\n    {\n        // TAN-Verfahren\n        client.HIRMS = txt_tanverfahren.Text;\n\n        if (!await InitTANMedium(client))\n            return;\n\n        var balance = await client.Balance(_tanDialog);\n\n        HBCIOutput(balance.Messages);\n\n        if (balance.IsSuccess)\n            SimpleOutput(\"Kontostand: \" + Convert.ToString(balance.Data.Balance));\n    }\n}\n```\n\n# Sample code (EBICS)\n\n## Initialization (INI/HIA)\n\nThe first thing you want to do as a new EBICS user is to announce your public RSA keys to your bank. You need to create three public/private key pairs for this (authentication, signature and encryption keys).\n\nCreating the keys is easy with BouncyCastle.\n\n```csharp\nvar gen = GeneratorUtilities.GetKeyPairGenerator(\"RSA\");\ngen.Init(new KeyGenerationParameters(new SecureRandom(), 4096));\nvar signKeyPair = gen.GenerateKeyPair();   \n\nusing (TextWriter sw = new StreamWriter(\"sign.key\"))\n{\n    var pw = new PemWriter(sw);\n    pw.WriteObject(signKeyPair);\n    sw.Flush();\n}\n```\n\nAdjust the above code and also create an authentication (\"auth.key\") and encryption (\"enc.key\") key.\n\nAnnounce your public signature key to your bank. Note that the previously generated keys are stored in PEM format and contain the private and public key.\n\n```csharp\nAsymmetricCipherKeyPair signKey;\n\nusing (var sr = new StringReader(File.ReadAllText(\"sign.key\").Trim()))\n{\n    var pr = new PemReader(sr);\n    signKey = pr.ReadObject();\n}\n\nvar signCert = KeyUtils.CreateX509Certificate2(signKey);\n\nvar client = EbicsClient.Factory().Create(new EbicsConfig\n{\n    Address = \"The EBICS URL you got from your bank, i.e. https://ebics-server.com/\",\n    Insecure = true,\n    TLS = true,\n    User = new UserParams\n    {\n        HostId = \"The host ID of your bank\",\n        PartnerId = \"Your partner ID you got from your bank\",\n        UserId = \"Your user ID you got from your bank\",\n        SignKeys = new SignKeyPair\n        {\n            Version = SignVersion.A005, // only A005 is supported right now\n            TimeStamp = DateTime.Now,\n            Certificate = signCert // internally we work with keys\n        }\n    }\n});\n\nvar resp = c.INI(new IniParams());\n```\n\nAfter that we need to announce the public authentication and encryption keys.\n\n```csharp\n// loading of keys \"auth.key\" and \"enc.key\" omitted\n\nvar authCert = KeyUtils.CreateX509Certificate2(authKey);\nvar encCert = KeyUtils.CreateX509Certificate2(encKey);\n\nvar client = EbicsClient.Factory().Create(new EbicsConfig\n{\n    Address = \"The EBICS URL you got from your bank, i.e. https://ebics-server.com/\",\n    Insecure = true,\n    TLS = true,\n    User = new UserParams\n    {\n        HostId = \"The host ID of your bank\",\n        PartnerId = \"Your partner ID\",\n        UserId = \"Your user ID\",\n        AuthKeys = new AuthKeyPair\n        {\n            Version = AuthVersion.X002,\n            TimeStamp = DateTime.Now,\n            Certificate = authCert\n        },\n        CryptKeys = new CryptKeyPair\n        {\n            Version = CryptVersion.E002,\n            TimeStamp = DateTime.Now,\n            Certificate = encCert\n        }\n    }\n});\n\nvar resp = c.HIA(new HiaParams());\n```\n\nAnnouncing the keys is not enough, as the bank needs to be sure that the keys really belong to you. To prove this, you need to send the INI and HIA letters to your bank. They contain hash values of your public keys and your written signature. The EBICS specification describes in detail how these letters should look like.\n\n## Retrieving public bank keys (HPB)\n\nIn order to communicate via EBICS with the bank you need the bank's public keys, because data exchanged needs to be encrypted and authenticated.\n\n```csharp\n// loading of keys \"auth.key\" and \"enc.key\" omitted\n\nvar authCert = KeyUtils.CreateX509Certificate2(authKey);\nvar encCert = KeyUtils.CreateX509Certificate2(encKey);\n\nvar client = EbicsClient.Factory().Create(new EbicsConfig\n{\n    Address = \"The EBICS URL you got from your bank, i.e. https://ebics-server.com/\",\n    Insecure = true,\n    TLS = true,\n    User = new UserParams\n    {\n        HostId = \"The host ID of your bank\",\n        PartnerId = \"Your partner ID\",\n        UserId = \"Your user ID\",\n        AuthKeys = new AuthKeyPair\n        {\n            Version = AuthVersion.X002,\n            TimeStamp = DateTime.Now,\n            Certificate = authCert\n        },\n        CryptKeys = new CryptKeyPair\n        {\n            Version = CryptVersion.E002,\n            TimeStamp = DateTime.Now,\n            Certificate = encCert\n        }\n    }\n});\n\nvar hpbResp = c.HPB(new HpbParams());\nif (hpbResp.TechnicalReturnCode != 0 || hpbResp.BusinessReturnCode != 0)\n{\n    // handle error\n    return;\n}\n\nc.Config.Bank = resp.Bank; // set bank's public keys\n\n// now issue other commands \n```\n\n## Direct credit transfer (CCT)\n\n```csharp\n// loading of keys \"auth.key\", \"enc.key\" and \"sign.key\" omitted\n\nvar authCert = KeyUtils.CreateX509Certificate2(authKey);\nvar encCert = KeyUtils.CreateX509Certificate2(encKey);\nvar signCert = KeyUtils.CreateX509Certificate2(signKey);\n\nvar client = EbicsClient.Factory().Create(new EbicsConfig\n{\n    Address = \"The EBICS URL you got from your bank, i.e. https://ebics-server.com/\",\n    Insecure = true,\n    TLS = true,\n    User = new UserParams\n    {\n        HostId = \"The host ID of your bank\",\n        PartnerId = \"Your partner ID\",\n        UserId = \"Your user ID\",\n        AuthKeys = new AuthKeyPair\n        {\n            Version = AuthVersion.X002,\n            TimeStamp = DateTime.Now,\n            Certificate = authCert\n        },\n        CryptKeys = new CryptKeyPair\n        {\n            Version = CryptVersion.E002,\n            TimeStamp = DateTime.Now,\n            Certificate = encCert\n        },\n        SignKeys = new SignKeyPair\n        {\n            Version = SignVersion.A005,\n            TimeStamp = DateTime.Now,\n            Certificate = signCert\n        }\n    }\n});\n\nvar hpbResp = c.HPB(new HpbParams());\nif (hpbResp.TechnicalReturnCode != 0 || hpbResp.BusinessReturnCode != 0)\n{\n    // handle error\n    return;\n}\n\nc.Config.Bank = resp.Bank; // set bank's public keys\n\n// create credit transfer data structure\n\nvar cctParams = new CctParams\n{\n    InitiatingParty = \"Your name\",\n    PaymentInfos = new[]\n    {\n        new CreditTransferPaymentInfo\n        {\n            DebtorName = \"Sender's name\",\n            DebtorAccount = \"Sender's IBAN\",\n            DebtorAgent = \"Sender's BIC\",\n            ExecutionDate = \"2018-05-15\",\n            CreditTransferTransactionInfos = new[]\n            {\n                new CreditTransferTransactionInfo\n                {\n                    Amount = \"1.00\",\n                    CreditorName = \"Receiver's name\",\n                    CreditorAccount = \"Receiver's IBAN\",\n                    CreditorAgent = \"Receiver's BIC\",\n                    CurrencyCode = \"EUR\",\n                    EndToEndId = \"something\",\n                    RemittanceInfo = \"Unstructured information for receiver\",\n                }\n            }\n        }\n    }\n};\n\nvar cctResp = c.CCT(cctParams);\n```\n\n# SSL verification\n\nThe verification process is done by using the default [**WebRequest**](https://msdn.microsoft.com/de-de/library/system.net.webrequest(v=vs.110).aspx) class.\n\n# Limitations\n\n* Usage with certificates has been prepared but not completely implemented yet. It works with private/public keys.\n* Only version A005 for signatures can be used. A006 uses PSS padding, which is currently not supported by .NET Core 2.x. Bouncy Castle is only used for PEM file and certificate management.\n* Only version E002 for encryption can be used.\n* Only version X002 for authentication can be used.\n* It was developed using EBICS Version H004, but H005 should work.\n\n# Copyright \u0026 License\n\nCopyright (c) 2016 - 2024 **Torsten Klinger**\n\nLicensed under **GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007**. Please read the LICENSE file.\n\n# Support\n\nYou can contact me via [E-Mail](mailto:torsten.klinger@googlemail.com).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibfintx%2Flibfintx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibfintx%2Flibfintx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibfintx%2Flibfintx/lists"}