All API changes for the CAMP Connect API, consolidated from individual changelog entries.| Date | New | Modified | Deleted |
|---|
| 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 |
20260408#
Executive Summary#
| 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 | |
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: POSTDescription: Client's Secret
Description: Client's Secret
Description: Access token
Description: Token expiry time
not-before-policy (Deleted)Description: A timestamp before which tokens are considered invalid
refresh_expires_in (Deleted)Description: Time in seconds until the token expiry is refreshed
Description: Scope included in the token
Description: Access token
Description: Token expiry time
Account Management#
Get Balance#
Path: /v1.0/ledger/account → /v2.0/ledger/account
Method: GETGet Internal Transfer#
Path: /v1.0/payment/account/getInternalTransfer → /v2.0/payment/account/getInternalTransfer
Method: GETDescription 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: POSTDescription Change:
Old: Transfer transaction time
New: Transfer transaction time (Unix timestamp in milliseconds)
Merchant Management#
Create Merchant#
Path: /v2.0/crm/addressBook/createMerchant
Method: POSTDescription Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
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: GETDescription Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
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: GETGet Fiat Deposit Detail#
Path: /v1.0/payment/fiat/deposit/detail → /v2.0/payment/fiat/deposit/detail
Method: GETDescription 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: GETDescription Change:
Old:
New: Unix timestamp in milliseconds
Description Change:
Old:
New: Unix timestamp in milliseconds
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: POSTGet Bank Accounts#
Path: /v1.0/crm/addressBook/bankAccount → /v2.0/crm/addressBook/bankAccount
Method: GETGet Fiat Account Application Status#
Path: /v2.0/crm/fiatAccount/appStatus
Method: GETDescription Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
Path: /v2.0/crm/fiatAccount/addInfo/submit
Method: POSTDescription Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
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: POSTDescription Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: - 1: First Party - 2: Third Party
estimatedAmountReceivable Description Change:
Old: Missing fields for the withdrawal request. Ref. to {} for details
New: Missing fields
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
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: GETestimatedAmountReceivable Description Change:
Old:
New: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
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: GETDescription Change:
Old: The end time
New: The end time (Unix timestamp in milliseconds)
Description Change:
Old: The start time
New: The start time (Unix timestamp in milliseconds)
estimatedAmountReceivable Description Change:
Old:
New: Swift charging code: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
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: GETDescription 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
Get Crypto Deposit History#
Path: /v1.0/payment/getCryptoDepositHistory → /v2.0/payment/getCryptoDepositHistory
Method: GETDescription 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
Get Crypto Deposit Wallet#
Path: /v1.0/crm/deposit/wallet → /v2.0/crm/deposit/wallet
Method: GETUpdate Crypto Deposit Travel Rule Info#
Path: /v1.0/payment/crypto/updateCryptoDepositTravelRuleInfo → /v2.0/payment/crypto/updateCryptoDepositTravelRuleInfo
Method: POSTDescription Change:
Old: required if "isOwner" is false
New: Owner information
Description Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Crypto Payment#
Crypto Withdrawal#
Create Crypto Withdrawal#
Path: /v1.0/payment/crypto/createCryptoWithdrawal → /v2.0/payment/crypto/createCryptoWithdrawal
Method: POSTDescription Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Get Crypto Withdrawal#
Path: /v1.0/payment/getCryptoWithdrawal → /v2.0/payment/getCryptoWithdrawal
Method: GETDescription Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Get Crypto Withdrawal History#
Path: /v1.0/payment/getCryptoWithdrawalHistory → /v2.0/payment/getCryptoWithdrawalHistory
Method: GETDescription Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
Get Wallet Address#
Path: /v1.0/payment/crypto/getWalletAddress → /v2.0/payment/crypto/getWalletAddress
Method: GETDescription 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: POSTDescription Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
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: POSTConversion#
Create Conversion#
Path: /v1.0/trade/conversion/createConversion → /v2.0/trade/conversion/createConversion
Method: POSTCreate Quotation#
Path: /v1.0/trade/conversion/createQuotation → /v2.0/trade/conversion/createQuotation
Method: POSTclientReference (Deleted) clientReference (Deleted) Get Conversion#
Path: /v1.0/trade/conversion/getConversion → /v2.0/trade/conversion/getConversion
Method: GETGet Quotation#
Path: /v1.0/trade/conversion/getQuotation → /v2.0/trade/conversion/getQuotation
Method: GETUpload File#
Path: /v2.0/auth/tools/upload
Method: POSTDescription: The unique id of the uploaded file
Description: The size of the uploaded file (byte)
Description: Response Code
Description: Response Message
getTnC#
Path: /v2.0/tool/getTnC/{tncId}
Method: GETDescription 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: POSTDescription Change:
Old: api_conversion_status_update
New: conversion.updated.v2
Crypto Deposit Webhook#
Type: Webhook
Name: Crypto Deposit Webhook
Method: POSTDescription 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
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: POSTDescription Change:
Old: Platform user id
New: required if "walletType" is "Platform Wallet"
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: POSTDescription Change:
Old: Status of the request
New: Status of the request Enum values: - 1: PENDING - 2: PROCESSING - 3: ACTIVE - 4: REJECTED
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: POSTDescription Change:
Old: Timestamp of deposit transaction, ISO-8601
New: Timestamp of deposit transaction (Unix timestamp in milliseconds)
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: POSTestimatedAmountReceivable Description Change:
Old:
New: Swift charging code: 1-BEN (Beneficiary Pays All Fees), 2-OUR (Sender Pays All Fees), 3-SHA (Shared Fees).
Description Change:
Old: First or third party withdrawal
New: First or third party withdrawal Enum values: 1: First Party 2: Third Party
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: POSTDescription: Update timestamp, UNIX timestamp in milliseconds (e.g., 1715000000000)
Description: Update timestamp, UNIX timestamp in milliseconds (e.g., 1715000000000)
Description Change:
Old:
New: Phone number for contact, country code + Number. eg, +65 87654321
Description Change:
Old: Date of birth (UTC format)
New: Date of birth, format: YYYY-MM-DD, e.g., 1990-05-15
Description Change:
Old:
New: The country of tax residency (Country Code in ISO 3166-1 alpha-2 format)
Description Change:
Old: Date of Incoporation
New: Date of Incoporation, format: YYYY-MM-DD, e.g., 1990-05-15
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
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:| Method | Path | Name |
|---|
| GET | /v1.0/payment/getStatement | Get Settlement Statement |
20260616#
Changelog 20260616#
Executive Summary#
| 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.
Detailed API Changes#
1. Create Merchant#
Path: /v2.0/crm/addressBook/createMerchant (unchanged)Summary Change: Unchanged.Description Change: Updated to reflect 20260616 tier rules and new fields.Request Body Changes#
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 |
Enum label changes (1–18):| 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 Rule Changes#
| 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) |
2. Get Merchant#
Path: /v2.0/crm/addressBook/getMerchant (unchanged)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):| 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] |
3. Merchant Status Webhook#
Path: Partner-implemented webhook endpoint (unchanged)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)#
| 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 |
20260624#
Executive Summary#
| Status | Count | Note |
|---|
| New APIs | 4 | - |
| Deleted APIs | 0 | Fully removed |
| Modified APIs | 0 | With field-level changes |
New APIs#
| 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 |
20260710#
Changelog 20260710#
Executive Summary#
| 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.
Part A: Fee Estimate & Points (New APIs)#
A.1 API Summary#
| 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 |
A.2 Fee Estimate#
POST /v2.0/payment/withdrawal/feeEstimateSide-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#
| 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 debitAmount or receivedAmount must be provided, matching the paymentType. FIRST_PARTY → debitAmount; THIRD_PARTY → receivedAmount.
Response (200)#
| 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) |
Scenario object (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) |
A.3 Get Points Balance#
Query the current available points balance for a participant. Pending points are not included.Query Parameters#
| Parameter | Type | Required | Description |
|---|
participantCode | string | Yes | Participant code |
Response (200)#
| Field | Type | Description |
|---|
participantCode | string | Participant code (echo) |
availablePoints | string | Current available points (settled, excluding pending) |
A.4 List Points Transactions#
GET /v2.0/points/transactionsQuery points transaction history within a time range. Only CONFIRMED and CANCELLED records are returned; PENDING records are excluded.Query Parameters#
| 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 |
Response (200)#
| 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) |
A.5 Get Points Transaction Detail#
GET /v2.0/points/transactions/detailQuery points transaction detail. Supports two mutually exclusive query modes:| Mode | Required Parameters | Typical Result |
|---|
| Transaction ID mode | participantCode + pointsTransactionId | 1 record |
| Related ID mode | participantCode + relatedId | 1–2 records (e.g. deduction + rollback) |
pointsTransactionId and relatedId are mutually exclusive. Providing both returns 801014 VALIDATION_QUERY_MODE_CONFLICT.
Query Parameters#
| 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. |
Response (200)#
| Field | Type | Description |
|---|
list | array[PointsTransaction] | Matching transaction records |
pagination | object | {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)Summary: Added amountType and feeBearer request fields; amount semantics clarified.Request Body Changes#
| 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. |
| 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 amountType is not provided, the backend falls back on the existing beneficiaryWallet logic. Existing integrations do not need to change.
Response Body Changes#
| 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.
B.2.2 Get Crypto Withdrawal#
Path: /v2.0/payment/getCryptoWithdrawal (unchanged)Summary: Response now includes 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.
B.2.3 Get Crypto Withdrawal History#
Path: /v2.0/payment/getCryptoWithdrawalHistory (unchanged)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)Summary: Webhook payload now includes 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.
B.2.5 Create Fiat Withdrawal#
Path: /v2.0/payment/fiat/createWithdrawal (unchanged)Summary: Added amountType and feeBearer request fields; amount semantics clarified.Request Body Changes#
| 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 |
| Property | Value |
|---|
| Type | integer |
| Required | No |
| Enum | 1 = Customer, 2 = Partner |
| Default | 1 (Customer) |
amount (Modified — semantics only)Response Body Changes#
| 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.
B.2.6 Get Fiat Withdrawal Detail#
Path: /v2.0/payment/fiat/withdrawal/detail (unchanged)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)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)Summary: Webhook payload now includes all six new fields plus legacy aliases.| 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 fees and estimatedAmountReceivable retained.
B.3 Amount Semantics: Debit vs Receive#
| 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 |
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.| 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 |
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#
| 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) |
Points & Fee Estimate APIs#
These are additive — no existing integrations are affected.
Summary of All New/Changed Fields (20260710)#
New APIs#
| 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) |
Modified APIs (field-level)#
| 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 | — |
20260717#
Changelog 20260717#
Executive Summary#
| 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; 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 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 |
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#
| 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) |
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.| 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).
A.4.3 Initiate Activation · 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 |
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.| 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
}
}
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):| 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.
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#
| 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) |
20260719#
Changelog 20260719#
Crypto Checkout & Refund v2.0 — introduced on this branch.
Executive Summary#
| 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.
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#
| 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 |
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#
| 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 |
B.2 Refund Status Lifecycle#
INITIATED → PROCESSING → COMPLETED
↓\n REJECTED
↓\n CLOSED
B.3 Refund Types#
| 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 |
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