For the complete documentation index, see llms.txt. This page is also available as Markdown.

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 — 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 — strict mode never sends plain-text onchain addresses to Branta.

  • No permission needed — and one network call per scan or paste.

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 info (name, logo, verifyUrl) 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 getPaymentsByQrCode with the raw QR text. This handles both on-chain (when the QR includes branta_id / branta_secret) and lightning destinations.

  • Copy/paste: call getPayments with 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 and result.verifyUrl
  } catch {
    // Swallow errors — never surface a "not found" or lookup failure to the user.
  }
}

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.

  • Not found — your wallet shows nothing (a miss is not an error).

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