Wallets
Embed Branta in your wallet so users see who they are paying before they hit send.
This page is for wallet developers integrating Branta into a send flow. Embedding Branta lets your users see counterparty name and logo before broadcast (and again in payment history afterward) turning an address or invoice into a recognizable payee.
Why integrate Branta
Users see who they are paying before broadcast (counterparty name and logo), not just an address or invoice.
Eliminates phishing, supply-chain, address-swap, and man-in-the-middle attacks at point of transaction.
Works across Bitcoin onchain, Lightning (bolt11, bolt12, lnurl, ln address), Ark, and Silent Payments.
Privacy-preserving —
strictmode never sends plain-text onchain addresses to Branta.No permission needed — and one network call per scan or paste.
Reuse the same counterparty name and logo in payment history, so a past payment reads as a recognizable payee, not an address.
How Branta works for wallets
Your wallet hands raw QR text or user-pasted text to the Branta SDK. The SDK calls Branta in strict privacy mode: onchain destinations only resolve when the QR carries branta_id and branta_secret (ZK-encoded), while bolt11, Ark (ark1…), and Silent Payments (sp1… / tsp1…) resolve using hash-ZK — no secret needed. On a hit, render the returned counterparty name and logo before the user confirms send. On a miss or error, show nothing — a missing record just means the destination was never posted to Branta.
See SDK, Environments, and Authentication for deeper reference.
Integrate
SDK: branta-js
Wallets should use strict privacy mode. Two flows are supported:
QR scan: call
getPaymentsByQrCodewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
getPaymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
import { BrantaServerBaseUrl } from "@branta-ops/branta";
import { BrantaService } from "@branta-ops/branta/v2";
const service = new BrantaService({
baseUrl: BrantaServerBaseUrl.Production,
privacy: 'strict',
});
async function lookup(input: string, isQrCode: boolean) {
try {
const result = isQrCode
? await service.getPaymentsByQrCode(input)
: await service.getPayments(input);
if (result.payments.length === 0) {
// Not found — show nothing. The address may simply not exist in Branta.
return;
}
// Render result.payments (name and logo)
} catch {
// Swallow errors — never surface a "not found" or lookup failure to the user.
}
}SDK: branta-dotnet
Wallets should use Strict privacy mode. Two flows are supported:
QR scan: call
GetPaymentsByQrCodeAsyncwith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
GetPaymentsAsyncwith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-python
Wallets should use PrivacyMode.Strict. Two flows are supported:
QR scan: call
get_payments_by_qr_codewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
get_paymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-dart
Wallets should use PrivacyMode.strict. Two flows are supported:
QR scan: call
getPaymentsByQrCodeAsyncwith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
getPaymentsAsyncwith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-kotlin
Wallets should use PrivacyMode.Strict. Two flows are supported:
QR scan: call
getPaymentsByQrCodewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
getPaymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-rust
Wallets should use PrivacyMode::Strict. Two flows are supported:
QR scan: call
get_payments_by_qr_codewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
get_paymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always handle the Result and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-go
Wallets should use PrivacyStrict. Two flows are supported:
QR scan: call
GetPaymentsByQRCodewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
GetPaymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always handle the error and show nothing on not-found — a missing record just means the address was not posted to Branta.
SDK: branta-swift
Wallets should use PrivacyMode.strict. Two flows are supported:
QR scan: call
getPaymentsByQRCodewith the raw QR text. This handles both on-chain (when the QR includesbranta_id/branta_secret) and lightning destinations.Copy/paste: call
getPaymentswith the pasted text. Plain-text on-chain addresses will not return results in strict mode — they must be ZK-encoded. bolt11, Ark, and Silent Payments work as plain text (hash-ZK — no secret needed).
Always catch errors and show nothing on not-found — a missing record just means the address was not posted to Branta.
Payment history
Once a payment resolves to a counterparty, render the counterparty name and logo in your transaction history, too.
This is recommended for all wallet integrations:
Persist at send time. When the send-flow lookup returns a hit, store the counterparty
nameandlogoon your transaction record. History rendering is then a local read — no extra network calls, and it works offline.Make it searchable. Include the stored counterparty
namein whatever your history search already indexes, so a user can find a payment by typing the merchant's name instead of recalling an address, invoice, or date. Search stays local — the field is already on the record.
Test your integration
Scan the example QR codes with your wallet to confirm each scenario renders the right thing before broadcast:
On-chain and Lightning — counterparty name and logo render.
ZK On-chain and ZK Lightning — encrypted destinations resolve via
branta_id/branta_secret.ZK Unified — on-chain address, Lightning invoice, and Branta params in one BIP-21 URI (the shape BTCPay checkout uses). Pass the full URI to the SDK; do not split it before lookup.
Not found — your wallet shows nothing (a miss is not an error).
Payment history — after paying a resolved QR, confirm the counterparty name and logo still render on the history row, and that searching history for the counterparty name returns it.
Each variant is published for both Production and Staging — match the environment your SDK is pointed at.
Wallets using Branta
See the live list at branta.pro/network.
To be listed, open a PR on branta-network.
Last updated