Monero
Accept XMR on Monero mainnet and stagenet. Share your view key so we can detect incoming payments - your spend key stays with you.
Monero requires a different trust model than other chains. Read the privacy disclosure first.
Availability. Monero is live on NoHoldPay. If Monero does not appear in your wallet picker, contact support.
Privacy disclosure (read first)
Monero is private by default. To detect incoming payments to your wallet, NoHoldPay needs your primary address plus your private view key.
| Capability | NoHoldPay has it? |
|---|---|
| See every incoming transaction | Yes - via your view key |
| Compute your running balance | Yes |
| Move funds out of your wallet | No - we never see your spend key |
| Sign or broadcast transactions on your behalf | No |
| Infer your outgoing payments | Yes (high probability today, mitigated post-Carrot/FCMP++) |
This is a property of Monero's protocol - every non-custodial XMR processor requires the same key set. You will tick a privacy acknowledgement checkbox before the wallet saves.
Networks
| Network | Chain key | Confirmations | Block time | Min invoice | Payment window |
|---|---|---|---|---|---|
| Monero | XMR | 25 | ~120s | $1.00 | 2 hours |
| Monero Stagenet (testnet) | XMR_STAGENET | 5 | ~120s | $0.10 | 1 hour |
Why 25 confirmations on mainnet? After the September 2025 Qubic 51%-attack incident produced an 18-block rollback that invalidated ~117 transactions, NoHoldPay defaults to 25 confirmations for safety. At ~2 minutes per block, that's about 50 minutes from first detection to confirmed.
Supported coins
Native XMR only. Monero is monolithic - there is no token equivalent of ERC-20 or SPL.
Wallet setup
NoHoldPay needs from you:
- Primary address (95-char base58, starts with
4on mainnet or5on stagenet) - Private view key (64 lowercase hex characters)
NoHoldPay never sees and never asks for:
- Your seed phrase
- Your private spend key
Do not paste:
- A subaddress (mainnet
8..., stagenet7...) - paste the primary address. - An integrated address.
- A custodial exchange deposit address.
Compatible wallets (for you to hold the spend key):
- Hodlall - NoHoldPay's multi-coin wallet, so you can hold Monero alongside your other keys
- Feather Wallet - desktop, lightweight
- Cake Wallet - mobile
- Monero GUI - official desktop wallet
- Ledger via Monero GUI or Feather
Where to find the view key
In Feather: Account -> View only keys. In Monero GUI: Settings -> Wallet -> Show seed & keys. In Cake: Menu -> Security -> Show keys.
In your Monero wallet, open the view-key panel and copy your primary address and private view key.
Screenshot
Monero wallet view-only keys panel showing the primary address and private view key
add image at public/images/guides/monero-view-key.png
XMR or XMR_STAGENET.Tick the privacy acknowledgement checkbox - you must explicitly confirm you understand the disclosure.
NoHoldPay validates that the view key matches the address before saving. A duplicate view key (already registered) is rejected - generate a fresh wallet instead.
How payments work
NoHoldPay derives a fresh subaddress per payment from your wallet. The subaddress index is permuted with a non-sequential mapping so a leaked subaddress does not reveal neighboring indices on-chain.
The checkout shows the standard Monero payment URI:
monero:<subaddress>?tx_amount=<amount>&tx_description=<description>Every Monero wallet - Feather, Cake, Monero GUI - handles this natively. The customer doesn't need a plugin or protocol extension.
Subaddress capacity
Each Monero wallet can hand out up to 10,000 subaddresses before rotation is required. At 10 payments/day, that's about 3 years. If you saturate, NoHoldPay returns MONERO_SUBADDRESS_CAPACITY_REACHED and you rotate to a fresh wallet.
For privacy hygiene, consider rotating wallets quarterly anyway.
What's not supported
- Gasless mode - Monero has no equivalent.
- Forwarder/CREATE2 mode - Monero has no smart contracts.
- Operator-broadcast sweeps - funds land directly at your address.
- Operator-broadcast refunds - you send refunds from your own wallet.
- Tokens - XMR only.
- Address-only setup - view key is required (Monero protocol property).
Refund flow
Refunds for Monero are merchant-initiated from your own wallet:
- Customer requests a refund via the checkout (you receive
payment.refund_requested). - You send the refund from your wallet (Feather, Cake, or Monero GUI).
- Contact support with the payment ID and your refund transaction details to close out the request.
Marking a Monero payment refunded directly in the dashboard is not supported yet: the platform cannot independently verify a Monero transaction's destination or amount (a privacy property of the chain), so attempting it returns REFUND_VERIFICATION_UNSUPPORTED. Keep your refund transaction hash and tx key so you can prove the payment if the customer disputes it.
Recovery model
You hold the spend key in your own wallet. If NoHoldPay vanishes, your wallet keeps working - you already have everything you need.
Your Recovery Kit lists your Monero primary address as an informational courtesy only - there is no platform-side secret to recover. Your seed phrase in your own wallet is everything you need, and your funds are always under your control.
Wallet rotation
When you want a fresh privacy boundary (quarterly hygiene, post-incident, capacity reached):
Generate a brand-new Monero wallet locally (Feather, Cake, or GUI). New spend key, new primary address, new view key.
Deactivate the old wallet from the wallet card, then delete it once the cooling-off period has passed (mainnet wallets must stay disabled for a few days before Delete unlocks).
Funds in the old wallet remain yours - deactivating only stops payment routing on NoHoldPay.
Testnet (XMR_STAGENET)
In Feather: Settings -> Manage seeds -> Stagenet wallet. Stagenet primary addresses start with 5.
- Explorer: stagenet.xmrchain.net.
- Stagenet faucets (community-run):
Common errors
| Code | When |
|---|---|
MONERO_PRIVACY_NOT_ACKNOWLEDGED | Privacy checkbox not ticked |
MONERO_ADDRESS_INVALID | Base58 decode or checksum failed - integrated addresses also fail here (paste the plain 95-char primary address) |
MONERO_ADDRESS_NOT_PRIMARY | You pasted a subaddress - paste the primary address |
MONERO_ADDRESS_WRONG_NETWORK | Mainnet address on stagenet route, or vice versa |
MONERO_VIEW_KEY_INVALID | View key not 64 lowercase hex |
MONERO_VIEW_KEY_MISMATCH | View key doesn't match the address's public view key (different wallets) |
MONERO_VIEW_KEY_DUPLICATE | This view key is already registered - generate a fresh wallet |
MONERO_SUBADDRESS_CAPACITY_REACHED | Wallet handed out 10,000 subaddresses - rotate to a fresh wallet |