跳轉到主要內容

KYC · 客戶准入

註冊客戶、恢復或啓動執行、提交節點數據並跟蹤案件審覈結論。

流程概覽

使用 eventType KYC_EVENT。註冊客戶後先檢查是否已有執行;僅在無匹配時啓動,依次提交等待中的節點,並跟蹤案件最終結論。KYC 只是控制檯顯示名。

步驟 1 — 註冊客戶

接口: workflow.applicant.register POST

{
  "customerId": "C_abc123",
  "email": "john@example.com"
}
customerId 和 email 至少需傳一個。此接口冪等 — 重複調用將返回已有客戶。

響應:

{
  "apiCode": 200,
  "data": {
    "code": 200,
    "data": { "customerId": "C_abc123", "isNew": true },
    "msg": "success"
  }
}

2. 恢復或啓動工作流

2.1 檢查已有執行

接口: workflow.apply.query POST

按 eventType + source + customerId 查詢該客戶是否已有執行。只讀 — 不觸發新執行、不計費。使用 apiVersion 1.0.0。

請求

{
  "eventType": "KYC_EVENT",
  "source": "API",
  "customerId": "C_abc123"
}
字段 類型 必填 描述
eventType string 是 與 submit 時一致。
source string 是 與 submit 時一致。
customerId string 是 與 submit 時 data.customerId 一致(必須對同一客戶保持穩定)。

響應

{
  "apiCode": 200,
  "apiMsg": "OK",
  "data": {
    "code": 200,
    "executionId": "exec-7208f03b931e4897",
    "status": "RUNNING"
  }
}
命中情況 executionId status 建議動作
客戶已審批通過 最近一次 COMPLETED 執行 APPROVED 不要重複提交。
存在進行中的執行 該執行 RUNNING 轉輪詢 workflow.execution.status。
未命中(被拒/無記錄) 空 — 可正常調用 submit。
customerId 穩定性 — customerId 必須與 submit 時 data.customerId 完全一致,且對同一客戶長期穩定;否則恢復查詢無法命中。

2.2 啓動工作流

接口: workflow.apply.submit POST

{
  "eventType": "KYC_EVENT",
  "source": "API",
  "data": {
    "customerId": "C_abc123",
    "referenceId": "onboarding-uuid-001"
  }
}

保存返回的 executionId — 後續所有接口調用均需使用。關於 apiVersion 2.0.0 與本工作流共用的 Case 結論字段(caseStatus / riskScore),見 工作流生命週期 API → 發起 與 查詢狀態與審覈結論。

workflow.apply.submit 使用 apiVersion 2.0.0。workflowId 爲可選:傳入已發佈的工作流 ID 可明確選擇工作流;留空則按 eventType + source 路由。請持久保存 executionId。業務層 data.code 爲 403 表示事件額度不足;再次提交前請管理員補充額度。

步驟 3 — 輪詢狀態

接口: workflow.execution.status POST

啓動工作流後約等待 2 秒再首次輪詢,系統需要短暫時間初始化節點。
{
  "executionId": "exec-abc123def456"
}
狀態 含義 處理方式
RUNNING 執行中,尚無節點等待 繼續輪詢 (2–5 秒)
WAITING 節點等待輸入 讀取 currentNode 並提交數據
COMPLETED 工作流已完成 讀取最終結果及 caseStatus,並按下方案件結論退出規則處理。
FAILED 執行失敗 停止輪詢,聯繫技術支持
TIMEOUT 已超時 停止輪詢,聯繫技術支持
取消狀態值:待確認 已取消 停止輪詢

當 status = WAITING 時的關鍵字段:

除執行狀態外,還應讀取 caseNo、caseStatus、riskScore 和 resolvedAt。UNASSIGNED、UNDER_REVIEW 和 RETURNED 表示人工處理;OTHER_GROUP 表示流程仍在其他組或節點中繼續。請持續輪詢至 caseStatus 爲 APPROVED、REJECTED 或 CLOSED,或執行爲 FAILED 或已確認取消。人工處理時採用 30–60 秒間隔,自動處理時採用 3–5 秒間隔。不能僅憑執行狀態替代案件審覈結論。

步驟 4 — 提交節點數據

每次提交響應都包含 nextStep 對象,可直接使用以進入下一步 — 無需每次提交間輪詢。僅在恢復會話或等待最終結果時輪詢。

nodeType API 描述
flow_action_identity_document workflow.kyc.ocr → workflow.kyc.ocr.data 上傳證件圖片,獲取 OCR 結果
flow_action_individual_particular workflow.kyc.particular.data 提交個人信息
flow_action_liveness_test workflow.kyc.liveness.data 提交 PASS 狀態及客戶照片
flow_action_validate_email workflow.kyc.otp.send + workflow.kyc.otp.verify 郵箱 OTP 驗證
flow_action_validate_phone workflow.kyc.otp.send + workflow.kyc.otp.verify 手機 OTP 驗證
flow_action_individual_required_document workflow.kyc.required.doc + workflow.kyc.required.doc.submit 上傳必傳文件
flow_action_individual_nonrequired_document workflow.kyc.non.required.doc + workflow.kyc.non.required.doc.submit 可選文件(可跳過)
flow_action_individual_required_forms workflow.kyc.required.form + workflow.kyc.required.form.submit 提交表單/問卷
flow_action_screen_check (自動執行) AML/制裁篩查 — 無需操作

身份證件 (OCR)

兩步操作: 先提交圖片,再輪詢結果。

步驟 1 — 提交: workflow.kyc.ocr POST

參數 類型 必填 描述
provider String 是 WIDTH / REGULA / VERIFF
frontImage String 是 證件正面圖片的 S3 URI
backImage String 否 證件背面圖片的 S3 URI
documentType String 是 NATIONAL_ID / INTERNATIONAL_PASSPORT / DRIVING_LICENCE / RESIDENCE_PERMIT
region String 是 ISO 雙字母國家代碼
executionId String 是 執行 ID
callbackKey String 是 取自 currentNode.callbackKey
referenceId String 是 您的追蹤 ID
includeDocverCheck Boolean 否 啓用證件真僞驗證
需先通過文件上傳接口上傳圖片以獲取 S3 URI。

OCR 提交請求體:workflow.kyc.ocr

{
  "provider": "WIDTH",
  "frontImage": "s3://workflow-kyc/.../front.jpg",
  "backImage":  "s3://workflow-kyc/.../back.jpg",
  "documentType": "INTERNATIONAL_PASSPORT",
  "region": "SG",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:ocr:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001"
}

步驟 2 — 輪詢結果: workflow.kyc.ocr.data POST

2–5 秒後輪詢。OCR 通常在 5–15 秒內完成。

個人信息

接口: workflow.kyc.particular.data POST

{
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:particular:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001",
  "personData": "{\"name\":\"John Smith\",\"dateOfBirth\":\"1990-01-15\",\"nationality\":\"SG\",\"sex\":\"MALE\",\"countryOfResidence\":\"SG\",\"address\":\"123 Main St\"}"
}
注意: personData 是一個 JSON 編碼的字符串,而非嵌套對象。必須先 JSON.stringify() 再放入請求體。

活體檢測

在 OpenAPI 模式下,活體檢測是數據提交步驟而非交互式檢測。提交 status: "PASS" 及客戶照片即可。

接口: workflow.kyc.liveness.data POST

{
  "provider": "SELF",
  "status": "PASS",
  "scores": "{\"qualityScore\":1.0,\"brightnessScore\":100,\"brightnessStatus\":\"normal\"}",
  "images": "{\"faceFull\":\"s3://workflow-kyc/tenantImages/2026-04-16/customer_photo.jpg\"}",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:liveness:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001"
}
scores 和 images 均爲 JSON 字符串。需先通過文件上傳接口上傳照片。

郵箱 / 手機 OTP

步驟 1 — 發送: workflow.kyc.otp.send POST

{
  "type": "email",
  "identity": "john@example.com",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:email:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001"
}
手機 OTP 時設置 "type": "phone",identity 使用 E.164 格式(如 +6581234567)。保存返回的 requestId 用於驗證步驟。

步驟 2 — 驗證: workflow.kyc.otp.verify POST

{
  "type": "email",
  "identity": "john@example.com",
  "code": "985024",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:email:exec-abc123def456:...",
  "requestId": "550e8400-e29b-41d4-a716-446655440000",
  "referenceId": "onboarding-uuid-001"
}

必傳文件

接口: workflow.kyc.required.doc POST

{
  "doc": "{\"front\":{\"url\":\"s3://workflow-kyc/.../bill.pdf\",\"filename\":\"bill.pdf\",\"content_type\":\"application/pdf\",\"size\":85618}}",
  "isRequired": true,
  "docType": "UTILITY_TELEPHONE_BILL",
  "extraData": "{\"issueDate\":\"2026-03-01\"}",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:required_doc:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001"
}

上傳完所有文件後,調用 workflow.kyc.required.doc.submit 推進工作流。

可選文件使用 workflow.kyc.non.required.doc,請求體結構相同。即使跳過也需調用 workflow.kyc.non.required.doc.submit 以推進。

必填表單

接口: workflow.kyc.required.form POST

{
  "formId": "IndividualForm",
  "formData": "{\"field_source_of_funds\":\"EMPLOYMENT\",\"field_annual_income\":\"50000-100000\"}",
  "executionId": "exec-abc123def456",
  "callbackKey": "kyc:required_form:exec-abc123def456:...",
  "referenceId": "onboarding-uuid-001"
}

提交所有表單後,調用 workflow.kyc.required.form.submit。

取消執行

接口: workflow.execution.cancel POST

{
  "executionId": "exec-abc123def456"
}
取消不可逆。已取消的執行無法恢復。

中途恢復

若流程中斷,使用已保存的 executionId 調用 workflow.execution.status,即可從上一個待處理節點恢復。數據不會丟失。

取消狀態契約待確認:生命週期參考使用 CANCELED,KYC 參考使用 CANCELLED。確認取消後應停止輪詢;部署依賴取消狀態的代碼前,請向 WIDTH 工程團隊確認接口實際返回的枚舉值。此處不將任一拼寫認定爲最終契約。