Execute Payout
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_idis required and must: -
be provided in request body,
-
not contain
/, -
exist under your account’s
registered_customers, and -
match the
customer_idbound to the transaction. -
Sender profile for execute is sourced from the registered customer record. You do not need to send
senderin executePayout.
Flow:
-
X-Idempotency-Key header is required (unique per logical payout).
-
HMAC (when configured): If your account has
signing_secret, send HMAC-SHA256 over JSON body (excludingsignature) viaX-Signatureor bodysignature. -
If idempotency key already has a successful stored 202 response, that response is replayed (with ownership/customer validation).
-
Loads transaction, validates account ownership,
customer_idownership, and PENDING status. An EXPIRED transaction returns 400QUOTATION_EXPIRED(start again from decodeQr); any other non-PENDING status returns 400TRANSACTION_NOT_PENDING. These checks run before schema validation and before any balance is locked. -
Amount/currency lock: if transaction already has saved amount/currency,
amount_confirmedandcurrencymust match exactly. -
partner_transaction_id: can be set once if empty; otherwise must be omitted or the same value.
-
Validates required fields from
missing_fields: pass each one in the body (for examplerecipient_namewhenrecipient.namewas listed, and the amount asamount_confirmed). If any listed field is still missing you get 400MISSING_REQUIRED_FIELDSwith the field list, before any balance is locked. -
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 listedrecipient.nameinmissing_fields; also accepted asrecipient.nameor nestedrecipient.name) -
senderis 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_idis 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
Basic Auth: base64(client_id:client_secret)
Headers
Query parameters
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
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.
