v1.4.12
New Features
New Card Account Mode:program-limitCard accounts can now be created with accountType: "program-limit". A program-limit account has an assigned credit limit that is independent of collateral. Instead of a credit account per card, all of your program-limit accounts draw on one shared program facility managed by the server, which caps total exposure across the program.What’s New
POST /cardaccounts — accepts accountType: "program-limit".- Requires a positive
limit,currency, identity details, andsettlementAccount. Do not passcreditAccount. - Your account must be set up for program-limit; otherwise creation fails with
CREDIT_LINE_TYPE_INVALID_ERRORorPROGRAM_ASSIGNMENT_NOT_FOUND. Program assignment is handled server-side, and a request carryingprogramId,programCreditLineId, orprogram_credit_line_idfails withINVALID_REQUEST.
GET /cardaccounts — the program facility is returned as one more record with accountType: "program". Two new nullable fields appear only on that record:programBalance— program settlement exposure including reservationsprogramOutstanding— captured program settlement exposure; can be negative when refunds or credits exceed captures
available always equals limit, because the facility’s own balance stays at zero; do not use it for capacity. Use limit minus programBalance for the remaining program capacity.POST /cardaccounts/fixed-limit — now also updates the assigned limit of program-limit accounts. These updates skip the collateral check and never change the program facility limit. Do not mix program-limit and fixed-limit accounts in one request; a mixed request fails and no limit is changed.New 400 Error Codes
Program checks fail with HTTP 400 and one of these code values. Existing validation errors are unchanged.Example Request — POST /cardaccounts
Example Response — GET /cardaccounts (program record)
Action Suggested
- If you switch on
accountType, handle the newprogram-limitandprogramvalues. Treatprogramrecords as read-only and exclude them from cardholder-facing lists. - If your JSON decoder rejects unknown fields, allow
programBalanceandprogramOutstanding. - Ask your solution manager to set up program-limit for your account before relying on it.
新功能
新增卡賬戶模式:program-limit現可使用 accountType: "program-limit" 建立卡賬戶。Program-limit 賬戶擁有獨立於抵押品的指定信用額度。所有 program-limit 賬戶共用一個由伺服器管理的計劃額度(program facility),而非每張卡各自綁定一個信貸賬戶;計劃額度會限制整個計劃的總風險敞口。新增內容
POST /cardaccounts — 接受 accountType: "program-limit"。- 需提供正數
limit、currency、身份資料及settlementAccount。請勿傳入creditAccount。 - 您的賬戶須先完成 program-limit 設定,否則建立時會返回
CREDIT_LINE_TYPE_INVALID_ERROR或PROGRAM_ASSIGNMENT_NOT_FOUND。計劃分配由伺服器處理;帶有programId、programCreditLineId或program_credit_line_id的請求會返回INVALID_REQUEST。
GET /cardaccounts — 計劃額度會以 accountType: "program" 的形式作為一筆額外記錄返回。以下兩個可為 null 的新欄位僅出現於該記錄:programBalance— 計劃結算風險敞口(包括預留金額)programOutstanding— 已入賬的計劃結算風險敞口
available 恆等於 limit(計劃額度本身的 balance 維持為零),請勿用作容量判斷。估算計劃剩餘容量時,請使用 limit 減 programBalance。POST /cardaccounts/fixed-limit — 現亦可更新 program-limit 賬戶的指定額度。此類更新會跳過抵押品檢查,且不會更改計劃額度上限。請勿在同一請求內混合 program-limit 與 fixed-limit 賬戶;混合請求會失敗,且不會更改任何額度。新增 400 錯誤碼
計劃檢查失敗時會返回 HTTP 400 及以下其中一個 code 值。現有的驗證錯誤維持不變。請求範例 — POST /cardaccounts
響應範例 — GET /cardaccounts(計劃記錄)
建議行動
- 如果您的程式會根據
accountType分支處理,請加入新的program-limit及program值。將program記錄視為唯讀,並從持卡人介面的列表中排除。 - 如果您的 JSON 解析器會拒絕未知欄位,請允許
programBalance及programOutstanding。 - 在正式使用前,請聯絡您的方案經理為您的賬戶完成 program-limit 設定。
v1.4.11
API Enhancements
New KYC Rejection Reasons for CardsAdded three new detailed rejection reasons for card KYC review:ID Document Rejections:ID failed authenticity check – clear photo of original requested- The ID failed an authenticity check; the cardholder should resubmit a clear photo of the original documentID failed authenticity check – reject application- The ID failed an authenticity check and the application is declined
Additional Doc for Non-HK Resident (travel agency info invalid)- The travel agency information provided in the supporting document is invalid
rejectedReason field when the KYC status is rejected, and in the cardaccount.client-identity.rejected webhook. The two authenticity reasons use an en dash (–) rather than parentheses, so match on the category prefix (ID failed authenticity check) rather than the full string.📚 API Reference: Get Client Identity →API 增強
新增卡片 KYC 拒絕原因新增三項卡片 KYC 審核的詳細拒絕原因:身份證件拒絕:ID failed authenticity check – clear photo of original requested- 身份證件未通過真偽檢查;持卡人須重新提交正本的清晰照片ID failed authenticity check – reject application- 身份證件未通過真偽檢查,申請被拒絕
Additional Doc for Non-HK Resident (travel agency info invalid)- 證明文件中提供的旅行社資料無效
status 為 rejected 時,這些拒絕原因會在 rejectedReason 欄位及 cardaccount.client-identity.rejected Webhook 中返回。兩項真偽檢查原因使用連接號(–)而非括號,請以類別前綴(ID failed authenticity check)而非完整字串進行匹配。📚 API 參考:取得客戶身份資訊 →v1.4.10
Important Update
Card Transaction Notifications: SMS and WhatsApp No Longer SupportedThe change applies to two fields only:purchaseNotification and atmNotification.POST /cards/notification-settingsstill acceptssms,whatsapp, andautofor these two fields, for backward compatibility. None of them has any effect, and the response returnsoff.automeans WhatsApp with SMS fallback, so it is turned off along withsmsandwhatsapp.GET /cards/notification-settingsreturnsofffor these two fields, including on cards whose settings were made before the cutoff.onlinePurchaseVerificationandfraudAlertare not affected. They still accept and returnsms,whatsapp,auto, andoff.- 3DS, OTP, Google Pay binding, and other authentication or approval flows are not affected.
Action Suggested
- Remove the SMS, WhatsApp, and Auto choices for purchase and ATM notifications from your cardholder UI, since setting them has no effect.
- Expect
offforpurchaseNotificationandatmNotificationin every response, and don’t treat it as an error.
重要更新
卡片交易通知:不再支援 SMS 及 WhatsApp此變更只適用於兩個欄位:purchaseNotification 及 atmNotification。- 為向後兼容,
POST /cards/notification-settings仍接受這兩個欄位的sms、whatsapp及auto,但全部不會生效,響應會返回off。 auto代表 WhatsApp 並以 SMS 作後備,因此會與sms及whatsapp一同被關閉。GET /cards/notification-settings對這兩個欄位會返回off,包括於截止時間前已設定的卡片。onlinePurchaseVerification及fraudAlert不受影響,仍接受並返回sms、whatsapp、auto及off。- 3DS、OTP、Google Pay 綁定及其他認證或批核流程不受影響。
建議行動
- 由於設定不會生效,請從持卡人介面中移除消費及 ATM 通知的 SMS、WhatsApp 及 Auto 選項。
- 預期所有響應中的
purchaseNotification及atmNotification均為off,並且不要將其視為錯誤。
v1.4.9
Important Update
UnionPay Payouts: Chinese Name ValidationUnionPay payout destinations now have their Chinese name fields checked when you submit the request. Before this change, these fields were not checked until the payout processor handled the payout, so an invalid name only failed later.- Chinese characters only.
firstNameCNandsurnameCNmust match^[\u4e00-\u9fa5]+$. A romanized name such asXUis rejected. - Combined length limit.
firstNameCN, a space, andsurnameCNtogether must be at most 10 characters. Because the space counts, the two names can total at most 9 Chinese characters.
POST /payouts and POST /payouts/validate both reject an invalid name with HTTP 400. For the length limit, POST /payouts/validate returns UNIONPAY_INVALID_CHINESE_NAME_LENGTH. POST /payouts returns UNIONPAY_INVALID_FIELDS, and its message names the limit.📚 API Reference: Create Payout →
📚 API Reference: Validate Payout Parameters →重要更新
銀聯匯款:中文姓名驗證提交銀聯匯款請求時,系統現會檢查收款人的中文姓名欄位。此變更前,這些欄位要到匯款處理商處理時才會檢查,因此無效姓名會在較後階段才失敗。- 只限中文字元。
firstNameCN及surnameCN必須符合^[\u4e00-\u9fa5]+$。拼音或英文姓名(例如XU)會被拒絕。 - 合併長度上限。
firstNameCN、一個空格及surnameCN合計不得超過 10 個字元。由於空格亦計算在內,兩個姓名合計最多 9 個中文字。
POST /payouts 及 POST /payouts/validate 均會以 HTTP 400 拒絕無效姓名。超出長度上限時,POST /payouts/validate 返回 UNIONPAY_INVALID_CHINESE_NAME_LENGTH;POST /payouts 返回 UNIONPAY_INVALID_FIELDS,其 message 會註明該上限。📚 API 參考:建立匯款 →
📚 API 參考:驗證匯款參數 →v1.4.8
API Enhancements
Card Accountxid Now Included in Client Identity WebhooksThe two client identity result webhooks now carry the card account’s xid — your own reference for that card account — so you can reconcile KYC outcomes against your records without a follow-up lookup.What’s New
data.xid — a nullable string added to both events:cardaccount.client-identity.approvedcardaccount.client-identity.rejected
xid of the same card account identified by data.cardAccountId. It is null when that card account has no xid.This is an additive change. Event names and all existing fields are unchanged, and the events are still delivered when xid is absent.Example Payload — cardaccount.client-identity.approved
Example Payload — cardaccount.client-identity.rejected
Action Suggested
- If your webhook consumer uses a strict JSON decoder that rejects unknown fields, allow the new
xidfield before it reaches you. - If you set
xidwhen creating card accounts, key your KYC reconciliation ondata.xidinstead of resolvingcardAccountIdthrough an extra API call. - Historical events are not backfilled or resent — only events generated after this release carry
xid.
API 增強
客戶身份 Webhook 現已包含卡賬戶xid兩個客戶身份結果 Webhook 現已帶有卡賬戶的 xid(即您自訂的卡賬戶參考編號),讓您無需額外查詢即可將 KYC 結果與自身記錄對賬。新增內容
data.xid — 於以下兩個事件新增的可為 null 的 string 欄位:cardaccount.client-identity.approvedcardaccount.client-identity.rejected
data.cardAccountId 所指向的同一卡賬戶的 xid。若該卡賬戶沒有 xid,則為 null。此為新增性變更。事件名稱及所有現有欄位維持不變,即使 xid 不存在,事件仍會照常派送。載荷範例 — cardaccount.client-identity.approved
載荷範例 — cardaccount.client-identity.rejected
建議行動
- 如果您的 Webhook 接收端使用嚴格的 JSON 解析器並會拒絕未知欄位,請先容許新的
xid欄位。 - 如果您在建立卡賬戶時設定了
xid,請直接以data.xid進行 KYC 對賬,無需再透過額外 API 呼叫解析cardAccountId。 - 過往事件不會補發或重送 — 僅此版本發布後產生的事件會帶有
xid。
v1.4.7
API Enhancements
Card Dispute Fields Now ExposedCard account and transaction payloads now surface dispute information so cobranders can display dispute state to cardholders and react to dispute lifecycle events.What’s New
CardAccount.disputeAmount — a number field on every card account response.- The total amount currently under dispute, denominated in the card account currency.
- Returns
0when there is no disputed amount.
CardAccountTransaction.disputeStatus — a nullable string field on every card account transaction.- Possible values:
requested,pending,success,failed,reported, ornull(not disputed).
Webhook Behavior
Thecardaccount.transaction.updated webhook now also fires when a transaction’s dispute status changes (previously fired only on transaction status transitions such as pending → posted). The webhook payload’s data.disputeStatus carries the latest value.Example Response — GET /cardaccounts/transactions?cardAccountId=...
Example Response — GET /cardaccounts
Action Suggested
- If your UI surfaces card account balances, consider showing
disputeAmountalongsidebalance/outstandingso users see funds locked in dispute review. - If you subscribe to
cardaccount.transaction.updated, branch ondata.disputeStatusto react to dispute lifecycle (e.g. notify the user when a dispute completes).
API 增強
新增卡片爭議資料欄位卡賬戶與交易回應現已提供爭議資訊,方便聯名銀行向持卡人展示爭議狀態並對爭議生命週期事件作出回應。新增內容
CardAccount.disputeAmount — 每個卡賬戶回應中的 number 欄位。- 以卡賬戶幣種計算的目前爭議中總金額。
- 沒有爭議金額時返回
0。
CardAccountTransaction.disputeStatus — 每筆卡賬戶交易上的可為 null 的 string 欄位。- 可能的值:
requested、pending、success、failed、reported,或null(非爭議)。
Webhook 行為
cardaccount.transaction.updated Webhook 現在也會在交易爭議狀態變更時觸發(過去僅在交易狀態轉換如 pending → posted 時觸發)。Webhook 載荷中的 data.disputeStatus 會帶有最新值。響應範例 — GET /cardaccounts/transactions?cardAccountId=...
響應範例 — GET /cardaccounts
建議行動
- 如果您的介面顯示卡賬戶餘額,請考慮在
balance/outstanding旁邊顯示disputeAmount,以便使用者看到因爭議審核而鎖定的金額。 - 如果您已訂閱
cardaccount.transaction.updated,請根據data.disputeStatus進行分支處理,以對爭議生命週期作出回應(例如在爭議完成時通知使用者)。
v1.4.6
Important Update
Card Endpoints: Business Errors Now Return HTTP 400Seven card endpoints have been fixed so that known business-state errors now returnHTTP 400 Bad Request with a typed code field, instead of HTTP 500. Genuine upstream/system failures continue to return HTTP 500. This change is live in production.Affected Endpoints and Error Codes
Any other failure on these endpoints (e.g. an upstream card processor error) continues to return
HTTP 500 with a generic error body.Action Required
- Before: business errors such as
CARD_ALREADY_LOCKEDleaked through asHTTP 500. - After: the same errors return
HTTP 400with a structured body containing the errorcode— branch oncode, not on the HTTP status alone.
Example Response (After)
Recommended Client Handling
Branch on the HTTP status, not on individualcode values. Use body.code for user-facing messages or telemetry — not for retry decisions.code values is in the table above — useful when mapping each code to a localized user message in your UI.📚 API Reference: Cards →重要更新
卡片端點:業務錯誤現在返回 HTTP 400七個卡片端點已修正,已知的業務狀態錯誤現在會返回HTTP 400 Bad Request,並附帶具類型的 code 欄位,而不再返回 HTTP 500。真正的上游或系統錯誤仍會返回 HTTP 500。此變更已於生產環境上線。受影響的端點與錯誤碼
這些端點上的其他錯誤(例如上游卡片處理器錯誤)仍會以
HTTP 500 配合通用錯誤主體返回。需要採取的行動
- 修正前:例如
CARD_ALREADY_LOCKED之類的業務錯誤會以HTTP 500形式返回。 - 修正後:相同錯誤會以
HTTP 400返回,並在響應主體中包含結構化的code欄位 — 請根據code進行分支處理,而非僅依賴 HTTP 狀態碼。
響應範例(修正後)
建議的客戶端處理方式
請以 HTTP 狀態碼作為分支判斷依據,而非個別的code 值。body.code 應用於使用者訊息或紀錄分析 — 而非作為重試判斷的依據。400 code 值清單見上方表格 — 在介面上將每個 code 映射為本地化的使用者訊息時可派上用場。📚 API 參考:卡片 →v1.4.5
API Enhancements
New KYC Rejection Reason for CardsAdded a new detailed rejection reason for card KYC review:Supporting Document Rejections (Non-HK Residents):Additional Doc for Non-HK Resident (hotel info invalid)- The hotel information provided in the supporting document is invalid
rejectedReason field when the KYC status is rejected.📚 API Reference: Get Client Identity →新增卡片 KYC 拒絕原因新增一項卡片 KYC 審核的詳細拒絕原因:證明文件拒絕(非香港居民):
Additional Doc for Non-HK Resident (hotel info invalid)- 證明文件中提供的酒店資料無效
status 為 rejected 時,此拒絕原因會在 rejectedReason 欄位中返回。📚 API 參考:取得客戶身份資訊 →v1.4.4
API Enhancements
New KYC Rejection Reasons for CardsAdded three new detailed rejection reasons for card KYC review:ID Document Rejections:Invalid ID (name check hit)- The cardholder’s name triggered a name screening checkInvalid ID (exceed the company's risk appetite)- The application exceeds the company’s risk appetite threshold
Additional Doc for Non-HK Resident (missing id back photo)- The back photo of the ID document is missing
rejectedReason field when the KYC status is rejected.📚 API Reference: Get Client Identity →新增卡片 KYC 拒絕原因新增三項卡片 KYC 審核的詳細拒絕原因:身份證件拒絕:
Invalid ID (name check hit)- 持卡人姓名觸發了姓名篩查Invalid ID (exceed the company's risk appetite)- 申請超出公司風險承受範圍
Additional Doc for Non-HK Resident (missing id back photo)- 缺少身份證件背面照片
status 為 rejected 時,這些拒絕原因會在 rejectedReason 欄位中返回。📚 API 參考:取得客戶身份資訊 →v1.4.3
API Enhancements
Enhanced Transaction Intent DescriptionsTheintent field on transactions and the intent query parameter on the List Transactions endpoint now include detailed descriptions for all supported values:charge- Card purchase or payment authorizationrefund- Reversal or refund of a previous chargetopup- Funds loaded into the card accountwithdraw- Funds withdrawn (e.g. ATM or cash advance)repay- Repayment towards outstanding balancecashback- Cashback reward credited to the accountinterest- Interest accrued on outstanding balancetransfer- Balance transfer between card accountsfee- Service fees (e.g. annual fee, late payment fee)other- Uncategorized transaction types
intent query filter now also accepts an array of values for filtering by multiple intent types.📚 API Reference: List Transactions →New KYC Rejection ReasonAdded a new rejection reason for address verification during KYC review:
Incomplete Info (not residential address)- The address provided is not a valid residential address
rejectedReason field when the KYC status is rejected.📚 API Reference: Get Client Identity →交易意圖說明增強交易的
intent 欄位及列出交易端點的 intent 查詢參數現已包含所有支援值的詳細說明:charge- 卡片消費或支付授權refund- 退款或撤銷先前的消費topup- 資金存入卡賬戶withdraw- 資金提取(如 ATM 或現金預借)repay- 償還未清餘額cashback- 現金回饋獎勵interest- 未清餘額的利息transfer- 卡賬戶之間的餘額轉帳fee- 服務費用(如年費、逾期還款費)other- 未分類的交易類型
intent 查詢篩選器現在也支援數組值,可同時按多種意圖類型進行篩選。📚 API 參考:列出交易 →新增 KYC 拒絕原因新增一項用於地址驗證的 KYC 審核拒絕原因:
Incomplete Info (not residential address)- 提供的地址不是有效的住宅地址
status 為 rejected 時,此拒絕原因會在 rejectedReason 欄位中返回。📚 API 參考:取得客戶身份資訊 →v1.4.2
New Features
Sandbox Simulation for Client Identity VerificationProgrammatically simulate the approval or rejection of Client Identity (KYC) verification for card accounts in the Sandbox environment. This allows you to test your webhook handlers and downstream flows immediately without waiting for manual intervention.What’s New:
A new endpointPOST /cardaccounts/simulate-client-identity-status is now available in the Sandbox environment.Usage:
Send a request with thecardAccountId and the desired action (approve or reject).Example Request:
ClientIdentityApproved, ClientIdentityRejected) as a real manual review, ensuring your integration is fully tested against production-like behavior.📚 API Reference: Simulate Client Identity Status →客戶身份驗證沙盒模擬在沙盒環境中以程式方式模擬卡賬戶客戶身份(KYC)驗證的批准或拒絕。這使您能夠在無需運營團隊手動干預的情況下,即時測試您的 Webhook 處理程序和下游流程。
新增內容:
沙盒環境中新增了端點POST /cardaccounts/simulate-client-identity-status。使用方法:
發送包含cardAccountId 和所需 action(approve [批准] 或 reject [拒絕])的請求。請求範例:
ClientIdentityApproved、ClientIdentityRejected),確保您的集成測試與生產行為一致。📚 API 參考:模擬客戶身份狀態 →v1.4.1
API Enhancements
Enhanced KYC Rejection Reasons for Supporting DocumentsAdded five new detailed rejection reasons specifically for supporting documents submitted by non-Hong Kong residents. These new rejection codes provide clearer feedback when supporting documents are rejected during KYC review:Additional Doc for Non-HK Resident (document type not accepted)- The submitted document type is not acceptedAdditional Doc for Non-HK Resident (expired document)- The submitted document has expiredAdditional Doc for Non-HK Resident (unclear image)- The document image quality is insufficientAdditional Doc for Non-HK Resident (document not belong to client)- The document does not belong to the applicantAdditional Doc for Non-HK Resident (potential bogus document)- The document appears to be fraudulent
rejectedReason field when the KYC status is rejected.📚 API Reference: Get Client Identity →v1.4.0
Important Update
Travel Permit Document Submission UpdateEffective Date: February 1, 2026, 00:00 HKT
What’s Changing:
The previous document typeTRAVEL_PERMIT has been replaced with two new document types:TRAVEL_PERMIT_FRONT- Front side of the permitTRAVEL_PERMIT_BACK- Back side of the permit
Example Submission:
往來港澳通行證文件提交要求更新
生效日期: 2026年2月1日,香港時間 00:00
變更內容:
先前的文件類型TRAVEL_PERMIT 已被替換為兩個新的文件類型:TRAVEL_PERMIT_FRONT- 通行證正面TRAVEL_PERMIT_BACK- 通行證背面
提交範例:
v1.3.0
Important Updates
New Mandatory KYC Requirements for Individual CardholdersEffective Date: February 1, 2026, 00:00 HKT
occupation- Select from/v1/occupationsendpointposition- Select from/v1/positionsendpointgender- MALE or FEMALEnationality- ISO 3166-1 alpha-2 format (e.g., HK)supportingDocuments- Required for non-Hong Kong (HK) nationals (see accepted document types →)
個人持卡人強制性 KYC 要求更新
生效日期: 2026年2月1日,香港時間 00:00
occupation(職業)- 從/v1/occupations端點選擇position(職位)- 從/v1/positions端點選擇gender(性別)- MALE 或 FEMALEnationality(國籍)- ISO 3166-1 alpha-2 格式(例如:HK)supportingDocuments(證明文件)- 非香港 (HK) 國籍申請人必須提供(查看可接受的文件類型 →)
v1.2.0
New Features
New 3D Secure (3DS) Challenge Flow for Online TransactionsEnhanced security for online transactions with the new 3DS challenge flow, providing a more secure and streamlined verification experience.📖 View 3D Secure Integration Guide →Go-Live Date: December 19, 2025, 00:00 HKT
⚠️ Deprecated Webhook:
cardaccount.transaction.verification-code-delivered - This webhook has been replaced by the new 3DS challenge flow. Please migrate to the new integration.v1.1.0
New Features
Webhook Auto-Recovery MechanismNew automatic recovery system for suspended webhooks to reduce manual intervention and prevent webhook accumulation:- Auto-Recovery: Suspended webhooks are automatically pinged every 5 minutes for up to 24 hours
- Automatic Resumption: If a ping succeeds, webhook delivery resumes automatically without manual intervention
- Auto-Deletion: Webhooks are automatically deleted if they remain suspended with failed recovery pings for 24 consecutive hours
Go-Live Date: November 29, 2025, 00:00 HKT

