Skip to main content

Cashout

Cashout pays fiat directly to a recipient's bank account, debiting your crypto fund. You name the recipient yourself, in the order itself.

  1. Quote it — review-cashout.
  2. Create it — create-cashout.
  3. Track it — orders/details, plus a webhook.

The user must be KYC-verified first. See KYC. Cashout and scan-to-pay share the same order lookup, the same order object, and the same webhook.

Quote a cashout​

POST /api/v2/orders/review-cashout

Signed string

partnerCode|userEmail|fiatCurrency|fiatAmount|cryptoCurrency|<secretKey>

Request — every field is required.

FieldTypeNotes
partnerCodestring
userEmailstringThe end user.
fiatCurrencystringVND, PHP, IDR…
fiatAmountnumberWhat the recipient receives. No decimals for VND and IDR, up to two for PHP; see Amount precision.
cryptoCurrencystringThe crypto to debit — USDT.
signaturestring

Response data

FieldTypeNotes
fiatAmountnumberEchoed from your request.
currencystringThe crypto code.
pricenumber
tokenAmountnumberThe crypto that will be debited.
totalPaymentnumber
processingFee, systemFeenumber
signaturestringOver fiatAmount|currency|price|tokenAmount|totalPayment|secretKey.

The live minimum and maximum reach you through errors 24 and 25, whose messages carry the current limit.

Errors — 46 SERVICE_NOT_AVAILABLE, 24 / 25 (below min / above max), 16 AMOUNT_OUT_OF_RANGE (below the payment provider's own floor, 10,000 VND for Vietnam), 7 PARTNER_INSUFFICIENT_BALANCE, 9 SERVICE_UNDER_MAINTENANCE, plus the KYC codes (34, 59, 60, 61, 62, 64) and the shared ones.

Create a cashout​

POST /api/v2/orders/create-cashout

Signed string

partnerCode|externalOrderId|userEmail|cryptoCurrency|fiatCurrency|fiatAmount|<secretKey>

Cashout has its own string, with different fields and a different order from scan-to-pay's. It signs cryptoCurrency and fiatCurrency, while the recipient's bank details travel in extendInfo, outside the signature.

If fiatCurrency or fiatAmount is omitted, its segment becomes the literal text undefined, and the order fails with 46. Include both fields in every request.

Request

FieldTypeRequiredNotes
partnerCodestringYes
externalOrderIdstringYesYour unique id, and the idempotency key.
userEmailstringYesMust be KYC-verified.
cryptoCurrencystringYesThe crypto to debit — USDT.
fiatCurrencystringYesOmitting it is not rejected as a missing field, and no default is applied. See above.
fiatAmountnumberYesSame.
extendInfoobjectYesThe recipient.
webhookSecretKeystringNoWithout it the order settles silently, read through orders/details.
signaturestringYes

extendInfo — the recipient​

FieldTypeRequiredNotes
recipientNamestringYes
recipientNumberstringYesThe bank account number.
recipientBankCodestringYesFrom the bank list.
transferContentstringNoThe transfer remark. Unaccented letters only, where the provider checks it.
recipientTypestringNoWhen sent, it must be a recognised value; an unrecognised one returns 5.
JSON
{
"partnerCode": "ACME",
"externalOrderId": "acme-co-1042",
"userEmail": "[email protected]",
"cryptoCurrency": "USDT",
"fiatCurrency": "VND",
"fiatAmount": 5000000,
"webhookSecretKey": "81663eae...",
"extendInfo": {
"recipientName": "NGUYEN VAN A",
"recipientNumber": "0123456789",
"recipientBankCode": "VCB",
"transferContent": "ALIX CASHOUT 1042"
},
"signature": "I7XDfTngWIraq...=="
}

Response data — the order object, with type: "CASHOUT".

For a cashout, tokenTransfer.address, tokenTransfer.network and bankTransfer.qrUrl are null; the payout goes straight to the recipient's bank account.

Errors — everything review-cashout can return, plus:

11 DUPLICATE_TRANSACTION_IDexternalOrderId is already used.
13 WEBHOOK_SECRET_NOT_FOUNDwebhookSecretKey matches no registered endpoint. Checked before anything else, so the order is not created.
18 INVALID_BANK_ACCOUNTextendInfo is missing, or the account could not be verified.
56 BANK_NOT_SUPPORTEDrecipientBankCode is not in the provider's list.
17 INVALID_TRANSFER_CONTENTtransferContent has accents or special characters.
27 USER_EMAIL_INVALIDuserEmail is malformed.
5 INVALID_REQUEST_DATArecipientType is not a recognised value.
12 TRANSACTION_CREATE_FAILEDThe payout failed after the order was created. You are already refunded, and data holds the order.