1. Payment Link
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
      • 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
        POST
      • List Payment links
        POST
      • Get Curreny Network Config
        GET
    • 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 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
      POST
    • 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
    • Get KYB/KYC submit + open account status
    • Get Stablecoin Quote
    • Create Stable Order
    • Get Order (Single) Detail
    • List Orders(Batch)
    • Submit hash
  • 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. Payment Link

Create Payment Link

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

Idempotency#

Use requestId to identify a create request. Reuse the same requestId when the outcome is unknown.
A duplicate requestId returns ODR00000040; it does not return the original Payment Link. Query
POST /v1/stable/collect/payment-links with the same requestId to recover the result.
userOrderNo is deprecated. If requestId is blank, userOrderNo will be used as the requestId.
If both are provided, requestId takes precedence.

Amount tolerance#

By default a payment must match the expected amount exactly. Supply amountTolerance on a One-Time
link to accept a payment that lands within a band around the expected amount. The band is two-sided:
both underpayment and overpayment inside the band are matched.
modeExtra fieldAccepted range
NONE—exactly the expected amount
PERCENTAGEpercentageexpected amount ± (expected amount × percentage)
FIXEDfixedAmountexpected amount ± fixedAmount
mode is uppercase and case-sensitive, unlike paymentLinkType. Set at most one of percentage and
fixedAmount; the value must be positive. Both are capped by a platform limit, and fixed-amount
tolerance additionally has to be enabled for the currency.
Tolerance is not available on Permanent links.
When an accepted payment is below the expected amount, the platform fee is scaled down in proportion
to the amount actually received and the merchant is credited with the remainder. Overpayment above
the expected amount is routed to the excess-funds flow rather than credited to the order.
The response always echoes the effective configuration. A link created without tolerance returns
"amountTolerance": { "mode": "NONE" }.

Deposit addresses#

addressList is returned only to merchants for whom address pre-allocation is enabled. For those
merchants a One-Time crypto-priced link with a concrete supportCurrency is activated at creation
and its deposit addresses are returned immediately, one entry per eligible chain. Every other
merchant, and every link that is not eligible for pre-allocation, keeps the hosted checkout flow and
receives no addressList.
When an entry carries a memo, the payer must include it or the deposit cannot be matched.

Error codes#

Business failures return status 500 and an ODR-prefixed code (OrderErrorCode). These are not
8-digit numbers like the Wallet APIs.
codeMeaning
ODR00000040Duplicate requestId — a Payment Link already exists for it
ODR00000041A parameter was rejected
ODR00000042amountTolerance.percentage and amountTolerance.fixedAmount were both supplied
ODR00000043The tolerance exceeds the platform limit, or fixed-amount tolerance is not enabled for that currency
ODR00000044amountTolerance was supplied on a link that is not One-Time
ODR00000045Address pre-allocation is enabled for the merchant but no deposit address was available on any eligible chain
ODR00000041 covers every parameter check on this endpoint. It is returned when:
Condition
paymentLinkType is ONETIME and paymentValidTime is missing or not positive
crypto collection without targetAccountId
targetAccountId does not resolve to an active wallet
supportCurrency is ALL on a One-Time link
fiat collection with fiatAmount missing or not positive
One-Time crypto link with cryptoAmount missing or not positive
the amount is below the minimum receive amount for that currency
supportCurrency or supportNetwork is blank
supportCurrency is ALL combined with a specific supportNetwork
supportCurrency is not a platform-supported currency
supportNetwork is not among the networks allowed for that currency
payerInfo is omitted
payerInfo.userType is absent while payerNameUnavailable is false
an individual payer is missing firstName or lastName
a corporate payer is missing companyName
payerInfo.userType is neither individual nor corporate
paymentLinkType is not recognised
the business type is not recognised
amountTolerance.mode is PERCENTAGE and percentage is missing or not positive
amountTolerance.mode is FIXED and fixedAmount is missing or not positive

Request

Authorization
API Key
Add parameter in header
API-KEY
Example:
API-KEY: ********************
API Key
Add parameter in header
API-SIGNATURE
Example:
API-SIGNATURE: ********************
API Key
Add parameter in header
API-TIMESTAMP
Example:
API-TIMESTAMP: ********************
or
Body Params application/jsonRequired

Examples
{
    "productRemark": "Test Product Remark",
    "recipientName": "Vertex",
    "recipientAccountId": "100000221",
    "fiatCurrency": "USD",
    "fiatAmount": 100,
    "supportCurrency": "USDT",
    "supportNetwork": "ALL",
    "paymentLinkType": "onetime",
    "paymentValidTime": 15,
    "payerInfo": {
        "payerNameUnavailable": true
    },
    "requestId": "pl_req_example_1"
}

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/collect/create-payment-link' \
--header 'API-KEY: <api-key>' \
--header 'API-SIGNATURE: <api-key>' \
--header 'API-TIMESTAMP: <api-key>' \
--header 'Content-Type: application/json' \
--data '{
    "productRemark": "Test Product Remark",
    "recipientName": "Vertex",
    "recipientAccountId": "100000221",
    "fiatCurrency": "USD",
    "fiatAmount": 100,
    "supportCurrency": "USDT",
    "supportNetwork": "ALL",
    "paymentLinkType": "onetime",
    "paymentValidTime": 15,
    "payerInfo": {
        "payerNameUnavailable": true
    },
    "requestId": "pl_req_example_1"
}'

Responses

🟢200Success
application/json
Bodyapplication/json

Example
{
    "status": 200,
    "code": "SUCCESS",
    "msg": "ok",
    "data": {
        "paymentId": "sample_paymentId",
        "productRemark": "Invoice payment",
        "requestId": "sample_requestId",
        "userOrderNo": "mo_20260805_001",
        "recipientName": "Alice",
        "recipientAccountId": "acc_recv_001",
        "fiatCurrency": "BRL",
        "fiatAmount": "100.00",
        "cryptoCurrency": "USDT",
        "cryptoAmount": "100.00",
        "quotePrice": "sample_quotePrice",
        "supportCurrency": "USDT",
        "supportNetwork": "ETH",
        "payerInfo": {
            "payerNameUnavailable": true
        },
        "returnUrl": "https://merchant.example/webhook",
        "status": 200,
        "paymentLinkType": "permanent",
        "paymentValidTime": 1,
        "paymentLink": "sample_paymentLink",
        "effectiveTime": 1,
        "expiresTime": 1,
        "createTime": 1720000000000,
        "addressList": [
            {
                "address": "sample_address",
                "addressQrCode": "sample_addressQrCode",
                "coin": "USDT",
                "network": "ETH",
                "name": "Ethereum (ERC20)",
                "memo": "123456789"
            }
        ],
        "amountTolerance": {
            "mode": "NONE",
            "percentage": 0.01,
            "fixedAmount": 0.5
        }
    },
    "traceId": "a1b2c3d4e5f6"
}
Previous
Submit to platform
Next
List Payment links
Built with