Idempotency-Key header on writes. All amounts are strings.SUCCESS./v1/wallet/deposit-whitelist/** and walletACTIVE| When to use it | Entry point | |
|---|---|---|
| Path A — register the address up front | You know the payer's source address before they send | POST /v1/wallet/deposit-whitelist/addresses |
| Path B — submit after the deposit lands | You learn the address only from the incoming transaction | POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit |
orderStatus = SUCCESS is not what tells you the money is spendable, and it is not what tells you the| Field | Question it answers |
|---|---|
orderStatus / order status | Has the whole order finished? |
whiteListStatus | Has the Travel Rule review cleared? |
creditStatus | Is the money in the receiving wallet's available balance? |
orderStatus = PROCESSING + whiteListStatus = approved +creditStatus = CREDITED: whitelisting is done and the funds are credited, while the order is still beingGET /v1/wallet/deposit-whitelist/options — fetch the VASP provider list.POST /v1/wallet/deposit-whitelist/addresses — submit the address plus the Travel Rule details.GET /v1/wallet/deposit-whitelist/addresses/{id}, or wait for WALLET_ADDRESS_UPDATED, until theACTIVE. If it comes back FAILED, disable it and register a new one.GET /v1/wallet/deposit-address.ACTIVE, the deposit skips the whitelist flow entirely andNo whitelist gate appears on this path. The order never comes back with whiteListStatusinitorrejected. Do not make booking conditional on a whitelist signal — the order webhook is your only
signal.
PROCESSING and the funds in the unavailable balance.COLLECT_ORDER_UPDATED arrives with orderStatus = PROCESSING and whiteListStatus = init.GET /v1/wallet/deposit-whitelist/options. UseGET /v1/wallet/transaction/list?whiteListStatus=init or GET /v1/wallet/transaction/detail to read thePOST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit with the Travel Rule details only.pending). If it is rejected the next COLLECT_ORDER_UPDATED carrieswhiteListStatus = rejected and you submit again; if it passes, whiteListStatus becomes approved.COLLECT_ORDER_UPDATED at orderStatus = SUCCESS.ACTIVE, so later deposits from it behave like Path A.| Path | What to do |
|---|---|
| A | The address is FAILED. Call POST /v1/wallet/deposit-whitelist/addresses/{id}/disable, then register a new address with corrected details. An address key cannot be edited in place. |
| B | Call POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit again. The on-chain address fields still must not be sent. |
GET /v1/wallet/transaction/list?whiteListStatus=rejected.POST /v1/wallet/add-withdraw-whitelist for this — that is the withdrawal whitelist, aacceptStatus turnsACCEPTING and a COLLECT_ORDER_UPDATED goes out — that is the signal to callPOST /v2/stable/collect/order/accept.| Stage | What you observe | What you do |
|---|---|---|
| Deposit received, compliance running | orderStatus = PROCESSING, acceptStatus = INIT | Nothing |
| Whitelist gate open | whiteListStatus init (first time) or rejected (sent back) | Submit or resubmit the Travel Rule details |
| Under review | whiteListStatus = pending | Wait |
| Cleared and credited | whiteListStatus = approved, creditStatus = CREDITED | Wait for acceptStatus |
| Acceptable | acceptStatus = ACCEPTING | Call accept with the current quote.quoteId — or reject to refund |
| Accepted | acceptStatus = ACCEPTED | Wait |
| Finished | orderStatus = SUCCESS | Settle |
An early accept silently does nothing. If acceptStatusis anything other thanACCEPTING, accept
and reject both return the order unchanged with businessstatus 200— no state moves and no error is
raised. TreatacceptStatus = ACCEPTINGas the precondition and re-read the returned order rather than
assuming the call took effect.
orderStatus stays PROCESSING for the whole stretch from the deposit landing to collection finishing,whiteListStatus and acceptStatus.acceptStatus goesACCEPTING.status / orderStatus| Value | Meaning |
|---|---|
PROCESSING | In flight — awaiting details, under review, or credited but not yet finished |
SUCCESS | The whole order is complete |
FAIL | Failed |
REJECTED | Rejected; a refund state may follow |
REFUNDING | Refund in progress |
REFUNDED | Refunded |
whiteListStatus| Value | Meaning | What you do |
|---|---|---|
init | Travel Rule details not submitted | Path B: call submit. Path A: get the address to ACTIVE |
pending | Submitted, under review | Wait |
approved | Cleared | Wait for the order to reach SUCCESS |
rejected | Rejected | Resubmit — see 3.3 |
null for transactions and orders that are not gated by the whitelist.creditStatus| Value | Meaning |
|---|---|
PENDING | Not yet in the receiving wallet's available balance |
CREDITED | In the receiving wallet. A sweep may still follow |
BLOCKED | Could not be credited — contact support |
status (Path A only)| Value | Meaning |
|---|---|
PROCESSING | Submitted, under review |
ACTIVE | Approved. Later deposits from it skip the whitelist flow |
FAILED | Rejected. Disable it and register again |
GET /v2/stable/collect/order-status and on COLLECT_ORDER_UPDATED.| Field | Type | Meaning |
|---|---|---|
refundBy | string | null | MERCHANT for a refund you triggered with POST /v2/stable/collect/order/reject, BPN for one the platform triggered on its own. null while no refund has been initiated |
refundReason | string | null | The reason. Your refundReason is echoed back verbatim; a platform refund carries the platform's own reason |
refundBy rather than assuming every refund is yours.acceptStatus| Value | Meaning | What you do |
|---|---|---|
INIT | Not acceptable yet — compliance and, where it applies, the whitelist gate are still in front of it | Wait |
ACCEPTING | Acceptable now. The only state in which accept and reject take effect | Call accept, or reject to refund |
ACCEPTED | You accepted; collection follows | Wait for orderStatus = SUCCESS |
REJECTED | You rejected; a refund follows — see 4.5 | Read refundBy / refundReason |
orderStatus is PROCESSING for INIT, ACCEPTING and ACCEPTED alike, so acceptStatus is whatGET /v1/wallet/deposit-whitelist/cases/{transactionId} returns the whitelist gate of one deposit in apayerWhitelist, the payer's Travel Rule| Part of the response | What it gives you |
|---|---|
whiteListStatus, creditStatus, failMessage | The gate itself, and why it was sent back |
fromAddress, network, memo, amount, currency, txHash | The deposit. The first three are frozen and a submission cannot change them |
walletId, walletName, walletType, autoCollection, walletStatus | The receiving sub-wallet |
payerWhitelist | Source address, Travel Rule details, and the address-side status / failMessage. null until payer details have been submitted or matched |
GET /v1/wallet/transaction/detail carrieswhiteListStatus, but not the payer's whitelist record.transactionId is the deposit transaction id — on a collection order, the same value as the order'sorderId. A deposit that never went through the whitelist gate has no case and returns 10000100.eventId. Full catalogue: Event catalogue.data.whiteListStatus.| Webhook | Gate — payer details needed | Order finished |
|---|---|---|
COLLECT_ORDER_UPDATED | orderStatus = PROCESSING with whiteListStatus init or rejected | orderStatus = SUCCESS |
DEPOSIT_ORDER_NOTIFICATION | status = PROCESSING with whiteListStatus init or rejected | status = SUCCESS, normally with whiteListStatus = approved |
whiteListStatus | What it means | What you do |
|---|---|---|
init | This deposit needs payer details; funds are in the unavailable balance | Call submit with the Travel Rule details. Do not change the payer address, network or memo |
pending | Submitted, under review | Wait |
rejected | Details were rejected; funds still unavailable | Read failMessage on the transaction, correct it, submit again |
approved | Review passed; funds are in the receiving wallet's available balance | Update the balance you show. Not the end of the order |
ACTIVE never shows one.WALLET_ADDRESS_UPDATEDstatus:ACTIVE means you can keep collecting from it, FAILED means disable and re-register.COLLECT_ORDER_UPDATEDorderStatus (see 4.1);data.whiteListStatus is carried alongside it, and the refund fields of 4.5 travel on the same payload.COLLECT_ORDER_UPDATED with orderStatus = SUCCESS. A gatePROCESSING with init or rejected) never means the order is finished, and approved on its own doesdata.acceptStatus rides on the same payload. The delivery that carries acceptStatus = ACCEPTING is theDEPOSIT_ORDER_NOTIFICATION, which carries whiteListStatus the same way.COLLECT_ORDER_UPDATED at PROCESSING with whiteListStatus = init → you submitCOLLECT_ORDER_UPDATED at PROCESSING with whiteListStatus = rejected → you submit againwhiteListStatus reaches approved — funds credited to the receiving walletCOLLECT_ORDER_UPDATED with acceptStatus = ACCEPTING → you call accept, or reject to refundCOLLECT_ORDER_UPDATED with acceptStatus = ACCEPTED → collection runsCOLLECT_ORDER_UPDATED at orderStatus = SUCCESSCOLLECT_ORDER_UPDATED with acceptStatus = ACCEPTING → you call acceptCOLLECT_ORDER_UPDATED → final one at orderStatus = SUCCESS| Method | Path | Path A / B | Purpose |
|---|---|---|---|
GET | /v1/wallet/deposit-whitelist/options | A / B | VASP provider list. Countries use ISO two-letter codes |
POST | /v1/wallet/deposit-whitelist/addresses | A | Register an address with Travel Rule details |
GET | /v1/wallet/deposit-whitelist/addresses | A | Paginated address book |
GET | /v1/wallet/deposit-whitelist/addresses/{id} | A | One address and its deposits |
POST | /v1/wallet/deposit-whitelist/addresses/{id}/disable | A | Disable, then register again |
POST | /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit | B | Submit Travel Rule details for a received deposit |
GET | /v1/wallet/deposit-whitelist/cases/{transactionId} | A / B | Whitelist gate of one deposit, including the payer's Travel Rule record — see 4.7 |
| Method | Path | Purpose |
|---|---|---|
POST | /v1/wallet/create/sub | Create a receiving sub-wallet |
GET | /v1/wallet/deposit-address | Deposit address |
GET | /v1/wallet/asset-balance | Available / unavailable balance |
GET | /v1/wallet/transaction/list | Supports whiteListStatus=init|pending|approved|rejected as a filter |
GET | /v1/wallet/transaction/detail | One transaction: status, whiteListStatus, creditStatus |
GET | /v1/wallet/list, /v1/wallet/sub-account/list | Wallet lists |
| Method | Path | Note |
|---|---|---|
POST | /v1/wallet/transfer | Available balance only |
GET | /v1/wallet/transfer-order/detail, /v1/wallet/transfer-order/list | Transfer queries |
POST | /v1/wallet/withdraw | Withdrawal |
POST | /v1/wallet/add-withdraw-whitelist | Withdrawal whitelist — not deposit source whitelisting |
POST | /v1/wallet/delete-withdraw-whitelist | Remove a withdrawal whitelist entry |
whiteListStatus and the refund fields of 4.5 now sit next to orderStatus in the order payload.| Method | Path | Purpose |
|---|---|---|
POST | /v2/stable/collect/order/accept | Accept a collection order — only while acceptStatus = ACCEPTING, see 3.4 |
POST | /v2/stable/collect/order/reject | Reject a collection order and refund the payer — see 7.5 |
GET | /v2/stable/collect/order-status | One order, including whiteListStatus and the refund fields |
| Item | Why |
|---|---|
POST /v1/wallet/add-deposit-sender | Not wired up for this flow. Use /v1/wallet/deposit-whitelist/** |
/v1/wallet/deposit-whitelist/pending-list | Removed. Use GET /v1/wallet/transaction/list with whiteListStatus |
GET /v1/wallet/deposit-whitelist/options{
"providers": [
{ "name": "Binance" },
{ "name": "Coinbase" }
]
}POST /v1/wallet/deposit-whitelist/addresses, header Idempotency-Key{
"requestId": "uuid",
"walletLabel": "Payport Limited",
"network": "BSC",
"walletAddress": "0x…",
"memo": "",
"symbol": "USDC",
"addressType": "STANDARD",
"walletType": "VASP",
"provider": "Binance",
"correspondentType": "ENTITY",
"fullName": "Payport Limited",
"countryCode": "SG",
"companyAddress": "Tampines Blk67, Singapore"
}countryCode is ISO 3166-1 alpha-2, for example SG. Do not send countryInfo.ENTITY requires fullName, countryCode, companyAddress.INDIVIDUAL requires firstName, lastName, birthday (yyyy-MM-dd), countryCode,residentialAddress, and no fullName.data:{
"id": "10001",
"status": "PROCESSING"
}POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit, header Idempotency-Key{
"requestId": "uuid",
"correspondentType": "ENTITY",
"fullName": "Payport Limited",
"countryCode": "SG",
"companyAddress": "Tampines Blk67, Singapore",
"walletLabel": "Payport Limited",
"addressType": "STANDARD",
"walletType": "VASP",
"provider": "Binance"
}walletAddress, network, memo, symbol or txHash. The on-chain transaction is the sourcedata:{
"requestNo": "uuid",
"status": "PROCESSING",
"whiteListStatus": "pending",
"failMessage": "",
"transactionIds": ["20573580428712136704"]
}status 200 only means the submission was accepted. The channel may reject it on the spot and still200, so read whiteListStatus and failMessage rather than the outer status:{
"requestNo": "uuid",
"status": "PROCESSING",
"whiteListStatus": "rejected",
"failMessage": "G20011: Invalid IP address",
"transactionIds": ["20573580428712136704"]
}failMessage carries a reason only when whiteListStatus is rejected; otherwise it is an empty string.status 500 with an outer code and msg and nodata, so there is no data.failMessage to read.GET /v1/wallet/transaction/detail → data{
"transactionId": "20573580428712136704",
"status": "PROCESSING",
"whiteListStatus": "init",
"creditStatus": "PENDING",
"failMessage": "",
"fromAddress": "0x…",
"network": "BSC",
"amount": "100.00",
"currency": "USDC"
}POST /v2/stable/collect/order/reject, header Idempotency-Key{
"orderId": "WT...",
"requestId": "req_...",
"refundReason": "Customer cancelled"
}{
"orderId": "WT...",
"orderStatus": "REFUNDING",
"acceptStatus": "REJECTED",
"refundBy": "MERCHANT",
"refundReason": "Customer cancelled"
}GET /v2/stable/collect/order-status and COLLECT_ORDER_UPDATED carry the same fields. ArefundBy BPN and a platform-suppliedrefundReason.acceptStatus = ACCEPTING — see 3.4.POST /v2/stable/collect/order/accept, header Idempotency-Key{
"orderId": "WT...",
"quoteId": "9dcd762a6399451f9672098c201a0517",
"requestId": "req_..."
}{
"orderId": "WT...",
"orderStatus": "PROCESSING",
"acceptStatus": "ACCEPTED"
}quoteId must be the one carried on the order when acceptStatus turned ACCEPTING; the quote isquote.expireTime. An expired or mismatched quote is rejected10000064.status is 200 on success. On failure it is 500 and code carries one of these. Full list:code | Meaning |
|---|---|
10000100 | Transaction does not exist, or does not belong to this account |
10000101 | Payer details for this deposit have already been reviewed |
10000102 | Payer details incomplete |
10000103 | Invalid field value, including an unknown countryCode or provider |
10000104 | Cannot submit right now. Poll the status — do not edit the details and retry immediately |
10000105 | Duplicate request |
10000106 | The payer address cannot be supplied or changed when submitting for a received deposit |
10000064 | The quote on an accept call has expired or does not match the order |
10000007 | The order does not exist, or requestId does not match the one already on it |
COLLECT_ORDER_UPDATED; on Path A also to WALLET_ADDRESS_UPDATEDwhiteListStatus = rejected) and an order rejection (orderStatus = REJECTED)whiteListStatus = approved updates the balance but does not close the order; completion isCOLLECT_ORDER_UPDATED at orderStatus = SUCCESSPOST /v2/stable/collect/order/accept is called only once acceptStatus = ACCEPTING; on a gatedrefundBy — a BPN refund can arrive without you calling rejectGET /v1/wallet/transaction/list?whiteListStatus=init|rejectedIdempotency-Key — see Idempotency