1. Wallet
BPN OpenAPI
  • Get started
    • Introduction to BPN
    • Introduction to API
    • Architecture Overview
    • Authentication
    • Environments
    • Response envelope
    • Idempotency
  • Guides
    • Virtual Account
      • Virtual Account Overview
      • VA · Payin
      • VA · Statuses
      • VA · Currencies & limits
      • VA · Payout
      • VA · RFI
    • Wallet
      • Wallet · Withdraw
      • Wallet · Transfer
      • Wallet · Assets & limits
      • Wallet · Deposit whitelist
      • Wallet Overview
      • Wallet · Deposit
      • Wallet · Statuses
    • Convert
      • Convert Overview
      • Convert · Quote & submit
      • Convert · Business types
      • Convert · Pairs & limits
      • Convert · Statuses
  • API Reference
    • Virtual Account
      • Virtual Account field notes
      • Inquiry Master VA Balance
      • List Primary Virtual Accounts
      • Create Virtual Account
      • Get Virtual Account Detail
      • List Virtual Account
      • List Virtual Account Orders
      • Get Virtual Account Order Detail
      • Refund Virtual Account Order
      • List RFI Sub Virtual Account
      • Get Sub Virtual Account RFI Template Info
      • Sub Virtual Account Submit RFI
      • Add Bank Account
      • List Bank Account
      • List Banks
      • Payout via Virtual Account
      • Send Email Verify Code
    • Wallet
      • Wallet field notes
      • Deposit Whitelist
        • Get Deposit Whitelist Options
        • Register Deposit Source Address
        • List Deposit Source Addresses
        • Get Deposit Source Address
        • Disable Deposit Source Address
        • Submit Payer Details for a Received Deposit
      • Get Asset Balance
      • Get Deposit Address
      • Add Deposit Sender
      • Add Withdraw Whitelist
      • Delete Withdraw Whiltelist
      • Request Withdraw
      • Query Wallet Internal Transfer Detail
      • List Wallet Internal Transfer order
      • Wallet Internal Transfer
      • Create Sub Account
      • Query Transaction History
      • List Wallets
      • List Sub Account
      • Get Transaction Detail
    • Payment Link
      • Abnormal fund
        • Abnormal funds
        • Matchable Payment links
        • Link Order(Abnormal fund)
        • Submit to platform
      • Create Payment Link
      • List Payment links
      • Get Curreny Network Config
    • Convert
      • Convert field notes
      • Inquery FX Rate
      • Get Stablecoin Quote
      • Create Stable Order
      • Get Order (Single) Detail
      • List Orders(Batch)
    • KYB
      • Share KYB/KYC Info For Sub User
      • Get KYB Sub User Status
    • Reconciliation
      • Get Reconciliation Order List By Page
    • External Provider
      • FE: Create stablecoin collection sub-account link
      • Create stablecoin collection sub-account link
      • Get sub wallet account
      • List sub wallet accounts
      • Change sub wallet status
      • Query stablecoin collection order list
      • Query stablecoin collection order status
      • Get quote
      • Accept stablecoin collection order
      • Reject stablecoin collection order
      • Query USD balance
      • USD Payout (withdrawal)
      • Query USD Payout order status
      • Query USD Payout order list
    • Mock
      • Mock Virtual account Payin Order
      • Mock wallet deposit transaction
      • Mock Payin Order Refund
      • Mock Payout Order Update Status
    • Pay Session
      • Request Pay Session
  • Webhooks
    • Webhooks Overview
    • KYB notifications
    • Event catalogue
    • Resend Fail Webhook
    • Open Virtual Account Status
    • Virtual Account Payment Status
    • Virtual Account Invoice update
    • Transaction Status Notification
    • KYB Status Notification
    • Deposit Sender Detail Required
    • Abnormal Fund Notification
    • WALLET_TRANSFER_ORDER_UPDATED
    • Sub Virtual Account RFI Required
    • Sub Wallet Update
    • wallet address whitelist Update
    • Crypto Deposit Order Notification
    • Collect Order Updated
    • Usd Payout Order Updated
    • onboard result
    • partner order status
    • PaymentLink Notification
    • Deposit Whitelist Notification
  • Partner Flow
    • inquiry supported currency
    • KYC/KYB Sharing
    • inquiry onboard status
    • get price
    • Create order
    • order list
    • inquiry single order
    • get user deposit address
    • get payment instruction
    • sync fund notification
    • daily settlement records
  • Appendix
    • Enums quick reference
    • Enum
    • Virtual Account(VA) Support List & KYB requirement
  • Release Notes & Changelog
  • Errors
    • Error codes catalogue
  • Change Log
    • 2026-09-21 Virtual Account independent refund orders
    • Wallet deposit source-address whitelist
  1. Wallet

Wallet · Deposit whitelist

A payer sending crypto into your wallet must have their source address registered and their payer details
reviewed
before the money becomes usable. Until that clears, the deposit order is PROCESSING and the
funds sit in the unavailable balance of the receiving wallet — not withdrawable, not convertible.
Once the review passes, the funds move into the available balance of that receiving wallet. After an
address has been approved, later deposits from the same address skip the whitelist flow entirely:
they credit as ordinary deposits and emit no DEPOSIT_WHITELIST_* webhook at all — neither
DEPOSIT_WHITELIST_REQUIRED nor DEPOSIT_WHITELIST_CREDITED. You are notified by the ordinary
DEPOSIT_ORDER_NOTIFICATION when the deposit completes.
If auto-collection is enabled on the wallet, the funds are then swept to the main account by the existing
transfer flow. The deposit order stays PROCESSING until that sweep finishes, and becomes SUCCESS
afterwards. Without auto-collection the order becomes SUCCESS as soon as the review passes.
Authentication is the same as every other Wallet endpoint. Send an Idempotency-Key header on writes. All
amounts are strings.

The one rule that matters#

SUCCESS is not the signal that funds are spendable.
A deposit order can be PROCESSING with the money already available (auto-collection still running), and it
can be PROCESSING with the money locked (review not finished). To know whether funds are usable, read
creditStatus from GET /v1/wallet/transactions/{transactionId}, or read the available balance from
GET /v1/wallet/asset-balance.
Order statuswhiteListStatuscreditStatusMoney spendable?
PROCESSINGinitPENDINGNo — submit payer details
PROCESSINGpendingPENDINGNo — under review
PROCESSINGrejectedPENDINGNo — resubmit
PROCESSINGapprovedCREDITEDYes — sweep still running
SUCCESSapprovedCREDITEDYes

Which path applies to you#


1. Address known: register it first#

Use this when you already know which address the payer will send from.
1.
GET /v1/wallet/deposit-whitelist/options — fetch the VASP / provider list. That is the endpoint's
only purpose.
2.
POST /v1/wallet/deposit-whitelist/addresses — submit the address and the payer details. Send the
country as an ISO 3166-1 alpha-2 two-letter code (SG). There is no country enum to look up.
3.
GET /v1/wallet/deposit-whitelist/addresses/{id} — check the outcome:
PROCESSING — under review
ACTIVE — approved
FAILED — rejected. Call POST /v1/wallet/deposit-whitelist/addresses/{id}/disable, then register a
new record.
A record cannot be edited after submission. Correcting anything means disable + register again.
Then the payer sends to your deposit address (GET /v1/wallet/deposit-address):
4.
After on-chain confirmation the order is PROCESSING and the funds are in the unavailable balance of the
receiving wallet.
Source address not whitelisted yet — you receive DEPOSIT_WHITELIST_REQUIRED. Supply the payer
details. You can also poll GET /v1/wallet/history?whiteListStatus=init (or rejected) for the work
queue.
Source address already ACTIVE — the deposit does not enter the whitelist flow. No
DEPOSIT_WHITELIST_* webhook is sent
, and the deposit credits as an ordinary one. Wait for
DEPOSIT_ORDER_NOTIFICATION, or poll GET /v1/wallet/transactions/{transactionId}.
5.
For a deposit that did go through the whitelist flow, DEPOSIT_WHITELIST_CREDITED tells you the
available balance of that receiving wallet in GET /v1/wallet/asset-balance has increased. With
auto-collection enabled the order is usually still PROCESSING while the funds are swept to the main
account.
6.
When the deposit is fully complete — including auto-collection where enabled — the order becomes
SUCCESS and you receive DEPOSIT_ORDER_NOTIFICATION, whose payload now carries whiteListStatus. You
can also confirm with GET /v1/wallet/history or GET /v1/wallet/transactions/{transactionId}.

2. Address unknown: submit after the deposit arrives#

1.
After the payer sends, the order is PROCESSING and the funds are in the unavailable balance of the
receiving wallet. You receive DEPOSIT_WHITELIST_REQUIRED; you can also read
GET /v1/wallet/history?whiteListStatus=init for the deposits awaiting details.
2.
Optionally call GET /v1/wallet/deposit-whitelist/options for the provider list.
3.
POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit — submit the payer details. Do
not send the source address, network, memo or transaction hash
; those come from the on-chain
transaction. Country goes in as a two-letter code.
4.
GET /v1/wallet/transactions/{transactionId} — track progress, including whiteListStatus.
5.
On approval you receive DEPOSIT_WHITELIST_CREDITED and the available balance of the receiving
wallet
increases. With auto-collection enabled the order is usually still PROCESSING.
6.
On rejection you receive DEPOSIT_WHITELIST_FAILED with whiteListStatus rejected. The order stays
PROCESSING and the funds stay in the unavailable balance. Fix what failMessage reports and submit
again.
7.
When the deposit is fully complete the order becomes SUCCESS and you receive
DEPOSIT_ORDER_NOTIFICATION.
Once an address is approved, later deposits from it never enter the whitelist flow. They emit no
DEPOSIT_WHITELIST_* webhook whatsoever — not REQUIRED, not CREDITED. The only notification is
DEPOSIT_ORDER_NOTIFICATION when the order closes. Do not gate booking a repeat deposit on a whitelist
event that will never arrive.

Payer fields#

correspondentTypeMandatoryMust NOT be sent
ENTITYfullName, countryCode, companyAddressfirstName, lastName, birthday, residentialAddress
INDIVIDUALfirstName, lastName, birthday (yyyy-MM-dd), countryCode, residentialAddressfullName
walletTypeAlso mandatory
VASPprovider — must be a name from GET /v1/wallet/deposit-whitelist/options
OTHERSothersPleaseSpecify, max 255 characters
SELF_HOSTED—
Other constraints: walletLabel max 50 characters; symbol may be empty when addressType is UNIVERSAL;
memo only where the network uses one.
countryCode is an ISO 3166-1 alpha-2 code such as SG. The platform converts it to whatever country
name the downstream channel requires. countryInfo was withdrawn — do not send it. An unrecognised code
or an unknown provider returns 10000103.

Statuses#

Deposit order status#

Appears in GET /v1/wallet/history, GET /v1/wallet/transactions/{transactionId} and the deposit webhooks.
ValueMeaning
PROCESSINGDeposit in progress — awaiting whitelist, under review, or credited but not yet swept
SUCCESSDeposit fully complete, including auto-collection where enabled
FAILDeposit failed
Do not read this field to decide whether the money is spendable. Read creditStatus, or
GET /v1/wallet/asset-balance.

Whitelist progress whiteListStatus#

Appears in order queries — history, transaction detail, collection order status — and in
DEPOSIT_ORDER_NOTIFICATION, DEPOSIT_WHITELIST_* and Collect Order Updated. Values are lowercase.
ValueMeaning
initTravel Rule details not submitted yet
pendingSubmitted, under review
approvedPassed — the gate is cleared. The order may still be PROCESSING
rejectedRejected, resubmit required
submitStatus was withdrawn. Use whiteListStatus everywhere.

Crediting creditStatus#

Appears in the transaction detail and related endpoints.
ValueMeaning
PENDINGNot yet in the available balance of the receiving wallet
CREDITEDIn the available balance of the receiving wallet. The order may still be PROCESSING
BLOCKEDCould not be credited — contact support

Source address status#

Appears on the address endpoints.
ValueMeaning
PROCESSINGSubmitted, under review
ACTIVEApproved
FAILEDRejected

Webhooks#

Configured exactly like the existing Stable webhooks. Deduplicate on eventId.
EventMeaningOrder statusNotes
WALLET_ADDRESS_UPDATEDSource address changed state—
DEPOSIT_WHITELIST_REQUIREDPayer details neededPROCESSINGSent only while the source address is not yet whitelisted
DEPOSIT_WHITELIST_FAILEDReview rejected, resubmit; funds still unavailablePROCESSINGPayload carries whiteListStatus rejected
DEPOSIT_WHITELIST_CREDITEDReview passed for this deposit; funds now in the available balance of the receiving walletusually PROCESSING; can be SUCCESS without auto-collectionOnly for deposits that went through the whitelist flow
DEPOSIT_ORDER_NOTIFICATIONDeposit fully complete (existing event)SUCCESSNew: carries whiteListStatus, normally approved
Collect Order UpdatedCollection / payment-link order updated (existing event)as todayNew: carries whiteListStatus
A deposit from an address that is already ACTIVE emits none of the three DEPOSIT_WHITELIST_* events.
It never enters the whitelist flow, so there is nothing for them to report; the ordinary
DEPOSIT_ORDER_NOTIFICATION is the only notification you receive.
The three DEPOSIT_WHITELIST_* events are delivered by a single entry — Deposit Whitelist Notification —
under API Reference · Webhooks. Branch on eventType; the envelope and data shape are identical, and only
failMessage (on FAILED) and creditTime (on CREDITED) are conditional.
After DEPOSIT_WHITELIST_REQUIRED or DEPOSIT_WHITELIST_FAILED, work the queue with
GET /v1/wallet/history?whiteListStatus=init|rejected and call the submit endpoint. No
DEPOSIT_ORDER_NOTIFICATION is emitted during on-chain confirmation.
Only DEPOSIT_ORDER_NOTIFICATION is terminal — treat DEPOSIT_WHITELIST_CREDITED as "the money is
spendable now", not as "the deposit is finished".

API index#

Success returns HTTP 200 and business status 200:
{
  "status": 200,
  "code": null,
  "msg": "OK",
  "traceId": "…",
  "data": {}
}
Business failures return status 500 with a code from the table at the bottom of this page.
ScenarioMethodPath
Provider listGET/v1/wallet/deposit-whitelist/options
Register source addressPOST/v1/wallet/deposit-whitelist/addresses
List source addressesGET/v1/wallet/deposit-whitelist/addresses
Source address detailGET/v1/wallet/deposit-whitelist/addresses/{id}
Disable source addressPOST/v1/wallet/deposit-whitelist/addresses/{id}/disable
Submit for a received depositPOST/v1/wallet/deposit-whitelist/transactions/{transactionId}/submit
Transaction detailGET/v1/wallet/transactions/{transactionId}
APIs you are already using, and what changed:
MethodPathPurpose / change
GET/v1/wallet/deposit-addressDeposit address
POST/v1/wallet/create/subCreate a sub-wallet
GET/v1/wallet/asset-balanceAvailable / unavailable balance
GET/v1/wallet/historyNew: whiteListStatus filter and response field. Replaces the pending list
GET/v1/wallet/transactions/{transactionId}New: transaction detail carrying whiteListStatus. Replaces the case endpoint
GET/v2/stable/collect/order-statusNew: whiteListStatus in the response
WebhookDEPOSIT_ORDER_NOTIFICATIONNew: whiteListStatus
WebhookCollect Order UpdatedNew: whiteListStatus
Withdrawal whitelisting is unchanged — keep using POST /v1/wallet/add-withdraw-whitelist. This page is
about incoming funds only.

Removed and withdrawn#

ItemReplacement
GET /v1/wallet/deposit-whitelist/pending-listGET /v1/wallet/history with whiteListStatus
GET /v1/wallet/deposit-whitelist/cases/{transactionId}GET /v1/wallet/transactions/{transactionId}
submitStatuswhiteListStatus, with lowercase init / pending / approved / rejected
Country enum in /optionsSend countryCode as an ISO 3166-1 alpha-2 code
countryInfo in requestsNot needed — derived from countryCode server-side

Error codes#

Same convention as the rest of Wallet: code is an 8-digit string from WalletErrorCode.
codeMeaningSafe to retry unchanged?
10000100Transaction not found, or not owned by the callerNo — re-read GET /v1/wallet/history?whiteListStatus=init
10000101Review already completed for this depositNo — nothing left to do
10000102Payer details incompleteNo — add the missing fields
10000103Field value not accepted, including an invalid countryCode or unknown providerNo — use an ISO 3166-1 alpha-2 code and a provider from /options
10000104Cannot submit right nowYes, later — poll the status. Do not edit the details and retry immediately
10000105Duplicate requestNo — read the original result
10000106Source address supplied or changed for a received depositNo — drop walletAddress / network / memo / symbol / txHash
Previous
Wallet · Assets & limits
Next
Wallet Overview
Built with