1. v2.1
v2.1 (Production)
  • v2.1 (Production)
  • v2.1 (Sandbox)
  • v2.0 (Sandbox)
  • v1.0 (Deprecated)
  • v2.1
    • Getting Started
    • Account Setup For PSP
    • Account Setup For Direct Client
    • Idempotent Requests
    • Webhook
    • API Error Handling Guide
    • Changelog
    • Authentication
      • Create Token
    • Account Management
      • Get Balance
      • Internal Transfer
      • Get Internal Transfer
    • Merchant Management
      • Initiate Merchant Activation
      • Confirm Merchant Activation
      • Create Merchant
      • Get Merchant
      • Merchant Status Webhook
    • Fiat Payment
      • Fiat Deposit
        • Get Deposit Bank Account
        • Get Fiat Deposit Detail
        • Get Fiat Deposit History
        • Fiat Deposit Webhook
      • Fiat Account Management
        • Get Fiat Account Capabilities
        • Create Fiat Account Request
        • Submit Additional Information for Fiat Account Request
        • Get Fiat Account Application Status
        • Get Bank Accounts
        • Add Bank Account
        • Fiat Account Request Status Webhook
      • Fiat Withdrawal
        • Get Same Name Withdrawal Capabilities
        • Activate Same Name Withdrawal
        • Submit Additional Information for Activating Same Name Withdrawal
        • Activate Same Name Withdrawal Webhook
        • Create Fiat Withdrawal
        • Submit Additional Information for Fiat Withdrawal Request
        • Get Fiat Withdrawal Detail
        • Get Fiat Withdrawal History
        • Fiat Withdrawal Webhook
    • Crypto Payment
      • Crypto Deposit
        • Update Crypto Deposit Travel Rule Info
        • Get Crypto Deposit Wallet
        • Get Crypto Deposit
        • Get Crypto Deposit History
        • Crypto Deposit Webhook
      • Crypto Withdrawal
        • Register Wallet Address
        • Remove Wallet Address
        • Create Crypto Withdrawal
        • Get Wallet Address
        • Get Crypto Withdrawal
        • Get Crypto Withdrawal History
        • Crypto Withdrawal Webhook
      • Crypto Checkout v1.0
        • Create Crypto Checkout
        • Create Crypto Checkout Link
        • Crypto Checkout Wallet Connection
        • Generate POS Payment Request
        • Close Crypto Checkout
        • Get Convertible Cryptos
        • Get Supported Blockchains
        • Get Crypto Checkout
        • Get Crypto Checkout Link
        • Get Crypto Checkout Currencies
        • Crypto Checkout Webhook
      • Crypto Refund v1.0
        • Create Crypto Refund
        • Confirm Crypto Refund
        • Get Crypto Refund
        • Crypto Refund Webhook
      • Crypto Checkout v2.0
        • Create Checkout
        • Create Crypto Quotation
        • Order Accept
        • Get Checkout History
        • Get Checkout
        • Close Checkout
        • Get Checkout Acceptable Cryptos
        • Checkout Status Webhook
      • Crypto Refund v2.0
        • Get Checkout Refundable Info
        • Create Crypto Void
        • Create Crypto Risk Refund
        • Create Crypto Refund
        • Close Crypto Refund
        • Get Crypto Refund
        • Refund Status Webhook
    • Conversion
      • Create Quotation
      • Create Conversion
      • Get Quotation
      • Get Conversion
      • Conversion Webhook
    • Statements
      • Create statement
      • Get statement overview
      • Get statement entries
      • Get statement transactions
    • Points
      • Get Points Balance
      • List Points Transactions
      • Get Points Transaction Detail
    • Fee Estimate
      • Fee Estimate
    • Tool
      • Upload File
      • getTnC
  1. v2.1

Changelog

All API changes for the CAMP Connect API, consolidated from individual changelog entries.
DateNewModifiedDeleted
2026-07-191600
2026-07-17230
2026-07-10490
2026-06-24400
2026-06-16030
2026-04-080391

20260408#

Executive Summary#

StatusCountNote
New APIs0-
Deleted APIs1Fully removed
Modified APIs39With field-level changes
Unchanged APIs33No modifications
Total APIs (v2.0)73

Detailed API Changes#

The following sections detail all field-level modifications, organized by functional category.

Authentication#

Create Token#

Path: /v1.0/oauth/token → /v2.0/oauth/token
Method: POST
Summary Change:
Old: Get Token
New: Create Token
Request Body Changes:
client_id (Deleted)
Type: string
Required: True
Description: Client's ID
client_secret (Deleted)
Type: string
Required: True
Description: Client's Secret
clientId (Added)
Type: string
Required: True
Description: Client's ID
clientSecret (Added)
Type: string
Required: True
Description: Client's Secret
Response Body Changes:
access_token (Deleted)
Type: string
Required: False
Description: Access token
expires_in (Deleted)
Type: integer
Required: False
Description: Token expiry time
not-before-policy (Deleted)
Type: integer
Required: False
Description: A timestamp before which tokens are considered invalid
refresh_expires_in (Deleted)
Type: integer
Required: False
Description: Time in seconds until the token expiry is refreshed
scope (Deleted)
Type: string
Required: False
Description: Scope included in the token
token_type (Deleted)
Type: string
Required: False
Description: Token type
accessToken (Added)
Type: string
Required: False
Description: Access token
expiresIn (Added)
Type: integer
Required: False
Description: Token expiry time
tokenType (Added)
Type: string
Required: False
Description: Token type

Account Management#

Get Balance#

Path: /v1.0/ledger/account → /v2.0/ledger/account
Method: GET

Get Internal Transfer#

Path: /v1.0/payment/account/getInternalTransfer → /v2.0/payment/account/getInternalTransfer
Method: GET
Response Body Changes:
data
createdAt
Type: string -> integer
Description Change:
Old: Transfer transaction time
New: Transfer transaction time (Unix timestamp in milliseconds)

Internal Transfer#

Path: /v1.0/payment/account/internalTransfer → /v2.0/payment/account/internalTransfer
Method: POST
Response Body Changes:
data
createdAt
Type: string -> integer
Description Change:
Old: Transfer transaction time
New: Transfer transaction time (Unix timestamp in milliseconds)

Merchant Management#

Create Merchant#

Path: /v2.0/crm/addressBook/createMerchant
Method: POST
Request Body Changes:
merchantDetails
personalDetails
contactNumber
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
dateOfBirth
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
taxResidency
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
corporationDetails
dateOfIncorporation
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
Response Body Changes:
data
merchantInfo
merchantDetails
personalDetails
contactNumber
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
dateOfBirth
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
taxResidency
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
corporationDetails
dateOfIncorporation
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
status
Description Change:
Old: Current status of the application
New: Current status of the application Enum values: - 1: PROCESSING - 2: APPROVED - 3: REJECTED

Get Merchant#

Path: /v2.0/crm/addressBook/getMerchant
Method: GET
Response Body Changes:
data
merchantInfo
merchantDetails
personalDetails
contactNumber
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
dateOfBirth
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
taxResidency
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
corporationDetails
dateOfIncorporation
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
merchantStatus
Description Change:
Old: Merchant status
New: Merchant status Enum values: - 1: PROCESSING - 2: APPROVED - 3: REJECTED

Fiat Payment#

Fiat Deposit#

Get Deposit Bank Account#
Path: /v1.0/crm/deposit/bankAccount → /v2.0/crm/deposit/bankAccount
Method: GET
Get Fiat Deposit Detail#
Path: /v1.0/payment/fiat/deposit/detail → /v2.0/payment/fiat/deposit/detail
Method: GET
Response Body Changes:
data
createdAt
Type: string -> integer
Description Change:
Old: Timestamp of deposit transaction, ISO-8601
New: Timestamp of deposit transaction (Unix timestamp in milliseconds)
Get Fiat Deposit History#
Path: /v1.0/payment/fiat/deposit/history → /v2.0/payment/fiat/deposit/history
Method: GET
Response Body Changes:
data
endTime
Description Change:
Old:
New: Unix timestamp in milliseconds
startTime
Description Change:
Old:
New: Unix timestamp in milliseconds
transactions
createdAt
Type: string -> integer
Description Change:
Old: Timestamp of deposit transaction, ISO-8601
New: Timestamp of deposit transaction (Unix timestamp in milliseconds)

Fiat Payment#

Fiat Account Management#

Add Bank Account#
Path: /v1.0/crm/addressBook/addBankAccount → /v2.0/crm/addressBook/addBankAccount
Method: POST
Get Bank Accounts#
Path: /v1.0/crm/addressBook/bankAccount → /v2.0/crm/addressBook/bankAccount
Method: GET
Get Fiat Account Application Status#
Path: /v2.0/crm/fiatAccount/appStatus
Method: GET
Response Body Changes:
data
status
Description Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
Submit Additional Information for Fiat Account Request#
Path: /v2.0/crm/fiatAccount/addInfo/submit
Method: POST
Response Body Changes:
data
status
Description Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
updatedAt
Description Change:
Old: Timestamp of update, UNIX timestamp in milliseconds (e.g., 1715000000000)
New: Timestamp of update, UNIX timestamp in milliseconds (e.g., 1715000000000)

Fiat Payment#

Fiat Withdrawal#

Create Fiat Withdrawal#
Path: /v2.0/payment/fiat/createWithdrawal
Method: POST
Request Body Changes:
amount
Type: number -> string
withdrawalType
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: - 1: First Party - 2: Third Party
Response Body Changes:
data
amount
Type: number -> string
estimatedAmountReceivable
Type: number -> string
fees
Type: number -> string
missingFields
Description Change:
Old: Missing fields for the withdrawal request. Ref. to {} for details
New: Missing fields
status
Description Change:
Old: Withdrawal status. Possible values: 1-PROCESSING, 2-COMPLETED, 3-CANCELLED, 4-FAILED, 5-PENDING.
New: Withdrawal status. Possible values: 1-PROCESSING, 2-COMPLETED, 3-CANCELLED, 4-FAILED, 5-PENDING. Enum values: - 1: PROCESSING - 2: COMPLETED - 3: CANCELLED - 4: FAILED - 5: PENDING
withdrawalType
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: - 1: First Party - 2: Third Party
Get Fiat Withdrawal Detail#
Path: /v2.0/payment/fiat/withdrawal/detail
Method: GET
Response Body Changes:
data
amount
Type: number -> string
estimatedAmountReceivable
Type: number -> string
fees
Type: number -> string
swiftChargingCode
Description Change:
Old:
New: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
withdrawalType
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: 1: First Party 2: Third Party
Get Fiat Withdrawal History#
Path: /v2.0/payment/fiat/withdrawal/history
Method: GET
Response Body Changes:
data
endTime
Description Change:
Old: The end time
New: The end time (Unix timestamp in milliseconds)
startTime
Description Change:
Old: The start time
New: The start time (Unix timestamp in milliseconds)
transactions
amount
Type: number -> string
estimatedAmountReceivable
Type: number -> string
fees
Type: number -> string
swiftChargingCode
Description Change:
Old:
New: Swift charging code: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
withdrawalType
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: - 1 - 2

Crypto Payment#

Crypto Deposit#

Get Crypto Deposit#
Path: /v1.0/payment/getCryptoDeposit → /v2.0/payment/getCryptoDeposit
Method: GET
Response Body Changes:
data
udpatedAt (Deleted)
Type: integer
Required: False
Description: Update time
updatedAt (Added)
Type: integer
Required: False
Description: Update time
status
Description Change:
Old: Status
New: Status 1 DETECTED 2 CONFIRMED 3 KYT FAILED 4 PENDING TRAVELRULE 5 TRAVELRULE COMPLETED 6 REJECTED 7 COMPLETED 8 CANCELLED 9 REFUNDED
Enum Change: Add: [9]
Get Crypto Deposit History#
Path: /v1.0/payment/getCryptoDepositHistory → /v2.0/payment/getCryptoDepositHistory
Method: GET
Response Body Changes:
data
transactions
udpatedAt (Deleted)
Type: integer
Required: False
Description: Update time
updatedAt (Added)
Type: integer
Required: False
Description: Update time
status
Description Change:
Old: Status
New: Status 1 DETECTED 2 CONFIRMED 3 KYT FAILED 4 PENDING TRAVELRULE 5 TRAVELRULE COMPLETED 6 REJECTED 7 COMPLETED 8 CANCELLED 9 REFUNDED
Enum Change: Add: [9]
Get Crypto Deposit Wallet#
Path: /v1.0/crm/deposit/wallet → /v2.0/crm/deposit/wallet
Method: GET
Update Crypto Deposit Travel Rule Info#
Path: /v1.0/payment/crypto/updateCryptoDepositTravelRuleInfo → /v2.0/payment/crypto/updateCryptoDepositTravelRuleInfo
Method: POST
Request Body Changes:
ownerInfo
Required: False -> True
Description Change:
Old: required if "isOwner" is false
New: Owner information
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Response Body Changes:
data
Type: object -> null
Required: True -> False

Crypto Payment#

Crypto Withdrawal#

Create Crypto Withdrawal#
Path: /v1.0/payment/crypto/createCryptoWithdrawal → /v2.0/payment/crypto/createCryptoWithdrawal
Method: POST
Request Body Changes:
amount
Type: number -> string
Response Body Changes:
data
amount
Type: number -> string
beneficiaryWallet
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
feeAmount
Type: number -> string
Get Crypto Withdrawal#
Path: /v1.0/payment/getCryptoWithdrawal → /v2.0/payment/getCryptoWithdrawal
Method: GET
Response Body Changes:
data
amount
Type: number -> string
beneficiaryWallet
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
feeAmount
Type: number -> string
Get Crypto Withdrawal History#
Path: /v1.0/payment/getCryptoWithdrawalHistory → /v2.0/payment/getCryptoWithdrawalHistory
Method: GET
Response Body Changes:
data
transactions
amount
Type: number -> string
beneficiaryWallet
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
feeAmount
Type: number -> string
Get Wallet Address#
Path: /v1.0/payment/crypto/getWalletAddress → /v2.0/payment/crypto/getWalletAddress
Method: GET
Response Body Changes:
data
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Register Wallet Address#
Path: /v1.0/payment/crypto/registerWalletAddress → /v2.0/payment/crypto/registerWalletAddress
Method: POST
Request Body Changes:
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Response Body Changes:
data
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Remove Wallet Address#
Path: /v1.0/payment/crypto/removeWalletAddress → /v2.0/payment/crypto/removeWalletAddress
Method: POST

Conversion#

Create Conversion#

Path: /v1.0/trade/conversion/createConversion → /v2.0/trade/conversion/createConversion
Method: POST

Create Quotation#

Path: /v1.0/trade/conversion/createQuotation → /v2.0/trade/conversion/createQuotation
Method: POST
Request Body Changes:
clientReference (Deleted)
Type: string
Required: False
Response Body Changes:
data
clientReference (Deleted)
Type: string
Required: False

Get Conversion#

Path: /v1.0/trade/conversion/getConversion → /v2.0/trade/conversion/getConversion
Method: GET

Get Quotation#

Path: /v1.0/trade/conversion/getQuotation → /v2.0/trade/conversion/getQuotation
Method: GET

Tool#

Upload File#

Path: /v2.0/auth/tools/upload
Method: POST
Response Body Changes:
fileId (Deleted)
Type: string
Required: False
Description: The unique id of the uploaded file
fileSize (Deleted)
Type: integer
Required: False
Description: The size of the uploaded file (byte)
code (Added)
Type: string
Required: True
Description: Response Code
data (Added)
Type: object
Required: True
msg (Added)
Type: string
Required: False
Description: Response Message

getTnC#

Path: /v2.0/tool/getTnC/{tncId}
Method: GET
Response Body Changes:
data
effectiveFrom
Type: string -> integer
Description Change:
Old: Effective date of the T&C
New: Effective date of the T&C (Unix timestamp in milliseconds)

Webhooks#

Conversion Webhook#

Type: Webhook
Name: Conversion Webhook
Method: POST
Request Body Changes:
eventType
Description Change:
Old: api_conversion_status_update
New: conversion.updated.v2

Crypto Deposit Webhook#

Type: Webhook
Name: Crypto Deposit Webhook
Method: POST
Request Body Changes:
data
udpatedAt (Deleted)
Type: integer
Required: False
Description: Update time
updatedAt (Added)
Type: integer
Required: False
Description: Update time
status
Description Change:
Old: Status
New: Status 1 DETECTED 2 CONFIRMED 3 KYT FAILED 4 PENDING TRAVELRULE 5 TRAVELRULE COMPLETED 6 REJECTED 7 COMPLETED 8 CANCELLED 9 REFUNDED
Enum Change: 新增: [9]
eventType
Description Change:
Old: Webhook event type = "api_deposit_crypto_status_update"
New: crypto.deposit.updated.v2

Crypto Withdrawal Webhook#

Type: Webhook
Name: Crypto Withdrawal Webhook
Method: POST
Request Body Changes:
data
amount
Type: number -> string
beneficiaryWallet
platformUserId
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
feeAmount
Type: number -> string
eventType
Description Change:
Old: api_withdrawal_crypto_status_update
New: crypto.withdrawal.updated.v2

Fiat Account Request Status Webhook#

Type: Webhook
Name: Fiat Account Request Status Webhook
Method: POST
Request Body Changes:
data
status
Description Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
eventType
Description Change:
Old: api_fiat_account_request_status_update
New: fiat.account.request.updated.v2

Fiat Deposit Webhook#

Type: Webhook
Name: Fiat Deposit Webhook
Method: POST
Request Body Changes:
data
createdAt
Type: string -> integer
Description Change:
Old: Timestamp of deposit transaction, ISO-8601
New: Timestamp of deposit transaction (Unix timestamp in milliseconds)
eventType
Description Change:
Old: Webhook event type = "api_deposit_status_update"
New: fiat.deposit.updated.v2

Fiat Withdrawal Webhook#

Type: Webhook
Name: Fiat Withdrawal Webhook
Method: POST
Request Body Changes:
data
amount
Type: number -> string
estimatedAmountReceivable
Type: number -> string
fees
Type: number -> string
swiftChargingCode
Description Change:
Old:
New: Swift charging code: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
withdrawalType
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: 1: First Party 2: Third Party
eventType
Description Change:
Old: Webhook event type = "api_withdrawal_status_update"
New: fiat.withdrawal.updated.v2

Merchant Status Webhook#

Type: Webhook
Name: Merchant Status Webhook
Method: POST
Request Body Changes:
data
updateAt (Deleted)
Type: integer
Required: True
Description: Update timestamp, UNIX timestamp in milliseconds (e.g., 1715000000000)
updatedAt (Added)
Type: integer
Required: True
Description: Update timestamp, UNIX timestamp in milliseconds (e.g., 1715000000000)
merchantInfo
merchantDetails
personalDetails
contactNumber
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
dateOfBirth
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
taxResidency
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
corporationDetails
dateOfIncorporation
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
status
Description Change:
Old: Indicates the current status of the application
New: Indicates the current status of the application Enum values: - 1: PROCESSING - 2: APPROVED - 3: REJECTED
eventType
Description Change:
Old: Webhook event type = "api_merchant_status_update_v2"
New: merchant.updated.v2

Deleted APIs#

The following 2 APIs have been completely removed in v2.1:
MethodPathName
GET/v1.0/payment/getStatementGet Settlement Statement


20260616#

Changelog 20260616#

Executive Summary#

StatusCountNote
New APIs0—
Deleted APIs0—
Modified APIs3Field-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.

Detailed API Changes#

1. Create Merchant#

Path: /v2.0/crm/addressBook/createMerchant (unchanged)
Method: POST
Summary Change: Unchanged.
Description Change: Updated to reflect 20260616 tier rules and new fields.

Request Body Changes#

merchantDetails → additionalCorporationDetails → natureOfBusiness (Modified)
PropertyOldNew
Typeintegerinteger (unchanged)
RequiredYes (tier 3 only)Yes (all tiers)
Enum values1–181–24
Description"The nature of the company's business"Extended with full label mapping
Enum label changes (1–18):
ValueOld LabelNew Label
2ManufacturingManufacturing and Industrial
6Hospitality and TourismHospitality and Travel
7Real Estate and ConstructionReal Estate and E-Commerce
8Health Care and PharmaceuticalsHealthcare
9Professional and ServicesProfessional Services
16Multimedia and EntertainmentMedia and Entertainment
17Cryptocurrency MiningCryptocurrency & 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.
New enum values (19–24):
ValueLabel
19Insurance & Wealth
20Trading & Commodities
21Digital Products & Online Services
22Business Support Services
23Gaming
24Advertising
merchantDetails → additionalCorporationDetails → otherNatureOfBusiness (New)
PropertyValue
Typestring
RequiredNo (optional)
DescriptionSpecific business nature description. Use when natureOfBusiness = 18 (Others).
merchantDetails → additionalCorporationDetails → sourceOfWealth (Modified)
PropertyOldNew
Typearray[string]array[string] (unchanged)
RequiredNoYes (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)
PropertyOldNew
Typearray[string]array[string] (unchanged)
RequiredNoYes (tier 3)
Description"Source of wealth""Source of wealth. Required for tier 3 as of 20260616."

Tier Rule Changes#

TierOld BehaviorNew Behavior
Tier 1/2 (Corporate)additionalCorporationDetails not availableCan 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 optionaladditionalCorporationDetails required; sourceOfWealth now required (8 fields: operatingAddress, companyType, descriptionOfBusiness, purposesOfAccountOpening, sourceOfFunds, authSignatories, directors, sourceOfWealth)
Tier 3 (Individual)additionalPersonalDetails optional; sourceOfWealth optionaladditionalPersonalDetails optional; sourceOfWealth now required when the block is submitted (4 fields: occupation, purposesOfAccountOpening, sourceOfFunds, sourceOfWealth)

2. Get Merchant#

Path: /v2.0/crm/addressBook/getMerchant (unchanged)
Method: GET
Summary Change:
Old: Get Merchant
New: Get Merchant Details
Description Change: Updated to note that 20260616 response includes natureOfBusiness, otherNatureOfBusiness, and sourceOfWealth in additional details blocks.

Response Body Changes#

No structural changes. The following fields may now appear in the response (returned when present on the merchant record):
FieldLocationType
natureOfBusinessmerchantInfo.merchantDetails.additionalCorporationDetailsinteger (1–24)
otherNatureOfBusinessmerchantInfo.merchantDetails.additionalCorporationDetailsstring
sourceOfWealthmerchantInfo.merchantDetails.additionalCorporationDetailsarray[string]
sourceOfWealthmerchantInfo.merchantDetails.additionalPersonalDetailsarray[string]

3. Merchant Status Webhook#

Path: Partner-implemented webhook endpoint (unchanged)
Method: POST
Summary Change: Unchanged.
Description Change: Updated to note 20260616 payload backward compatibility.

Payload Changes#

No structural changes. The webhook payload (eventType, notificationId, data with applicationId / merchantInfo / status / statusInfo / updatedAt) is unchanged from v2.0.
New fields (natureOfBusiness, otherNatureOfBusiness, sourceOfWealth) are included within merchantInfo when present on the merchant record.

Migration Guide#

No action required if:#

You already submit sourceOfWealth in tier 3 merchant creation — your existing requests remain valid.
You consume webhooks — the payload structure is unchanged.

Action required if:#

All merchants (tier 1/2/3): natureOfBusiness is now required for every corporate merchant creation. Submit it within additionalCorporationDetails.
Tier 3 merchants: sourceOfWealth is now required in both additionalCorporationDetails (CORPORATE) and additionalPersonalDetails (INDIVIDUAL).

Recommended:#

If your integration uses natureOfBusiness = 18 (Others), consider adopting the new otherNatureOfBusiness field to provide a specific business type description.
Review the updated enum labels (values 1–17) to ensure your UI or internal mappings align with the new naming.

Full natureOfBusiness Enum (20260616)#

ValueLabelStatus
1Financial ServicesUnchanged
2Manufacturing and IndustrialRenamed
3Information TechnologyUnchanged
4Agriculture and FarmingUnchanged
5Retail and WholesaleUnchanged
6Hospitality and TravelRenamed
7Real Estate and E-CommerceRenamed
8HealthcareRenamed
9Professional ServicesRenamed
10Education and TrainingUnchanged
11Non Profit and CharityUnchanged
12Transaction and LogisticsUnchanged
13Energy and UtilitiesUnchanged
14TelecommunicationsUnchanged
15Government and Public SectorUnchanged
16Media and EntertainmentRenamed
17Cryptocurrency & Digital AssetsRenamed
18OthersUnchanged
19Insurance & WealthNew
20Trading & CommoditiesNew
21Digital Products & Online ServicesNew
22Business Support ServicesNew
23GamingNew
24AdvertisingNew

20260624#

Executive Summary#

StatusCountNote
New APIs4-
Deleted APIs0Fully removed
Modified APIs0With field-level changes

New APIs#

MethodPathName
POST/v2.0/payment/statementsCreate statement
GET/v2.0/payment/statements/{statementId}Get statement overview
GET/v2.0/payment/statements/{statementId}/entriesGet statement entries
GET/v2.0/payment/statements/{statementId}/transactionsGet statement transactions


20260710#

Changelog 20260710#

Executive Summary#

StatusCountNote
New APIs4Fee Estimate, Points
Deleted APIs0—
Modified APIs9Withdrawal — 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.

Part A: Fee Estimate & Points (New APIs)#

A.1 API Summary#

MethodPathName
POST/v2.0/payment/withdrawal/feeEstimateFee Estimate
GET/v2.0/points/balanceGet Points Balance
GET/v2.0/points/transactionsList Points Transactions
GET/v2.0/points/transactions/detailGet Points Transaction Detail

A.2 Fee Estimate#

POST /v2.0/payment/withdrawal/feeEstimate
Side-effect-free fee estimate endpoint. Returns results for two scenarios simultaneously:
withPoints: Estimate with points used for full fee redemption
withoutPoints: Estimate without points (always returned)
When points redemption is not supported for the given payment type / currency combination, the withPoints and currentPointsBalance fields are omitted from the response.
currentPointsBalance is a snapshot at query time; the actual balance at withdrawal submission may differ. Clients should display both scenarios and note "subject to actual settlement."

Request Body#

FieldTypeRequiredDescription
participantCodestringYesParticipant code
paymentTypestringYesFIRST_PARTY or THIRD_PARTY
accountTypestringYesFIAT or CRYPTO
currencystringYesWithdrawal currency (ISO 4217 for fiat, e.g. USD; token code for crypto, e.g. USDT)
debitAmountstringConditionalGross debit amount. Required when paymentType=FIRST_PARTY. Mutually exclusive with receivedAmount.
receivedAmountstringConditionalNet received amount. Required when paymentType=THIRD_PARTY. Mutually exclusive with debitAmount.
chargeTypestringNoFiat third-party only. OUR / SHA / BEN. Defaults to merchant configuration.
feeBearerstringNoCUSTOMER (default) — fee borne by trading party; PARTNER — fee borne by platform partner.
Amount field rules: Exactly one of debitAmount or receivedAmount must be provided, matching the paymentType. FIRST_PARTY → debitAmount; THIRD_PARTY → receivedAmount.

Response (200)#

FieldTypeDescription
feeCurrencystringFee currency
originalFeestringOriginal fee before points redemption
feeRatestringFee rate applied
minFeestringMinimum fee
maxFeestringMaximum fee ("0.00" = no upper limit)
minimumWithdrawalAmountstringMinimum withdrawal amount for this currency
currentPointsBalancestringPoints balance snapshot (omitted when points not supported)
feeBearerstringEchoed from request. CUSTOMER or PARTNER.
withPointsobjectEstimate with points redemption (omitted when not supported)
withoutPointsobjectEstimate without points (always returned)
Scenario object (withPoints / withoutPoints):
FieldTypeDescription
debitAmountstringGross debit amount from customer account
receivedAmountstringNet amount received by payee
actualFeestringActual fee ("0.00" when fully offset by points in withPoints)
pointsConsumedstringPoints consumed ("0" for withoutPoints)
Amount semantics:
paymentTypeRequired inputMeaning
FIRST_PARTYdebitAmountGross debit amount (↔ withdrawal amountType=1 Debit)
THIRD_PARTYreceivedAmountNet received amount (↔ withdrawal amountType=2 Receive)

A.3 Get Points Balance#

GET /v2.0/points/balance
Query the current available points balance for a participant. Pending points are not included.

Query Parameters#

ParameterTypeRequiredDescription
participantCodestringYesParticipant code

Response (200)#

FieldTypeDescription
participantCodestringParticipant code (echo)
availablePointsstringCurrent available points (settled, excluding pending)

A.4 List Points Transactions#

GET /v2.0/points/transactions
Query points transaction history within a time range. Only CONFIRMED and CANCELLED records are returned; PENDING records are excluded.

Query Parameters#

ParameterTypeRequiredDescription
participantCodestringYesParticipant code
startTimeintegerYesStart time, Unix milliseconds
endTimeintegerYesEnd time, Unix milliseconds. Span with startTime ≤ 90 days.
offsetintegerNoPagination offset
limitintegerNoPage size

Response (200)#

FieldTypeDescription
listarray[PointsTransaction]Transaction records
paginationobject{limit, offset, total, hasMore}
PointsTransaction:
FieldTypeDescription
pointsTransactionIdstringTransaction unique ID
businessTypestringOTC_CONVERSION (earn, +), WITHDRAWAL_DEDUCTION (consume, −), POINTS_EXPIRY (expiry, −), ROLLBACK (reversal), POBO_DEDUCTION (POBO fee, −)
pointsstringPoints change; positive = earned, negative = consumed
statusstringCONFIRMED or CANCELLED
relatedIdstringAssociated business order ID
createdAtintegerCreation time, Unix milliseconds
expiresAtintegerExpiry time (returned only when businessType=OTC_CONVERSION and status=CONFIRMED)

A.5 Get Points Transaction Detail#

GET /v2.0/points/transactions/detail
Query points transaction detail. Supports two mutually exclusive query modes:
ModeRequired ParametersTypical Result
Transaction ID modeparticipantCode + pointsTransactionId1 record
Related ID modeparticipantCode + relatedId1–2 records (e.g. deduction + rollback)
pointsTransactionId and relatedId are mutually exclusive. Providing both returns 801014 VALIDATION_QUERY_MODE_CONFLICT.

Query Parameters#

ParameterTypeRequiredDescription
participantCodestringYesParticipant code
pointsTransactionIdstringConditionalPoints transaction unique ID. Mutually exclusive with relatedId.
relatedIdstringConditionalAssociated business order ID (withdrawal / OTC order, etc.). Mutually exclusive with pointsTransactionId.

Response (200)#

FieldTypeDescription
listarray[PointsTransaction]Matching transaction records
paginationobject{limit, offset, total, hasMore}
Each item in list follows the PointsTransaction schema (see A.4).

Part B: Withdrawal Amount Semantics (Modified APIs)#

B.1 Motivation#

The withdrawal API (both crypto and fiat) previously relied on implicit conventions to determine whether 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.
This update introduces explicit amount semantics via 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.

B.2 Detailed API Changes#

B.2.1 Create Crypto Withdrawal#

Path: /v2.0/payment/crypto/createCryptoWithdrawal (unchanged)
Method: POST
Summary: Added amountType and feeBearer request fields; amount semantics clarified.

Request Body Changes#

amountType (New)
PropertyValue
Typeinteger
RequiredYes (for new integrations)
Enum1 = 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
DescriptionExplicitly declares the meaning of amount. New integrations must provide this field.
feeBearer (New)
PropertyValue
Typeinteger
RequiredNo
Enum1 = Customer (borne by trading party), 2 = Partner (borne by platform partner)
Default1 (Customer)
amount (Modified — semantics only, type unchanged)
When amountType is not provided, the backend falls back on the existing beneficiaryWallet logic. Existing integrations do not need to change.

Response Body Changes#

FieldTypeDescription
amountTypeintegerEchoed from request. 1=Debit, 2=Receive.
feeBearerintegerEchoed from request. 1=Customer, 2=Partner.
debitAmountstringGross debit amount. debitAmount = receivedAmount + feeAmount always holds.
receivedAmountstringNet amount received by payee (excluding platform fees).
Legacy response fields unchanged. New fields are additive.

B.2.2 Get Crypto Withdrawal#

Path: /v2.0/payment/getCryptoWithdrawal (unchanged)
Method: GET
Summary: Response now includes amountType, feeBearer, debitAmount, receivedAmount.
FieldTypeDescription
amountTypeinteger1=Debit, 2=Receive
feeBearerinteger1=Customer, 2=Partner
debitAmountstringGross debit amount
receivedAmountstringNet amount received by payee
All existing fields unchanged. Additive only.

B.2.3 Get Crypto Withdrawal History#

Path: /v2.0/payment/getCryptoWithdrawalHistory (unchanged)
Method: GET
Summary: Each history item now includes amountType, feeBearer, debitAmount, receivedAmount.
Same field additions as B.2.2 — each object in the history list gains the four fields above.

B.2.4 Crypto Withdrawal Webhook#

Path: Partner-implemented webhook endpoint (unchanged)
Method: POST
Summary: Webhook payload now includes amountType, feeBearer, debitAmount, receivedAmount.
FieldTypeDescription
amountTypeinteger1=Debit, 2=Receive
feeBearerinteger1=Customer, 2=Partner
debitAmountstringGross debit amount
receivedAmountstringNet amount received by payee
Existing payload fields unchanged. Webhook signature verification, retry policy, and security model unchanged.

B.2.5 Create Fiat Withdrawal#

Path: /v2.0/payment/fiat/createWithdrawal (unchanged)
Method: POST
Summary: Added amountType and feeBearer request fields; amount semantics clarified.

Request Body Changes#

amountType (New)
PropertyValue
Typeinteger
RequiredYes (for new integrations)
Enum1 = 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)
PropertyValue
Typeinteger
RequiredNo
Enum1 = Customer, 2 = Partner
Default1 (Customer)
amount (Modified — semantics only)

Response Body Changes#

FieldTypeDescription
amountTypeintegerEchoed from request. 1=Debit, 2=Receive.
feeBearerintegerEchoed from request. 1=Customer, 2=Partner.
debitAmountstringGross debit amount.
feeAmountstringPlatform fee. Alias for legacy fees.
feeCurrencystringFee currency (ISO 4217).
receivedAmountstringNet amount received by payee. Alias for legacy estimatedAmountReceivable.
Legacy aliases:
Legacy FieldEquivalent
feesfeeAmount
estimatedAmountReceivablereceivedAmount
Both legacy and new field names are returned. No removal.

B.2.6 Get Fiat Withdrawal Detail#

Path: /v2.0/payment/fiat/withdrawal/detail (unchanged)
Method: GET
Summary: Response now includes amountType, feeBearer, debitAmount, feeAmount, feeCurrency, receivedAmount. Fields echoed from creation-time values. Legacy fees and estimatedAmountReceivable retained as aliases.

B.2.7 Get Fiat Withdrawal History#

Path: /v2.0/payment/fiat/withdrawal/history (unchanged)
Method: GET
Summary: Each history item now includes the six new fields above. Legacy aliases retained.

B.2.8 Fiat Withdrawal Webhook#

Path: Partner-implemented webhook endpoint (unchanged)
Method: POST
Summary: Webhook payload now includes all six new fields plus legacy aliases.
FieldTypeDescription
amountTypeinteger1=Debit, 2=Receive
feeBearerinteger1=Customer, 2=Partner
debitAmountstringGross debit amount
feeAmountstringPlatform fee (alias for fees)
feeCurrencystringFee currency
receivedAmountstringNet amount received (alias for estimatedAmountReceivable)
Legacy fields fees and estimatedAmountReceivable retained.


B.3 Amount Semantics: Debit vs Receive#

amountTypeMeaning of amountAccount is debitedPayee receives
1 = DebitGross debit amount (including fees)amountamount − feeAmount
2 = ReceiveNet received amount (excluding fees)amount + feeAmountamount

B.4 Fee Bearer: Customer vs Partner#

debitAmount = receivedAmount + feeAmount always holds, regardless of feeBearer. The feeBearer only determines whose account the fee portion is deducted from.
feeBearerFee deducted fromEffect
1 = Customer (default)Trading party participant accountFull debitAmount from trading party account
2 = PartnerPlatform partner participant account (fee portion only)feeAmount portion from partner account; remaining from trading party account

Part C: Migration Guide#

Withdrawal APIs#

No action required if:#

You do not call the withdrawal APIs.
You already call withdrawal APIs — existing v2.0 requests remain valid. Backend applies backward-compatible fallback when amountType is absent.
You consume withdrawal webhooks — new fields are purely additive; existing payload fields remain.

Recommended:#

New integrations: Always provide amountType in Create Withdrawal requests.
Existing integrations: Consider adopting amountType to make amount semantics explicit. The fallback preserves current behavior, but explicit declaration improves auditability.
Response parsing: If you read fees or estimatedAmountReceivable, you may optionally switch to feeAmount and receivedAmount. Both sets are returned.

Field Reference Mapping#

ContextOld FieldNew FieldStatus
Request (Create Withdrawal)amount (ambiguous)amount + amountTypeOld format still accepted
ResponsefeesfeeAmountAlias (both returned)
ResponseestimatedAmountReceivablereceivedAmountAlias (both returned)

Points & Fee Estimate APIs#

These are additive — no existing integrations are affected.

Summary of All New/Changed Fields (20260710)#

New APIs#

FieldAPIsType
availablePointsGET /points/balance responsestring
list / paginationGET /points/transactions responsearray / object
points / businessType / status / relatedId / expiresAtPointsTransactionstring / integer
feeCurrency / originalFee / feeRate / minFee / maxFeeFee Estimate responsestring
currentPointsBalanceFee Estimate responsestring
withPoints / withoutPointsFee Estimate responseobject
debitAmount / receivedAmountFee Estimate request & responsestring
feeBearerFee Estimate request & responsestring (CUSTOMER / PARTNER)

Modified APIs (field-level)#

FieldAPIs Where AddedTypeEnum
amountTypeCreate Crypto/Fiat Withdrawal (req), All queries & webhooks (resp)integer1=Debit, 2=Receive
feeBearerCreate Crypto/Fiat Withdrawal (req), All queries & webhooks (resp)integer1=Customer, 2=Partner
debitAmountAll query & webhook responsesstring—
feeAmountFiat query & webhook responsesstring—
feeCurrencyFiat query & webhook responsesstring—
receivedAmountAll query & webhook responsesstring—

20260717#

Changelog 20260717#

Executive Summary#

StatusCountNote
New APIs2Merchant Activation (Non-FI partners)
Deleted APIs0—
Modified APIs3Merchant — activationStatus added (field-level)
Breaking change: No. Existing integrations remain compatible — the two activation endpoints are additive; activationStatus is an additive field on existing merchant responses/payloads; request bodies of existing endpoints are unchanged.

Part A: Non-FI Merchant Activation (New)#

CAMP partners fall into two types — FI (licensed financial institutions) and Non-FI (non-financial businesses / individuals) — assigned by CAMP when the partner is onboarded. This release introduces merchant activation for Non-FI partners: a merchant created by a Non-FI partner must complete a one-time email OTP activation before it can call fund-write APIs. FI partners require no activation; their API behaviour is unchanged.

A.1 Who Needs to Activate#

FI PartnerNon-FI Partner
After creating a merchantReady to useActivation required
Calling activation endpointsReturns 400, not neededNormal
internalTransfer✅ Available❌ Not available
activationStatus valueAlways NO_NEED_ACTIVATIONFollows the state machine

A.2 Integration Flow#

Main call chain: createMerchant → getMerchant → initiateActivation → confirmActivation. getTnC is 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.

A.3 Activation State Machine#

ValueMeaningFund-write APIs available?
NOT_ACTIVATEDMerchant created, activation not yet started❌
PENDING_ACTIVATIONOTP sent to merchant email, awaiting confirmation❌
EXPIREDOTP expired unused❌
LOCKED5 wrong OTP attempts, locked for 30 min❌
ACTIVATEDActivated (terminal)✅ (except internalTransfer)
NO_NEED_ACTIVATIONFI-partner merchant (terminal)✅ (all)

A.4 Step-by-Step#

Main call chain (4 steps): createMerchant → getMerchant → initiateActivation → confirmActivation. getTnC is an auxiliary call for displaying the agreement (see the note under A.4.3).

A.4.1 Create Merchant · POST /v2.0/crm/addressBook/createMerchant#

The merchant enters KYC review after creation, with initial activationStatus = NOT_ACTIVATED. The response does not include activationStatus; query it via Get Merchant.

A.4.2 Get Merchant · GET /v2.0/crm/addressBook/getMerchant#

Query by participantCode or clientReference.
FieldDescription
merchantStatusKYC status: 1=PROCESSING, 2=APPROVED, 3=REJECTED
activationStatusActivation state, initially NOT_ACTIVATED
Activation can only be initiated after the merchant's KYC is approved (merchantStatus = 2).

A.4.3 Initiate Activation · POST /v2.0/crm/merchant/initiateActivation#

Request
FieldTypeRequiredDescription
participantCodestringYesTarget merchant
clientReferencestringNoIdempotency key, ≤100 chars
Response (200)
{
  "code": 200,
  "msg": "success",
  "data": {
    "participantCode": "B0100106",
    "activationStatus": "PENDING_ACTIVATION",
    "otpSentToMaskedEmail": "j***@e***.com",
    "otpExpiresAt": 1768636800000,
    "tncId": "N001"
  }
}
Response fieldDescription
otpSentToMaskedEmailMasked email the OTP was sent to
otpExpiresAtOTP expiry, UNIX timestamp (ms); valid for 10 minutes
tncIdAgreement code for this activation; used to fetch the agreement link (below) and as acceptedTnC in A.4.4
The OTP is sent only to the merchant's registered email; the OTP itself is never returned.
Re-calling for an already-activated merchant → idempotent ACTIVATED; re-calling in PENDING_ACTIVATION/EXPIRED → the previous OTP is invalidated and a new one sent.
Auxiliary — Get Agreement Link · GET /v2.0/tool/getTnC/{tncId}
This call is not part of the main chain. Use the 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"
  }
}

A.4.4 Confirm Activation · POST /v2.0/crm/merchant/confirmActivation#

After the merchant reviews the agreement and submits the OTP on the entry page, the partner calls this endpoint.
Request
FieldTypeRequiredDescription
participantCodestringYesTarget merchant
otpstringYes6-digit OTP submitted by the merchant
acceptedTnCstring[]YesAgreement code(s); must match the tncId returned by initiateActivation, e.g. ["N001"]
Response (200)
{
  "code": 200,
  "msg": "success",
  "data": {
    "participantCode": "B0100106",
    "activationStatus": "ACTIVATED",
    "activatedAt": 1768637100000
  }
}
The activation result is returned synchronously. Once the merchant reaches ACTIVATED, fund-write APIs are unlocked.

A.5 Fund APIs Gated by Activation#

The following endpoints cannot be called before the merchant is activated (activationStatus other than ACTIVATED / NO_NEED_ACTIVATION):
EndpointPathMeaning
Create Crypto WithdrawalPOST /v2.0/payment/crypto/createCryptoWithdrawalCrypto withdrawal
Create Fiat WithdrawalPOST /v2.0/payment/fiat/createWithdrawalFiat withdrawal
Activate Same Name WithdrawalPOST /v2.0/payment/fiat/sameNameWithdrawal/activateSame-name withdrawal activation
Create ConversionPOST /v2.0/trade/conversion/createConversionConversion
Internal Transfer (POST /v2.0/payment/account/internalTransfer) is not available to Non-FI partners.

Part B: Modified APIs#

All changes are additive and field-level; request bodies are unchanged.

B.1 Get Merchant · GET /v2.0/crm/addressBook/getMerchant#

Response data adds activationStatus (read-only, enum in A.3). Existing merchantStatus and merchantInfo are unchanged.

B.2 Create Merchant · POST /v2.0/crm/addressBook/createMerchant#

Request/response structure unchanged. A Non-FI merchant is created as NOT_ACTIVATED with fund operations disabled by default until activated. activationStatus is not returned in this response — query it via Get Merchant.

B.3 Merchant Status Webhook · POST /webhooks/merchant-status/v2#

Payload data 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.

Appendix: Endpoint List#

EndpointPathType
Create MerchantPOST /v2.0/crm/addressBook/createMerchantExisting
Get MerchantGET /v2.0/crm/addressBook/getMerchantExisting (added activationStatus)
Initiate ActivationPOST /v2.0/crm/merchant/initiateActivationNew
Confirm ActivationPOST /v2.0/crm/merchant/confirmActivationNew
Get TnCGET /v2.0/tool/getTnC/{tncId}Existing (auxiliary, for displaying the agreement)
Merchant Status WebhookPOST /webhooks/merchant-status/v2Existing (added activationStatus)

20260719#

Changelog 20260719#

Crypto Checkout & Refund v2.0 — introduced on this branch.

Executive Summary#

StatusCountNote
New APIs16Crypto Checkout v2.0 (10) + Crypto Refund v2.0 (6)
Deleted APIs0v1.0 checkout/refund endpoints remain available
Modified APIs0—
Breaking change: No. The v2.0 checkout/refund surface is additive; existing v1.0 checkout/refund integrations are unaffected.

Part A: Crypto Checkout v2.0 (New APIs)#

A RESTful checkout surface under /v2.0/payment/crypto/checkouts, replacing the v1.0 createCryptoCheckout style.

A.1 Checkout Endpoints#

MethodPathNameStatus
POST/v2.0/payment/crypto/checkoutsCreate Checkoutreleased
POST/v2.0/payment/crypto/checkouts/quotationsCreate Checkout Quotationreleased
POST/v2.0/payment/crypto/checkouts/{checkoutId}/confirmConfirm Checkoutreleased
POST/v2.0/payment/crypto/checkouts/{checkoutId}/acceptAccept Checkoutdeveloping
GET/v2.0/payment/crypto/checkouts/historyList Checkout Historydeveloping
GET/v2.0/payment/crypto/checkouts/{checkoutId}Get Checkout Detailreleased
POST/v2.0/payment/crypto/checkouts/{checkoutId}/closeClose Checkoutreleased
GET/v2.0/payment/crypto/checkouts/cryptosGet Checkout Acceptable Cryptosreleased
GET/v2.0/payment/crypto/checkouts/{checkoutId}/refundable-infoGet Checkout Refundable Inforeleased
POST(partner webhook)Checkout Status Webhookreleased

A.2 Checkout Status Lifecycle#

OPENING → AWAITING_PAYMENT → RECEIVED → SUCCEEDED → SETTLED
                  ↓                ↓\n              EXPIRED          CLOSED

Part B: Crypto Refund v2.0 (New APIs)#

A RESTful refund surface under /v2.0/payment/crypto/refunds, replacing the v1.0 createCryptoRefund / confirmCryptoRefund style.

B.1 Refund Endpoints#

MethodPathNameStatus
POST/v2.0/payment/crypto/refunds/refundCreate Refundreleased
POST/v2.0/payment/crypto/refunds/risk-refundCreate Risk Refundreleased
POST/v2.0/payment/crypto/refunds/voidCreate Void Refundreleased
POST/v2.0/payment/crypto/refunds/{refundId}/closeClose Refundreleased
GET/v2.0/payment/crypto/refunds/{refundId}Get Refund Detailreleased
POST(partner webhook)Refund Status Webhookreleased

B.2 Refund Status Lifecycle#

INITIATED → PROCESSING → COMPLETED
                ↓\n            REJECTED
                ↓\n             CLOSED

B.3 Refund Types#

TypeUse CaseEndpoint
REFUNDStandard post-settlement refund/refunds/refund
RISK_REFUNDKYT-triggered risk refund/refunds/risk-refund
VOIDPre-settlement void (overpayment, incomplete order, wrong currency)/refunds/void

Part C: Migration Note#

The v2.0 checkout/refund API surface is additive — no existing integrations are affected. The legacy v1.0 checkout/refund endpoints remain available; new integrations should adopt the v2.0 RESTful endpoints above. Field-level request/response definitions are available on each endpoint in this documentation.

Modified at 2026-07-22 05:08:30
Previous
API Error Handling Guide
Next
Create Token
Built with