Built on SIX bLink + OpenWealth — Swiss Open Banking

A banking CLI
for AI agents.

Built for Claude Code, OpenClaw, and other AI tools. Payments, accounts, securities portfolio, trading, cryptographic signing, safety guardrails, ISO 20022 reports, and a git-backed ledger — powered by SIX bLink + OpenWealth. One CLI, every Swiss bank.

signed payment with safety guardrails
$ rbcli pay send --from CH9300762011623852957 --to CH6589144414396878645 \
    --amount 250.00 --force --sign --assert-min-balance 10000
 
✓ Payment executed (SCA bypassed) [signed]
  Payment Id:    pay-348264a1
  Uetr:         a3c8f921-71b4-4e2a-9d05-83bf2e1c6a47
  Status:       EXECUTED
  Amount:       CHF 250.00
  From Balance: 12450.00 → 12200.00
  Signed:       True
  Signature:   d4f89cc1786de61f1aa5bc29...
The reality

What bLink actually allows —
and what banks block.

rbcli demonstrates what could work. The gaps between our demo and real bLink are business decisions, not technical limitations.

--force (skip e-banking approval)
Real bLink PSS: “All payments must be explicitly confirmed by the customer in the Service Provider’s e-banking.” There is no API-level execution. Our --force shows what could work for trusted clients.
political gap
Instant Payment via API
SIC5 instant payments are live since Aug 2024 (<10 sec, 24/7). But they’re not exposed through bLink. You can send instant payments from your bank’s app — but not from a third-party tool.
political gap
Payment notifications (camt.054)
The bLink docs explicitly state: “camt.054 messages cannot be delivered through a bLink connection.” The Notification API exists only for OpenWealth trading, not for payments.
political gap
OAuth consent flow
Real bLink requires full OAuth 2.0 + mTLS consent flow. Customer must authenticate in bank’s e-banking for every new connection. Our demo uses API keys for simplicity.
technical gap
Ed25519 signing, git ledger, --dry-run
These are rbcli innovations — features that don’t exist in bLink but demonstrate what a client-sovereign banking interface could look like.
rbcli innovation
The proof

Same banks. Same country.
Opposite philosophy.

The same Swiss banks operate both bLink and Twint. One they made open. The other they deliberately closed.

bLink (SIX) — Open

  • Open standard, any third party can connect
  • Documented REST APIs (JSON + ISO 20022)
  • Client chooses the interface
  • rbcli works

Twint — Closed

  • P2P payments locked inside the app
  • No public API for consumers
  • Merchant contract required for Payment Links
  • No URL scheme, no webhook, no CLI
Lock-in is not a side effect. It’s the product.
Client sovereignty

Three features that shift
power to the client.

Together they make the bank a service provider you can audit, not a gatekeeper you depend on.

1

Channel visibility

Every transaction shows which channel initiated it: blink, ebanking, mobile, ebics, card, system. Filter with --channel. “Show me debits I didn’t initiate” = fraud detection in one command.

2

Git-backed ledger

Every statement, balance, payment, and transfer is auto-committed to a local git repo. Cryptographic hashes. Immutable history. Run rbcli ledger verify to diff your records against the bank. If they changed a transaction, you’ll know.

3

Cryptographic signing

Ed25519 signatures on payment instructions. Non-repudiable proof of authorization. The bank can’t deny you sent it, you can’t deny you authorized it. Stronger than any mobile app OTP. Verify anytime with rbcli pay verify.

LLM safety

Three guardrails for
autonomous agents.

When an LLM does banking, it must not drain accounts, double-pay, or act without checking. These features make that impossible.

🛡

--dry-run

Check consequences without executing. Shows before/after balances for both sides. The LLM validates its plan before committing real money.

⚠️

--assert-min-balance

Hard guardrail. Payment rejected if remaining balance would fall below N. Prevents hallucinated amounts from draining an account.

🔒

--idempotency-key

Same key = same result on retry. If the LLM retries a failed call, the payment isn’t executed twice. Response shows deduplicated: true.

safety in action
$ rbcli pay send --from CH93... --to CH65... --amount 100000 --force --dry-run
✓ Dry run — no payment executed
  From Balance Before: 500000.0
  From Balance After:  400000.0
 
$ rbcli pay send --from CH93... --to CH65... --amount 5000 --force --assert-min-balance 10000
✗ Payment would leave balance at CHF 5450.00, below minimum CHF 10000.00
 
$ rbcli pay send --from CH93... --to CH65... --amount 100 --force --idempotency-key "rent-2026-03"
✓ Payment executed (SCA bypassed) (deduplicated)
  Deduplicated: True ← no money moved on retry
Full picture

Cash + securities. All banks.
One command.

rbcli wealth summary combines cash accounts (bLink AIS) and securities portfolios (OpenWealth Custody) across all banks. Total wealth, deposit protection, P&L, and cross-asset warnings.

rbcli wealth summary
Wealth Summary
 
  Total Wealth:             CHF 1,784,900.25
 
  Cash          34.8%  CHF   621,750.25  ███████
  Securities   65.2%  CHF 1,163,150.00  █████████████
 
  esisuisse Covered:        CHF 203,130.25 (33%)
  esisuisse Uncovered:      CHF 418,620.00
 
  ✓ Big Bank AG       CHF 100,650.00   AA
  ⚠ KaBe Bank        CHF 515,420.00   A
 
  Securities Portfolio
  Market Value:             CHF 1,163,150.00
  Unrealized P&L:           CHF +81,400.00 (+7.52%)
 
  Warnings
  ⚠ exceeds_deposit_protection KaBe Bank +CHF 400k
  ⚠ concentration_risk 83% of cash at KaBe Bank
  ⚠ total_bank_exposure CHF 1M at KaBe (58% of wealth)
  ℹ zero_yield CHF 12,450 earning 0%
Independent record

Your own git repo of everything
the bank ever told you.

Companies have accounting systems. Normal people have nothing — the bank is the sole record-keeper. rbcli changes this. Every balance, statement, payment, trade, and portfolio snapshot is auto-committed to a local git repo. SHA hashes. Immutable history. If the bank changes anything retroactively, ledger verify shows the discrepancy.

rbcli ledger log
COMMIT        TIMESTAMP                  MESSAGE
------------  -------------------------  -----------------------------------------------------
13e11d1054  2026-03-27 18:54:35  rbcli: order BUY 50 Roche Holding AG EXECUTED
1e10ac7739  2026-03-27 18:54:35  rbcli: order SELL 200 Swiss Re AG EXECUTED
bf6a56e956  2026-03-27 18:54:34  rbcli: security-txns port-bb-001 (4 txns)
bebf0c3de3  2026-03-27 18:54:33  rbcli: positions port-bb-001 (CHF 650,750)
63d1df9417  2026-03-27 18:54:32  rbcli: wealth snapshot CHF 1,784,900 (6 warnings)
671bbf44f2  2026-03-25 22:24:33  rbcli: payment pay-bde60828 EXECUTED
25967f67d9  2026-03-25 22:24:43  rbcli: statements CH93...52957 (11 txns)
cf17776a22  2026-03-25 22:24:43  rbcli: balance CH93...52957 at big-bank
 
$ rbcli ledger verify CH9300762011623852957
✓ Records match. No discrepancies found.

Cash, securities, trades, wealth snapshots — every interaction is a git commit with a SHA hash. For the first time, a normal person has the same independent financial record that corporations take for granted.

Capabilities

Cash + securities + safety.

💰

Unified wealth

Cash + securities in one call. CHF 1.8M across 3 banks + 2 custody accounts. Allocation bars. 6 warning types.

📈

Portfolio + trading

Positions, transactions, P&L via OpenWealth Custody. Buy/sell with --dry-run and --idempotency-key.

Payments + signing

Ed25519 signed payments. UETR tracking. --force for instant execution. Before/after balance diff.

🛡

Safety guardrails

--dry-run, --assert-min-balance, --idempotency-key — on payments and trades. Hallucination can’t reach the money.

📚

Git ledger

Cash, securities, trades, wealth snapshots — all auto-committed. Your independent proof. Companies have ERP. Now you have git.

📄

ISO 20022 reports

Generates camt.053 (account statements) and semt.002 (custody reports). The same XML format Swiss banks produce.

🤖

LLM-native

Auto-JSON when piped. Semantic ANSI colors. Structured errors with suggestions. Built for Claude Code + OpenClaw.

🏦

Multi-bank products

Compare rates, ratings, fees, deposit protection across all banks. products compare --type savings

📡

Koivu monitoring

Pennytest payments measuring settlement latency. If CHF 0.01 doesn’t arrive in 30s, something’s broken.

In action

What Claude Code does with rbcli.

“I have CHF 500’000 at KaBe Bank. Distribute it so everything is covered by Einlagensicherung, and maximize my yield.”
1rbcli wealth summary — full picture in one call. Sees 3 warnings.
2“3 banks × 100k = 300k max. Keep 300k at KaBe (0.50%), move 100k to Big Bank (AA), 100k to Small Bank. Trade-off: CHF 600/yr less interest for 200k more protection.”
3rbcli pay send ... --amount 100000 --force --sign --assert-min-balance 200000 --dry-run — validates.
4Same command without --dry-run, with --idempotency-key "esisuisse-bigbank-2026-03" — executes.
5Repeat for Small Bank with different idempotency key.
6rbcli wealth summary — confirms coverage improved to 49%.

Two calls for the full picture. Two dry-run-validated, signed, idempotent payments. One verification. No banking app does this.

Comparison

Not another banking app.

CapabilityBanking AppFintechTwintStablecoinsrbcli + LLM
Full wealth view××××✓ cash + securities
Securities portfolioown banksome××✓ multi-custodian
Tradingown banksome××✓ with --dry-run
Execute paymentswith appredirectapp only✓ --force
Sign payments×××on-chain✓ Ed25519
Independent record×××blockchain✓ git ledger
ISO 20022 reports××××✓ camt.053 + semt.002
Safety guardrails××××✓ 5 layers
Custom reasoning×pre-coded××✓ any question
CHF nativeUSD/EUR
Lock-inbank appfintechTwint appwalletnone
Demo

Three banks. Three strategies.

Big Bank AG

AA (S&P) · esisuisse 100k
0.20%
savings rate

KaBe Bank

A (S&P) · esisuisse 100k
0.50%
savings · CHF 500k

Small Bank AG

BBB+ (S&P) · esisuisse 100k
0.20%
savings rate

Try it now.

install
$ pipx install rbcli
$ rbcli sim start
✓ 3 banks loaded
$ rbcli keys init && rbcli ledger init
$ rbcli wealth summary
GitHub repo bLink gap analysis