1. External Provider
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
        • Save Sub-wallet Payer Profile
        • Update Sub-wallet Payer Profile
        • Get Sub-wallet Payer Profile
      • 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
      • FE: Deposit Travel Rule
      • External Provider · Deposit whitelist
      • Create stablecoin collection sub-account link
        POST
      • Get sub wallet account
        GET
      • List sub wallet accounts
        GET
      • Change sub wallet status
        POST
      • Query stablecoin collection order list
        GET
      • Query stablecoin collection order status
        GET
      • Get quote
        GET
      • Accept stablecoin collection order
        POST
      • Reject stablecoin collection order
        POST
      • Query USD balance
        GET
      • USD Payout (withdrawal)
        POST
      • Query USD Payout order status
        GET
      • Query USD Payout order list
        GET
    • 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. External Provider

External Provider · Deposit whitelist

Audience: external provider integration teams.
Scope: the Wallet OpenAPI and webhooks that apply once deposit source-address whitelisting is switched on.
Authentication, the response envelope and idempotency are the same as every other Stable Wallet endpoint.
Send an Idempotency-Key header on writes. All amounts are strings.
Field-level reference: Wallet · Deposit whitelist.

1. What this is#

A payer sends crypto to a merchant receiving wallet. If the source address has not been whitelisted yet,
the money lands in the unavailable balance of that receiving wallet — not withdrawable, not convertible.
You submit the payer details through the OpenAPI; once the whitelist review passes, the funds credit into the
receiving wallet and the order continues to SUCCESS.
There is no provider-specific endpoint. You call the same /v1/wallet/deposit-whitelist/** and wallet
query endpoints as every other merchant.
There are two ways to get an address whitelisted. They can coexist, and once a source address is ACTIVE
neither one asks for the payer details again.
When to use itEntry point
Path A — register the address up frontYou know the payer's source address before they sendPOST /v1/wallet/deposit-whitelist/addresses
Path B — submit after the deposit landsYou learn the address only from the incoming transactionPOST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit
Both do Travel Rule whitelisting on the payer source address. The only difference is whether you do it
before or after the money arrives.

2. The one rule that matters#

orderStatus = SUCCESS is not what tells you the money is spendable, and it is not what tells you the
whitelist cleared.
Read three independent fields:
FieldQuestion it answers
orderStatus / order statusHas the whole order finished?
whiteListStatusHas the Travel Rule review cleared?
creditStatusIs the money in the receiving wallet's available balance?
The common mid-flight combination is orderStatus = PROCESSING + whiteListStatus = approved +
creditStatus = CREDITED: whitelisting is done and the funds are credited, while the order is still being
processed (for example a sweep to the main account). That is normal, not an error.

3. The two paths#

3.1 Path A — register the address up front#

1.
GET /v1/wallet/deposit-whitelist/options — fetch the VASP provider list.
2.
POST /v1/wallet/deposit-whitelist/addresses — submit the address plus the Travel Rule details.
Cannot be edited after submission.
3.
Poll GET /v1/wallet/deposit-whitelist/addresses/{id}, or wait for WALLET_ADDRESS_UPDATED, until the
address is ACTIVE. If it comes back FAILED, disable it and register a new one.
4.
The payer sends to the address from GET /v1/wallet/deposit-address.
5.
Because the source address is already ACTIVE, the deposit skips the whitelist flow entirely and
credits as an ordinary deposit.
No DEPOSIT_WHITELIST_* webhook fires on this path. Neither DEPOSIT_WHITELIST_REQUIRED nor
DEPOSIT_WHITELIST_CREDITED. Do not make booking conditional on receiving one — the order webhook is your
only signal.

3.2 Path B — submit after the deposit lands#

1.
The payer sends first, from an address that has not been whitelisted.
2.
On-chain confirmation puts the order in PROCESSING and the funds in the unavailable balance.
3.
You receive DEPOSIT_WHITELIST_REQUIRED (whiteListStatus = init).
4.
Optionally GET /v1/wallet/deposit-whitelist/options. Use
GET /v1/wallet/history?whiteListStatus=init or GET /v1/wallet/transactions/{transactionId} to read the
transaction and its read-only source address.
5.
POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit with the Travel Rule details only.
6.
Review runs (pending). If it is rejected you get DEPOSIT_WHITELIST_FAILED and submit again; if it
passes you get DEPOSIT_WHITELIST_CREDITED.
7.
The order finishes with COLLECT_ORDER_UPDATED at orderStatus = SUCCESS.
8.
The address is now ACTIVE, so later deposits from it behave like Path A.

3.3 Resubmitting after a rejection#

PathWhat to do
AThe 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.
BCall POST /v1/wallet/deposit-whitelist/transactions/{transactionId}/submit again. The on-chain address fields still must not be sent.
Find the affected items with GET /v1/wallet/history?whiteListStatus=rejected.
Do not use POST /v1/wallet/add-withdraw-whitelist for this — that is the withdrawal whitelist, a
different feature.

4. Status fields#

Full table: Wallet · Statuses.

4.1 Order status / orderStatus#

ValueMeaning
PROCESSINGIn flight — awaiting details, under review, or credited but not yet finished
SUCCESSThe whole order is complete
FAILFailed
REJECTEDRejected; a refund state may follow
REFUNDINGRefund in progress
REFUNDEDRefunded

4.2 whiteListStatus#

ValueMeaningWhat you do
initTravel Rule details not submittedPath B: call submit. Path A: get the address to ACTIVE
pendingSubmitted, under reviewWait
approvedClearedWait for the order to reach SUCCESS
rejectedRejectedResubmit — see 3.3
It is null for transactions and orders that are not gated by the whitelist.

4.3 creditStatus#

ValueMeaning
PENDINGNot yet in the receiving wallet's available balance
CREDITEDIn the receiving wallet. A sweep may still follow
BLOCKEDCould not be credited — contact support

4.4 Source address status (Path A only)#

ValueMeaning
PROCESSINGSubmitted, under review
ACTIVEApproved. Later deposits from it skip the whitelist flow
FAILEDRejected. Disable it and register again

5. Webhooks#

Deduplicate on eventId. Full catalogue: Event catalogue.

5.1 Deposit Whitelist Notification#

The three whitelist events are delivered by a single webhook, distinguished by eventType. The envelope
and data shape are identical across all three.
eventTypeMeaningOrder statusWhat you do
DEPOSIT_WHITELIST_REQUIREDThis deposit needs payer details; funds are in the unavailable balancePROCESSING, whiteListStatus = initCall submit with the Travel Rule details. Do not change the payer address, network or memo
DEPOSIT_WHITELIST_FAILEDDetails were rejected; funds still unavailablePROCESSING, whiteListStatus = rejectedRead data.failMessage, correct it, submit again
DEPOSIT_WHITELIST_CREDITEDReview passed; funds are now in the receiving wallet's available balanceusually still PROCESSING, whiteListStatus = approved, creditStatus = CREDITEDUpdate the balance you show. Not the end of the order
These three fire only for a deposit that actually goes through the whitelist flow. A deposit from a
source address that is already ACTIVE emits none of them.

5.2 WALLET_ADDRESS_UPDATED#

A source address in the address book changed state — mainly useful on Path A. Read the address status:
ACTIVE means you can keep collecting from it, FAILED means disable and re-register.

5.3 COLLECT_ORDER_UPDATED#

Order progress and completion for collection / payment-link orders. Branch on orderStatus (see 4.1);
data.whiteListStatus is carried alongside it.
Order completion is signalled only by COLLECT_ORDER_UPDATED with orderStatus = SUCCESS. Whitelist
progress never arrives through this event, and the whitelist events never mean the order is finished.
For plain wallet deposits that are not behind a collection order, the equivalent completion event is
DEPOSIT_ORDER_NOTIFICATION, which also carries whiteListStatus.

5.4 Typical sequences#

Address not whitelisted yet (Path B)
1.
DEPOSIT_WHITELIST_REQUIRED → you submit
2.
optionally DEPOSIT_WHITELIST_FAILED → you submit again
3.
DEPOSIT_WHITELIST_CREDITED → funds credited to the receiving wallet
4.
one or more COLLECT_ORDER_UPDATED → final one at orderStatus = SUCCESS
Address already whitelisted (Path A, and every repeat deposit)
1.
no whitelist event at all
2.
one or more COLLECT_ORDER_UPDATED → final one at orderStatus = SUCCESS

6. Endpoint inventory#

6.1 Deposit whitelist#

MethodPathPath A / BPurpose
GET/v1/wallet/deposit-whitelist/optionsA / BVASP provider list. Countries use ISO two-letter codes
POST/v1/wallet/deposit-whitelist/addressesARegister an address with Travel Rule details
GET/v1/wallet/deposit-whitelist/addressesAPaginated address book
GET/v1/wallet/deposit-whitelist/addresses/{id}AOne address and its deposits
POST/v1/wallet/deposit-whitelist/addresses/{id}/disableADisable, then register again
POST/v1/wallet/deposit-whitelist/transactions/{transactionId}/submitBSubmit Travel Rule details for a received deposit

6.2 Deposit and wallet queries#

MethodPathPurpose
POST/v1/wallet/create/subCreate a receiving sub-wallet
GET/v1/wallet/deposit-addressDeposit address
GET/v1/wallet/asset-balanceAvailable / unavailable balance
GET/v1/wallet/historySupports whiteListStatus=init|pending|approved|rejected as a filter
GET/v1/wallet/transactions/{transactionId}One transaction: status, whiteListStatus, creditStatus
GET/v1/wallet/list, /v1/wallet/sub-account/listWallet lists

6.3 Transfer and withdrawal (after the deposit clears)#

MethodPathNote
POST/v1/wallet/transferAvailable balance only
GET/v1/wallet/transfer-order/detail, /v1/wallet/transfer-order/listTransfer queries
POST/v1/wallet/withdrawWithdrawal
POST/v1/wallet/add-withdraw-whitelistWithdrawal whitelist — not deposit source whitelisting
POST/v1/wallet/delete-withdraw-whitelistRemove a withdrawal whitelist entry

6.4 Collection#

The existing Stable collect / payment-link query endpoints and webhooks are unchanged, except that
whiteListStatus now sits next to orderStatus in the order payload.

6.5 Do not use#

ItemWhy
POST /v1/wallet/add-deposit-senderNot wired up for this flow. Use /v1/wallet/deposit-whitelist/**
/v1/wallet/deposit-whitelist/pending-listRemoved. Use GET /v1/wallet/history with whiteListStatus
/v1/wallet/deposit-whitelist/cases/{transactionId}Removed. Use GET /v1/wallet/transactions/{transactionId}

7. Examples#

7.1 Provider options#

GET /v1/wallet/deposit-whitelist/options
{
  "providers": [
    { "name": "Binance" },
    { "name": "Coinbase" }
  ]
}

7.2 Path A — register an address#

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.
Response data:
{
  "id": "10001",
  "status": "PROCESSING"
}

7.3 Path B — submit for a received deposit#

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"
}
Never send walletAddress, network, memo, symbol or txHash. The on-chain transaction is the source
of truth, and this endpoint whitelists exactly the address that sent it.
Response data:
{
  "status": "PROCESSING",
  "whiteListStatus": "pending",
  "transactionIds": ["20573580428712136704"]
}

7.4 Transaction detail#

GET /v1/wallet/transactions/{transactionId} → data
{
  "transactionId": "20573580428712136704",
  "status": "PROCESSING",
  "whiteListStatus": "init",
  "creditStatus": "PENDING",
  "failMessage": "",
  "fromAddress": "0x…",
  "network": "BSC",
  "amount": "100.00",
  "currency": "USDC"
}

8. Error codes#

Business status is 200 on success. On failure it is 500 and code carries one of these. Full list:
Error codes catalogue.
codeMeaning
10000100Transaction does not exist, or does not belong to this account
10000101Payer details for this deposit have already been reviewed
10000102Payer details incomplete
10000103Invalid field value, including an unknown countryCode or provider
10000104Cannot submit right now. Poll the status — do not edit the details and retry immediately
10000105Duplicate request
10000106The payer address cannot be supplied or changed when submitting for a received deposit

9. Integration checklist#

Path A and Path B are handled separately, each against the sequence in §3
Subscribed to the Deposit Whitelist Notification webhook and to COLLECT_ORDER_UPDATED; on Path A also
to WALLET_ADDRESS_UPDATED
Booking a deposit is not conditional on a DEPOSIT_WHITELIST_* event — an already whitelisted
address emits none
A whitelist rejection (DEPOSIT_WHITELIST_FAILED) and an order rejection (COLLECT_ORDER_UPDATED with
orderStatus = REJECTED) are handled as different things
DEPOSIT_WHITELIST_CREDITED updates the balance but does not close the order; completion is
COLLECT_ORDER_UPDATED at orderStatus = SUCCESS
Path B submit never carries on-chain address fields; countries are two-letter codes only
Pending work is found with GET /v1/wallet/history?whiteListStatus=init|rejected
The withdrawal whitelist endpoints are not used for deposit source whitelisting
Every write carries an Idempotency-Key — see Idempotency
Previous
FE: Deposit Travel Rule
Next
Create stablecoin collection sub-account link
Built with