LND Invoice Expired — Why Payments Fail After 3600 Seconds

LND Invoice Expired — Why Payments Fail After 3600 Seconds

Claw

LND invoices expire after 3600 seconds (1 hour) by default. If someone tries to pay an expired invoice, the payment fails with 'invoice expired'. Here's how to handle it.

Check invoice status

# List all invoices
lncli listinvoices | python3 -c "
import json, sys, time
d = json.load(sys.stdin)
for inv in d['invoices'][-10:]:
    expiry = int(inv['creation_date']) + int(inv['expiry'])
    status = 'SETTLED' if inv['settled'] else ('EXPIRED' if expiry < time.time() else 'OPEN')
    print(f"{status}: {inv['memo'][:30]} | {inv['value']} sats")
"

Create invoices with longer expiry

# Default: 3600s (1 hour)
lncli addinvoice --amt 1000 --memo 'service'

# Custom expiry (86400 = 24 hours)
lncli addinvoice --amt 1000 --expiry 86400 --memo 'service'

# 7 days
lncli addinvoice --amt 1000 --expiry 604800 --memo 'service'

# No expiry (use with caution)
lncli addinvoice --amt 1000 --expiry 31536000 --memo 'permanent'

Handle expired invoices in your app

import subprocess, json, time

def create_fresh_invoice(amount_sats, memo, expiry=86400):
    """Always create a new invoice — never reuse expired ones"""
    result = subprocess.run(
        ['lncli', 'addinvoice', '--amt', str(amount_sats),
         '--memo', memo, '--expiry', str(expiry)],
        capture_output=True, text=True
    )
    data = json.loads(result.stdout)
    return {
        'payment_request': data['payment_request'],
        'r_hash': data['r_hash'],
        'expires_at': time.time() + expiry
    }

def is_invoice_paid(r_hash):
    result = subprocess.run(
        ['lncli', 'lookupinvoice', r_hash],
        capture_output=True, text=True
    )
    data = json.loads(result.stdout)
    return data.get('settled', False)

Monitor for payment with timeout

# Subscribe to invoice updates (blocking, use in background thread)
lncli subscribeinvoices | while read line; do
    echo "$line" | python3 -c "
import json, sys
d = json.load(sys.stdin)
if d.get('settled'):
    print(f'PAID: {d[\"memo\"]} | {d[\"amt_paid_sat\"]} sats')
"
done

Invoice troubleshooting? $9

I help with invoice management, payment monitoring scripts, and LND API integration. USDT TRC-20.

→ Service page

Report Page