Xendit notifies your system upon failed and successful payouts via webhook. You need to provide an URL to receive webhook. Please specify your URL in Webhook Settings in Xendit Dashboard.
The payment notification will be sent as POST request to the URL you set. Xendit attach x-callback-token header that you can validate against Verification Token in Webhook Settings to verify message authenticity.
Please response back with status 200 immediately. Xendit marks webhook event as failed if there is no response within 30s. When events failed, automatic retry will kick-off for the next 24h. Alternatively, you can resend any event in Webhook tab at anytime. You can also receive notification via email every 6h to check your webhook health.
Payout Webhook
{
"event": "payout.succeeded",
"business_id": "5f27a14a9bf05c73dd040bc8",
"created": "2025-01-01T23:55:59Z",
"data": {
"id": "disb-571f3644d2b4edf0745e9703",
"amount": 10000,
"channel_code": "ID_BCA",
"currency": "IDR",
"status": "SUCCEEDED",
"description": "July payout",
"reference_id": "myref-1482928194",
"created": "2024-12-31T23:53:59Z",
"updated": "2024-12-31T23:53:59Z",
"estimated_arrival_time": "2024-12-31T23:59:59Z",
"business_id": "6018306aa16ad90cb3c43ba7",
"channel_properties": {
"account_number": "000000000099",
"account_holder_name": "Michael Chen"
}
}
}
Type of the event:
payout.succeeded
- A payout's status has already succeeded and partner bank has credited the funds to the beneficiarypayout.failed
- A payout's status has already failed and the partner bank rejected the transaction or there was an issue processing the transactionpayout.reversed
- A payout that was originally in succeeded status received a bounceback or reversal of funds from the partner bank. Funds have been refunded back to the merchant’s available balance.
Your Xendit Business ID
Timestamp when the payout request was made (in ISO 8601 format)
Timezone UTC+0
Xendit-generated unique identifier for each payout
Prefix: disb_
Amount to be sent to the destination account.
- For
IDR
currency, number should be integer - For
PHP
currency, number can be up to 2 decimal places - For
VND
currency, number should be integer - For
MYR
currency, number can be up to 2 decimal places - For
THB
currency, number can be up to 2 decimal places
Channel code of destination bank, E-Wallet or OTC channel. List of supported channels can be found here
ISO 4217 Currency Code.
A reference to uniquely identify the Payout.
Status of the payout.
The status in the response will always be ACCEPTED; meaning transfer is initiated but not yet completed by bank or E-Wallet. The final status will be given in a callback.
ACCEPTED
- The payout request has been accepted and has not yet been sent on to a channel. A payout may remain in this status if the chosen channel is currently offline. Xendit will process this automatically when the channel comes back onlineREQUESTED
- The payout has been sent to the channel. Funds have been sent to the channel for processing.FAILED
- Payout failed. See possible reasons in Failed Reasons section.SUCCEEDED
- Sender bank/channel has sent out the payoutCANCELLED
- Payout has been cancelled per your requestREVERSED
- Payout was rejected by the channel after the payout succeeded. Commonly due to invalid or dormant account.
Timestamp when the payout request was made (in ISO 8601 format)
Timezone UTC+0
Timestamp when the payout request was updated (in ISO 8601 format)
Timezone UTC+0
Estimated time of arrival of funds in destination account (in ISO 8601 format) For OTC payouts: Estimated time that funds will be available for pick-up
Timezone UTC+0
If the Payout failed, we include a failure code for more details on the failure.
INSUFFICIENT_BALANCE
- Client has insufficient balance for the payout amountINVALID_DESTINATION
- The recipient account does not exist/is invalid.REJECTED_BY_CHANNEL
- Payout failed due to an error from the destination channel. This is usually because of network issues associated with the destination bank or issues crediting funds into the destination bank account.TEMPORARY_TRANSFER_ERROR
- The channel networks are experiencing a temporary error.TRANSFER_ERROR
- We’ve encountered a fatal error while processing this payout. Normally, this means that certain API fields in your request are invalid.UNKNOWN_BANK_NETWORK_ERROR
- The bank has delivered an error they have not documented. By definition, this means the bank does not know the issue.DESTINATION_MAXIMUM_LIMIT
- The recipient is unable to receive the funds due to the payout amount exceeding the recipient’s ability to receive.
Your Xendit Business ID
Name of account holder as per the bank or E-Wallet's records. Needs to match the registered account name exactly.
Account number of destination. Mobile numbers for E-Wallet accounts. For E-Wallets, standard format should use prefix 0, e.g. 081234567890
Account type of the destination for currencies and channels that supports proxy transfers (ie: Using mobile number as account number) If you do not specify a value for this field, the default value is BANK_ACCOUNT
Values:
For channel_code == MY_DUITNOW: MOBILE_NO NATIONAL_ID PASSPORT BUSINESS_REGISTRATION BANK_ACCOUNT
For currency == THB: MOBILE_NO NATIONAL_ID BANK_ACCOUNT
Object containing email addresses to receive payout details upon successful Payout. Maximum of three email addresses each.
Direct email recipients
CC-ed email recipients
BCC-ed email recipients
Key-value entries for your custom data. You can specify up to 50 keys, with key names up to 40 characters and values up to 500 characters. This is for your convenience. Xendit will not use this data for any processing.