Built on SIX bLink — Swiss Open Banking

A banking CLI
for AI agents.

Built for Claude Code, OpenClaw, and other AI tools. Payments, accounts, cryptographic signing, safety guardrails, and a wealth dashboard — powered by SIX bLink. One CLI, every Swiss bank.

signed payment with safety guardrails
$ blinkcli 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.

blinkcli 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 blinkcli innovations — features that don’t exist in bLink but demonstrate what a client-sovereign banking interface could look like.
blinkcli 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
  • blinkcli 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 blinkcli 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 blinkcli 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
$ blinkcli 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
 
$ blinkcli 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
 
$ blinkcli 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

One command. Every bank.
Structured warnings.

blinkcli wealth summary replaces 6+ separate calls. Total assets, per-bank breakdown, esisuisse coverage, yield analysis, and proactive risk warnings.

blinkcli wealth summary
Wealth Summary
 
  Total Assets:             CHF 621,750.25
  Weighted Avg Yield:       0.112%
  Est. Annual Interest:     CHF 672.84
 
  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
      ↳ CHF 400,000 exceeds esisuisse limit
  ✓ Small Bank AG    CHF   5,680.25   BBB+
 
  Warnings
  ⚠ exceeds_deposit_protection KaBe Bank +CHF 400k
  ⚠ concentration_risk 83% at one bank
  ⚠ low_credit_rating Small Bank BBB+
  ℹ zero_yield CHF 12,450 earning 0%
Independent record

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

Every statement, balance check, payment, and transfer is auto-committed to a local git repository. Cryptographic hashes. Immutable history. If the bank changes a transaction retroactively, ledger verify shows the discrepancy.

blinkcli ledger sync && blinkcli ledger log
$ blinkcli ledger sync
✓ [big-bank] Synced 3 accounts
✓ [kabe-bank] Synced 3 accounts
✓ [small-bank] Synced 2 accounts
✓ Ledger sync complete (14 commits)
 
$ blinkcli ledger log
 
COMMIT        TIMESTAMP                  MESSAGE
------------  -------------------------  ---------------------------------------------
671bbf44f207  2026-03-25 22:24:33 +0100  blinkcli: payment pay-bde60828 EXECUTED
0c416b64c00c  2026-03-25 22:24:32 +0100  blinkcli: payment pay-64c37eed EXECUTED
25967f67d93c  2026-03-25 22:24:43 +0100  blinkcli: statements CH93...52957 (11 txns)
cf17776a223a  2026-03-25 22:24:43 +0100  blinkcli: balance CH93...52957 at big-bank
f9794186bbe8  2026-03-25 22:24:43 +0100  blinkcli: statements CH65...78645 (7 txns)
7366686c6c8c  2026-03-25 22:24:43 +0100  blinkcli: balance CH65...78645 at kabe-bank
5054def84d63  2026-03-25 22:24:00 +0100  blinkcli: payment pay-6f511829 EXECUTED
819a76ed2f92  2026-03-25 22:23:25 +0100  blinkcli: payment pay-7a2215e8 EXECUTED
 
$ blinkcli ledger verify CH9300762011623852957
✓ Records match. No discrepancies found.
 
$ blinkcli pay verify pay-bde60828
✓ Signature VALID for pay-bde60828
  Algorithm:       Ed25519
  Local Key Match: True

Every interaction is a git commit with a SHA hash. The bank is no longer the sole record-keeper. You become a peer, not a dependent.

Capabilities

Everything a banking CLI needs.

--force --sign

Skip SCA and sign with Ed25519. Instant execution with proof stronger than any mobile app.

📚

Git ledger

Auto-committed banking record. Sync, verify, audit. Your independent proof of what the bank told you.

🤖

LLM-native

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

🏦

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.

📈

Wealth + warnings

One call for total assets, coverage gaps, yield analysis, and structured risk warnings with severity.

In action

What Claude Code does with blinkcli.

“I have CHF 500’000 at KaBe Bank. Distribute it so everything is covered by Einlagensicherung, and maximize my yield.”
1blinkcli 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.”
3blinkcli 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.
6blinkcli 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.

CapabilityComparisBanking AppFintechTwintblinkcli + LLM
Full wealth view××××✓ wealth summary
Execute payments×with appredirectapp only✓ --force
Sign payments××××✓ Ed25519
Independent record××××✓ git ledger
Dry-run / preview××××✓ --dry-run
Idempotency××××✓ --idempotency-key
Balance guardrail××××✓ --assert-min-balance
Risk warnings××some×✓ structured
Custom reasoning××pre-coded×✓ any question
Open APIn/a×✓ bLinkclosed✓ bLink
Lock-innonebank appfintechTwint appnone
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 blinkcli
$ blinkcli sim start
✓ 3 banks loaded
$ blinkcli keys init && blinkcli ledger init
$ blinkcli wealth summary
GitHub repo bLink gap analysis