SatLane
Documentation

Event types

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 lands within tolerance, before expiryno
invoice.late_paidCumulative confirmed amount lands 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 is below amount_sats − tolerance. Fires on every short payment, so a top-up flow can produce two of these followed by invoice.paid.yes — see top-up
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

Always deduplicate by event_id, never by invoice.id + event_type. Top-up payments will produce repeated invoice.underpaid events, and retries from our dispatcher produce repeated events with the same event_id (your dedupe target).