Payment Verification (LUD-21)
Payment Verification provides cryptographic proof that a payment was settled. This enables non-custodial verification of Lightning payments.
Why It Matters
Traditional Lightning payments require trust — when you pay someone, you get a preimage as proof, but verifying that the recipient actually received the funds requires trust in the payment processor. With Payment Verification:
- Trustless confirmation — cryptographic proof the payment reached its destination
- Non-custodial verification — verify without relying on a third party
- Agent-friendly — perfect for autonomous systems that need settlement proof
- Dispute resolution — undeniable evidence for commercial transactions
How It Works
Payment Verification works by having the recipient server provide a verification endpoint that returns a cryptographic signature proving the payment was received.
Flow Overview
- Sender makes a payment and receives a preimage
- Sender requests verification from the recipient's server
- Server returns a signed message confirming receipt
- Sender can verify the signature independently
Server Response
When responding to the LNURL request, include verification capability:
{ "callback": "https://domain.com/lnurlp/user/callback", "minSendable": 1000, "maxSendable": 100000000000, "metadata": "[[\"text/plain\",\"Pay user\"]]", "tag": "payRequest", "payerData": { "name": { "mandatory": false }, "email": { "mandatory": false } }, "nostrPubkey": "npub1...", "allowsNostr": true}Verification Endpoint
After payment, the sender can verify:
GET /lnurlp/user/verify/{payment_hash}Response:
{ "status": "OK", "settled": true, "preimage": "abc123...", "signature": "...", "pubkey": "..."}Use Cases
Agent Payments
AI agents can verify payments programmatically:
async function verifyPayment(domain: string, user: string, hash: string) { const response = await fetch( `https://${domain}/lnurlp/${user}/verify/${hash}` ); const data = await response.json(); if (data.settled) { // Verify signature against known pubkey return verifySignature(data.signature, data.pubkey, hash); } return false;}E-commerce
Online stores can confirm payment before shipping without trusting a payment processor.
Escrow Services
Third parties can independently verify that both sides of a transaction completed.
Implementation Notes
- The verification endpoint should be rate-limited
- Signatures should use standard cryptographic schemes (secp256k1)
- Payment data should be persisted for the verification window
- Consider privacy implications of exposing payment hashes