Skip to main content
For the complete documentation index, see llms.txt.
Built by the community - Special thanks to Ruben Somsen and Josie Bake for their groundbreaking work on BIP-352.

Installation

Import the SDK:

Integration Workflow

1

Generate silent payment address

Create a reusable address for receiving private payments
2

Create destination address

Generate a one-time taproot address for each payment
3

Scan for incoming funds

Detect payments without exposing spending keys
4

Spend received funds

Derive private keys and move Bitcoin

Step 1: Generate Silent Payment Address

Choose your key generation method based on your use case:
If not using the signature-derived method, ensure you’re using a cryptographically secure random number generator for b_scan and b_spend.

Create a Change Address

Critical for privacy: Never send change to a public address after making silent payments.
Scenario: You send 10 silent payments to friends, then send change to your public address.Result: You’ve exposed:
  • ❌ Your own private transaction history
  • ❌ Your friends’ payment patterns
  • ❌ Links between all 10 transactions
Solution: Always use a labeled silent payment address for change.Reference: BIP-352 Labels for Change

Step 2: Create Destination Address

Generate a unique taproot address for the payment:
What you need:
  • UTXO transaction ID and output index
  • UTXO private key
  • Amount in satoshis
  • Recipient’s scan and spend public keys (B_scan, B_spend)

Step 3: Scan for Incoming Funds

Scanning trade-off: This is the main drawback of silent payments - you must scan the blockchain to detect incoming transactions.
Check if a transaction belongs to you:
If the output matches the taproot address → it’s yours! 🎉
  • Transaction input’s txid and output_index
  • Public key from the output
  • Script and amount from the taproot address
Learn more: BIP-352 Scanning

Step 4: Spend the Funds

Once you’ve confirmed funds belong to you, derive the private key:
Use this private key with bitcoinjs-lib to build and sign your taproot transaction.

That’s It

You’ve successfully implemented Bitcoin silent payments. Your users can now:
  • ✅ Share a single address for all payments
  • ✅ Receive Bitcoin privately
  • ✅ Maintain transaction unlinkability
  • ✅ Avoid notification transaction fees

Additional Resources

BIP-352 Specification

Complete technical specification

bitcoinjs-lib

Build Bitcoin transactions in JavaScript

Silent Payments Explained

Protocol deep dive

ECDSA Signatures

Learn about signature-based key derivation