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 · Transfer
      • Wallet · Assets & limits
      • Wallet · Deposit whitelist
      • Wallet · PaymentLink
      • Wallet Overview
      • Wallet · Deposit
      • Wallet · Statuses
      • Wallet · Withdraw
    • 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
      • List Wallet Transactions
      • Get Wallet 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
      • 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 · PaymentLink

Payment Links let a merchant collect supported stablecoins through a hosted payment page. This guide covers creation, status handling, webhook processing, and reconciliation. Withdrawal flows are outside this guide.

Integration flow#

1.
Configure merchant credentials, a Payment Link webhook destination, and an eligible Collection Sub wallet.
2.
Query the supported currencies and networks before creating a link.
3.
Create a One-Time or Permanent Payment Link with a merchant-generated requestId.
4.
Store paymentId, paymentLink, requestId, recipient wallet, amount, and link type.
5.
Present the hosted link to the payer.
6.
Treat processing as pending. Confirm collection only when the order reaches completed.
7.
Process webhooks idempotently and reconcile nonterminal records through the list API.

Create a Payment Link#

Use POST /v1/stable/collect/create-payment-link.

Merchant request ID#

Use requestId for new integrations.
userOrderNo is deprecated. When requestId is blank, the platform falls back to userOrderNo; when both are nonblank, requestId takes precedence.
A detected duplicate returns ODR00000040; the original result is not replayed.
After an unknown result, query with the original requestId. Do not change the ID merely to bypass a duplicate error.
Permanent payment child orders may not inherit the parent link's requestId. Use the child paymentId as the payment identity and referencePaymentId as the parent relationship.

One-Time links#

A One-Time link is created in init. It becomes active when activated, and its validity window starts from activation.
Required fields depend on the pricing mode:
ModeRequired amount fields
Fiat-pricedfiatCurrency and fiatAmount
Crypto-pricedcryptoAmount and one concrete supportCurrency
paymentValidTime is required for One-Time links and is expressed in minutes.

Permanent links#

A Permanent link is reusable and is created in active. Each actual payment creates a separate child order. Keep the parent link and child payments as different records.

Query and recovery#

Use POST /v1/stable/collect/payment-links.
Query by paymentId to recover one known link or payment record. When paymentId and referencePaymentId are both supplied, they are combined with AND.
Query by requestId to recover an uncertain create result.
primaryOrderOnly defaults to true and returns primary Payment Links only. Set it to false to include primary links and actual payment child records.
Query by referencePaymentId to page actual payment child records for a Permanent parent link. When supplied, primaryOrderOnly is ignored.
An empty result while creation may still be in flight is not proof that creation failed.
startTime and endTime filter record creation time, not payment or fund-transfer completion time.
Requery records that remain nonterminal after the original creation-time window.

Status model#

One-Time order#

StatusTerminal?MeaningMerchant action
initNoCreated but not activatedPresent the link and wait
activeNoActivated and payableTrack the payment
processingNoPayment matched; fund transfer is incompleteWait and query again; do not credit as final
completedYesEvery required merchant fund transfer succeededConfirm collection idempotently
expiredNot alwaysPayment window ended without a matched paymentStop directing new payment and keep boundary cases under review
An address-risk rejection can keep an order in processing for manual handling. Do not infer a terminal outcome from elapsed time.

Permanent link and payment child#

The parent Permanent link remains active. Each actual payment creates a child order:
A child order's referencePaymentId points to the Permanent parent link. Use the child paymentId for per-payment booking and deduplication.

Time fields#

All timestamps are Unix epoch milliseconds.
FieldMeaning
createTimeLink or payment-record creation time
effectiveTimeOne-Time link activation time
expiresTimeActivation time plus paymentValidTime
Creation time does not represent payment completion or fund-transfer completion. Do not calculate a final collection result from timestamps.

Payment Link webhook#

Event type: PAYMENT_LINK_UPDATED.
One-Time creation, activation, expiry, and final completion can emit status notifications.
Entering processing does not by itself emit a Payment Link status webhook.
A Permanent parent emits its active state; each payment child emits completed only after all required fund transfers succeed.
Webhooks may be duplicated or delayed. Deduplicate by eventId, then apply business idempotency by the actual payment paymentId.
Do not let a late nonterminal event overwrite a stored completed result.
Verify the webhook signature using the raw request body and the documented authentication headers.

Reconciliation#

For One-Time links:
1.
Page through records by overlapping creation-time windows.
2.
Deduplicate records by paymentId.
3.
Persist and requery init, active, and processing records until a terminal business decision is available.
4.
Book the collection only at completed.
For Permanent links:
1.
Store each payment child's paymentId and referencePaymentId from the webhook.
2.
Query a known child by its own paymentId.
3.
Reconcile and book each child independently; never use the parent paymentId as the identity of every payment.

Error handling#

SituationAction
Create timeout or unknown resultQuery with the original requestId, then retry recovery with backoff
Duplicate request IDQuery the original request; do not generate a new ID just to bypass the error
Long-running processingQuery again and contact the platform if it remains unresolved
Expired order with a detected paymentFollow query and webhook results; do not assume automatic credit or refund
Duplicate or late webhookDeduplicate events and prevent status regression
Previous
Wallet · Deposit whitelist
Next
Wallet Overview
Built with