sumsub-create-poa-preset
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSumsub — Create POA Preset
Sumsub — 创建POA预设
Builds a POA preset JSON payload from a compact spec, POSTs it to the Sumsub API, and reports the resulting preset so it can be attached to one or more levels via .
idlevel.requiredIdDocs.docSets[].poaStepSettingsIdPrerequisite — level must have a PROOF_OF_RESIDENCE step. A POA preset has no effect unless it is attached to a(orPROOF_OF_RESIDENCE/PROOF_OF_RESIDENCE2/3) docset in at least one level. If the user hasn't created (or described) a level that includes a POA step, surface this before building the preset — there is no point creating it in isolation.4
根据精简规范构建POA预设JSON负载,将其POST至Sumsub API,并返回生成的预设,以便通过关联到一个或多个等级。
idlevel.requiredIdDocs.docSets[].poaStepSettingsId前提条件 — 等级必须包含PROOF_OF_RESIDENCE步骤。POA预设只有关联到至少一个等级中的(或PROOF_OF_RESIDENCE/PROOF_OF_RESIDENCE2/3)文档集时才会生效。如果用户尚未创建(或描述)包含POA步骤的等级,请在构建预设前告知用户——单独创建预设没有意义。4
Endpoints
端点
| Method | Path | When |
|---|---|---|
| | Create a new preset. Body MUST NOT include |
| | Update an existing preset. Body MUST include |
| | Read one preset back — used to verify what landed and to resolve |
All three require permission . Body shape is the
POA preset schema — client-settable
fields only (, , , , audit
trail are server-managed and echoed back on the response).
manageClientSettingsclientIdcreatedAtcreatedBymodifiedAtAfter creation, attach by editing a level: on any doc-set.
requiredIdDocs.docSets[].poaStepSettingsId = "<the new id>"PROOF_OF_RESIDENCE| 方法 | 路径 | 使用场景 |
|---|---|---|
| | 创建新预设。请求体不得包含 |
| | 更新现有预设。请求体必须包含 |
| | 读取单个预设——用于验证配置结果,以及通过已知 |
所有请求均需权限。请求体格式遵循
POA预设 schema——仅包含客户端可设置的字段(、、、及审计跟踪由服务器管理,并在响应中返回)。
manageClientSettingsclientIdcreatedAtcreatedBymodifiedAt创建完成后,可通过编辑等级进行关联:在任意文档集上设置。
PROOF_OF_RESIDENCErequiredIdDocs.docSets[].poaStepSettingsId = "<新生成的id>"Auth — App Token + secret (sandbox only)
认证 — App Token + 密钥(仅沙箱环境)
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. If the user offers one, 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⚠️ 仅支持沙箱令牌。请勿接受或使用生产环境的App Token。如果用户提供生产令牌,请拒绝并要求他们在https://cockpit.sumsub.com/checkus/devSpace/appTokens生成沙箱令牌对(先将工作区切换为Sandbox,再点击Create)。令牌和密钥仅显示一次——请在关闭对话框前复制两者。辅助脚本会强制执行此规则——拒绝不以开头的令牌。sbx:
| 变量 | 示例 |
|---|---|
| |
| 创建令牌时一次性显示的配对密钥。 |
| 可选。默认值为 |
如果用户已在对话中提供凭证,请复用;否则在运行前询问一次。切勿返回密钥内容。
Tenant entitlements
租户权限
POA preset creation has historically been gated behind the entitlement, but in practice the API accepts the write for most tenants regardless — the entitlement is often baseline, covered by other keys, or simply not surfaced in . Don't treat its absence as a blocker.
POAallowedChecks- Invoke and inspect
sumsub-check-permissions— informational, for diagnostics.allowedChecks - If is present — proceed.
POA - If is missing — proceed anyway, with a one-line user-visible note that the documented entitlement isn't listed (so they know what to mention to support if the POST eventually fails). Do NOT pause for confirmation — Sumsub will reject the write itself if the tenant truly lacks the right, and the 4xx from that will be more informative than a pre-emptive halt.
POA - If the POST returns a 4xx that mentions an entitlement — surface the error body verbatim and suggest contacting CSM / Sumsub support.
POA预设创建历史上受权限限制,但实际上大多数租户的API都会接受写入请求——该权限通常是基础权限,由其他密钥覆盖,或者未在中显示。请勿将权限缺失视为阻塞因素。
POAallowedChecks- 调用并检查
sumsub-check-permissions——仅用于信息诊断。allowedChecks - 如果存在权限——继续执行。
POA - 如果缺少权限——仍继续执行,并向用户显示一行提示,说明文档中提到的权限未列出(以便如果POST最终失败,用户知道需要向支持人员提及什么)。请勿暂停等待确认——如果租户确实缺少权限,Sumsub会自行拒绝写入请求,返回的4xx错误会比预先停止操作更具参考价值。
POA - 如果POST返回提及权限的4xx错误——直接显示错误体内容,并建议联系客户成功经理/Sumsub支持人员。
Procedure
操作流程
-
Fetch tenant entitlements — see section above.
-
Translate the user's intent into the compact spec (below). Most users describe presets in terms of "what we accept" (bank statements, utility bills) and "for how long" (validity in months) — map that intokeys,
providers, andsubTypes.validMonths -
Validate: name non-empty;and
includedCountriesaren't both set; every provider key is aexcludedCountries; everyPoaCompanyContactTypeentry is asubTypes; every country code is ISO-3166-1 alpha-3 uppercase;PoaSubTypeincrossValidator.fuzzyThreshold.[0, 1] -
Generate payload via(compact spec on stdin → full payload on stdout).
${CLAUDE_SKILL_DIR}/scripts/build_poa_preset.py -
Create vs. update:
- New preset — POST via . The payload must not carry
${CLAUDE_SKILL_DIR}/scripts/post_poa_preset.sh.id - Update existing — first GET the current state via so the user sees the diff, then PATCH via
${CLAUDE_SKILL_DIR}/scripts/get_poa_preset.sh. The payload must include the preset's${CLAUDE_SKILL_DIR}/scripts/patch_poa_preset.sh.id
- New preset — POST via
-
Build the dashboard link. Readand
idfrom the response body and format:clientIdhttps://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbxThequery 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; surface the id only at the end as the value to pass into the next API call:
- Name and country scope (incl/excl) + per-country override countries.
- A brief summary of what's accepted (provider types covered, default validity).
- Dashboard link as a clickable markdown link.
- Final line: .
Preset ID for level wiring: <id>
-
获取租户权限——参见上文章节。
-
将用户意图转换为精简规范(如下)。大多数用户会用“我们接受的文档类型”(银行对账单、水电费账单)和“有效期”(以月为单位)来描述预设——将其映射为键、
providers和subTypes。validMonths -
验证:名称非空;和
includedCountries不能同时设置;每个provider键都是excludedCountries;每个PoaCompanyContactType条目都是subTypes;每个国家代码都是ISO-3166-1 alpha-3大写格式;PoaSubType在crossValidator.fuzzyThreshold范围内。[0, 1] -
生成负载:通过(标准输入传入精简规范 → 标准输出输出完整负载)。
${CLAUDE_SKILL_DIR}/scripts/build_poa_preset.py -
创建 vs 更新:
- 新预设——通过发送POST请求。负载不得包含
${CLAUDE_SKILL_DIR}/scripts/post_poa_preset.sh。id - 更新现有预设——首先通过获取当前状态,以便用户查看差异,然后通过
${CLAUDE_SKILL_DIR}/scripts/get_poa_preset.sh发送PATCH请求。负载必须包含预设的${CLAUDE_SKILL_DIR}/scripts/patch_poa_preset.sh。id
- 新预设——通过
-
构建控制台链接:从响应体中读取和
id,并格式化为:clientIdhttps://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbx查询参数指向Sandbox工作区——这是所有技能通用的标准沙箱链接参数。xSNSEnv=sbx -
结果报告——以人类可读的名称开头;仅在最后一行显示id,作为下一步API调用的参数:
- 名称和国家范围(包含/排除)+ 各国覆盖规则的国家列表。
- 简要总结接受的内容(涵盖的提供商类型、默认有效期)。
- 控制台链接:以可点击的markdown链接形式呈现。
- 最后一行:。
用于等级关联的预设ID: <id>
Compact spec format (JSON or YAML on stdin)
精简规范格式(标准输入传入JSON或YAML)
yaml
name: "Standard POA (6 months)"
desc: "Default Proof of Address rules with 6-month validity"yaml
name: "Standard POA (6 months)"
desc: "Default Proof of Address rules with 6-month validity"Country scope — choose AT MOST ONE
国家范围 — 最多选择一项
includedCountries: [GBR, DEU, FRA] # allow-list
includedCountries: [GBR, DEU, FRA] # 允许列表
excludedCountries: [PRK, IRN] # block-list
excludedCountries: [PRK, IRN] # 阻止列表
Global defaults
全局默认设置
settings:
acceptMultiplePages: true
acceptDocScreenshot: true
requireCountryMatch: false # require POI country == POA country
useIssueDateForExpiry: false # use only issueDate (ignore expiry) for "fresh enough" check
validMonths: 6 # shortcut: applied to every provider that omits its own validMonths
addressTypes: [dwelling, poBox] # allowed PoA address types
acceptableLanguages: [en, de, fr]
Document providers and the doc sub-types each may produce
Keys (PoaCompanyContactType): bank | utilityProvider | governmentOrganization | mobileOperator | other
providers:
bank:
validMonths: 6
acceptUnconventional: true # accept non-mainstream banks (with allowedOrgNames below)
subTypes: [bankStatement, bankLetter, other]
allowedOrgs: # only used when acceptUnconventional=true
names: ["Some Local Co-op Bank"]
websites: ["coopbank.example"]
forbiddenDocumentNames: []
forbiddenOrgNames: []
forbiddenOrgWebsites: []
utilityProvider:
subTypes: [telecom, utilityBill, other]
governmentOrganization:
subTypes: [statement, voterRegistration, taxBill, other]
mobileOperator: {} # accept defaults
other:
subTypes: [lease, other, universityLetter]
Accept identity document as proof of address
poiAsPoa:
enabled: true # acceptPoiAsPoa
sameDoc: true # acceptSamePoiAsPoa (same doc for POI + POA)
validMonths: 3
allowedTypes: [PASSPORT, ID_CARD, RESIDENCE_PERMIT, DRIVERS]
Name/address comparison between POI and POA
crossValidator:
nameMode: weakContainment # strict | weakContainment | def | ai | fuzzy | containment | fuzzyContainment
addressMode: fuzzy # strict | fuzzy
fuzzyThreshold: 0.75
ignoreMiddleName: false
ignoreFixedInfo: false
settings:
acceptMultiplePages: true
acceptDocScreenshot: true
requireCountryMatch: false # 要求POI国家 == POA国家
useIssueDateForExpiry: false # 仅使用签发日期(忽略过期日期)进行“足够新”检查
validMonths: 6 # 快捷方式:应用于所有未单独设置validMonths的提供商
addressTypes: [dwelling, poBox] # 允许的POA地址类型
acceptableLanguages: [en, de, fr]
文档提供商及每个提供商可生成的文档子类型
键(PoaCompanyContactType): bank | utilityProvider | governmentOrganization | mobileOperator | other
providers:
bank:
validMonths: 6
acceptUnconventional: true # 接受非主流银行(需配置下方allowedOrgNames)
subTypes: [bankStatement, bankLetter, other]
allowedOrgs: # 仅在acceptUnconventional=true时生效
names: ["Some Local Co-op Bank"]
websites: ["coopbank.example"]
forbiddenDocumentNames: []
forbiddenOrgNames: []
forbiddenOrgWebsites: []
utilityProvider:
subTypes: [telecom, utilityBill, other]
governmentOrganization:
subTypes: [statement, voterRegistration, taxBill, other]
mobileOperator: {} # 接受默认设置
other:
subTypes: [lease, other, universityLetter]
接受身份文档作为地址证明
poiAsPoa:
enabled: true # acceptPoiAsPoa
sameDoc: true # acceptSamePoiAsPoa(同一文档同时作为POI和POA)
validMonths: 3
allowedTypes: [PASSPORT, ID_CARD, RESIDENCE_PERMIT, DRIVERS]
POI与POA之间的姓名/地址比较
crossValidator:
nameMode: weakContainment # strict | weakContainment | def | ai | fuzzy | containment | fuzzyContainment
addressMode: fuzzy # strict | fuzzy
fuzzyThreshold: 0.75
ignoreMiddleName: false
ignoreFixedInfo: false
Per-country overrides — same shape as settings
. Only the keys you set are overridden;
settings各国覆盖规则 — 格式与settings
相同。仅覆盖设置的键;
settingsothers fall through to the global settings
.
settings其他键继承全局settings
的设置。
settingsbyCountry:
BRA:
validMonths: 3 # tighter validity for Brazil
providers:
bank:
validMonths: 3
undefinedbyCountry:
BRA:
validMonths: 3 # 巴西的有效期更严格
providers:
bank:
validMonths: 3
undefinedProvider-type values (providers.<key>
)
providers.<key>提供商类型值(providers.<key>
)
providers.<key>bankutilityProvidergovernmentOrganizationmobileOperatorotherbankutilityProvidergovernmentOrganizationmobileOperatorotherSub-types (providers.<key>.subTypes[]
)
providers.<key>.subTypes[]子类型(providers.<key>.subTypes[]
)
providers.<key>.subTypes[]statementvoterRegistrationtaxBilltelecomutilityBillbankStatementbankLetterleaseuniversityLetteremploymentLetterotherstatementvoterRegistrationtaxBilltelecomutilityBillbankStatementbankLetterleaseuniversityLetteremploymentLetterotherAddress types (addressTypes[]
)
addressTypes[]地址类型(addressTypes[]
)
addressTypes[]dwellingpoBoxpoBoxSpecialCountriesdwellingpoBoxpoBoxSpecialCountriesPOI-as-POA allowedTypes[]
allowedTypes[]POI-as-POA允许类型(allowedTypes[]
)
allowedTypes[]Standard values: , , , (others rare).
IdDocTypePASSPORTID_CARDRESIDENCE_PERMITDRIVERS标准值:, , , (其他类型罕见)。
IdDocTypePASSPORTID_CARDRESIDENCE_PERMITDRIVERSName comparison modes (crossValidator.nameMode
)
crossValidator.nameMode姓名比较模式(crossValidator.nameMode
)
crossValidator.nameModestrictweakContainmentdefaifuzzycontainmentfuzzyContainmentstrictweakContainmentdefaifuzzycontainmentfuzzyContainmentAddress comparison modes (crossValidator.addressMode
)
crossValidator.addressMode地址比较模式(crossValidator.addressMode
)
crossValidator.addressModestrictfuzzystrictfuzzyOutputs
输出
On success, lead with the human-readable info:
- , country scope, list of per-country override countries.
name - A brief summary (provider types covered, default validity).
- Dashboard link: . Render as a clickable markdown link. Both
https://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbxandidcome from the POST response body;clientIdtargets the Sandbox workspace.xSNSEnv=sbx - Finally, on its own line: .
Preset ID (for level wiring / future PATCH): <id>
On failure: HTTP status + Sumsub's /. The builder rejects invalid enums / impossible combinations upfront with precise messages.
descriptionerrorName成功时,优先显示人类可读信息:
- 、国家范围、各国覆盖规则的国家列表。
name - 简要总结(涵盖的提供商类型、默认有效期)。
- 控制台链接:。以可点击的markdown链接形式呈现。
https://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbx和id来自POST响应体;clientId指向沙箱工作区。xSNSEnv=sbx - 最后单独一行:。
预设ID(用于等级关联/后续PATCH): <id>
失败时:返回HTTP状态码 + Sumsub的/。构建器会提前拒绝无效枚举/不可能的组合,并返回精确的错误信息。
descriptionerrorNameNames, not ids, in user-facing messages
用户消息中使用名称而非ID
This applies to every message about the preset — pre-POST summary, mid-flow status updates, hand-off lines — not only the final report:
- Refer to the preset by ("POA — 60 days"), not by its
name, in prose.id - The belongs only on the final dedicated line (
id) — that line is the one place a raw id is correct, because the user needs to copy it into a level'sPreset ID for level wiring: <id>.poaPresetId - When the caller is the level skill chaining this preset into a step, the level skill should ALSO refer to this preset by name in its pre-POST summary — see
PROOF_OF_RESIDENCE.sumsub-create-level
此规则适用于所有关于预设的消息——POST前的摘要、流程中的状态更新、交接说明——不仅限于最终报告:
- 在文本中使用预设的(如“POA — 60天”)而非
name。id - 仅应出现在最后一行专用行中(
id)——这是唯一适合显示原始ID的地方,因为用户需要将其复制到等级的用于等级关联的预设ID: <id>中。poaPresetId - 当调用者是将此预设关联到步骤的等级技能时,等级技能在POST前的摘要中也应使用预设名称——参见
PROOF_OF_RESIDENCE。sumsub-create-level
Hand-off to sumsub-create-level
sumsub-create-level交接至sumsub-create-level
sumsub-create-levelThe returned is what you pass to a level's doc-set. The level skill exposes it as a friendly shortcut (or the canonical ):
idPROOF_OF_RESIDENCEpoaPresetIdpoaStepSettingsIdjson
{
"type": "PROOF_OF_RESIDENCE",
"docTypes": ["UTILITY_BILL", "BANK_STATEMENT"],
"poaPresetId": "<id from this skill>"
}See .
sumsub-create-level/examples/with-presets.json返回的用于关联到等级的文档集。等级技能将其作为友好的快捷方式(或标准的):
idPROOF_OF_RESIDENCEpoaPresetIdpoaStepSettingsIdjson
{
"type": "PROOF_OF_RESIDENCE",
"docTypes": ["UTILITY_BILL", "BANK_STATEMENT"],
"poaPresetId": "<此技能返回的id>"
}参见。
sumsub-create-level/examples/with-presets.jsonWorked examples
示例
- — bare-minimum preset: 6-month bank/utility/gov defaults, POI-as-POA off.
examples/minimal.json - — EU-only preset, generous bank-statement validity, POI-as-POA allowed for 3 months.
examples/eu-bank-friendly.json - — global defaults plus a tighter Brazil override.
examples/per-country-tight.json
- — 最简预设:6个月有效期的银行/公共事业/政府默认设置,禁用POI-as-POA。
examples/minimal.json - — 仅欧盟预设,宽松的银行对账单有效期,允许POI-as-POA有效期3个月。
examples/eu-bank-friendly.json - — 全局默认设置加上更严格的巴西覆盖规则。
examples/per-country-tight.json
See also
另请参阅
- references/poa-preset-schema.md — full schema, every enum, and gotchas.
PoaStepSettings
- references/poa-preset-schema.md — 完整的schema、所有枚举及注意事项。
PoaStepSettings