Skip to main content
LMN sends webhooks to your registered URL for order changes and observed inventory events. order.detail_updated carries the latest partner-visible order snapshot after material changes, whether initiated by LMN, a partner API call, a background job, or a data repair. Existing lifecycle, invoice, Eagle Eye, and chat events remain separate.

Event families

See event types for payload examples and per-event semantics.
Chat events are opt-in. Unlike Orders and Eagle Eye, chat events are off by default — chat.message.created fires once per visible reply; chat.eagle_eye.match_posted fires once per Eagle Eye digest posted into a dealer’s room. Contact LMN to enable either for your integration; delivery otherwise uses the same webhook URL and secret you already have registered.

Order firing rules

Status transitions use the existing status-event rules below and do not also queue order.detail_updated for that order. Invoice issue/reissue uses order.invoice_issued only. Other invoice changes use order.invoice_updated. Other material order detail edits, including partner-driven changes, queue order.detail_updated. Automatic draft creation during a status transition is covered by its status event. Creating an order alone does not notify that new order; existing orders whose bid context changes can be notified. No-op and timestamp-only writes are silent. Offline orders remain silent. The detail event uses the existing delivery worker, so it is asynchronous and may combine rapid updates. A related invoice change can update data.order.invoice without changing data.order.updated_at; use the event’s occurred_at as its notification timestamp. * cancellation_reason is one of auction_rescheduled_too_soon, auction_cancelled (pre-acquiring), seller_withdrew (pre-acquiring). ** Inspection is optional — placed → acquiring directly (row 4) remains valid for orders that skip inspection. secondary_inspection_in_progress and secondary_inspection_ready are LMN-owned statuses; partners cannot set them directly via the status-push endpoint. *** At secondary_inspection_ready, the outcome can be either driver: LMN/admin decides (rows 6, 8) or the partner decides via POST /v1/orders/{id}/confirm or DELETE /v1/orders/{id} (rows 7, 9). Both drivers fire order.status_changed (amended 2026-07-06 — previously the partner-driven rows fired nothing; the partner’s event pipe now carries every outcome of the decision point), in addition to the synchronous API response. Whichever happens first wins; a losing concurrent request gets 409. † No status change — informational signal only.

Eagle Eye firing rule

eagle_eye.match fires per saved watch when LMN observes at least one change worth notifying: Muted watches still collect matches but suppress webhook delivery. Paused watches do not collect new matches until resumed.

Invoice firing rule

order.invoice_issued fires when LMN ops issue an order’s invoice and again on every re-issue (same number, version + 1, data.previous_version set). It does not fire when the draft is created, when the invoice is marked paid, or when it is voided — those changes instead emit order.invoice_updated with the current Order.invoice; the Invoices routes remain available. Always on for any integration with a registered webhook URL; there is no opt-in. The event is written in the same transaction as the invoice version, so an issued version without its event cannot exist; delivery then follows the normal retry policy. See order.invoice_issued for the payload.

Delivery model — fire-and-forget

On state transition, LMN enqueues the event and returns the API/admin response immediately. A background worker picks up pending events on the cron cadence, typically within the next minute. The write path never blocks on webhook delivery. If your endpoint is slow or down, the order transition still completes immediately. Delivery is retried per the retry policy.

Pilot mode — webhooks optional

For pilot integrations, you may skip registering a webhook URL and rely on polling API reads instead. LMN still records events server-side for every qualifying transition; if no URL is registered, delivery is a no-op (recorded as delivery_skipped in the event log). Post-pilot (production volume), webhooks become required — LMN cannot support polling at scale.

Self-service event history

LMN exposes the event log for recovery and audit: Each entry includes delivery status, attempts, response code, and the payload LMN sent. Useful for “did I miss a webhook?” debugging without contacting LMN support.
The two endpoints report delivery_status in different vocabularies. This is long-standing behavior, not a bug, but it will break a shared parser:The watch endpoint collapses the internal states: delivering folds into pending, and both delivery_failed and delivery_skipped fold into failed.The consequence worth knowing: on a watch event, failed does not tell you whether your endpoint rejected the delivery or whether no URL was registered at the time — two situations with opposite remedies. Only the order endpoint distinguishes them. If you need that distinction for a watch event, check whether a webhook URL is registered for that environment before assuming your receiver is at fault.
The partner console shows the same log per order, and adds two self-service actions: View payload (inspect the exact JSON, read-only) and Replay (re-send a past event to your endpoint). See Replaying a webhook — note that a replay reuses the original event_id, which matters if your handler deduplicates.