跳转到主要内容

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 工程团队确认接口实际返回的枚举值。此处不将任一拼写认定为最终契约。