KYC 发卡流程
适用场景:目标卡产品的 kyc_level 为 Standard / Enhanced,或 cardholder_required_fields 中要求 identity、billing_address、kyc_verification 等字段。若产品仅要求 Simplified 字段,可沿用基础持卡人创建流程,无需本指南全部步骤。
警告:仅当持卡人
status为SUCCESS时才能发起开卡。
持卡人处于PENDING或FAILED时,请勿调用创建卡片;须先完成平台审批或处理驳回。
警告:开卡受地区与国籍限制。
持卡人的账单地址国家、国籍、手机区号须满足目标产品的support_billing_region、support_nationality/sanctioned_nationality、support_area_code。建议在创建持卡人并完成 KYC 之前,先查看产品列表中的限制字段,避免 KYC 通过后仍无法开卡。
持卡人要求
- 以目标产品的
cardholder_required_fields为准;仅required: true的字段必须提供。 - 地址字段字符集:字母、数字、空格及
, . ' / # ( ) - &;postcode长度 4–10。 - 美国国籍持卡人需提供 9 位数字
ssn(以产品必填配置为准)。
概览
前置条件:获取 Access Token
所有业务接口需在请求头携带:
| Header | 说明 |
|---|---|
Authorization | Bearer {access_token}(获取 token 接口除外) |
X-Request-Id | 请求 ID,建议 UUID;写操作同时用于幂等 |
curl -X POST "https://{host}/api/open/v1/auth/token" \
-H "Content-Type: application/json" \
-H "X-Request-Id: 550e8400-e29b-41d4-a716-446655440000" \
-d '{
"api_key": "{your_api_key}",
"api_secret": "{your_api_secret}"
}'
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 7200
}
}
后续示例中的 {token} 均指上述 access_token。
步骤 1:检查产品要求
调用卡产品列表,确认目标产品的 KYC 等级、必填字段与地区限制。
curl -X GET "https://{host}/api/open/v1/issuing/products" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}"
响应中每个产品的 id 即为后续开卡 / 预校验使用的 card_product_id(账户–产品绑定 ID)。
重点关注:
| 字段 | 说明 |
|---|---|
kyc_level | Simplified / Standard / Enhanced |
cardholder_required_fields | 持卡人必填字段树(含嵌套 fields) |
support_billing_region | 账单地址国家白名单;空表示不限制 |
support_nationality / sanctioned_nationality | 国籍白/黑名单;空表示不限制 |
support_area_code | 手机区号白名单;空表示不限制 |
min_open_card_amount / min_recharge_amount | 开卡与充值门槛 |
max_cards_per_cardholder | 持卡人最大开卡数;空表示不限制 |
Enhanced 类产品的 cardholder_required_fields 通常会包含 identity、billing_address(或 residential_address)、kyc_verification 等。示例(字段以实际产品配置为准):
{
"id": "acct-prod-xxxxx",
"name": "Personal Visa Enhanced",
"status": "ENABLED",
"kyc_level": "Enhanced",
"model_type": "SINGLE",
"card_scheme": "VISA",
"country": "SG",
"support_billing_region": ["SG", "HK"],
"support_nationality": ["SG", "HK", "CN"],
"sanctioned_nationality": [],
"support_area_code": ["+65", "+852"],
"cardholder_required_fields": [
{ "name": "first_name", "type": "string", "required": true },
{ "name": "last_name", "type": "string", "required": true },
{ "name": "email", "type": "string", "required": true },
{ "name": "birth_date", "type": "string", "required": true },
{ "name": "nationality", "type": "string", "required": true },
{
"name": "identity",
"type": "object",
"required": true,
"fields": [
{ "name": "type", "type": "string", "required": true },
{ "name": "number", "type": "string", "required": true },
{ "name": "issue_country", "type": "string", "required": true },
{ "name": "front_file_id", "type": "string", "required": true },
{ "name": "back_file_id", "type": "string", "required": false }
]
},
{
"name": "billing_address",
"type": "object",
"required": true,
"fields": [
{ "name": "country", "type": "string", "required": true },
{ "name": "state", "type": "string", "required": true },
{ "name": "city", "type": "string", "required": true },
{ "name": "line1", "type": "string", "required": true },
{ "name": "postcode", "type": "string", "required": true }
]
},
{
"name": "kyc_verification",
"type": "object",
"required": true,
"fields": [
{ "name": "method", "type": "string", "required": true }
]
}
]
}
只有标注
"required": true的字段是必填;可选字段可省略。开卡前也可用步骤 2.5 的预校验接口提前检查。
城市名称建议先查询公共城市列表:
curl -X GET "https://{host}/api/open/v1/common/cities?country=SG" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}"
步骤 2:上传证件图片
证件图片均须先上传获取 file_id。
curl -X POST "https://{host}/api/open/v1/common/files/upload" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}" \
-F "file=@/path/to/passport_front.jpg"
{
"success": true,
"data": {
"file_id": "file_xxxxxxxx",
"file_name": "passport_front.jpg",
"file_type": "image/jpeg",
"size": 204800
}
}
限制:最大 10MB;格式 jpg / jpeg / png / pdf。
下载:GET /api/open/v1/common/files/{id}。
步骤 2.5(可选):持卡人 × 产品预校验
在正式创建持卡人之前,可用草稿字段或已有 cardholder_id 做预校验,减少开卡时的 CARDHOLDER_FIELDS_INCOMPLETE。
curl -X POST "https://{host}/api/open/v2/issuing/cardholders/validate" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}" \
-d '{
"card_product_id": "acct-prod-xxxxx",
"email": "sarah.chen@example.com",
"first_name": "Sarah",
"last_name": "Chen",
"birth_date": "1992-06-15",
"nationality": "SG",
"area_code": "+65",
"billing_address": {
"country": "SG",
"state": "Singapore",
"city": "Singapore",
"line1": "9 N Buona Vista Dr",
"postcode": "138666"
}
}'
- 传入
cardholder_id时优先生效,可少传草稿字段。 - 不传
card_product_id时,校验账户下全部ENABLED产品。 - 关注响应中的
valid、issues[].type(MISSING_FIELDS/COUNTRY_RESTRICTION)与missing_fields。
步骤 3:使用 KYC 字段创建持卡人(v2)
POST /api/open/v2/issuing/cardholders
KYC 验证方式二选一:
| 方式 | 适用场景 | 结果 |
|---|---|---|
REDIRECT_LINK | 希望由平台通过 Sumsub 完成 IDV | 获取验证链接,引导持卡人完成验证 |
THIRD_PARTY | 商户已通过自有 KYC 服务商完成验证 | 提交服务商 reference_id |
方式 A:REDIRECT_LINK
创建持卡人时指定 method,无需 kyc_proof:
curl -X POST "https://{host}/api/open/v2/issuing/cardholders" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}" \
-d '{
"first_name": "Sarah",
"last_name": "Chen",
"email": "sarah.chen@example.com",
"birth_date": "1992-06-15",
"gender": 2,
"mobile_number": "90755646",
"mobile_country": "SG",
"area_code": "+65",
"nationality": "SG",
"identity": {
"type": "PASSPORT",
"number": "E98765432",
"issue_country": "SG",
"issue_date": "2018-01-15",
"expiry_date": "2028-01-14",
"front_file_id": "file_xxxxxxxx"
},
"billing_address": {
"country": "SG",
"state": "Singapore",
"city": "Singapore",
"district": "Buona Vista",
"line1": "9 N Buona Vista Dr",
"line2": "THE METROPOLIS",
"postcode": "138666"
},
"delivery_address": {
"country": "SG",
"state": "Singapore",
"city": "Singapore",
"line1": "9 N Buona Vista Dr",
"postcode": "138666"
},
"kyc_verification": {
"method": "REDIRECT_LINK"
}
}'
{
"success": true,
"data": {
"id": "ch_9d6017b2-0c2f-4b2e-876b-992b0db9597d"
}
}
接着获取 KYC 链接(须已设置 REDIRECT_LINK):
curl -X POST "https://{host}/api/open/v1/issuing/cardholders/{id}/kycLink" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}"
{
"success": true,
"data": {
"url": "https://in.sumsub.com/websdk/p/...",
"expires_at": "2026-04-04 17:32:50",
"review_status": "init"
}
}
将持卡人重定向到 url 完成身份验证,并订阅 Webhook(见步骤 4)。也可通过 GET /api/open/v2/issuing/cardholders/{id} 查看 kyc_status 与 kyc_verification.url。
证件类型 type 支持:ID_CARD、PASSPORT、HK_HKID、DLN。非护照创建时通常需提供 back_file_id。
方式 B:THIRD_PARTY
若已通过自有 KYC 服务商完成验证,提交 kyc_proof。
curl -X POST "https://{host}/api/open/v2/issuing/cardholders" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}" \
-d '{
"first_name": "Sarah",
"last_name": "Chen",
"email": "sarah.chen@example.com",
"birth_date": "1992-06-15",
"mobile_number": "90755646",
"mobile_country": "SG",
"area_code": "+65",
"nationality": "SG",
"identity": {
"type": "PASSPORT",
"number": "E98765432",
"issue_country": "SG",
"front_file_id": "file_xxxxxxxx"
},
"billing_address": {
"country": "SG",
"state": "Singapore",
"city": "Singapore",
"line1": "9 N Buona Vista Dr",
"postcode": "138666"
},
"kyc_verification": {
"method": "THIRD_PARTY",
"kyc_proof": {
"provider": "YOUR_PROVIDER",
"reference_id": "your_provider_ref_1234567890",
"documents": [
{
"file_id": "file_idv_report",
"report_type": "IDV"
}
]
}
}
}'
kyc_proof.reference_id:长度 10–128,且全局唯一。重复会返回CARDHOLDER_KYC_REFERENCE_ALREADY_EXISTS。
创建成功后仍可能需等待平台对持卡人的审批(status → SUCCESS)。THIRD_PARTY 场景下,若上游 IDV 尚未最终通过,后续开卡可能进入异步等待(见步骤 5)。
步骤 4:等待 KYC / 持卡人可用
状态说明
| 字段 | 取值 | 说明 |
|---|---|---|
status | PENDING / SUCCESS / FAILED | 平台持卡人审批状态;开卡要求 SUCCESS |
kyc_status | NOT_STARTED / PENDING / VERIFIED / REJECTED | KYC 进度;产品要求 KYC 时通常需 VERIFIED |
Webhook
建议订阅:
cardholder.createdcardholder.updatedcardholder.kyc.status_changed
cardholder.kyc.status_changed 的 data 示意:
{
"cardholder_id": "ch_9d6017b2-0c2f-4b2e-876b-992b0db9597d",
"status": "SUCCESS",
"kyc_status": "VERIFIED",
"first_name": "Sarah",
"last_name": "Chen",
"email": "sarah.chen@example.com",
"create_time": "...",
"update_time": "...",
"kyc_verification_url": "https://...",
"kyc_verification_url_expires_at": "..."
}
kyc_verification_url 仅在 REDIRECT_LINK 且链接仍有效时可能出现。
REDIRECT_LINK未完成 Sumsub(未达到 VERIFIED)时,不能开卡,会返回CARDHOLDER_KYC_NOT_COMPLETE,且不支持延后开卡(无WAITING_KYC)。
KYC 被拒绝时返回CARDHOLDER_KYC_REJECTED。
步骤 5:创建卡片
当 status = SUCCESS,且产品要求的 KYC 已满足(通常 kyc_status = VERIFIED)后,调用 v2 开卡:
curl -X POST "https://{host}/api/open/v2/issuing/cards" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-H "X-Request-Id: {uuid}" \
-d '{
"cardholder_id": "ch_9d6017b2-0c2f-4b2e-876b-992b0db9597d",
"card_product_id": "acct-prod-xxxxx",
"label": "Sarah travel",
"recharge_amount": 100,
"out_id": "merchant-order-001"
}'
{
"success": true,
"data": {
"id": "card_d26f2287-434b-41a4-af47-f06dbf6f9e71"
}
}
card_product_id:步骤 1 产品列表中的id(必填)。recharge_amount:允许为0;须满足产品min_open_card_amount/min_recharge_amount。out_id:可选外部标识,便于对账。