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。
-
斷點恢復 — 調用
submit後超時或宕機、未拿到executionId:先 query,命中則直接拿回executionId繼續輪詢,避免重複提交(submit 計費)。 -
提交防重 —
上游重試導致同一客戶可能重複發起:query 命中
RUNNING/APPROVED時跳過submit。
請求
{
"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 必須與 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
{
"executionId": "exec-abc123def456"
}
| 狀態 | 含義 | 處理方式 |
|---|---|---|
RUNNING |
執行中,尚無節點等待 | 繼續輪詢 (2–5 秒) |
WAITING |
節點等待輸入 |
讀取 currentNode 並提交數據
|
COMPLETED |
工作流已完成 | 讀取最終結果及 caseStatus,並按下方案件結論退出規則處理。 |
FAILED |
執行失敗 | 停止輪詢,聯繫技術支持 |
TIMEOUT |
已超時 | 停止輪詢,聯繫技術支持 |
| 取消狀態值:待確認 | 已取消 | 停止輪詢 |
當 status = WAITING 時的關鍵字段:
-
currentNode.nodeType→ 決定調用哪個接口 -
currentNode.callbackKey→ 提交數據時必傳 -
currentNode.metadata→ 節點專屬配置
除執行狀態外,還應讀取 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 | 否 | 啓用證件真僞驗證 |
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"
}
"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,即可從上一個待處理節點恢復。數據不會丟失。