# Bitcoin QR codes — the BIP-21 URI explained

> A Bitcoin QR code stores a BIP-21 URI containing an address and optionally an amount, label and message. Wallets prefill a send screen from it. The address is public information, so the code itself is safe to print — but always verify the first and last characters after scanning.

Source: https://useqr.app/bitcoin-qr-code · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The payload

```
bitcoin:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq?amount=0.001&label=Coffee
```

BIP-21 defines the scheme. Parameters:

| Param | Meaning |
|---|---|
| `amount` | BTC, up to 8 decimal places — **not** satoshis |
| `label` | Recipient name shown in the wallet |
| `message` | Note for the payer |
| `lightning` | An optional BOLT-11 invoice for a unified QR |

`amount=0.001` means one milli-bitcoin. Writing `amount=100000` intending satoshis
requests one hundred thousand BTC, which the wallet will happily display. Check the
units before printing.

## Uppercase bech32 makes smaller codes

Bech32 addresses (`bc1…`) are case-insensitive by design, precisely so they can be
uppercased for QR encoding. Uppercase lets the encoder use alphanumeric mode at 5.5
bits per character instead of byte mode at 8 — roughly 30% fewer modules for the same
address.

Legacy base58 addresses (`1…`, `3…`) are case-*sensitive* and cannot be uppercased.
This is one of several practical reasons to prefer bech32.

## Safety

The address is public — publishing it reveals nothing secret, and anyone can send to
it. The risks are different in kind:

- **Address substitution.** Clipboard-hijacking malware and stickers pasted over
  printed codes both work by swapping the address. After scanning, check the first four
  and last four characters against what is printed.
- **Irreversibility.** There is no chargeback. A wrong address is a permanent loss.
- **Privacy.** A single reused address on public signage makes every payment to you
  publicly linkable. Rotate addresses, or use a payment processor that derives fresh
  ones.

## Lightning

For small amounts, on-chain fees can exceed the payment. A unified QR carrying both an
on-chain address and a `lightning=` BOLT-11 invoice lets the wallet choose. Note that
Lightning invoices usually carry an expiry — a printed one dies.

## FAQ

### What units does the amount parameter use?
BTC, with up to eight decimal places. It is not satoshis. amount=0.001 is one milli-bitcoin; writing a satoshi figure here requests a vastly larger sum.

### Is it safe to print my Bitcoin address publicly?
The address itself is public information and reveals no secret. The real risks are someone pasting a different code over yours, and the privacy loss from a single reused address making all your payments linkable.

### Why should I use a bech32 address?
Bech32 addresses are case-insensitive, so they can be uppercased and encoded in alphanumeric mode — about 30% fewer modules than a legacy address, giving a code that scans more easily.

### Can one QR code hold both on-chain and Lightning?
Yes, using the lightning= parameter alongside the address. Be aware that Lightning invoices normally expire, so this is unsuitable for print.

## Try it

- https://useqr.app/bitcoin
- https://useqr.app/ethereum
