1. Partner Flow
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 · Payout
      • VA · RFI
      • VA · Currencies & limits
      • VA Opening
        • VND VA Opening
        • BRL VA Opening
    • 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 Deposit Whitelist Case
      • 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
      • Create deposit Travel Rule link
      • Create deposit Travel Rule detail link
    • Mock
      • Mock Virtual account Payin Order
      • Mock wallet deposit transaction
      • Mock Payment Link deposit
      • Mock Payin Order Refund
      • Mock Payout Order Update Status
    • Pay Session
      • Request Pay Session
    • Files
      • Request File Upload URL
  • 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
    • Share KYB/KYC and open account directly
      POST
    • Get KYB/KYC submit + open account status
      GET
    • Get Stablecoin Quote
      POST
    • Create Stable Order
      POST
    • Get Order (Single) Detail
      GET
    • List Orders(Batch)
      GET
    • Submit hash
      POST
  • 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. Partner Flow

Create Stable Order

POST
/v1/stable/order/submit-order
This API is off-ramp / Convert only (stablecoin → fiat). On-ramp does not use
submit-order: after onboarding, fund the VA. Side, currency and VA come from
get-quote; do not pass virtualAccountId.

Request#

fieldrequirednotes
quoteIdyesfrom get-quote; must not be expired
merchantOrderIdrecommendedmerchant idempotency / reconciliation key
remarksnofree text
beneficiaryBankno*payout bank for this order. Omit the whole object to use the KYB default (extra.bankAccounts). If present, accountName, accountNo and bankId must all be set
beneficiaryBank.accountNamewith beneficiaryBankaccount holder name
beneficiaryBank.accountNowith beneficiaryBanklocal account number (NGN: 10-digit NUBAN)
beneficiaryBank.bankIdwith beneficiaryBanklocal bank code from the bank list, not a bank name
* HKD off-ramp still requires userRefundCryptoAddress and extInfo.travelRule.
NGN / KES must not send those fields.

Bank code validation (submit-time)#

For NGN / KES, beneficiaryBank.bankId is validated when the order is
submitted
, before the order is created. An unknown or unsupported code is
rejected immediately; it is not deferred to payout.
1.
Call GET /v1/account/list-banks?currency={quote fiat} (NGN or KES).
2.
Copy the returned bankCode into beneficiaryBank.bankId.
3.
Do not invent codes, use clearing names, or reuse another currency’s list.
currencybankIdaccountNo
NGNNIBSS code from list-banks (e.g. 058)10-digit NUBAN
KESlocal bank code from list-banks (e.g. 01)local account number
If beneficiaryBank is omitted, the same rule applies to the KYB default
bankAccounts[].bankCode when that default is used for the order.
Submit-time errors:
ODR00001047 — bank code is not in the quote channel's currency catalog.
ODR00001048 — bank catalog is unavailable; the order is not created.
ODR00001049 — beneficiary account format is invalid (NGN requires a 10-digit NUBAN).

Response data#

merchantOrderId, orderId, orderStatus (processing | success | fail).
Async final state via webhook STABLE_ORDER_UPDATED. Do not treat HTTP 200 alone as funds settled.
Guide: Guides → Convert.

Request

Body Params application/json

Examples
{
    "quoteId": "e49ddd0a21404dbc95df1d35771d7024",
    "merchantOrderId": "BPN_RD_OFFRAMP_1788788907",
    "userRefundCryptoAddress": {
        "address": "0xUserBinanceWithdrawAddress",
        "network": "ETH",
        "currency": "USDT"
    },
    "beneficiaryBank": {
        "accountName": "Sample Trading Limited",
        "accountNo": "12345678901",
        "bankId": "003"
    },
    "extInfo": {
        "returnUrl": "https://merchant.example.com/rd/return",
        "cancelUrl": "https://merchant.example.com/rd/cancel",
        "travelRule": {
            "originatorName": "Sample Trading Limited",
            "beneficiaryName": "Sample Trading Limited",
            "customerType": "CORPORATE",
            "country": "HK",
            "address": "1 Queen's Road Central, Hong Kong",
            "residenceCountry": "HK"
        }
    }
}

Request Code Samples

Shell
JavaScript
Java
Swift
Go
PHP
Python
HTTP
C
C#
Objective-C
Ruby
OCaml
Dart
R
Request Request Example
Shell
JavaScript
Java
Swift
cURL
curl --location '/v1/stable/order/submit-order' \
--header 'API-KEY: <api-key>' \
--header 'API-SIGNATURE: <api-key>' \
--header 'API-TIMESTAMP: <api-key>' \
--header 'Content-Type: application/json' \
--data '{
    "quoteId": "e49ddd0a21404dbc95df1d35771d7024",
    "merchantOrderId": "BPN_RD_OFFRAMP_1788788907",
    "userRefundCryptoAddress": {
        "address": "0xUserBinanceWithdrawAddress",
        "network": "ETH",
        "currency": "USDT"
    },
    "beneficiaryBank": {
        "accountName": "Sample Trading Limited",
        "accountNo": "12345678901",
        "bankId": "003"
    },
    "extInfo": {
        "returnUrl": "https://merchant.example.com/rd/return",
        "cancelUrl": "https://merchant.example.com/rd/cancel",
        "travelRule": {
            "originatorName": "Sample Trading Limited",
            "beneficiaryName": "Sample Trading Limited",
            "customerType": "CORPORATE",
            "country": "HK",
            "address": "1 Queen'\''s Road Central, Hong Kong",
            "residenceCountry": "HK"
        }
    }
}'

Responses

🟢200OK
application/json
Bodyapplication/json

Examples
{
    "status": 200,
    "code": "SUCCESS",
    "msg": "OK",
    "success": true,
    "traceId": "tr_3",
    "data": {
        "merchantOrderId": "m_20260730_001",
        "orderId": "ord_123",
        "orderStatus": "processing"
    }
}
Previous
Get Stablecoin Quote
Next
Get Order (Single) Detail
Built with