Skip to main content
Spark doesn’t force a single address format on your users. Depending on what you’re building, your users might interact with standard Bitcoin taproot addresses, Lightning invoices, Spark addresses, or none of the above. You choose what to expose.

Address types

Bitcoin taproot addresses

Every Spark wallet has a standard Bitcoin taproot address (bc1p... on mainnet) for L1 deposits. This is the same address format used by any Bitcoin wallet. Your users can receive Bitcoin from Coinbase, a hardware wallet, or any on-chain source. On test networks you’ll see different prefixes: tb1p... (testnet/signet) and bcrt1p... (regtest/local).
const depositAddress = await wallet.getStaticDepositAddress();
// bc1p5d7rjq7g6rdk2yhzks9smtbqtedr4dekq08ge8ztwac72sfr9rusxg3297
This means a Spark-powered app can function as a full L1 Bitcoin wallet. Users deposit to a taproot address, hold Bitcoin on Spark, and withdraw back to L1 whenever they want.

Lightning invoices

Spark wallets can create and pay Lightning invoices without running a node or managing channels. Some apps only expose Lightning. Users never see a Spark address or know Spark exists.
// Create a Lightning invoice
const { invoice } = await wallet.createLightningInvoice({
  amountSats: 50000,
  memo: "Payment for order #1234",
});

// Pay a Lightning invoice
const payment = await wallet.payLightningInvoice({
  invoice: "lnbc500u1p...",
});

Spark addresses

Spark addresses are Bech32m-encoded identifiers that map to a wallet’s identity public key. Think of them as user IDs. They identify a wallet on the Spark network. Transfers between Spark addresses are instant and free.
const sparkAddress = await wallet.getSparkAddress();
// spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu
Most wallets don’t expose Spark addresses to end users. They’re useful behind the scenes for free, instant transfers between your own users, between services, or for settlement between apps.

What to expose

Spark is modular. Pick the addressing that fits your use case:
Use caseWhat users seeWhat Spark does behind the scenes
Bitcoin walletTaproot address (bc1p... / tb1p... / bcrt1p...)L1 deposits, Spark balance, L1 withdrawals
Payments appLightning invoicesSpark handles routing, no node needed
Exchange / fintechNothing (internal accounts)Spark addresses for free internal transfers
P2P transfersSpark addresses or usernamesInstant, free Spark-to-Spark settlement
The point: Spark adapts to your product. It can be a full L1 wallet, a Lightning payments backend, a free internal ledger, or all three at once. Your users don’t need to know what’s underneath.

Spark address format

For developers working directly with Spark addresses, here’s the format:
spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu

Network prefixes

NetworkPrefixAvailability
MainnetsparkAvailable
RegtestsparkrtAvailable
TestnetsparktComing soon
SignetsparksComing soon
LocalsparklAvailable

Key facts

  • Derived from your wallet’s network and identity public key
  • Same wallet always produces the same Spark address
  • Network-specific. A mainnet wallet and regtest wallet will have different addresses