Skip to navigation

Execute Payout

View as Markdown

Executes payout with confirmed amount from a pending transaction.

Authentication:

  • REQUIRED: Basic Auth only. Body-based credentials are deprecated and not supported.

Key requirements:

  • customer_id is required and must:

  • be provided in request body,

  • not contain /,

  • exist under your account’s registered_customers, and

  • match the customer_id bound to the transaction.

  • Sender profile for execute is sourced from the registered customer record. You do not need to send sender in executePayout.

Flow:

  1. X-Idempotency-Key header is required (unique per logical payout).

  2. HMAC (when configured): If your account has signing_secret, send HMAC-SHA256 over JSON body (excluding signature) via X-Signature or body signature.

  3. If idempotency key already has a successful stored 202 response, that response is replayed (with ownership/customer validation).

  4. Loads transaction, validates account ownership, customer_id ownership, and PENDING status. An EXPIRED transaction returns 400 QUOTATION_EXPIRED (start again from decodeQr); any other non-PENDING status returns 400 TRANSACTION_NOT_PENDING. These checks run before schema validation and before any balance is locked.

  5. Amount/currency lock: if transaction already has saved amount/currency, amount_confirmed and currency must match exactly.

  6. partner_transaction_id: can be set once if empty; otherwise must be omitted or the same value.

  7. Validates required fields from missing_fields: pass each one in the body (for example recipient_name when recipient.name was listed, and the amount as amount_confirmed). If any listed field is still missing you get 400 MISSING_REQUIRED_FIELDS with the field list, before any balance is locked.

  8. API returns 202 Accepted (with status PROCESSING). Final status is completed by inbound webhook updates.

Request body:

  • Required: tx_id, customer_id, amount_confirmed, currency

  • Optional: partner_transaction_id

  • Optional: recipient_name (only when decodeQr listed recipient.name in missing_fields; also accepted as recipient.name or nested recipient.name)

  • sender is not required for execute (derived from registered customer profile).

Response (202 Accepted):

  • status, tx_id, customer_id, message, exchange_rate, fee, percentage_fee, fixed_fee, amount, amount_usd, currency

  • Optional: recipient, partner_transaction_id, updated_at

Precision:

  • exchange_rate: 10 decimal places

  • USD fields (fee, percentage_fee, fixed_fee, amount_usd): 2 decimal places

Error:

  • Returns 404 if customer_id is not found under your account.

  • Returns 403 when transaction ownership does not match account/customer.

LATAM: Payment lock is refreshed at execute to obtain a fresh payment lock code before settlement.

Authentication

AuthorizationBasic

Basic Auth: base64(client_id:client_secret)

Headers

X-Idempotency-KeystringRequired

Query parameters

dpintegerOptional0-10Defaults to 2

Decimal places for monetary fields in the response (USD amounts, fees, exchange rates). Default 2, which rounds sub-cent fees to 0. Use dp=4 or higher to reconcile against exact deducted totals: at full precision amount_usd + percentage_fee + fixed_fee equals the amount deducted from your balance. Rounding is applied to the response only; all stored values and balance deductions always use full precision.

Request

This endpoint expects an object.
tx_idstringRequired
amount_confirmeddoubleRequired
currencystringRequired
customer_idstringRequired
partner_transaction_idstringOptional
recipient_namestringOptional

Send only when decodeQr listed recipient.name in missing_fields. Also accepted as the dotted key recipient.name or nested recipient: { "name": "..." }. recipient.name_first and recipient.name_last are derived from it and never need to be sent. On Vietnam the account-holder name resolved from the bank at payout replaces the value you send; a supplied name only satisfies the required-field check.

Response

Accepted
statusenumOptional
Allowed values:
tx_idstringOptional
customer_idstringOptional
messagestringOptional
exchange_ratedoubleOptional
feedoubleOptional
percentage_feedoubleOptional
fixed_feedoubleOptional
amountdoubleOptional
amount_usddoubleOptional
currencystringOptional
sendermap from strings to anyOptional
recipientmap from strings to anyOptional
partner_transaction_idstringOptional
updated_atdatetimeOptional

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
404
Not Found Error