sumsub-create-level
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSumsub — Create Level
Sumsub — 创建等级
Builds an JSON payload from a compact spec, POSTs (or PATCHes) it to the Sumsub API, and reports the resulting / .
ApplicantLevelnameid根据紧凑规范生成 JSON负载,通过POST(或PATCH)请求发送至Sumsub API,并返回生成的/。
ApplicantLevelnameidEndpoints
接口端点
| Method | Path | When |
|---|---|---|
| | Create a new level. Body must NOT include |
| | Update an existing level (by |
| | Read one level. Use this to verify what landed (tenant gates may silently drop fields) or to resolve |
| | List all levels (use to reuse existing levels before creating duplicates). |
Body: . Returns the persisted level with , , audit trails.
ApplicantLevelidcreatedAt| 方法 | 路径 | 适用场景 |
|---|---|---|
| | 创建新等级。请求体不得包含 |
| | 更新现有等级(需在请求体中传入 |
| | 读取单个等级信息。用于验证提交内容是否生效(租户权限可能会静默丢弃字段),或通过已知 |
| | 列出所有等级(用于创建重复等级前复用已有等级)。 |
请求体:。返回包含、和审计追踪信息的已持久化等级。
ApplicantLevelidcreatedAtAuth — App Token + secret (sandbox only)
认证——应用令牌+密钥(仅沙箱环境)
This skill talks to the public Sumsub API and signs each request per
the authentication reference.
The full how-it-works writeup lives in the
skill — read it if you hit .
sumsub-api-auth401 Invalid signature⚠️ Sandbox tokens only. Do not accept or use a production App Token here — creating a level is a workspace-visible write. If the user offers a prod token, refuse and ask them to generate a sandbox pair at https://cockpit.sumsub.com/checkus/devSpace/appTokens (toggle the workspace to Sandbox first, then Create). Token + secret are shown once — copy both before closing the dialog. The helper script enforces this — it rejects tokens that don't start with.sbx:
| Var | Example |
|---|---|
| |
| The paired secret shown once at token creation. |
| Optional. Defaults to |
If the user has already supplied credentials in conversation, reuse them;
otherwise ask once before running. Never echo the secret back.
本技能调用公开的Sumsub API,并按照
认证参考文档对每个请求进行签名。
完整的工作原理说明在
技能文档中——如果遇到错误,请查阅该文档。
sumsub-api-auth401 Invalid signature⚠️ 仅支持沙箱令牌。 请勿接受或使用生产环境的应用令牌 ——创建等级是对共享工作区的写入操作。如果用户提供生产环境令牌,请拒绝并要求他们在https://cockpit.sumsub.com/checkus/devSpace/appTokens生成沙箱环境的令牌密钥对(先将工作区切换为Sandbox,再点击Create)。令牌和密钥仅显示一次——请在关闭对话框前复制两者。辅助脚本会强制验证这一点——拒绝所有不以开头的令牌。sbx:
| 变量 | 示例 |
|---|---|
| |
| 创建令牌时一次性显示的配对密钥。 |
| 可选参数。默认值为 |
如果用户已在对话中提供凭证,请复用;否则在执行前询问一次。切勿回显密钥内容。
Procedure
操作流程
-
Fetch tenant entitlements. Invoke theskill and parse the JSON result. Store the
sumsub-check-permissionsarray; use it for all feature-gate checks in step 2 and the entitlements section below. Do this before anything else.allowed -
Check existing entities. Before building anything, list existing levels, POA presets, and questionnaires (GET the respective list endpoints). If a matching entity already exists, offer to reuse itsand skip the POST — the server creates a duplicate on every POST with no name deduplication.
id -
Translate the user's request to the compact spec below — name, applicant type, and a list of doc-set steps in the order they should appear in the WebSDK flow.
-
Validate — confirm everyis a real
type, everyIdDocSetTypestep has aQUESTIONNAIREthat points to an existing questionnaire, everyquestionnaireDefIdstep has aPROOF_OF_RESIDENCE*/poaPresetId(the server rejects the level if it's missing — runpoaStepSettingsIdfirst if no preset exists), everysumsub-create-poa-presetstep has at least one named sub-step. Use theCOMPANYarray from step 0 to reject any entitlement-gated feature not present in it.allowed -
Generate payload — runwith the spec on stdin → full payload on stdout.
${CLAUDE_SKILL_DIR}/scripts/build_level.py -
Show the resolved payload to the user and ask for explicit confirmation before the first POST.
-
Create vs. update:
- New level — POST via . Returns response body + HTTP status.
${CLAUDE_SKILL_DIR}/scripts/post_level.sh - Update existing — GET the current state via so the user sees the diff, then PATCH via
${CLAUDE_SKILL_DIR}/scripts/get_level.sh. The spec passed to${CLAUDE_SKILL_DIR}/scripts/patch_level.shmust includebuild_level.py— the builder preserves it into the payload, and PATCH refuses bodies without it. PATCH replacesid: <level-id>as a single array — every docSet you send must carry the full intended state, since fields omitted from a docSet are wiped on the server. Copy preserved values from the GET response into your PATCH spec.requiredIdDocs.docSets
- New level — POST via
-
GET the level back viaand compare to what was sent — several fields land differently from what was sent (see gotchas in references/level-schema.md). Report any discrepancy to the user.
${CLAUDE_SKILL_DIR}/scripts/get_level.sh -
Build the dashboard link. Read,
id, andapplicantTypefrom the response body and format:clientIdhttps://cockpit.sumsub.com/checkus/sdkIntegrations/levels/<applicantType>Level/<id>?clientId=<clientId>&xSNSEnv=sbxThesegment is literally<applicantType>LevelforindividualLevel(confirmed) andapplicantType: individualforcompanyLevel(assumed by analogy — surface as the best guess and flag if it 404s). TheapplicantType: companyquery param targets the Sandbox workspace — it is the canonical sandbox link param shared across all skills.xSNSEnv=sbx -
Report — lead with the human-readable name:
- ,
name, ordered list of docSets created.applicantType - Dashboard link as a clickable markdown link.
- Final line: .
Level ID (for SDK access tokens / future PATCH): <id>
Surface 4xx errors verbatim — they usually point to a missingor an unknown enum value.questionnaireDefId
-
获取租户权限。调用技能并解析JSON结果。存储
sumsub-check-permissions数组;在步骤2和下文权限章节的所有功能权限检查中使用该数组。这一步需优先执行。allowed -
检查现有实体。在构建任何内容之前,列出所有现有等级、居住证明预设和问卷(调用对应的列表接口)。如果存在匹配的实体,建议复用其并跳过POST请求——服务器每次POST都会创建重复项,不会对名称进行去重。
id -
将用户请求转换为下文的紧凑规范——包括名称、申请人类型,以及在WebSDK流程中应显示的文档集步骤列表。
-
验证——确认每个都是有效的
type,每个IdDocSetType步骤都包含指向现有问卷的QUESTIONNAIRE,每个questionnaireDefId步骤都包含PROOF_OF_RESIDENCE*/poaPresetId(如果缺少该参数,服务器会拒绝创建等级——如果没有预设,请先运行poaStepSettingsId),每个sumsub-create-poa-preset步骤至少包含一个命名子步骤。使用步骤0中获取的COMPANY数组拒绝任何租户未拥有权限的功能。allowed -
生成负载——通过标准输入将规范传入,标准输出即为完整负载。
${CLAUDE_SKILL_DIR}/scripts/build_level.py -
向用户展示解析后的负载并请求明确确认,然后执行首次POST请求。
-
创建 vs 更新:
- 新等级——通过执行POST请求。返回响应体和HTTP状态码。
${CLAUDE_SKILL_DIR}/scripts/post_level.sh - 更新现有等级——通过获取当前状态以便用户查看差异,然后通过
${CLAUDE_SKILL_DIR}/scripts/get_level.sh执行PATCH请求。传入${CLAUDE_SKILL_DIR}/scripts/patch_level.sh的规范必须包含build_level.py——构建器会将其保留在负载中,且PATCH请求拒绝不包含该参数的请求体。PATCH请求会完全替换id: <level-id>数组——发送的每个文档集必须包含完整的预期状态,因为文档集中省略的字段会被服务器清空。请从GET响应中复制需要保留的值到PATCH规范中。requiredIdDocs.docSets
- 新等级——通过
-
重新获取等级信息——通过获取等级,并与发送的内容进行比较——部分字段的实际存储结果可能与发送内容不同(详见references/level-schema.md中的注意事项)。向用户报告任何差异。
${CLAUDE_SKILL_DIR}/scripts/get_level.sh -
生成控制台链接。从响应体中读取、
id和applicantType,并格式化为:clientIdhttps://cockpit.sumsub.com/checkus/sdkIntegrations/levels/<applicantType>Level/<id>?clientId=<clientId>&xSNSEnv=sbx部分对于<applicantType>Level为applicantType: individual(已确认),对于individualLevel为applicantType: company(类推得出——作为最佳猜测展示,如果返回404请标记)。companyLevel查询参数指向Sandbox工作区——这是所有技能通用的标准沙箱链接参数。xSNSEnv=sbx -
结果报告——以易读的名称开头:
- 、
name、已创建的文档集有序列表。applicantType - 控制台链接:以可点击的markdown链接形式展示。
- 最后一行:。
等级ID(用于SDK访问令牌/后续PATCH请求): <id>
直接展示4xx错误信息——这些错误通常指向缺失的或未知的枚举值。questionnaireDefId
Tenant entitlements
租户权限
Many level settings are gated behind tenant entitlements (). Before enabling a feature, check that the required is present in the array returned by (fetched in step 0).
allowedChecksBackgroundCheckTargetallowedsumsub-check-permissionsDocSet type → required permission (OR — any one suffices):
| DocSet type | Required (any one of) |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Types not in this table (, , , , , etc.) are available to all tenants — no entitlement required.
IDENTITYSELFIEAPPLICANT_DATAEMAIL_VERIFICATIONPHONE_VERIFICATIONIf a requested feature requires an entitlement the tenant doesn't have — stop immediately. Do not build or POST the level. Tell the user which entitlement is missing, that the feature is unavailable on their account, and that they need to contact their CSM or Sumsub support to get it enabled. Resume only after the user confirms the entitlement has been added or explicitly decides to drop the feature.
Exception — POA. The / keys are often absent from even on tenants where the API actually accepts levels (the entitlement seems to be baseline or covered by other keys; the documented mapping is stale on some tenants). When only is missing, proceed with a one-line warning to the user so they have context if support is later needed. Do NOT pause for explicit confirmation — Sumsub itself will reject the write if the tenant truly lacks the right, and that 4xx will be more informative than a pre-emptive halt. Surface any entitlement-related error verbatim if it comes back.
POAADVANCED_POA_TYPE_DETECTIONallowedChecksPROOF_OF_RESIDENCEPOA许多等级设置受租户权限()限制。启用某项功能前,请检查技能返回的数组(步骤0中获取)中是否包含所需的。
allowedCheckssumsub-check-permissionsallowedBackgroundCheckTarget文档集类型 → 所需权限(满足任意一项即可):
| 文档集类型 | 所需权限(任意一项) |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
本表未列出的类型(、、、、等)对所有租户可用——无需权限。
IDENTITYSELFIEAPPLICANT_DATAEMAIL_VERIFICATIONPHONE_VERIFICATION如果用户请求的功能需要租户未拥有的权限——立即停止操作。 请勿构建或POST等级。告知用户缺少的权限名称、该功能在其账户中不可用,以及他们需要联系客户成功经理或Sumsub支持团队启用该功能。仅在用户确认权限已添加或明确决定放弃该功能后再继续。
例外情况——居住证明(POA)。 即使租户的API实际接受等级,/密钥也常缺失于(该权限似乎是基础权限或由其他密钥覆盖;部分租户的文档映射已过时)。当仅缺少权限时,继续执行并向用户显示一行警告,以便后续需要支持时用户了解背景情况。无需等待用户明确确认——如果租户确实缺少权限,Sumsub会自行拒绝写入操作,且返回的4xx错误比预先停止操作更具参考价值。如果返回与权限相关的错误,请直接展示给用户。
PROOF_OF_RESIDENCEPOAADVANCED_POA_TYPE_DETECTIONallowedChecksPOASafety
安全注意事项
Creating a level is a write to a shared workspace. Always:
- Show the resolved payload to the user before the first POST (step 4 above).
- After each successful POST, GET the entity back and compare to what was sent — silent overrides are common.
- Do not re-POST a dependency (PoA preset, questionnaire) if it already succeeded mid-session — reuse the returned .
id - Do not delete or modify levels you didn't create in this session unless the user explicitly names them.
创建等级是对共享工作区的写入操作。请始终遵守以下规则:
- 在首次POST前向用户展示解析后的负载(上文步骤4)。
- 每次POST成功后,重新获取实体并与发送内容进行比较——静默覆盖是常见情况。
- 如果依赖项(居住证明预设、问卷)已在会话中创建成功,请勿重新POST——复用返回的。
id - 除非用户明确指定,否则请勿删除或修改本次会话中未创建的等级。
Names, not ids, in user-facing messages
用户消息中使用名称而非ID
This applies to every message you send the user about this level — not just the final report:
- Pre-POST summary: when you list which questionnaire and which POA preset will be attached, refer to each by /
name(e.g. "POA preset «POA — 60 days»", "questionnaire «Applicant basics»"). Do not paste the rawtitle("id") into prose — the user can't read it and it does not let them judge whether you picked the right entity.6a16bfd4ded0fe13aa48165d - Final report: still ends with on its own line — that line is the one place a raw id is correct, because the user needs to copy it for the next API call.
Level ID (for SDK access tokens / future PATCH): <id> - Diagnostic messages: when a 4xx response references a dependency id (POA preset not found, etc.), translate it to the name before showing the user.
If you don't yet know an entity's name (e.g. user supplied only an id from outside this session), GET the entity first and surface its name; do not fall back to the id.
此规则适用于所有发送给用户的关于本等级的消息——不仅限于最终报告:
- POST前摘要:当列出要关联的问卷和居住证明预设时,请使用/
name指代(例如:“居住证明预设«POA — 60天»”、“问卷«申请人基础信息»”)。请勿在文本中粘贴原始title(如“id”)——用户无法识别该ID,也无法判断是否选择了正确的实体。6a16bfd4ded0fe13aa48165d - 最终报告:仍需在单独一行显示——这是唯一适合显示原始ID的位置,因为用户需要复制该ID用于后续API调用。
等级ID(用于SDK访问令牌/后续PATCH请求): <id> - 诊断消息:当4xx响应引用依赖项ID(如居住证明预设未找到等)时,请先将其转换为名称再展示给用户。
如果尚未知晓实体的名称(例如用户仅提供了会话外的ID),请先获取实体信息并展示其名称;切勿直接使用ID。
Compact spec format
紧凑规范格式
Accepts JSON or YAML on stdin. The builder fills in sensible defaults for each doc-set type (see references/level-schema.md).
json
{
"name": "Basic KYC",
"applicantType": "individual",
"type": "standalone",
"docSets": [
{"type": "IDENTITY", "docTypes": ["PASSPORT","ID_CARD","DRIVERS"]},
{"type": "SELFIE", "videoRequired": "passiveLiveness"},
{"type": "PROOF_OF_RESIDENCE", "docTypes": ["UTILITY_BILL"]},
{"type": "QUESTIONNAIRE", "questionnaireDefId": "source-of-funds"}
]
}接受标准输入的JSON或YAML格式。构建器会为每种文档集类型填充合理的默认值(详见references/level-schema.md)。
json
{
"name": "基础KYC",
"applicantType": "individual",
"type": "standalone",
"docSets": [
{"type": "IDENTITY", "docTypes": ["PASSPORT","ID_CARD","DRIVERS"]},
{"type": "SELFIE", "videoRequired": "passiveLiveness"},
{"type": "PROOF_OF_RESIDENCE", "docTypes": ["UTILITY_BILL"]},
{"type": "QUESTIONNAIRE", "questionnaireDefId": "source-of-funds"}
]
}Supported docSets[].type
values
docSets[].type支持的docSets[].type
值
docSets[].typeAPPLICANT_DATAEMAIL_VERIFICATIONPHONE_VERIFICATIONIDENTITYIDENTITY234SELFIESELFIE2PROOF_OF_RESIDENCEPROOF_OF_RESIDENCE2PROOF_OF_PAYMENTPAYMENT_METHODSINVESTABILITYCOMPANYCOMPANY_DATACOMPANY_DOCUMENTSCOMPANY_BENEFICIARIESACCREDITED_INVESTORE_SIGNQUESTIONNAIRE234E_KYCOTHER_DOCSTR_RECIPIENT_INFORMATIONDEVICE_CHECKAPPLICANT_DATAEMAIL_VERIFICATIONPHONE_VERIFICATIONIDENTITYIDENTITY234SELFIESELFIE2PROOF_OF_RESIDENCEPROOF_OF_RESIDENCE2PROOF_OF_PAYMENTPAYMENT_METHODSINVESTABILITYCOMPANYCOMPANY_DATACOMPANY_DOCUMENTSCOMPANY_BENEFICIARIESACCREDITED_INVESTORE_SIGNQUESTIONNAIRE234E_KYCOTHER_DOCSTR_RECIPIENT_INFORMATIONDEVICE_CHECKPer-type compact shortcuts
按类型划分的紧凑快捷方式
| Shortcut keys | Builder expands to |
|---|---|---|
| | flat fields on the docSet — only what you set. See Dashboard ↔ API mapping below. |
| | bare docSet with |
| | docSet + |
| | bare docSet |
| | |
| | |
| — | bare docSet |
| | full KYB step structure |
| | as-is |
Unknown keys in a docSet are passed through to the API verbatim, so escape hatches are easy when you need an obscure field.
| 快捷参数 | 构建器展开结果 |
|---|---|---|
| | 文档集的扁平字段——仅包含您设置的内容。详见下文控制台↔API映射。 |
| | 包含 |
| | 文档集 + |
| | 基础文档集 |
| | 包含默认值的 |
| | 经过结构验证的 |
| —— | 基础文档集 |
| | 完整的KYB步骤结构 |
| | 原样保留 |
文档集中的未知参数会直接传递给API,因此当您需要使用冷门字段时可以轻松实现。
Dashboard ↔ API mapping for IDENTITY step
身份验证步骤的控制台↔API映射
Verbatim labels from the Sumsub dashboard sidebar, paired with the API value to write. Match the user's description to a label, then use the value.
| Dashboard control | Label (user-visible) | API value | Spec key |
|---|---|---|---|
| Capture method | File upload | | |
| Capture method | Live capture | | |
| Capture mode¹ | Both manual and auto capture work at the same time | | |
| Capture mode¹ | Only manual capture is active | | |
| Capture mode¹ | Seamless live capture | | |
| Fallback to file upload¹ | Always available | | |
| Fallback to file upload¹ | Available only if camera capture failed | | |
| Fallback to file upload¹ | Not available | | |
| NFC verification² | Disabled | | |
| NFC verification² | Optional | | |
| NFC verification² | Required | | |
¹ Only meaningful with . Silently dropped from the payload otherwise (matches the dashboard's own behavior — it deletes both keys when the radio is toggled to File upload).
² auto-rejects Web SDK applicants; Mobile SDK only.
videoRequired: docapturerequiredDefaults emitted by the builder (necessary for the dashboard to render — the controls bind to actual stored values, not implicit UI defaults; empty fields render as "Select" placeholder, not as the default option):
- →
videoRequired: docapture,captureMode: manualAndAuto(unless caller overrides).uploaderMode: always - IDENTITY always gets unless caller overrides.
nfcVerificationSettings: {mode: disabled}
These match what the dashboard's own Vue watcher writes when the user first toggles Live capture. Caveat on PATCH: is replaced wholesale (only top-level Level fields merge) — every docSet in the PATCH spec must carry the full intended state, since omitted sub-fields are wiped. GET the level first and copy values you want to preserve.
requiredIdDocs.docSetsSumsub控制台侧边栏的原始标签,与对应的API值配对。将用户描述与标签匹配,然后使用对应的API值。
| 控制台控件 | 用户可见标签 | API值 | 规范参数 |
|---|---|---|---|
| 采集方式 | 文件上传 | | |
| 采集方式 | 实时采集 | | |
| 采集模式¹ | 手动和自动采集同时可用 | | |
| 采集模式¹ | 仅启用手动采集 | | |
| 采集模式¹ | 无缝实时采集 | | |
| 回退至文件上传¹ | 始终可用 | | |
| 回退至文件上传¹ | 仅当相机采集失败时可用 | | |
| 回退至文件上传¹ | 不可用 | | |
| NFC验证² | 禁用 | | |
| NFC验证² | 可选 | | |
| NFC验证² | 必填 | | |
¹ 仅当时有意义。否则会从负载中静默丢弃(与控制台行为一致——当单选按钮切换为文件上传时,控制台会删除这两个参数)。
² 会自动拒绝Web SDK申请人;仅支持Mobile SDK。
videoRequired: docapturerequired构建器生成的默认值(控制台渲染所需——控件绑定到实际存储的值,而非隐式UI默认值;空字段会显示为“选择”占位符,而非默认选项):
- →
videoRequired: docapture,captureMode: manualAndAuto(除非调用者覆盖)。uploaderMode: always - 除非调用者覆盖,否则IDENTITY始终会生成。
nfcVerificationSettings: {mode: disabled}
这些默认值与用户首次切换至实时采集时控制台自身的Vue监听器生成的值一致。PATCH请求注意事项:会被完全替换(仅顶级等级字段会合并)——PATCH规范中的每个文档集必须包含完整的预期状态,因为省略的子字段会被清空。请先获取等级信息,然后复制需要保留的值。
requiredIdDocs.docSetsPayment method verification (step or action)
支付方式验证(步骤或操作)
Payment method verification — the docSet, for verifying a bank card, bank account, crypto wallet, or e-wallet — runs in two modes:
PAYMENT_METHODS- As a step in a normal verification level: add a docSet alongside
PAYMENT_METHODS/IDENTITY/SELFIE/ etc. The level stays a regularPROOF_OF_RESIDENCElevel with nostandalone. Use this when payment verification is one part of a broader onboarding flow.actionType - As an action on an actions-type level: set and
type: "actions". Use this for a standalone, re-runnable payment-method check decoupled from onboarding.actionType: "paymentMethod"
Pick the mode from how the user frames it — "add card/wallet verification to my KYC level" → step; "create a standalone payment-method check / action" → action.
Step mode — inside a standard level (identity and payment coexist):
json
{
"name": "KYC + payment method",
"type": "standalone",
"applicantType": "individual",
"docSets": [
{"type": "IDENTITY"},
{"type": "SELFIE", "videoRequired": "passiveLiveness"},
{"type": "PAYMENT_METHODS",
"typeSettings": {"bankCard": {"allowed": true, "countImages": "one"}}}
]
}Action mode — inside an actions level:
json
{
"name": "Payment method check",
"type": "actions",
"actionType": "paymentMethod",
"websdkNext": true,
"docSets": [
{"type": "PAYMENT_METHODS", "skipOwnershipCheck": false,
"typeSettings": {"bankCard": {"allowed": true, "countImages": "one"}}}
]
}Constraints the builder enforces:
- requires
actionType: "paymentMethod", and the level must include atype: "actions"docSet.PAYMENT_METHODS - Cannot set both and
skipOwnershipCheck: truesimultaneously.skipRiskScoreCheck: true - goes at the
walletScreeningProviderlevel, not insidepaymentSourceSettings(the builder places it correctly).typeSettings.cryptoWallet - needs a concrete verification method. Unlike
bankAccount, enabling a bank account withbankCardalone is rejected by the API — it must enable at least one ofallowed: true(statement upload, no extra entitlement) orallowBankStatementUpload(external data-source check, uses theallowExternalSourcesCheckentitlement). Ask the user which method(s) they want; don't offer a bare "standard" bank-account option.E_KYC
The docSet (both modes): the builder always emits plus a object assembled from your compact spec — the API rejects the docSet without , so the builder never omits it.
PAYMENT_METHODStypes: ["PAYMENT_SOURCE"]paymentSourceSettingspaymentSourceSettingstypeSettings| Key | Fields |
|---|---|
| |
| |
| |
| |
walletScreeningProvidercrystalmerkletrmLabschainalysisellipticcyversDashboard link: both modes live under — the standard standalone-level URL pattern.
sdkIntegrations/levels/individualLevel/<id>See for a complete action-mode spec.
examples/payment-methods.json支付方式验证——即文档集,用于验证银行卡、银行账户、加密钱包或电子钱包——支持两种模式:
PAYMENT_METHODS- 作为普通验证等级中的步骤:在/
IDENTITY/SELFIE等文档集之外添加PROOF_OF_RESIDENCE文档集。等级保持为常规的PAYMENT_METHODS等级,不设置standalone。当支付验证是 broader 入职流程的一部分时使用此模式。actionType - 作为操作类型等级中的操作:设置和
type: "actions"。用于独立于入职流程的可重复执行的支付方式检查。actionType: "paymentMethod"
根据用户的描述选择模式——“在我的KYC等级中添加卡片/钱包验证”→步骤模式;“创建独立的支付方式检查/操作”→操作模式。
步骤模式——在标准等级中(身份验证和支付验证共存):
json
{
"name": "KYC + 支付方式验证",
"type": "standalone",
"applicantType": "individual",
"docSets": [
{"type": "IDENTITY"},
{"type": "SELFIE", "videoRequired": "passiveLiveness"},
{"type": "PAYMENT_METHODS",
"typeSettings": {"bankCard": {"allowed": true, "countImages": "one"}}}
]
}操作模式——在操作类型等级中:
json
{
"name": "支付方式检查",
"type": "actions",
"actionType": "paymentMethod",
"websdkNext": true,
"docSets": [
{"type": "PAYMENT_METHODS", "skipOwnershipCheck": false,
"typeSettings": {"bankCard": {"allowed": true, "countImages": "one"}}}
]
}构建器强制执行的约束:
- 要求
actionType: "paymentMethod",且等级必须包含type: "actions"文档集。PAYMENT_METHODS - 不能同时设置和
skipOwnershipCheck: true。skipRiskScoreCheck: true - 应设置在
walletScreeningProvider层级,而非paymentSourceSettings内部(构建器会将其放置在正确位置)。typeSettings.cryptoWallet - 需要具体的验证方式。与
bankAccount不同,仅设置bankCard启用银行账户会被API拒绝——必须至少启用allowed: true(账单上传,无需额外权限)或allowBankStatementUpload(外部数据源检查,需要allowExternalSourcesCheck权限)中的一项。请询问用户想要使用哪种方式;不要提供单纯的“标准”银行账户选项。E_KYC
PAYMENT_METHODStypes: ["PAYMENT_SOURCE"]paymentSourceSettingspaymentSourceSettings各支付来源类型的:
typeSettings| 键 | 字段 |
|---|---|
| |
| |
| |
| |
walletScreeningProvidercrystalmerkletrmLabschainalysisellipticcyvers控制台链接:两种模式的链接均为——标准独立等级URL格式。
sdkIntegrations/levels/individualLevel/<id>完整的操作模式规范示例请见。
examples/payment-methods.jsonChaining with other Sumsub-* skills
与其他Sumsub-*技能联动
This skill's and doc-sets accept ids produced by sibling skills, so a 3-step build-everything-from-scratch flow is natural:
QUESTIONNAIREPROOF_OF_RESIDENCE| First run … | Pass the returned |
|---|---|
| |
| |
See for an end-to-end level that references both.
examples/with-presets.json本技能的和文档集接受同级技能生成的ID,因此可以自然实现从无到有构建所有内容的三步流程:
QUESTIONNAIREPROOF_OF_RESIDENCE| 先运行… | 将返回的 |
|---|---|
| |
| |
同时引用问卷和居住证明预设的完整等级示例请见。
examples/with-presets.jsonOutputs
输出结果
On success, lead with the human-readable info:
- ,
name, ordered list ofapplicantType.docSets[].idDocSetType - Dashboard link: . Render as a clickable markdown link. The
https://cockpit.sumsub.com/checkus/sdkIntegrations/levels/<applicantType>Level/<id>?clientId=<clientId>&xSNSEnv=sbxsegment is<applicantType>Levelfor individuals (confirmed) orindividualLevelfor companies (assumed pattern). All three fields (companyLevel,id,applicantType) come from the POST response body;clientIdtargets the Sandbox workspace.xSNSEnv=sbx - Finally, on its own line: .
Level ID (for SDK access tokens / future PATCH): <id>
On failure: HTTP status + the / from Sumsub's error envelope.
descriptionerrorName成功时,以易读信息开头:
- 、
name、applicantType的有序列表。docSets[].idDocSetType - 控制台链接:。以可点击的markdown链接形式展示。
https://cockpit.sumsub.com/checkus/sdkIntegrations/levels/<applicantType>Level/<id>?clientId=<clientId>&xSNSEnv=sbx部分对于个人为<applicantType>Level(已确认),对于企业为individualLevel(类推模式)。三个字段(companyLevel、id、applicantType)均来自POST响应体;clientId指向沙箱工作区。xSNSEnv=sbx - 最后,单独一行显示:。
等级ID(用于SDK访问令牌/后续PATCH请求): <id>
失败时:显示HTTP状态码 + Sumsub错误包中的/。
descriptionerrorNameWorked examples
示例
- — the most common pattern.
examples/identity-selfie.json - — IDENTITY-only with Live capture + all docapture sub-options + NFC.
examples/identity-live-capture.json - — pure data-collection level (like the SOF level in this repo).
examples/questionnaire-only.json - —
examples/full-kyc.json.APPLICANT_DATA + IDENTITY + SELFIE + PROOF_OF_RESIDENCE + QUESTIONNAIRE - — KYB level with company + UBOs + representatives steps.
examples/kyb-company.json - — references both a questionnaire (
examples/with-presets.json) and a POA preset (questionnaireDefId) returned by sibling skills.poaPresetId - — payment method action level with bank card, bank account, crypto wallet, and e-wallet.
examples/payment-methods.json
- ——最常见的模式。
examples/identity-selfie.json - ——仅包含身份验证,启用实时采集+所有docapture子选项+NFC。
examples/identity-live-capture.json - ——纯数据收集等级(如本仓库中的SOF等级)。
examples/questionnaire-only.json - ——
examples/full-kyc.json。APPLICANT_DATA + IDENTITY + SELFIE + PROOF_OF_RESIDENCE + QUESTIONNAIRE - ——包含企业+最终受益人+代表步骤的KYB等级。
examples/kyb-company.json - ——同时引用同级技能返回的问卷(
examples/with-presets.json)和居住证明预设(questionnaireDefId)。poaPresetId - ——包含银行卡、银行账户、加密钱包和电子钱包的支付方式操作等级。
examples/payment-methods.json
See also
另请参阅
- references/level-schema.md — full schema, all enum values, gotchas.
ApplicantLevel
- references/level-schema.md ——完整的schema、所有枚举值和注意事项。
ApplicantLevel