Payout Callbacks

StraitsX sends a payoutStatusUpdated callback to your registered URL when an outgoing payout status changes (e.g., pendingcompleted or pendingfailed).

This event covers payouts made via:

  • Bank Transfer (SGD) — domestic payouts via FAST network
  • Bank Transfer (USD) — international wire payouts
  • FX Payout — cross-currency payouts (e.g., XUSD → IDR)

When this callback fires

TriggerDescription
Payout initiatedA payout request is submitted and enters pending state
Payout completedFunds have been successfully sent to the recipient
Payout failedThe payout could not be processed (see failure_reason)

Status values

StatusMeaning
pendingPayout is being processed
completedFunds successfully delivered to recipient
failedPayout could not be completed — check failure_reason for details

Payload structure

This event uses two different payload structures depending on the payout type:

Payout typeStructureHow to identify
Bank Transfer (SGD/USD)Flat JSONTop-level type = "Withdrawal on behalf"
FX PayoutJSON:API (nested)data.type = "fxPayout"
📘

Important:

Your callback handler should check the payload structure to determine which type of payout it's processing. FX payouts are wrapped in data.attributes, while bank transfer payouts use flat top-level fields.

Field Reference — Bank Transfer Payouts

{
  "id": "contract_c3d4e5f6-a7b8-9012-cdef-123456789012",
  "type": "Withdrawal on behalf",
  "idempotency_id": "payout-usd-unique-key-789",
  "amount": "10000.0",
  "fees": "0.0",
  "status": "completed",
  "account_no": "068760057173",
  "bank_abbrev": "",
  "failure_reason": "",
  "arrival": "14 May 2026 -  9:11 AM",
  "currency": "usd",
  "payout_invoice_id": "payout-usd-unique-key-789",
  "wallet_name": "Digital Goods",
  "bank_account_holder_name": "Acme Corp Pte. Ltd.",
  "swift_bic": "TSIBTWTP",
  "beneficiary_address": "123 Main Street, Singapore, SG, 018982",
  "routing_code": "",
  "intermediary_swift_bic": "",
  "description": null,
  "external_reference": "payout-ext-ref-789",
  "charge_option": "OUR",
  "created_at": "2026-05-14T01:11:03.800Z",
  "updated_at": "2026-05-14T01:11:27.946Z"
}
{
  "id": "contract_b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "type": "Withdrawal on behalf",
  "idempotency_id": "payout-unique-key-456",
  "amount": "500.0",
  "fees": "0.0",
  "status": "completed",
  "account_no": "1234567890",
  "bank_abbrev": "OCBC",
  "failure_reason": "",
  "arrival": "13 May 2026 - 10:51 PM",
  "currency": "sgd",
  "payout_invoice_id": "payout-unique-key-456",
  "wallet_name": "Digital Goods",
  "external_reference": "payout-unique-key-456",
  "created_at": "2026-05-13T14:51:07.967Z",
  "updated_at": "2026-05-13T14:51:09.814Z",
  "express": "FAST"
}
FieldScopeTypeDescription
idCommon fieldsStringUnique contract ID.
typeCommon fieldsStringAlways Withdrawal on behalf.
idempotency_idCommon fieldsStringYour idempotency key from the payout request.
amountCommon fieldsStringPayout amount.
feesCommon fieldsStringFees charged.
statusCommon fieldsStringPayout status.
account_noCommon fieldsStringRecipient bank account number.
bank_abbrevCommon fieldsStringRecipient bank short code. May be empty for USD/international payouts.
failure_reasonCommon fieldsStringReason for failure. Empty string if not failed.
arrivalCommon fieldsStringHuman-readable arrival time. Populated when completed.
currencyCommon fieldsStringCurrency code (lowercase).
payout_invoice_idCommon fieldsStringYour payout invoice/reference ID.
wallet_nameCommon fieldsStringWallet name associated with the payout.
external_referenceCommon fieldsStringYour external reference.
created_atCommon fieldsStringISO 8601 timestamp when the payout was created.
updated_atCommon fieldsStringISO 8601 timestamp when the status last changed.
expressSGD onlyStringFAST (sent via Singapore's FAST network).
bank_account_holder_nameUSD onlyStringRecipient account holder name.
swift_bicUSD onlyStringRecipient SWIFT/BIC code.
beneficiary_addressUSD onlyStringRecipient address.
routing_codeUSD onlyStringBank routing code (empty string if not applicable).
intermediary_swift_bicUSD onlyStringIntermediary bank SWIFT code (empty string if not applicable).
descriptionUSD onlyStringPayment description/remarks.
charge_optionUSD onlyStringFee charge option: SHA (shared) or OUR (sender pays all fees).
*This affects the net amount received by the beneficiary.

Field Reference — FX Payouts

FX payouts use a different payload structure (JSON:API format). They fire the same payoutStatusUpdated event but are wrapped in a data envelope.

{
  "data": {
    "id": "d4d1da72-111e-4d52-bdbf-2e74a2d803d5",
    "type": "fxPayout",
    "attributes": {
      "status": "completed",
      "quoteId": "fx_quote_c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
      "recipientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "rate": 15832.5,
      "from": {
        "currency": "XUSD",
        "amount": "1000.00"
      },
      "to": {
        "currency": "IDR",
        "amount": "15832500.00"
      },
      "fee": {
        "currency": "XUSD",
        "amount": "1.50"
      },
      "initiator": null,
      "references": {
        "externalReference": null,
        "internalReference": "INV-2026-001"
      },
      "createdAt": "2025-03-25T20:04:05+08:00",
      "updatedAt": "2025-03-25T20:10:00+08:00"
    }
  }
}
{
  "data": {
    "id": "d4d1da72-111e-4d52-bdbf-2e74a2d803d5",
    "type": "fxPayout",
    "attributes": {
      "status": "failed",
      "quoteId": "fx_quote_c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
      "recipientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "rate": 15832.5,
      "from": {
        "currency": "XUSD",
        "amount": "1000.00"
      },
      "to": {
        "currency": "IDR",
        "amount": "15832500.00"
      },
      "fee": {
        "currency": "XUSD",
        "amount": "1.50"
      },
      "initiator": {
        "mode": "onBehalfOf",
        "customerProfileId": "b2c3d4e5-f6a7-8901-bcde-f23456789012"
      },
      "references": {
        "externalReference": null,
        "internalReference": "INV-2026-002"
      },
      "createdAt": "2025-03-25T20:04:05+08:00",
      "updatedAt": "2025-03-25T22:15:30+08:00"
    }
  }
}
FieldTypeDescription
data.idStringUnique payout contract ID.
data.typeStringAlways fxPayout.
data.attributes.statusStringFX Payout status.
data.attributes.quoteIdStringThe FX quote ID used for this payout.
data.attributes.recipientIdStringThe payout recipient ID.
data.attributes.rateStringFX rate applied to the conversion.
data.attributes.fromObjectSource currency and amount debited.
data.attributes.from.currencyStringSource currency code (e.g., XUSD).
data.attributes.from.amountStringAmount debited from source.
data.attributes.toObjectTarget currency and amount delivered.
data.attributes.to.currencyStringTarget currency code (e.g., IDR).
data.attributes.to.amountStringAmount delivered to recipient.
data.attributes.feeObjectFee charged for the payout.
data.attributes.fee.currencyStringFee currency.
data.attributes.fee.amountStringFee amount.
data.attributes.initiatorObjectnull for direct payouts. Populated for onBehalfOf payouts.
data.attributes.initiator.modeStringonBehalfOf when initiated for a customer profile.
data.attributes.initiator.customerProfileIdStringThe customer profile ID the payout was made on behalf of.
data.attributes.referencesObjectYour reference IDs.
data.attributes.references.externalReferenceStringYour external reference (if provided in the payout request).
data.attributes.references.internalReferenceStringYour internal reference (if provided in the payout request).
data.attributes.createdAtStringISO 8601 timestamp when the payout was created.
data.attributes.updatedAtStringISO 8601 timestamp when the status last changed.


Did this page help you?