Payment Rail Discovery (LUD-25)
Payment Rail Discovery enables recipients to advertise multiple payment protocols beyond BOLT11 Lightning — including BOLT12, Ark, Spark, Liquid, and on-chain Bitcoin.
Why It Matters
The Bitcoin payment ecosystem is expanding:
- BOLT12 — improved privacy and reusability
- Ark — scalable off-chain payments
- Spark — instant settlement layer
- Liquid — federated sidechain
- On-chain — the base layer
With Payment Rail Discovery, your Lightning Address becomes a unified payment endpoint that supports all these protocols.
How It Works
The pay-options Endpoint
In addition to the standard /.well-known/lnurlp/<user> endpoint, servers can expose:
GET /.well-known/pay-options/<user>This returns available payment rails:
{ "options": [ { "type": "bolt11", "callback": "https://domain.com/lnurlp/user/callback" }, { "type": "bolt12", "offer": "lno1..." }, { "type": "onchain", "address": "bc1q..." }, { "type": "liquid", "address": "VJL..." } ]}Option Types
| Type | Description | Fields |
|------|-------------|--------|
| bolt11 | Standard Lightning | callback |
| bolt12 | BOLT12 offers | offer |
| onchain | Bitcoin on-chain | address, bip21 |
| liquid | Liquid Network | address |
| ark | Ark protocol | vtxo_address |
| spark | Spark protocol | endpoint |
Client Behavior
Wallets implementing LUD-25 should:
- Check for
/.well-known/pay-options/<user>first - If available, present options to the user or auto-select based on preferences
- Fall back to standard LNURL-pay if not available
async function resolveLightningAddress(address: string) { const [user, domain] = address.split('@'); // Try pay-options first try { const payOptions = await fetch( `https://${domain}/.well-known/pay-options/${user}` ); if (payOptions.ok) { return { type: 'multi-rail', data: await payOptions.json() }; } } catch {} // Fall back to standard LNURL-pay const lnurl = await fetch( `https://${domain}/.well-known/lnurlp/${user}` ); return { type: 'lnurl', data: await lnurl.json() };}Implementation Example
app.get('/.well-known/pay-options/:username', async (req, res) => { const user = await getUser(req.params.username); if (!user) { return res.status(404).json({ status: 'ERROR', reason: 'User not found' }); } const options = []; // Always include BOLT11 options.push({ type: 'bolt11', callback: `https://domain.com/lnurlp/${user.username}/callback` }); // Add BOLT12 if user has an offer if (user.bolt12Offer) { options.push({ type: 'bolt12', offer: user.bolt12Offer }); } // Add on-chain if user has a static address if (user.bitcoinAddress) { options.push({ type: 'onchain', address: user.bitcoinAddress }); } res.json({ options });});The Future of Payments
Payment Rail Discovery positions Lightning Address as the universal payment identifier:
- One address, many rails — users share a single identifier
- Automatic optimization — wallets can pick the best rail
- Future-proof — new protocols can be added without changing addresses
- Agent-friendly — programmatic rail selection for AI systems
As new Bitcoin scaling solutions emerge, they can integrate with the Lightning Address ecosystem through this discovery mechanism.