Loading...
Loading...
Create or update a Sumsub Proof-of-Address (POA) preset. POST `/resources/api/agent/poaStepSettings` to create new, PATCH same path to update (id in body), GET `/resources/api/agent/poaStepSettings/{id}` to read one back. TRIGGER when the user asks to "create / add / build / configure / update / edit a POA preset" or "PoA step settings", configure which proof-of-address document types are accepted (utility bills, bank statements, tax bills, etc.), set validity periods per provider type, enable POI-as-POA (accept identity doc as proof of address), tune the cross-validator (name/address fuzzy match between POI and POA), or add per-country POA overrides. SKIP for attaching a preset to a level (set `poaStepSettingsId` on the level instead, via `sumsub-create-level`), or for non-POA presets (cross-check presets, permission presets, etc.).
npx skill4agent add sumsub/agent-skills sumsub-create-poa-presetidlevel.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
| 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 |
manageClientSettingsclientIdcreatedAtcreatedBymodifiedAtrequiredIdDocs.docSets[].poaStepSettingsId = "<the new id>"PROOF_OF_RESIDENCEsumsub-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 |
POAallowedCheckssumsub-check-permissionsallowedChecksPOAPOAproviderssubTypesvalidMonthsincludedCountriesexcludedCountriesPoaCompanyContactTypesubTypesPoaSubTypecrossValidator.fuzzyThreshold[0, 1]${CLAUDE_SKILL_DIR}/scripts/build_poa_preset.py${CLAUDE_SKILL_DIR}/scripts/post_poa_preset.shid${CLAUDE_SKILL_DIR}/scripts/get_poa_preset.sh${CLAUDE_SKILL_DIR}/scripts/patch_poa_preset.shididclientIdhttps://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbxxSNSEnv=sbxPreset ID for level wiring: <id>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
excludedCountries: [PRK, IRN] # block-list
# 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
# Per-country overrides — same shape as `settings`. Only the keys you set are overridden;
# others fall through to the global `settings`.
byCountry:
BRA:
validMonths: 3 # tighter validity for Brazil
providers:
bank:
validMonths: 3providers.<key>bankutilityProvidergovernmentOrganizationmobileOperatorotherproviders.<key>.subTypes[]statementvoterRegistrationtaxBilltelecomutilityBillbankStatementbankLetterleaseuniversityLetteremploymentLetterotheraddressTypes[]dwellingpoBoxpoBoxSpecialCountriesallowedTypes[]IdDocTypePASSPORTID_CARDRESIDENCE_PERMITDRIVERScrossValidator.nameModestrictweakContainmentdefaifuzzycontainmentfuzzyContainmentcrossValidator.addressModestrictfuzzynamehttps://cockpit.sumsub.com/checkus/sdkIntegrations/globalSettings/userVerification/proofOfAddress/<id>?clientId=<clientId>&xSNSEnv=sbxidclientIdxSNSEnv=sbxPreset ID (for level wiring / future PATCH): <id>descriptionerrorNamenameididPreset ID for level wiring: <id>poaPresetIdPROOF_OF_RESIDENCEsumsub-create-levelsumsub-create-levelidPROOF_OF_RESIDENCEpoaPresetIdpoaStepSettingsId{
"type": "PROOF_OF_RESIDENCE",
"docTypes": ["UTILITY_BILL", "BANK_STATEMENT"],
"poaPresetId": "<id from this skill>"
}sumsub-create-level/examples/with-presets.jsonexamples/minimal.jsonexamples/eu-bank-friendly.jsonexamples/per-country-tight.jsonPoaStepSettings