Skip to main content
Disclaimer: This article contains AI translations and should only be used as reference. Contact Cobo’s support team through [email protected] if you have any questions.
This document describes all Webhook events and status transition processes involved in receiving payments (Pay-in), refunds, and payouts/transfers.

Webhook Events

ScenarioEvent NameTrigger ConditionEvent Content
Order Modepayment.order.status.updatedTriggered when a payment order status changes. Key nodes include:
- Pending: Triggered only when an order is successfully created via a payment link.
- Completed: Full payment received within the order validity period.
- Expired: No completed deposit transactions within the validity period, or the order was canceled.
- Underpaid: Completed deposit transactions exist, but the total amount received is less than the expected amount.
This payload includes:
- order_id (required): The order ID.
- merchant_id (optional): The merchant ID.
- merchant_order_code (optional): A unique reference code assigned by the merchant.
- psp_order_code (required): A unique reference code assigned by the developer to identify this order.
- pricing_currency (optional): The pricing currency of the order.
- pricing_amount (optional): The base amount of the order, excluding the developer fee.
- fee_amount (required): The developer fee for the order.
- payable_currency (optional): The ID of the cryptocurrency used for payment.
- chain_id (required): The ID of the blockchain network.
- payable_amount (required): The cryptocurrency amount to be paid for this order.
- exchange_rate (required): The exchange rate between payable_currency and pricing_currency.
- amount_tolerance (optional): The allowed amount deviation.
- receive_address (required): The recipient wallet address for the payment transaction.
- status (required): The current order status. One of: Pending, Processing, Completed, Expired, Underpaid.
- received_token_amount (required): The total cryptocurrency amount received for this order.
- expired_at (optional): The expiration time, in Unix timestamp (seconds).
- created_timestamp (optional): The creation time, in Unix timestamp (seconds).
- updated_timestamp (optional): The last update time, in Unix timestamp (seconds).
- transactions (optional): An array of payment transactions associated with this order.

For full details, see Get pay-in order information.
Order Modepayment.transaction.lateA deposit transaction that passed compliance scanning is received after the payment order has reached a final state (Underpaid, Expired, or Completed).This payload includes all fields from the Transaction payload fields section, plus the following Payment-specific fields:
- acquiring_type (required): The collection type. Value: Order (Order Mode only).
- order_id (optional): The pay-in order ID.
- psp_order_code (optional): A unique reference code assigned by the developer to identify this order.
Top-up Modepayment.transaction.createdA new deposit transaction is detected on a deposit address.This payload includes all fields from the Transaction payload fields section, plus the following Payment-specific fields:
- acquiring_type (required): The collection type. Value: TopUp (Top-up Mode only).
- payer_id (optional): A unique identifier assigned by Cobo to track and identify individual payers.
- custom_payer_id (optional): A unique identifier assigned by the developer to track and identify individual payers.
Top-up Modepayment.address.updatedTriggered when the payer’s top-up address is replaced.This payload includes:
- custom_payer_id: Payer identifier in your system.
- payer_id: Payer identifier assigned by Cobo.
- chain: The chain of the address.
- previous_address: Address before replacement.
- updated_address: Address after replacement.
Order Modepayment.transaction.completedFor every transaction received within the order’s validity period, once the funds pass compliance screening, they are credited and recorded in the Actual Receipt amount.This payload includes all fields from the Transaction payload fields section, plus the following Payment-specific fields:
- acquiring_type (required): The collection type. Value: Order.
- order_id (optional): The pay-in order ID.
- psp_order_code (optional): A unique reference code assigned by the developer to identify this order.
Top-up Modepayment.transaction.completedOnce a collection transaction passes compliance screening, the funds are credited and recorded in the Actual Receipt amount.This payload includes all fields from the Transaction payload fields section, plus the following Payment-specific fields:
- acquiring_type (required): The collection type. Value: TopUp.
- payer_id (optional): A unique identifier assigned by Cobo to track and identify individual payers.
- custom_payer_id (optional): A unique identifier assigned by the developer to track and identify individual payers.
Unexpected Depositpayment.transaction.external.createdAn unexpected deposit transaction is detected (e.g., transactions not within current orders/deposit plans, or deposits in unsupported tokens).This payload includes all fields from the Transaction payload fields section.
Unexpected Depositpayment.transaction.external.completedThe unexpected deposit transaction passed compliance scanning and has been successfully credited to the developer balance.This payload includes all fields from the Transaction payload fields section.
Pay-in Checkpayment.transaction.failedThe collection transaction failed the compliance screening.This payload includes all fields from the Transaction payload fields section, plus the following Payment-specific fields:
- acquiring_type (required): The collection type. Order for Order Mode, TopUp for Top-up Mode.
- order_id (optional): The pay-in order ID.
- psp_order_code (optional): A unique reference code assigned by the developer to identify this order.
- payer_id (optional): A unique identifier assigned by Cobo to track and identify individual payers.
- custom_payer_id (optional): A unique identifier assigned by the developer to track and identify individual payers.

Transaction payload fields

The following table lists the base fields included in all payment.transaction.* event payloads. Not all fields may be populated in every scenario.
FieldTypeRequiredDescription
transaction_idstring (UUID)YesThe transaction ID.
cobo_idstringNoThe Cobo ID used to track a transaction.
request_idstringNoThe request ID used to track the transaction request.
wallet_idstringYesFor deposit transactions, the wallet ID of the destination. For other types, the wallet ID of the source.
typestringNoThe transaction type.
statusstringYesThe transaction status.
sub_statusstringNoThe transaction sub-status.
failed_reasonstringNoThe reason why the transaction failed (applicable to approval and signature failures only).
chain_idstringNoThe chain ID.
token_idstringNoThe token ID.
asset_idstringNoThe asset ID (Exchange Wallets only).
transaction_hashstringNoThe transaction hash.
sourceobjectYesThe transaction source.
destinationobjectYesThe transaction destination.
resultobjectNoThe transaction result.
feeobjectNoThe transaction fee.
initiatorstringNoThe transaction initiator.
initiator_typestringYesThe initiator type.
confirmed_numintegerNoThe number of confirmations received.
confirming_thresholdintegerNoThe minimum number of confirmations required.
block_infoobjectNoThe block information.
raw_tx_infoobjectNoThe raw transaction information.
replacementobjectNoReplacement transaction information.
categoryarrayNoCustom transaction categories.
descriptionstringNoThe transaction description.
is_loopbooleanNoWhether the transaction was executed as a Cobo Loop transfer.
cobo_categoryarrayNoTransaction categories defined by Cobo.
extraarrayNoStructured, business-specific extra information for the transaction.
fueling_infoobjectNoFueling information.
created_timestampinteger (int64)YesThe creation time, in Unix timestamp format (milliseconds).
updated_timestampinteger (int64)YesThe last update time, in Unix timestamp format (milliseconds).
Each transaction event also includes Payment-specific fields listed in the Event Content column of the table above.
ScenarioEvent NameTrigger ConditionEvent Content
Refundpayment.refund.status.updatedTriggered when a refund order status changes. Key nodes include:
- Pending: Triggered only when a refund order is successfully created via a refund link.
- Completed: All refund transactions are completed.
- PartiallyCompleted: Some refund transactions completed, while others failed.
- Failed: All refund transactions failed.
This payload includes:
- refund_id (required): The refund order ID.
- request_id (optional): The request ID you provided when creating the refund.
- order_id (optional): The ID of the pay-in order corresponding to this refund.
- merchant_id (optional): The merchant ID.
- token_id (required): The ID of the cryptocurrency used for the refund.
- chain_id (required): The ID of the blockchain network.
- amount (required): The cryptocurrency amount to be returned for this refund.
- to_address (required): The recipient wallet address.
- status (required): The current refund status. One of: AddressPending, AddressSubmitted, Pending, Processing, Completed, PartiallyCompleted, Failed, PendingConfirmation.
- refund_type (optional): The source of funds. One of: Merchant, Psp.
- created_timestamp (required): The creation time, in Unix timestamp (seconds).
- updated_timestamp (required): The last update time, in Unix timestamp (seconds).
- initiator (optional): The initiator of the refund request.
- transactions (optional): An array of payment transactions associated with this refund.
- charge_merchant_fee (optional): Whether to charge the developer fee to the merchant.
- merchant_fee_amount (optional): The developer fee amount to charge the merchant.
- merchant_fee_token_id (optional): The ID of the cryptocurrency used for the developer fee.
- commission_fee (optional): Commission fee details.

For full details, see Get refund order information.
Single-Destination Payout/Transferpayment.payout.status.updatedTriggered when a payout/transfer request status changes:
- Completed: All payouts/transfers completed.
- PartiallyCompleted: Some completed, some failed.
- Failed: All failed.
This payload includes:
- payout_id (required): The payout ID.
- request_id (required): The request ID you provided when creating the payout.
- payout_channel (required): The payout channel. One of: Crypto, OffRamp.
- source_account (optional): The source account from which the payout is made.
- payout_items (optional): An array of payout items.
- recipient_info (optional): The recipient information.
- initiator (optional): The initiator of the payout request.
- actual_payout_amount (optional): The actual amount delivered to the recipient.
- commission_fees (optional): An array of commission fees for this payout.
- remark (optional): A note or comment about the payout.
- status (required): The current payout status. One of: Pending, Preparing, Transferring, Completed, PartiallyCompleted, Failed, RejectedByBank.
- created_timestamp (required): The creation time, in Unix timestamp (seconds).
- updated_timestamp (required): The last update time, in Unix timestamp (seconds).
- transactions (optional): An array of payment transactions associated with this payout.

For full details, see Get payout information.
Bulk Send (Crypto)payment.bulk_send.status.updatedTriggered when a bulk send request status changes:
- Completed: All sends completed.
- PartiallyCompleted: Some completed, some failed.
- Failed: All failed.
This payload includes:
- bulk_send_id (required): The bulk send ID.
- request_id (optional): The request ID you provided when creating the bulk send.
- source_account (required): The source account from which the bulk send is made.
- description (optional): The description for the entire bulk send batch.
- execution_mode (required): The execution mode.
- status (required): The current bulk send status.
- created_timestamp (required): The creation time, in Unix timestamp (seconds).
- updated_timestamp (required): The last update time, in Unix timestamp (seconds).

For full details, see Get bulk send information.

Webhook event examples

The following examples are illustrative and constructed from the field definitions in the Payment spec. Optional fields may be absent in actual webhook deliveries.

payment.order.status.updated

{
  "event_id": "8f2e919a-6a7b-4a9b-8c1a-4c0b3f5b8b1f",
  "url": "https://example.com/webhook",
  "created_timestamp": 1701396866000,
  "type": "payment.order.status.updated",
  "data": {
    "data_type": "PaymentOrder",
    "order_id": "O20250304-M1001-1001",
    "merchant_id": "1001",
    "psp_order_code": "P20240201001",
    "pricing_currency": "USD",
    "pricing_amount": "100.00",
    "fee_amount": "2.00",
    "payable_currency": "ETH_USDT",
    "chain_id": "ETH",
    "payable_amount": "103.03",
    "exchange_rate": "0.99",
    "receive_address": "0x1234567890abcdef1234567890abcdef12345678",
    "status": "Completed",
    "received_token_amount": "103.0305",
    "created_timestamp": 1744689600,
    "updated_timestamp": 1744689600
  },
  "status": "Success"
}

payment.transaction.created

{
  "event_id": "8f2e919a-6a7b-4a9b-8c1a-4c0b3f5b8b2f",
  "url": "https://example.com/webhook",
  "created_timestamp": 1701396866000,
  "type": "payment.transaction.created",
  "data": {
    "data_type": "PaymentTransaction",
    "transaction_id": "aff0e1cb-15b2-4e1f-9b9d-a9133715986f",
    "wallet_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "status": "Submitted",
    "chain_id": "ETH",
    "token_id": "ETH_USDT",
    "transaction_hash": "239861be9a4afe080c359b7fe4a1d035945ec46256b1a0f44d1267c71de8ec28",
    "source": { "source_type": "DepositFromAddress" },
    "destination": { "destination_type": "DepositToAddress" },
    "initiator_type": "API",
    "created_timestamp": 1701396866000,
    "updated_timestamp": 1701396866000,
    "acquiring_type": "TopUp",
    "payer_id": "P20250619T0310056d7aa",
    "custom_payer_id": "user_abc_10001"
  },
  "status": "Success"
}

payment.payout.status.updated

{
  "event_id": "8f2e919a-6a7b-4a9b-8c1a-4c0b3f5b8b3f",
  "url": "https://example.com/webhook",
  "created_timestamp": 1701396866000,
  "type": "payment.payout.status.updated",
  "data": {
    "data_type": "PaymentPayout",
    "payout_id": "123e457-e89b-12d3-a456-426614174004",
    "request_id": "123e457-e89b-12d3-a456-426614174004",
    "payout_channel": "Crypto",
    "source_account": "M1001",
    "status": "Completed",
    "created_timestamp": 1744689600,
    "updated_timestamp": 1744689600
  },
  "status": "Success"
}

Tips

To ensure absolute data accuracy and avoid concurrency conflicts, the Webhook payload does not include real-time balance changes or detailed fee deductions. If your use case requires this information, please refer to the following:
  • To update balances promptly based on Webhook notifications: Upon receiving a Webhook, immediately call the List merchant balances or Get developer balances endpoint to obtain the accurate balance for internal accounting.
  • To obtain fee details associated with a transaction for reconciliation: Use the corresponding transaction query endpoints or Generate reports to retrieve fee reports for data verification.
  • To monitor Fee Station balance changes and prevent business disruption: Periodically call List Fee Station token balance and set up internal alerting based on your consumption rate to avoid service interruptions due to insufficient fees.