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,即可从上一个待处理节点恢复。数据不会丢失。