> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xendit.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Cross-Border Payout Webhook

> Xendit notifies your system change of status of your payout link via webhook. You need to provide an URL to receive webhook. 
Please specify your URL in Webhook Settings in Xendit Dashboard.

The Cross-Border Payout 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.


## OpenAPI

````json POST /cross_border_payout_webhook_url
{
  "openapi": "3.0.3",
  "info": {
    "title": "Payouts",
    "version": "1.0",
    "description": "This Payouts API can be used to send money at scale to all bank accounts & E-Wallets in Indonesia, Philippines, Thailand, Malaysia and Vietnam by using just a single endpoint."
  },
  "servers": [
    {
      "url": "https://api.xendit.co",
      "description": "Xendit API"
    }
  ],
  "paths": {
    "/cross_border_payout_webhook_url": {
      "post": {
        "security": [
          {
            "Payouts_BasicAuth": []
          }
        ],
        "operationId": "crossBorderPayoutWebhook",
        "summary": "Cross-Border Payout Webhook",
        "description": "Xendit notifies your system change of status of your payout link via webhook. You need to provide an URL to receive webhook. \nPlease specify your URL in Webhook Settings in Xendit Dashboard.\n\nThe Cross-Border Payout 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.\n\nPlease 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.\n",
        "tags": [
          "Cross-Border Payout"
        ],
        "responses": {
          "200": {
            "description": "Cross-Border Payout Webhook",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Payouts_StandardCrossBorderPayoutWebhookSchema"
                },
                "examples": {
                  "crossBorderPayoutWebhookExample": {
                    "value": {
                      "event": "remittance_payout.pending_compliance_assessment",
                      "id": "rpo_288250b4-124b-4be5-93a1-1cd50dd4ad02",
                      "created": "2024-12-13T07:51:10.832Z",
                      "updated": "2024-12-13T07:51:10.832Z",
                      "business_id": "665990ef233a8b8054549367",
                      "description": "This is a sample Cross-border Payout transaction",
                      "destination_amount": "1000000",
                      "destination_currency": "IDR",
                      "origin_amount": "60",
                      "origin_currency": "EUR",
                      "purpose_code": "OTHER",
                      "recipient_customer_id": "cust-b8476133-ec15-4f06-9dfb-562d8dca3f43",
                      "reference_id": "myref-1482928194",
                      "relationship": "CUSTOMER",
                      "sender_customer_id": "cust-1752fefb-358c-4043-a690-58036157d851",
                      "source_of_fund": "OTHER",
                      "status": "PENDING_COMPLIANCE_ASSESSMENT",
                      "metadata": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Payouts_StandardCrossBorderPayoutWebhookSchema": {
        "type": "object",
        "properties": {
          "event": {
            "type": "string",
            "enum": [
              "remittance_payout.pending_compliance_assessment",
              "remittance_payout.compliance_rejected",
              "remittance_payout.failed",
              "remittance_payout.succeeded",
              "remittance_payout.ready",
              "remittance_payout.locked",
              "remittance_payout.expired"
            ],
            "description": "Type of the event:\n  * `remittance_payout.pending_compliance_assessment` - Request is considered medium or high risk, and is being reviewed by our compliance team. Our team will contact you via email for extra information for enhanced due diligence.\n  * `remittance_payout.compliance_rejected` - Request is rejected for compliance reasons.\n  * `remittance_payout.failed` - Payout failed. See possible reasons in Failed Reasons section.\n  * `remittance_payout.succeeded` - Sender bank/channel has sent out the payout\n  * `remittance_payout.ready` - For cash payout only. Cash is ready for pick-up.\n  * `remittance_payout.locked` - For cash payout only. Cash pick-up in progress.\n  * `remittance_payout.expired` - For cash payout only. Cash payout has expired.\n"
          },
          "disbursement_code": {
            "type": "string",
            "description": "Only for event `remittance_payout.ready`\nCode to be presented by the beneficiary for cash pick-up. Please share this with the beneficiary.\n",
            "example": "XENDIT-12341",
            "minLength": "1",
            "maxLength": "100"
          },
          "id": {
            "$ref": "#/components/schemas/Payouts_CrossBorderPayoutId"
          },
          "created": {
            "$ref": "#/components/schemas/Payouts_CreatedTimestamp"
          },
          "updated": {
            "$ref": "#/components/schemas/Payouts_UpdatedTimestamp"
          },
          "business_id": {
            "$ref": "#/components/schemas/Payouts_XenditBusinessId"
          },
          "reference_id": {
            "$ref": "#/components/schemas/Payouts_ReferenceId"
          },
          "destination_currency": {
            "$ref": "#/components/schemas/Payouts_Currency"
          },
          "destination_amount": {
            "$ref": "#/components/schemas/Payouts_Amount"
          },
          "sender_customer_id": {
            "$ref": "#/components/schemas/Payouts_SenderCustomerId"
          },
          "recipient_customer_id": {
            "$ref": "#/components/schemas/Payouts_RecipientCustomerId"
          },
          "status": {
            "$ref": "#/components/schemas/Payouts_CrossBorderPayoutStatus"
          },
          "description": {
            "$ref": "#/components/schemas/Payouts_Description"
          },
          "source_of_fund": {
            "$ref": "#/components/schemas/Payouts_SourceOfFund"
          },
          "origin_currency": {
            "$ref": "#/components/schemas/Payouts_Currency"
          },
          "origin_amount": {
            "$ref": "#/components/schemas/Payouts_OriginAmount"
          },
          "purpose_code": {
            "$ref": "#/components/schemas/Payouts_PurposeCode"
          },
          "relationship": {
            "$ref": "#/components/schemas/Payouts_RelationShip"
          },
          "failure_code": {
            "$ref": "#/components/schemas/Payouts_FailureCode"
          },
          "metadata": {
            "$ref": "#/components/schemas/Payouts_Metadata"
          }
        }
      },
      "Payouts_CrossBorderPayoutId": {
        "type": "string",
        "description": "Xendit-generated unique payout link id in UUID format\n\nPrefix: rpo_\n",
        "minLength": "40",
        "maxLength": "40",
        "example": "rpo_cde3dcb8-37d7-4ea1-a275-8f54af81feb0"
      },
      "Payouts_CreatedTimestamp": {
        "type": "string",
        "description": "Timestamp when the payout request was made (in ISO 8601 format)\n\nTimezone UTC+0\n"
      },
      "Payouts_UpdatedTimestamp": {
        "type": "string",
        "description": "Timestamp when the payout request was updated (in ISO 8601 format)\n\nTimezone UTC+0\n"
      },
      "Payouts_XenditBusinessId": {
        "type": "string",
        "description": "Your Xendit Business ID",
        "example": "5785e6334d7b410667d355c4"
      },
      "Payouts_ReferenceId": {
        "type": "string",
        "minLength": "1",
        "maxLength": "255",
        "description": "A reference to uniquely identify the Payout.",
        "example": "myref-1482928194"
      },
      "Payouts_Currency": {
        "type": "string",
        "description": "ISO 4217 Currency Code."
      },
      "Payouts_Amount": {
        "type": "number",
        "minimum": "0",
        "description": "Amount to be sent to the destination account. \n\n* For `IDR` currency, number should be integer\n* For `PHP` currency, number can be up to 2 decimal places\n* For `VND` currency, number should be integer\n* For `MYR` currency, number can be up to 2 decimal places\n* For `THB` currency, number can be up to 2 decimal places\n",
        "example": "10000"
      },
      "Payouts_SenderCustomerId": {
        "type": "string",
        "description": "The Id of the sender customer (as returned by the Create Customer endpoint)\n\nThe following fields are required in the sender customer object: `customer_type` and `addresses`\n- For INDIVIDUAL `customer_type`, the following parameters are also required: `given_names`, `nationality`, and `date_of_birth` in `customer_type`.`individual_detail` object\n- For BUSINESS `customer_type`, then the following parameters are also required: `business_name` in `customer_type`.`business_detail` object.\n- For `addresses` object, the following fields are also required: `addresses`.`country`, `addresses`.`city`, `addresses`.`street_line1`\n\nReference: [Customer Object](https://developers.xendit.co/api-reference/#create-customer)\n"
      },
      "Payouts_RecipientCustomerId": {
        "type": "string",
        "description": "The Id of the recipient customer (as returned by the Create Customer endpoint)\n\nThe following fields are required in the sender customer object: `customer_type`, `addresses`, `identity_accounts`, and one of `phone_number` or `mobile_number`\n- For INDIVIDUAL `customer_type`, the following parameters are also required: `given_names`, `nationality`, and `date_of_birth` in `customer_type`.`individual_detail` object\n- For BUSINESS `customer_type`, then the following parameters are also required: `business_name` in `customer_type`.`business_detail` object.\n- For `addresses` object, the following fields are also required: `addresses`.`country`, `addresses`.`city`, `addresses`.`street_line1`\n- For `identity_accounts` object, the following fields are also required: `type`, `country`, `company` (with the channel code value), and `properties`\n\nReference: [Customer Object](https://developers.xendit.co/api-reference/#create-customer)\n"
      },
      "Payouts_CrossBorderPayoutStatus": {
        "type": "string",
        "enum": [
          "ACCEPTED",
          "PENDING_COMPLIANCE_ASSESSMENT",
          "COMPLIANCE_REJECTED",
          "REQUESTED",
          "READY",
          "LOCKED",
          "EXPIRED",
          "FAILED",
          "SUCCEEDED",
          "CANCELLED",
          "REFUNDED"
        ],
        "description": "Status of the cross-border payout. Default is ACCEPTED.\n\n  * `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 online\n  * `PENDING_COMPLIANCE_ASSESSMENT` - Request is considered medium or high risk, and is being reviewed by our compliance team. Our team will contact you via email for extra information for enhanced due diligence.\n  * `COMPLIANCE_REJECTED` - Request is rejected for compliance reasons.\n  * `REQUESTED` - The payout has been sent to the channel. Funds have been sent to the channel for processing.\n  * `READY` - For cash payout only. Cash is ready for pick-up.\n  * `LOCKED` - For cash payout only. Cash pick-up in progress.\n  * `EXPIRED` - For cash payout only. Cash payout has expired.\n  * `FAILED` - Payout failed. See possible reasons in Failed Reasons section.\n  * `SUCCEEDED` - Sender bank/channel has sent out the payout\n  * `CANCELLED` - Payout has been cancelled per your request\n  * `REFUNDED` - Only valid for SKN/RTGS and cash channel use case.\n"
      },
      "Payouts_Description": {
        "type": "string",
        "description": "Description to send with the payout. \nThe recipient may see this e.g. in their bank statement (if supported) or in email receipts we send on your behalf.\n",
        "minLength": "1",
        "maxLength": "100"
      },
      "Payouts_SourceOfFund": {
        "type": "string",
        "enum": [
          "INVESTMENT",
          "PERSONAL_SAVINGS",
          "BUSINESS_REVENUE",
          "LEGACY",
          "BUSINESS_ARRANGEMENT",
          "LOAN",
          "SALARY",
          "OTHER"
        ],
        "description": "Source of fund\n  * `INVESTMENT` - Bonds, fixed deposits, preference shares, business ownership/equity or property ownership\n  * `PERSONAL_SAVINGS` - Funds kept in an account in a bank or a similar organization\n  * `BUSINESS_REVENUE` - Income from a business or a company\n  * `LEGACY` - Inherited money from a will\n  * `BUSINESS_ARRANGEMENT` - Any understanding, procedure, course of dealing, or arrangement between a creditor and a seller\n  * `LOAN` - A sum of money that is borrowed\n  * `SALARY` - A fixed regular payment made by an employer\n  * `OTHER` - Other\n\nDefault: OTHER\n"
      },
      "Payouts_OriginAmount": {
        "type": "number",
        "description": "The original amount as sent by the sender. \nThis field will not be used for processing the payout, but is required for monitoring purposes. \n\nXendit will deduct your balance and process the payout in the destination amount and currency.\n"
      },
      "Payouts_PurposeCode": {
        "type": "string",
        "enum": [
          "SELF",
          "FAMILY",
          "EDUCATION",
          "MEDICAL",
          "HOTEL",
          "TRAVEL",
          "UTILITIES",
          "LOAN_REPAYMENT",
          "TAX_PAYMENT",
          "RESIDENCE_PURCHASE",
          "RESIDENCE_RENT",
          "INSURANCE",
          "MUTUAL_FUND",
          "SHARES_INVESTMENT",
          "DONATIONS",
          "ADVERTISING",
          "ROYALTY_FEES",
          "BROKER_FEES",
          "ADVISORS",
          "OFFICE",
          "CONSTRUCTION",
          "SHIPMENT",
          "EXPORT",
          "DELIVERY",
          "TRADES",
          "SALARY",
          "REFUND",
          "OTHER"
        ],
        "description": "Purpose of the Cross-border Payout\n  * `SELF` - Transfer to own account\n  * `FAMILY` - Family Maintenance\n  * `EDUCATION` - Education-related student expenses\n  * `MEDICAL` - Medical Treatment\n  * `HOTEL` - Hotel Accomodation\n  * `TRAVEL` - Travel\n  * `UTILITIES` - Utility Bills\n  * `LOAN_REPAYMENT` - Repayment of Loans\n  * `TAX_PAYMENT` - Tax Payment\n  * `RESIDENCE_PURCHASE` - Purchase of Residential Property\n  * `RESIDENCE_RENT` - Payment of Property Rental\n  * `INSURANCE` - Insurance\n  * `MUTUAL_FUND` - Mutual Fund Investment\n  * `SHARES_INVESTMENT` - Investment in Shares\n  * `DONATIONS` - Donations\n  * `ADVERTISING` - Advertising & Public relations-related expenses\n  * `ROYALTY_FEES` - Royalty fees, trademark fees, patent fees, and copyright fees\n  * `BROKER_FEES` - Fees for brokers, front end fee, commitment fee, guarantee fee and custodian fee\n  * `ADVISORS` - Fees for advisors, technical assistance, and academic purpose, including remuneration for specialists\n  * `OFFICE` - Representative office expenses\n  * `CONSTRUCTION` - Construction costs / expenses\n  * `SHIPMENT` - Transportation fees for goods\n  * `EXPORT` - For payment of exported goods\n  * `DELIVERY` - Delivery fees for goods\n  * `TRADES` - General Goods Trades - Offline trade\n  * `SALARY` - Salary\n  * `REFUND` - Refund\n  * `OTHER` - Other\n\nDefault: OTHER\n"
      },
      "Payouts_RelationShip": {
        "type": "string",
        "enum": [
          "BRANCH_REPRESENTATIVE_OFFICE",
          "BUSINESS_PARTNER",
          "CHILDREN",
          "CREDITOR",
          "CUSTOMER",
          "DEBTOR",
          "EMPLOYEE",
          "EX_SPOUSE",
          "FRANCHISEE_FRANCHISOR",
          "GRANDPARENTS",
          "HOLDING_COMPANY",
          "MAID",
          "OWNSELF",
          "PARENTS",
          "RELATIVE",
          "SIBLING",
          "SPOUSE",
          "SUBSIDIARY_COMPANY",
          "SUPPLIER",
          "FRIEND",
          "GOVERNMENT_BODY",
          "EDUCATION_INSTITUTION",
          "NON_GOVERNMENT_BODY",
          "OTHER"
        ],
        "description": "Relationship between sender and recipient\n\nRequired for PH_GCASH\nDefault: OTHER\n"
      },
      "Payouts_FailureCode": {
        "type": "string",
        "enum": [
          "INSUFFICIENT_BALANCE",
          "INVALID_DESTINATION",
          "REJECTED_BY_CHANNEL",
          "TEMPORARY_TRANSFER_ERROR",
          "TRANSFER_ERROR",
          "UNKNOWN_BANK_NETWORK_ERROR",
          "DESTINATION_MAXIMUM_LIMIT"
        ],
        "description": "If the Payout failed, we include a failure code for more details on the failure.\n\n  * `INSUFFICIENT_BALANCE` - Client has insufficient balance for the payout amount\n  * `INVALID_DESTINATION` - The recipient account does not exist/is invalid.\n  * `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.\n  * `TEMPORARY_TRANSFER_ERROR` - The channel networks are experiencing a temporary error.\n  * `TRANSFER_ERROR` - We’ve encountered a fatal error while processing this payout. Normally, this means that certain API fields in your request are invalid.\n  * `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.\n  * `DESTINATION_MAXIMUM_LIMIT` - The recipient is unable to receive the funds due to the payout amount exceeding the recipient’s ability to receive.\n"
      },
      "Payouts_Metadata": {
        "type": "object",
        "nullable": "true",
        "description": "Key-value entries for your custom data.\nYou can specify up to 50 keys, with key names up to 40 characters and values up to 500 characters.\nThis is for your convenience. Xendit will not use this data for any processing.\n",
        "example": {
          "my_custom_id": "merchant-123",
          "my_custom_order_id": "order-123"
        }
      }
    }
  }
}
````

