SatLane
Documentation

Webhook events

Webhook event types

Every event type matches its status transition and carries the same payload shape ({ event_id, event_type, created_at, livemode, data: { invoice } }).

Event typeFired whenMay fire more than once?
invoice.createdNew invoice via POST /v1/invoicesno
invoice.payment_seenPayment in mempool, 0 confno, once per invoice
invoice.paidCumulative confirmed amount within tolerance, before expiryno
invoice.late_paidCumulative confirmed amount within tolerance, after expiry but inside graceno
invoice.expiredpending invoice's expires_at elapsed with no payment. Note: seen invoices never receive invoice.expired; if you got invoice.payment_seen, wait for the next event.no
invoice.underpaidCumulative confirmed amount below amount_sats − tolerance. Fires on every short payment (top-ups can produce multiple).yes
invoice.overpaidCumulative confirmed amount exceeds amount_sats + toleranceno
invoice.payment_revertedA reorg orphaned the block containing the payment. Reverse fulfillment if you already shipped. Rare.very rare
invoice.requires_reviewRouting produced "no-match" or cross-check disagreedrare
invoice.cancelledVendor or admin cancelledno
invoice.grace_endingOpt-in: fires once near the end of the late-payment grace window (endpoint must enable graceEndingEnabled)no
invoice.reopenedInvoice reopened after a prior terminal-ish state (lifecycle edge case)rare

Always deduplicate by event_id, never by invoice.id + event_type. Top-ups produce repeated invoice.underpaid events, and dispatcher retries reuse the same event_id.