Skip to main content
These events track a single payout or transfer request, including:
  • Crypto transfers
  • Off-Ramp integration
  • Fiat withdrawals from one of your virtual accounts to a bank account
Read Events overview first for the envelope, deduplication, and the rules that apply to every event.

Events on this page

payment.payout.updated

The main payout event.

Trigger conditions

One event per change of this payout’s status. Payout status flow The diagram shows the main status paths; final statuses are shown in green. Pending and Preparing can also go directly to Failed. Events may arrive out of order; see Event ordering.

Event content

Failure reasons

Use failed_reason.code to decide how to handle the failure.

Sample events

Each sample shows the data object only. The envelope around it is the same for every event — see Event structure.

The payout is accepted

Record it and do not submit the request again. requested_target is your own instruction echoed back — check it against what you sent.

The payout completed

Mark the payout as completed in your system. This means Cobo finished the transfer, not that the recipient’s platform has credited it.

The payout is partially completed

Create a new payout for the amount in failed_amounts. Do not resend the part that succeeded. Here the payout requested two tokens, and one of them failed on its outgoing transaction, so both the object-level reason and the entry-level reason are present.

The payout failed

⚠️ A payout item can also fail before any outgoing transaction exists. Here it failed during fund consolidation, so failed_amounts carries the amount but transactions is empty.

An Off-Ramp payout is rejected by the bank

This is not a final status. The on-chain leg has already completed (the entry in transactions is Completed); it is the receiving bank that returned the fiat credit, so failed_amounts is empty. Contact Cobo to resolve it, and wait for further events on this payout: if a retry succeeds, you receive a second Transferring and then Completed.

payment.bank_withdrawal.status.updated

Fires when a bank withdrawal reaches Completed or Failed; no event is sent for Pending or Processing. A bank withdrawal moves fiat out of one of your virtual accounts into a target bank account, and is created with Create bank withdrawal. Event content: the data object carries data_type PaymentBankWithdrawal, plus:
  • bank_withdrawal_id (required) — The bank withdrawal ID generated by Cobo.
  • request_id (required) — The request ID you provided when creating the bank withdrawal.
  • source_bank_account_id (required) — The ID of the source bank account, which must be a virtual account (tagged VA).
  • target_bank_account_id (required) — The ID of the target bank account that receives the withdrawal.
  • source_bank_account (required) — The full details of the source bank account.
  • target_bank_account (required) — The full details of the target bank account.
  • currency (required) — The fiat currency of the bank withdrawal, for example USD.
  • amount (required) — The bank withdrawal amount, as a decimal string in the currency’s display unit, for example 100.00.
  • bank_tx_fee (optional) — The bank transaction fee charged for the bank withdrawal.
  • status (required) — The current status. One of: Pending, Processing, Completed, Failed.
  • remark (optional) — The remark for the bank withdrawal.
  • failed_reason (optional, string) — Free-text reason the bank withdrawal failed; there is no code. Populated only when status is Failed.
  • timeline (required) — The status timeline of the bank withdrawal. Each item carries a status and the timestamp at which the withdrawal entered it, in Unix timestamp (seconds).
  • created_timestamp (required) — The creation time, in Unix timestamp (seconds).
The bank withdrawal payload does not carry an updated_timestamp. To determine when the withdrawal entered its current status, read the last entry in timeline.
For full details, see Get bank withdrawal information.

Advanced events

For the payout’s on-chain transaction detail, subscribe to the advanced event payment.payout.status.updated. See Advanced events.