EBICS for Python, without the sidecar.
ebicsclient talks to your bank over EBICS 3.0: download statements, initiate payments, one library, no PHP or Java process next to your application. Validated live against a Swiss bank. Free for noncommercial use.
pip install ebicsclient
from ebicsclient import Bank, User, Client, load_keyring, PAIN_001
bank = Bank(host_id="HOST1", url="https://ebics.example-bank.ch/ebicsweb")
user = User(partner_id="PARTNER1", user_id="USER1")
client = Client(bank, user, load_keyring("keyring.json", passphrase="…"))
# Read: end-of-day statements, parsed.
for statement in client.download_statements():
print(statement.iban, statement.closing_balance)
# Write: a pain.001 payment order.
transaction_id = client.upload(PAIN_001, pain001_bytes)
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>MEMBER-REFUNDS-2026-09</MsgId>
<CreDtTm>2026-09-20T09:30:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<InitgPty><Nm>Swimming Club Example</Nm></InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId>REFUNDS</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<ReqdExctnDt><Dt>2026-09-22</Dt></ReqdExctnDt>
<Dbtr><Nm>Swimming Club Example</Nm></Dbtr>
<DbtrAcct><Id><IBAN>CH9300762011623852957</IBAN></Id></DbtrAcct>
<CdtTrfTxInf>
<PmtId><EndToEndId>REFUND-0042</EndToEndId></PmtId>
<Amt><InstdAmt Ccy="CHF">120.00</InstdAmt></Amt>
<Cdtr><Nm>Jane Example</Nm></Cdtr>
<CdtrAcct><Id><IBAN>CH5604835012345678009</IBAN></Id></CdtrAcct>
</CdtTrfTxInf>
</PmtInf>
</CstmrCdtTrfInitn>
</Document>
What it does
The whole EBICS round trip, in the package you install
Key ceremony, statement downloads and payment uploads, implemented from the EBICS 3.0 specification and checked against the bank, not against another client.
- Pure Python
-
Built on
cryptographyandlxml, nothing else. No PHP or Java process to operate next to your application, no proprietary dependency. Fully typed, documented, and it fails closed. Works in Django, Flask, FastAPI or a plain script. - Statements in, payments out
-
camt.053, camt.052 and camt.054 downloads with optional date ranges, pain.002 status reports, and pain.001 payment uploads with the A006 electronic signature. Read and write are validated live against Zürcher Kantonalbank, including the key initialisation ceremony.
- Full source, no gating
-
Every feature is in the package: no licence keys, no delayed statements, no transaction caps, nothing that phones home. Noncommercial use is free. Commercial use is what funds the maintenance, through a plain licence you take out by email.
Pricing
Free to use, fair to embed
The same package either way. The licence you need depends on what you do with it.
Noncommercial
Free
Personal, educational, research and charitable use, and nonprofit associations managing their own affairs, such as a club invoicing its members.
- Full source, every feature
- No registration, no licence keys
- PolyForm Noncommercial License 1.0.0
- Support through GitHub issues
Commercial
CHF 60.00 / seat / year
excl. VAT
For products and services you sell to, or host for, other organisations.
- A seat is one customer of yours, an organisation or a private person, regardless of how many accounts, bank connections or users it has
- Your own development, test and staging environments are free
- Every release published during the licence term
- Email support, licensees first
- Billed yearly. Seats are self-declared through a private link or the API, seats added mid-year are charged pro rata
Large customer bases: get in touch and we will talk about volume pricing. Prices are net; VAT is added where the licensor is required to charge it.
Seat reporting
One call per customer, in either direction
With a commercial licence you get a private link. Open it in the browser to add or remove a seat by hand, or let your product call the API when it onboards or offboards a customer. Only the number is recorded, never who the customer is.
- Nothing to install, nothing to embed
- ebicsclient itself does not know about seats. The library stays unchanged, the count lives on this site.
- Once a year, one invoice
- The seat count at renewal sets the next year. Seats added during the year are charged pro rata for the remaining months; seats removed take effect at renewal.
- Documented API
- Two endpoints, JSON in and out: OpenAPI reference →
# A new customer goes live: add a seat.
curl -X POST https://ebicsclient.miniapps.ch/api/licenses/<licence-id>/seats \
-H 'Content-Type: application/json' \
-d '{"add": true}'
# The customer leaves: remove it again.
curl -X POST https://ebicsclient.miniapps.ch/api/licenses/<licence-id>/seats \
-H 'Content-Type: application/json' \
-d '{"add": false}'
# Either call answers with the current state.
{
"seats": 4,
"billable_seats": 4,
"seat_price": "60.00",
"annual_cost": "240.00",
"currency": "CHF"
}
Frequently asked questions
These come from real licensing enquiries. Something else? Send an email and you will get an answer from the person who wrote the library.
- I run the accounting of a nonprofit association. Can I use ebicsclient for free?
- Yes. A club or association managing its own members, invoices and payment reconciliation is noncommercial use under the PolyForm Noncommercial License. If you would like that in writing for your records, ask and you will get it by email.
- I built an application for my own association and now want to offer it to other organisations. Do I need a licence?
- From the moment you charge other organisations for it, or host it for them as a service, yes. Development, testing and your own association's use stay free. You need the commercial licence when the first paying customer goes live, not before.
- What exactly is a seat?
- One customer whose bank accounts your product accesses through ebicsclient. A customer can be an organisation or a private person: a club is one seat, and so is each of fifty individuals using your product for their own accounts. How many accounts, bank connections, EBICS user IDs or people a customer has does not matter. Your own development, test and staging environments are never seats.
- Does the free version hold anything back, such as recent statements or upload limits?
- No. There is one package and it contains everything: statements for any date range including today, uploads without a transaction cap, the full source. There are no licence keys and no technical enforcement. The model relies on commercial users respecting the licence, and that is what funds the maintenance.
- How is the commercial licence billed?
- Yearly, per seat. At onboarding you pay for your current seats for the remaining licence year. Seats you add during the year are charged pro rata for the remaining months, seats you drop take effect at the next renewal. Seat counts are self-declared through your private link or the API.
- What do I get with a commercial licence?
- The right to use, embed and host ebicsclient in your product for the paid seats, every release published during the term, and email support with licensees taking priority. Your fee also funds the maintenance and further development of the library, including keeping up with EBICS and ISO 20022 changes. The formal terms are in a short licence agreement you receive when you start.
- What if I give my application to other nonprofits for free?
- Then they use ebicsclient noncommercially themselves and are covered by the noncommercial licence. Keep the licence notice with the code, that is all.
- Which banks and EBICS versions are supported?
- EBICS 3.0 (H005) only, by design: banks now require it and the older protocol versions are retired. Read and write are validated live against Zürcher Kantonalbank. EBICS is a standard, but banks differ in details, so if your bank behaves differently, report it and it gets looked at.
- Does it work inside a Django application?
- Yes. ebicsclient is a plain library with no framework dependency. Call it from a management command, a Celery task or a cron job, the same way you would from a script.
- Can I get a different price, for example a flat rate?
- Pricing is set per licence, so a flat rate, a cap beyond which seats are free, or a volume price is a conversation, not a new product. Once agreed it is locked in on your licence page.
Questions about your case?
Whether the licence fits, which bank you are connecting, or what is missing for your integration: write, and you get an answer from the maintainer.