# Webhooks

Test delivery to your `webhookUrl` and the log of sent webhooks.
Event payloads are listed in the Webhooks section of this reference.

 - [POST /webhooks/test](https://b2b-app.lumowallet.io/apis/webhooks/sendtestwebhook.md): Sends one `webhook.test` event to the current `webhookUrl`, without retries, and returns the outcome. Answers `200` even if your server returned an error — check `ok` and `statusCode`. Without a confi
 - [GET /webhooks/deliveries](https://b2b-app.lumowallet.io/apis/webhooks/listwebhookdeliveries.md): Sent webhooks, newest first. `id` equals the `X-Lumo-Delivery-Id` header of the delivery. Requires `webhook.manage`.
 - [GET /webhooks/deliveries/{id}](https://b2b-app.lumowallet.io/apis/webhooks/getwebhookdelivery.md): One delivery with the sent body. An unknown id answers `400 WEBHOOK_DELIVERY_NOT_FOUND`. Requires `webhook.manage`.
 - [POST order.status_changed](https://b2b-app.lumowallet.io/apis/webhooks/onorderstatuschanged.md): The order became `success`, `failed` or `disputed`. Not sent for `created` / `in_progress`. When you open a dispute yourself, the webhook may or may not arrive — rely on the response.
 - [POST deposit.*](https://b2b-app.lumowallet.io/apis/webhooks/oncompanydeposit.md): A deposit to the company address changed status: `deposit.created` → `deposit.fee_charged` → `deposit.aml_pending` → `deposit.completed`, or `deposit.failed` (including an AML check that still fails a
 - [POST deposit.* (user wallets)](https://b2b-app.lumowallet.io/apis/webhooks/onuserdeposit.md): A deposit to a user wallet was forwarded to `depositForwardAddress` (`deposit.completed`), failed the AML check (`deposit.aml_failed`, the wallet gets blocked) or could not be forwarded (`deposit.fail
 - [POST payout.status_changed](https://b2b-app.lumowallet.io/apis/webhooks/onpayoutstatus.md): `payout.status_changed` — on every payout status change, except a return to `success` after a refund: then `payout.recharged` is sent instead (the payout was debited again); the body is the same.
 - [POST card.assigned](https://b2b-app.lumowallet.io/apis/webhooks/oncardassigned.md): A card was assigned — both for a queued request (`requestId` set; the card closes the company's oldest queued request) and for an immediate assignment (`requestId: null`). Not sent in `cardsTestMode`.
 - [POST card.request_cancelled](https://b2b-app.lumowallet.io/apis/webhooks/oncardrequestcancelled.md): A card request was cancelled on our side; the reserve is returned. Not sent for your own `POST /cards/requests/{id}/cancel`.
 - [POST card.otp_received](https://b2b-app.lumowallet.io/apis/webhooks/oncardotpreceived.md): A 3DS code arrived. `maskedCard` carries the last digits of the card number from the issuer's mail. Not sent for mail that arrived more than 15 minutes late, and the same code for the same card is not
 - [POST card.transaction.created](https://b2b-app.lumowallet.io/apis/webhooks/oncardtransaction.md): `card.transaction.created` — a new operation row from the issuer, including recharge rows (`typeName: Recharge/Collateral`). `card.transaction.settled` — an earlier authorization was settled or cancel
 - [POST card.status_changed](https://b2b-app.lumowallet.io/apis/webhooks/oncardstatuschanged.md): The card state at the issuer changed. The card `status` in this API does not change.
 - [POST card.closed](https://b2b-app.lumowallet.io/apis/webhooks/oncardclosed.md): The card is closed; the remaining balance minus the closure fee is credited to the company.
 - [POST card.recharge.succeeded](https://b2b-app.lumowallet.io/apis/webhooks/oncardrecharge.md): A recharge reached `succeeded`, `in_progress_manual`, `refunded` or `failed`; the event name ends with the status. `in_progress_manual` — the issuer did not carry it out, manual review follows and usu
 - [POST webhook.test](https://b2b-app.lumowallet.io/apis/webhooks/onwebhooktest.md): Sent by `POST /webhooks/test`, once, without retries.
