| Date | New | Modified | Deleted |
|---|---|---|---|
| 2026-09-16 | 0 | 5 | 0 |
| 2026-08-14 | 1 | 4 | 0 |
| 2026-07-19 | 16 | 0 | 0 |
| 2026-07-17 | 2 | 3 | 0 |
| 2026-07-10 | 4 | 9 | 0 |
| 2026-06-24 | 4 | 0 | 0 |
| 2026-06-16 | 0 | 3 | 0 |
| 2026-04-08 | 0 | 39 | 1 |
| Status | Count | Note |
|---|---|---|
| New APIs | 0 | - |
| Deleted APIs | 1 | Fully removed |
| Modified APIs | 39 | With field-level changes |
| Unchanged APIs | 33 | No modifications |
| Total APIs (v2.0) | 73 |
/v1.0/oauth/token → /v2.0/oauth/token/v1.0/ledger/account → /v2.0/ledger/account/v1.0/payment/account/getInternalTransfer → /v2.0/payment/account/getInternalTransferstring -> integer/v1.0/payment/account/internalTransfer → /v2.0/payment/account/internalTransferstring -> integer/v2.0/crm/addressBook/createMerchant/v2.0/crm/addressBook/getMerchant/v1.0/crm/deposit/bankAccount → /v2.0/crm/deposit/bankAccount/v1.0/payment/fiat/deposit/detail → /v2.0/payment/fiat/deposit/detailstring -> integer/v1.0/payment/fiat/deposit/history → /v2.0/payment/fiat/deposit/historystring -> integer/v1.0/crm/addressBook/addBankAccount → /v2.0/crm/addressBook/addBankAccount/v1.0/crm/addressBook/bankAccount → /v2.0/crm/addressBook/bankAccount/v2.0/crm/fiatAccount/appStatus/v2.0/crm/fiatAccount/addInfo/submit/v2.0/payment/fiat/createWithdrawalnumber -> stringnumber -> stringnumber -> stringnumber -> string/v2.0/payment/fiat/withdrawal/detailnumber -> stringnumber -> stringnumber -> string/v2.0/payment/fiat/withdrawal/historynumber -> stringnumber -> stringnumber -> string/v1.0/payment/getCryptoDeposit → /v2.0/payment/getCryptoDeposit/v1.0/payment/getCryptoDepositHistory → /v2.0/payment/getCryptoDepositHistory/v1.0/crm/deposit/wallet → /v2.0/crm/deposit/wallet/v1.0/payment/crypto/updateCryptoDepositTravelRuleInfo → /v2.0/payment/crypto/updateCryptoDepositTravelRuleInfoFalse -> Trueobject -> nullTrue -> False/v1.0/payment/crypto/createCryptoWithdrawal → /v2.0/payment/crypto/createCryptoWithdrawalnumber -> stringnumber -> stringnumber -> string/v1.0/payment/getCryptoWithdrawal → /v2.0/payment/getCryptoWithdrawalnumber -> stringnumber -> string/v1.0/payment/getCryptoWithdrawalHistory → /v2.0/payment/getCryptoWithdrawalHistorynumber -> stringnumber -> string/v1.0/payment/crypto/getWalletAddress → /v2.0/payment/crypto/getWalletAddress/v1.0/payment/crypto/registerWalletAddress → /v2.0/payment/crypto/registerWalletAddress/v1.0/payment/crypto/removeWalletAddress → /v2.0/payment/crypto/removeWalletAddress/v1.0/trade/conversion/createConversion → /v2.0/trade/conversion/createConversion/v1.0/trade/conversion/createQuotation → /v2.0/trade/conversion/createQuotation/v1.0/trade/conversion/getConversion → /v2.0/trade/conversion/getConversion/v1.0/trade/conversion/getQuotation → /v2.0/trade/conversion/getQuotation/v2.0/auth/tools/upload/v2.0/tool/getTnC/{tncId}string -> integerConversion WebhookCrypto Deposit WebhookCrypto Withdrawal Webhooknumber -> stringnumber -> stringFiat Account Request Status WebhookFiat Deposit Webhookstring -> integerFiat Withdrawal Webhooknumber -> stringnumber -> stringnumber -> stringMerchant Status Webhook| Method | Path | Name |
|---|---|---|
| GET | /v1.0/payment/getStatement | Get Settlement Statement |
| Status | Count | Note |
|---|---|---|
| New APIs | 0 | — |
| Deleted APIs | 0 | — |
| Modified APIs | 3 | Field-level changes only |
Breaking change: No. All v2.0 valid requests remain valid in 20260616. URL paths, request/response structure, and field types are unchanged.
/v2.0/crm/addressBook/createMerchant (unchanged)merchantDetails → additionalCorporationDetails → natureOfBusiness (Modified)| Property | Old | New |
|---|---|---|
| Type | integer | integer (unchanged) |
| Required | Yes (tier 3 only) | Yes (all tiers) |
| Enum values | 1–18 | 1–24 |
| Description | "The nature of the company's business" | Extended with full label mapping |
| Value | Old Label | New Label |
|---|---|---|
| 2 | Manufacturing | Manufacturing and Industrial |
| 6 | Hospitality and Tourism | Hospitality and Travel |
| 7 | Real Estate and Construction | Real Estate and E-Commerce |
| 8 | Health Care and Pharmaceuticals | Healthcare |
| 9 | Professional and Services | Professional Services |
| 16 | Multimedia and Entertainment | Media and Entertainment |
| 17 | Cryptocurrency Mining | Cryptocurrency & Digital Assets |
Values 1, 3, 4, 5, 10, 11, 12, 13, 14, 15, 18 (Others) — labels unchanged. Integer values unchanged. No code change required for existing integrations.
| Value | Label |
|---|---|
| 19 | Insurance & Wealth |
| 20 | Trading & Commodities |
| 21 | Digital Products & Online Services |
| 22 | Business Support Services |
| 23 | Gaming |
| 24 | Advertising |
merchantDetails → additionalCorporationDetails → otherNatureOfBusiness (New)| Property | Value |
|---|---|
| Type | string |
| Required | No (optional) |
| Description | Specific business nature description. Use when natureOfBusiness = 18 (Others). |
merchantDetails → additionalCorporationDetails → sourceOfWealth (Modified)| Property | Old | New |
|---|---|---|
| Type | array[string] | array[string] (unchanged) |
| Required | No | Yes (tier 3) |
| Description | "Source of wealth (If HIGH risk and/or PEP)" | "Source of wealth. Required for tier 3 as of 20260616." |
merchantDetails → additionalPersonalDetails → sourceOfWealth (Modified)| Property | Old | New |
|---|---|---|
| Type | array[string] | array[string] (unchanged) |
| Required | No | Yes (tier 3) |
| Description | "Source of wealth" | "Source of wealth. Required for tier 3 as of 20260616." |
| Tier | Old Behavior | New Behavior |
|---|---|---|
| Tier 1/2 (Corporate) | additionalCorporationDetails not available | Can submit additionalCorporationDetails with only natureOfBusiness (and optional otherNatureOfBusiness). The 8-field required constraint is waived for this case (server-side exception). |
| Tier 3 (Corporate) | additionalCorporationDetails required; sourceOfWealth optional | additionalCorporationDetails required; sourceOfWealth now required (8 fields: operatingAddress, companyType, descriptionOfBusiness, purposesOfAccountOpening, sourceOfFunds, authSignatories, directors, sourceOfWealth) |
| Tier 3 (Individual) | additionalPersonalDetails optional; sourceOfWealth optional | additionalPersonalDetails optional; sourceOfWealth now required when the block is submitted (4 fields: occupation, purposesOfAccountOpening, sourceOfFunds, sourceOfWealth) |
/v2.0/crm/addressBook/getMerchant (unchanged)natureOfBusiness, otherNatureOfBusiness, and sourceOfWealth in additional details blocks.| Field | Location | Type |
|---|---|---|
natureOfBusiness | merchantInfo.merchantDetails.additionalCorporationDetails | integer (1–24) |
otherNatureOfBusiness | merchantInfo.merchantDetails.additionalCorporationDetails | string |
sourceOfWealth | merchantInfo.merchantDetails.additionalCorporationDetails | array[string] |
sourceOfWealth | merchantInfo.merchantDetails.additionalPersonalDetails | array[string] |
eventType, notificationId, data with applicationId / merchantInfo / status / statusInfo / updatedAt) is unchanged from v2.0.natureOfBusiness, otherNatureOfBusiness, sourceOfWealth) are included within merchantInfo when present on the merchant record.sourceOfWealth in tier 3 merchant creation — your existing requests remain valid.natureOfBusiness is now required for every corporate merchant creation. Submit it within additionalCorporationDetails.sourceOfWealth is now required in both additionalCorporationDetails (CORPORATE) and additionalPersonalDetails (INDIVIDUAL).natureOfBusiness = 18 (Others), consider adopting the new otherNatureOfBusiness field to provide a specific business type description.| Value | Label | Status |
|---|---|---|
| 1 | Financial Services | Unchanged |
| 2 | Manufacturing and Industrial | Renamed |
| 3 | Information Technology | Unchanged |
| 4 | Agriculture and Farming | Unchanged |
| 5 | Retail and Wholesale | Unchanged |
| 6 | Hospitality and Travel | Renamed |
| 7 | Real Estate and E-Commerce | Renamed |
| 8 | Healthcare | Renamed |
| 9 | Professional Services | Renamed |
| 10 | Education and Training | Unchanged |
| 11 | Non Profit and Charity | Unchanged |
| 12 | Transaction and Logistics | Unchanged |
| 13 | Energy and Utilities | Unchanged |
| 14 | Telecommunications | Unchanged |
| 15 | Government and Public Sector | Unchanged |
| 16 | Media and Entertainment | Renamed |
| 17 | Cryptocurrency & Digital Assets | Renamed |
| 18 | Others | Unchanged |
| 19 | Insurance & Wealth | New |
| 20 | Trading & Commodities | New |
| 21 | Digital Products & Online Services | New |
| 22 | Business Support Services | New |
| 23 | Gaming | New |
| 24 | Advertising | New |
| Status | Count | Note |
|---|---|---|
| New APIs | 4 | - |
| Deleted APIs | 0 | Fully removed |
| Modified APIs | 0 | With field-level changes |
| Method | Path | Name |
|---|---|---|
| POST | /v2.0/payment/statements | Create statement |
| GET | /v2.0/payment/statements/{statementId} | Get statement overview |
| GET | /v2.0/payment/statements/{statementId}/entries | Get statement entries |
| GET | /v2.0/payment/statements/{statementId}/transactions | Get statement transactions |
| Status | Count | Note |
|---|---|---|
| New APIs | 4 | Fee Estimate, Points |
| Deleted APIs | 0 | — |
| Modified APIs | 9 | Withdrawal — amount semantics clarification (field-level only) |
Breaking change: No. All v2.0 valid requests remain valid. Existing withdrawal integrations are backward-compatible; points and fee estimate APIs are additive.
| Method | Path | Name |
|---|---|---|
| POST | /v2.0/payment/withdrawal/feeEstimate | Fee Estimate |
| GET | /v2.0/points/balance | Get Points Balance |
| GET | /v2.0/points/transactions | List Points Transactions |
| GET | /v2.0/points/transactions/detail | Get Points Transaction Detail |
POST /v2.0/payment/withdrawal/feeEstimatewithPoints: Estimate with points used for full fee redemptionwithoutPoints: Estimate without points (always returned)withPoints and currentPointsBalance fields are omitted from the response.currentPointsBalanceis a snapshot at query time; the actual balance at withdrawal submission may differ. Clients should display both scenarios and note "subject to actual settlement."
| Field | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Participant code |
paymentType | string | Yes | FIRST_PARTY or THIRD_PARTY |
accountType | string | Yes | FIAT or CRYPTO |
currency | string | Yes | Withdrawal currency (ISO 4217 for fiat, e.g. USD; token code for crypto, e.g. USDT) |
debitAmount | string | Conditional | Gross debit amount. Required when paymentType=FIRST_PARTY. Mutually exclusive with receivedAmount. |
receivedAmount | string | Conditional | Net received amount. Required when paymentType=THIRD_PARTY. Mutually exclusive with debitAmount. |
chargeType | string | No | Fiat third-party only. OUR / SHA / BEN. Defaults to merchant configuration. |
feeBearer | string | No | CUSTOMER (default) — fee borne by trading party; PARTNER — fee borne by platform partner. |
Amount field rules: Exactly one of debitAmountorreceivedAmountmust be provided, matching thepaymentType. FIRST_PARTY →debitAmount; THIRD_PARTY →receivedAmount.
| Field | Type | Description |
|---|---|---|
feeCurrency | string | Fee currency |
originalFee | string | Original fee before points redemption |
feeRate | string | Fee rate applied |
minFee | string | Minimum fee |
maxFee | string | Maximum fee ("0.00" = no upper limit) |
minimumWithdrawalAmount | string | Minimum withdrawal amount for this currency |
currentPointsBalance | string | Points balance snapshot (omitted when points not supported) |
feeBearer | string | Echoed from request. CUSTOMER or PARTNER. |
withPoints | object | Estimate with points redemption (omitted when not supported) |
withoutPoints | object | Estimate without points (always returned) |
withPoints / withoutPoints):| Field | Type | Description |
|---|---|---|
debitAmount | string | Gross debit amount from customer account |
receivedAmount | string | Net amount received by payee |
actualFee | string | Actual fee ("0.00" when fully offset by points in withPoints) |
pointsConsumed | string | Points consumed ("0" for withoutPoints) |
| paymentType | Required input | Meaning |
|---|---|---|
| FIRST_PARTY | debitAmount | Gross debit amount (↔ withdrawal amountType=1 Debit) |
| THIRD_PARTY | receivedAmount | Net received amount (↔ withdrawal amountType=2 Receive) |
GET /v2.0/points/balance| Parameter | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Participant code |
| Field | Type | Description |
|---|---|---|
participantCode | string | Participant code (echo) |
availablePoints | string | Current available points (settled, excluding pending) |
GET /v2.0/points/transactionsCONFIRMED and CANCELLED records are returned; PENDING records are excluded.| Parameter | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Participant code |
startTime | integer | Yes | Start time, Unix milliseconds |
endTime | integer | Yes | End time, Unix milliseconds. Span with startTime ≤ 90 days. |
offset | integer | No | Pagination offset |
limit | integer | No | Page size |
| Field | Type | Description |
|---|---|---|
list | array[PointsTransaction] | Transaction records |
pagination | object | {limit, offset, total, hasMore} |
| Field | Type | Description |
|---|---|---|
pointsTransactionId | string | Transaction unique ID |
businessType | string | OTC_CONVERSION (earn, +), WITHDRAWAL_DEDUCTION (consume, −), POINTS_EXPIRY (expiry, −), ROLLBACK (reversal), POBO_DEDUCTION (POBO fee, −) |
points | string | Points change; positive = earned, negative = consumed |
status | string | CONFIRMED or CANCELLED |
relatedId | string | Associated business order ID |
createdAt | integer | Creation time, Unix milliseconds |
expiresAt | integer | Expiry time (returned only when businessType=OTC_CONVERSION and status=CONFIRMED) |
GET /v2.0/points/transactions/detail| Mode | Required Parameters | Typical Result |
|---|---|---|
| Transaction ID mode | participantCode + pointsTransactionId | 1 record |
| Related ID mode | participantCode + relatedId | 1–2 records (e.g. deduction + rollback) |
pointsTransactionIdandrelatedIdare mutually exclusive. Providing both returns801014 VALIDATION_QUERY_MODE_CONFLICT.
| Parameter | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Participant code |
pointsTransactionId | string | Conditional | Points transaction unique ID. Mutually exclusive with relatedId. |
relatedId | string | Conditional | Associated business order ID (withdrawal / OTC order, etc.). Mutually exclusive with pointsTransactionId. |
| Field | Type | Description |
|---|---|---|
list | array[PointsTransaction] | Matching transaction records |
pagination | object | {limit, offset, total, hasMore} |
list follows the PointsTransaction schema (see A.4).amount represented a gross debit amount (total deducted from account, including fees) or a net received amount (amount the payee receives, excluding fees). This convention was derived from withdrawalType (for fiat) or beneficiaryWallet ownership (for crypto), which created ambiguity and integration complexity.amountType, adds fee bearer declaration via feeBearer, and formally separates debit / received amounts in the response via dedicated fields (debitAmount, receivedAmount). For fiat withdrawals, feeAmount and feeCurrency are added to the response (crypto withdrawal already had these fields). Legacy response fields (fees, estimatedAmountReceivable) are retained as aliases./v2.0/payment/crypto/createCryptoWithdrawal (unchanged)amountType and feeBearer request fields; amount semantics clarified.amountType (New)| Property | Value |
|---|---|
| Type | integer |
| Required | Yes (for new integrations) |
| Enum | 1 = Debit (gross debit amount), 2 = Receive (net received amount) |
| Default (backward compat) | Falls back on beneficiaryWallet ownership: first-party wallet → Debit, third-party wallet → Receive |
| Description | Explicitly declares the meaning of amount. New integrations must provide this field. |
feeBearer (New)| Property | Value |
|---|---|
| Type | integer |
| Required | No |
| Enum | 1 = Customer (borne by trading party), 2 = Partner (borne by platform partner) |
| Default | 1 (Customer) |
amount (Modified — semantics only, type unchanged)When amountTypeis not provided, the backend falls back on the existingbeneficiaryWalletlogic. Existing integrations do not need to change.
| Field | Type | Description |
|---|---|---|
amountType | integer | Echoed from request. 1=Debit, 2=Receive. |
feeBearer | integer | Echoed from request. 1=Customer, 2=Partner. |
debitAmount | string | Gross debit amount. debitAmount = receivedAmount + feeAmount always holds. |
receivedAmount | string | Net amount received by payee (excluding platform fees). |
Legacy response fields unchanged. New fields are additive.
/v2.0/payment/getCryptoWithdrawal (unchanged)amountType, feeBearer, debitAmount, receivedAmount.| Field | Type | Description |
|---|---|---|
amountType | integer | 1=Debit, 2=Receive |
feeBearer | integer | 1=Customer, 2=Partner |
debitAmount | string | Gross debit amount |
receivedAmount | string | Net amount received by payee |
All existing fields unchanged. Additive only.
/v2.0/payment/getCryptoWithdrawalHistory (unchanged)amountType, feeBearer, debitAmount, receivedAmount.amountType, feeBearer, debitAmount, receivedAmount.| Field | Type | Description |
|---|---|---|
amountType | integer | 1=Debit, 2=Receive |
feeBearer | integer | 1=Customer, 2=Partner |
debitAmount | string | Gross debit amount |
receivedAmount | string | Net amount received by payee |
Existing payload fields unchanged. Webhook signature verification, retry policy, and security model unchanged.
/v2.0/payment/fiat/createWithdrawal (unchanged)amountType and feeBearer request fields; amount semantics clarified.amountType (New)| Property | Value |
|---|---|
| Type | integer |
| Required | Yes (for new integrations) |
| Enum | 1 = Debit (gross debit amount), 2 = Receive (net received amount) |
| Default (backward compat) | Falls back on withdrawalType: withdrawalType=1 (First Party) → Debit, withdrawalType=2 (Third Party) → Receive |
feeBearer (New)| Property | Value |
|---|---|
| Type | integer |
| Required | No |
| Enum | 1 = Customer, 2 = Partner |
| Default | 1 (Customer) |
amount (Modified — semantics only)| Field | Type | Description |
|---|---|---|
amountType | integer | Echoed from request. 1=Debit, 2=Receive. |
feeBearer | integer | Echoed from request. 1=Customer, 2=Partner. |
debitAmount | string | Gross debit amount. |
feeAmount | string | Platform fee. Alias for legacy fees. |
feeCurrency | string | Fee currency (ISO 4217). |
receivedAmount | string | Net amount received by payee. Alias for legacy estimatedAmountReceivable. |
| Legacy Field | Equivalent |
|---|---|
fees | feeAmount |
estimatedAmountReceivable | receivedAmount |
Both legacy and new field names are returned. No removal.
/v2.0/payment/fiat/withdrawal/detail (unchanged)amountType, feeBearer, debitAmount, feeAmount, feeCurrency, receivedAmount. Fields echoed from creation-time values. Legacy fees and estimatedAmountReceivable retained as aliases./v2.0/payment/fiat/withdrawal/history (unchanged)| Field | Type | Description |
|---|---|---|
amountType | integer | 1=Debit, 2=Receive |
feeBearer | integer | 1=Customer, 2=Partner |
debitAmount | string | Gross debit amount |
feeAmount | string | Platform fee (alias for fees) |
feeCurrency | string | Fee currency |
receivedAmount | string | Net amount received (alias for estimatedAmountReceivable) |
Legacy fields feesandestimatedAmountReceivableretained.
| amountType | Meaning of amount | Account is debited | Payee receives |
|---|---|---|---|
| 1 = Debit | Gross debit amount (including fees) | amount | amount − feeAmount |
| 2 = Receive | Net received amount (excluding fees) | amount + feeAmount | amount |
debitAmount = receivedAmount + feeAmount always holds, regardless of feeBearer. The feeBearer only determines whose account the fee portion is deducted from.| feeBearer | Fee deducted from | Effect |
|---|---|---|
| 1 = Customer (default) | Trading party participant account | Full debitAmount from trading party account |
| 2 = Partner | Platform partner participant account (fee portion only) | feeAmount portion from partner account; remaining from trading party account |
amountType is absent.amountType in Create Withdrawal requests.amountType to make amount semantics explicit. The fallback preserves current behavior, but explicit declaration improves auditability.fees or estimatedAmountReceivable, you may optionally switch to feeAmount and receivedAmount. Both sets are returned.| Context | Old Field | New Field | Status |
|---|---|---|---|
| Request (Create Withdrawal) | amount (ambiguous) | amount + amountType | Old format still accepted |
| Response | fees | feeAmount | Alias (both returned) |
| Response | estimatedAmountReceivable | receivedAmount | Alias (both returned) |
| Field | APIs | Type |
|---|---|---|
availablePoints | GET /points/balance response | string |
list / pagination | GET /points/transactions response | array / object |
points / businessType / status / relatedId / expiresAt | PointsTransaction | string / integer |
feeCurrency / originalFee / feeRate / minFee / maxFee | Fee Estimate response | string |
currentPointsBalance | Fee Estimate response | string |
withPoints / withoutPoints | Fee Estimate response | object |
debitAmount / receivedAmount | Fee Estimate request & response | string |
feeBearer | Fee Estimate request & response | string (CUSTOMER / PARTNER) |
| Field | APIs Where Added | Type | Enum |
|---|---|---|---|
amountType | Create Crypto/Fiat Withdrawal (req), All queries & webhooks (resp) | integer | 1=Debit, 2=Receive |
feeBearer | Create Crypto/Fiat Withdrawal (req), All queries & webhooks (resp) | integer | 1=Customer, 2=Partner |
debitAmount | All query & webhook responses | string | — |
feeAmount | Fiat query & webhook responses | string | — |
feeCurrency | Fiat query & webhook responses | string | — |
receivedAmount | All query & webhook responses | string | — |
| Status | Count | Note |
|---|---|---|
| New APIs | 2 | Merchant Activation (Non-FI partners) |
| Deleted APIs | 0 | — |
| Modified APIs | 3 | Merchant — activationStatus added (field-level) |
Breaking change: No. Existing integrations remain compatible — the two activation endpoints are additive; activationStatusis an additive field on existing merchant responses/payloads; request bodies of existing endpoints are unchanged.
| FI Partner | Non-FI Partner | |
|---|---|---|
| After creating a merchant | Ready to use | Activation required |
| Calling activation endpoints | Returns 400, not needed | Normal |
internalTransfer | ✅ Available | ❌ Not available |
activationStatus value | Always NO_NEED_ACTIVATION | Follows the state machine |
Main call chain: createMerchant → getMerchant → initiateActivation → confirmActivation.getTnCis not part of this chain — it is an auxiliary call used to fetch the agreement link, which the partner places on the OTP entry page for the merchant to review.
| Value | Meaning | Fund-write APIs available? |
|---|---|---|
NOT_ACTIVATED | Merchant created, activation not yet started | ❌ |
PENDING_ACTIVATION | OTP sent to merchant email, awaiting confirmation | ❌ |
EXPIRED | OTP expired unused | ❌ |
LOCKED | 5 wrong OTP attempts, locked for 30 min | ❌ |
ACTIVATED | Activated (terminal) | ✅ (except internalTransfer) |
NO_NEED_ACTIVATION | FI-partner merchant (terminal) | ✅ (all) |
createMerchant → getMerchant → initiateActivation → confirmActivation. getTnC is an auxiliary call for displaying the agreement (see the note under A.4.3).POST /v2.0/crm/addressBook/createMerchantactivationStatus = NOT_ACTIVATED. The response does not include activationStatus; query it via Get Merchant.GET /v2.0/crm/addressBook/getMerchantparticipantCode or clientReference.| Field | Description |
|---|---|
merchantStatus | KYC status: 1=PROCESSING, 2=APPROVED, 3=REJECTED |
activationStatus | Activation state, initially NOT_ACTIVATED |
Activation can only be initiated after the merchant's KYC is approved ( merchantStatus = 2).
POST /v2.0/crm/merchant/initiateActivation| Field | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Target merchant |
clientReference | string | No | Idempotency key, ≤100 chars |
{
"code": 200,
"msg": "success",
"data": {
"participantCode": "B0100106",
"activationStatus": "PENDING_ACTIVATION",
"otpSentToMaskedEmail": "j***@e***.com",
"otpExpiresAt": 1768636800000,
"tncId": "N001"
}
}| Response field | Description |
|---|---|
otpSentToMaskedEmail | Masked email the OTP was sent to |
otpExpiresAt | OTP expiry, UNIX timestamp (ms); valid for 10 minutes |
tncId | Agreement code for this activation; used to fetch the agreement link (below) and as acceptedTnC in A.4.4 |
ACTIVATED; re-calling in PENDING_ACTIVATION/EXPIRED → the previous OTP is invalidated and a new one sent.GET /v2.0/tool/getTnC/{tncId}tncId from the response above as the path parameter to fetch the agreement link, then place tncContent (agreement PDF) on the OTP entry page for the merchant to review.{
"code": 200,
"msg": "success",
"data": {
"tncId": "N001",
"name": "Partner_Program_Agreement_EndUser_Authorization",
"version": "V1.0",
"tncContent": "https://.../Partner_Program_Agreement_EndUser_Authorization.pdf",
"effectiveFrom": "2026-07-15"
}
}POST /v2.0/crm/merchant/confirmActivation| Field | Type | Required | Description |
|---|---|---|---|
participantCode | string | Yes | Target merchant |
otp | string | Yes | 6-digit OTP submitted by the merchant |
acceptedTnC | string[] | Yes | Agreement code(s); must match the tncId returned by initiateActivation, e.g. ["N001"] |
{
"code": 200,
"msg": "success",
"data": {
"participantCode": "B0100106",
"activationStatus": "ACTIVATED",
"activatedAt": 1768637100000
}
}ACTIVATED, fund-write APIs are unlocked.activationStatus other than ACTIVATED / NO_NEED_ACTIVATION):| Endpoint | Path | Meaning |
|---|---|---|
| Create Crypto Withdrawal | POST /v2.0/payment/crypto/createCryptoWithdrawal | Crypto withdrawal |
| Create Fiat Withdrawal | POST /v2.0/payment/fiat/createWithdrawal | Fiat withdrawal |
| Activate Same Name Withdrawal | POST /v2.0/payment/fiat/sameNameWithdrawal/activate | Same-name withdrawal activation |
| Create Conversion | POST /v2.0/trade/conversion/createConversion | Conversion |
Internal Transfer (POST /v2.0/payment/account/internalTransfer) is not available to Non-FI partners.GET /v2.0/crm/addressBook/getMerchantdata adds activationStatus (read-only, enum in A.3). Existing merchantStatus and merchantInfo are unchanged.POST /v2.0/crm/addressBook/createMerchantNOT_ACTIVATED with fund operations disabled by default until activated. activationStatus is not returned in this response — query it via Get Merchant.POST /webhooks/merchant-status/v2data adds activationStatus. Activation itself does not trigger this webhook (confirmActivation returns the result synchronously); the webhook continues to fire on existing merchant KYC-status changes, now additionally carrying activationStatus.Impact on existing integrations: Get Merchant and the webhook consumers must tolerate the new field and not reject payloads with unrecognised fields.
| Endpoint | Path | Type |
|---|---|---|
| Create Merchant | POST /v2.0/crm/addressBook/createMerchant | Existing |
| Get Merchant | GET /v2.0/crm/addressBook/getMerchant | Existing (added activationStatus) |
| Initiate Activation | POST /v2.0/crm/merchant/initiateActivation | New |
| Confirm Activation | POST /v2.0/crm/merchant/confirmActivation | New |
| Get TnC | GET /v2.0/tool/getTnC/{tncId} | Existing (auxiliary, for displaying the agreement) |
| Merchant Status Webhook | POST /webhooks/merchant-status/v2 | Existing (added activationStatus) |
Crypto Checkout & Refund v2.0 — introduced on this branch.
| Status | Count | Note |
|---|---|---|
| New APIs | 16 | Crypto Checkout v2.0 (10) + Crypto Refund v2.0 (6) |
| Deleted APIs | 0 | v1.0 checkout/refund endpoints remain available |
| Modified APIs | 0 | — |
Breaking change: No. The v2.0 checkout/refund surface is additive; existing v1.0 checkout/refund integrations are unaffected.
/v2.0/payment/crypto/checkouts, replacing the v1.0 createCryptoCheckout style.| Method | Path | Name | Status |
|---|---|---|---|
| POST | /v2.0/payment/crypto/checkouts | Create Checkout | released |
| POST | /v2.0/payment/crypto/checkouts/quotations | Create Checkout Quotation | released |
| POST | /v2.0/payment/crypto/checkouts/{checkoutId}/confirm | Confirm Checkout | released |
| POST | /v2.0/payment/crypto/checkouts/{checkoutId}/accept | Accept Checkout | developing |
| GET | /v2.0/payment/crypto/checkouts/history | List Checkout History | developing |
| GET | /v2.0/payment/crypto/checkouts/{checkoutId} | Get Checkout Detail | released |
| POST | /v2.0/payment/crypto/checkouts/{checkoutId}/close | Close Checkout | released |
| GET | /v2.0/payment/crypto/checkouts/cryptos | Get Checkout Acceptable Cryptos | released |
| GET | /v2.0/payment/crypto/checkouts/{checkoutId}/refundable-info | Get Checkout Refundable Info | released |
| POST | (partner webhook) | Checkout Status Webhook | released |
OPENING → AWAITING_PAYMENT → RECEIVED → SUCCEEDED → SETTLED
↓ ↓\n EXPIRED CLOSED/v2.0/payment/crypto/refunds, replacing the v1.0 createCryptoRefund / confirmCryptoRefund style.| Method | Path | Name | Status |
|---|---|---|---|
| POST | /v2.0/payment/crypto/refunds/refund | Create Refund | released |
| POST | /v2.0/payment/crypto/refunds/risk-refund | Create Risk Refund | released |
| POST | /v2.0/payment/crypto/refunds/void | Create Void Refund | released |
| POST | /v2.0/payment/crypto/refunds/{refundId}/close | Close Refund | released |
| GET | /v2.0/payment/crypto/refunds/{refundId} | Get Refund Detail | released |
| POST | (partner webhook) | Refund Status Webhook | released |
INITIATED → PROCESSING → COMPLETED
↓\n REJECTED
↓\n CLOSED| Type | Use Case | Endpoint |
|---|---|---|
REFUND | Standard post-settlement refund | /refunds/refund |
RISK_REFUND | KYT-triggered risk refund | /refunds/risk-refund |
VOID | Pre-settlement void (overpayment, incomplete order, wrong currency) | /refunds/void |
| Status | Count | Note |
|---|---|---|
| New APIs | 1 | Crypto Deposit Wallet Status Webhook |
| Deleted APIs | 0 | - |
| Modified APIs | 4 | Create Fiat Withdrawal (POBO controls); Crypto Deposit address risk management (3 endpoints) |
Breaking change: No. First-party withdrawals (withdrawalType=1) are unaffected; purposeOfTransaction stays a string.
POST /v2.0/payment/fiat/createWithdrawalPOST /webhooks/crypto-deposit-address/suspendeddata.addresses[]: blockchain, suspendedAddress, newAddress (populated on KYT-triggered suspension; null when disabled manually), suspendedAt. Applies to: PSP.GET /v2.0/crm/deposit/wallet)wallets[]:GET /v2.0/payment/getCryptoDeposit)POST /webhooks/crypto-deposit)Get Crypto Deposit History is intentionally unchanged: address status is exposed only on the single-deposit and wallet endpoints, not on history.
Crypto Checkout & Refund v2.2 — reference-currency quoting, plus refund/void fee-bearer refinements.
| Status | Count | Note |
|---|---|---|
| New APIs | 0 | — |
| Deleted APIs | 0 | — |
| Modified APIs | 5 | Create Checkout; Get Checkout; Create Crypto Refund; Create Crypto Void; Create Crypto Risk Refund |
Breaking change: No. All changes are additive or relax existing requirements, so existing requests remain valid.
ReferenceAmountRequestDto, ReferenceAmountResponseDto.POST /v2.0/payment/crypto/checkoutsReferenceAmountRequestDto)referenceAmount = reference currency and amount (e.g. {currency: SGD, amount: 135.00}); orderCurrency = target order currency (currently only USD).orderAmount or referenceAmount must be provided (at least one).paymentMethod is a top-level field; when it is provided, buyerInfo becomes mandatory.ReferenceAmountResponseDto)referenceAmount + referencePrice), present only when referenceAmount was sent in the request.GET /v2.0/payment/crypto/checkouts/{checkoutId}ReferenceAmountResponseDto)referenceAmount was sent at Create Checkout.POST /v2.0/payment/crypto/refunds/refundBUYER when omitted.POST /v2.0/payment/crypto/refunds/voidBUYER | MERCHANT; defaults to BUYER.POST /v2.0/payment/crypto/refunds/risk-refundfeeBearer; refundCurrency and blockchain no longer required.