sumsub-create-cross-check-preset — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sumsub-create-cross-check-preset (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
⚠️ Read this before running this skill.
>
Sumsub's default cross-check preset is tuned for the best balance of conversion and approval rate. Most clients should not override it. If the user hasn't named a specific comparison they want to change, stop and say:
>
> "Cross-check rules are already configured for the best approval rate. > We strongly recommend keeping the defaults. Tell me a specific tweak > you need (e.g. 'allow fuzzy address match', 'ignore middle name') and > we'll create a minimal override."
>
Only proceed if the user has a concrete, named tweak.
A cross-check preset controls how Sumsub compares the name and address that appear on the proof-of-identity (POI) document with the same fields on the proof-of-address (POA) document. The preset decides whether small differences ("Jonathan" vs "Jon", "Apt 4" vs "Apartment 4") are accepted or flagged as mismatches.
Don't confuse with PoA preset's `crossValidator`. Thesumsub-create-poa-presetskill has an internal block calledcrossValidator(CrossValidatorSettingsonPoaDocumentSettings) withnameMode/addressMode/fuzzyThreshold— that's a per-PoA-preset override for the same comparison. A workspace-level CrossCheckPreset (this skill) supplies the default when no PoA-preset override applies. When a PoA preset'scrossValidatoris set, it wins for documents handled by that preset.
There are two preset modes:
nameComparisonMode andaddressComparisonMode from a small enum, plus optional ignore-flags. Best for almost everyone.
public API** (POST returns 403 Forbidden — Advanced cross-check presets cannot be managed via API). Has to be done in the dashboard.
| Method | Path | When |
|---|---|---|
POST | /resources/api/agent/crossCheckPresets | Create a new preset. Body must NOT include id. |
PATCH | /resources/api/agent/crossCheckPresets | Update an existing preset. Body MUST include id. |
GET | /resources/api/agent/crossCheckPresets/{id} | Read one preset back (verify what landed; resolve title from a known id). |
All require permission manageClientSettings. Body shape is the cross-check preset schema — client-settable fields 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 sumsub-api-auth skill — read it if you hit 401 Invalid signature.
⚠️ Sandbox tokens only. Do not accept or use a production App Token here — cross-check rules affect every verification on the workspace. If the user offers a prod token, refuse and ask them to generate a sandbox pair at <https://cockpit.sumsub.com/checkus/home?sbx=true> (Connect Sumsub to your AI agent -> Build & configure -> Generate token). Token + secret are shown once — copy both before closing the dialog. The helper scripts enforce this — they reject tokens that don't start with sbx:.| Var | Example |
|---|---|
SUMSUB_APP_TOKEN | sbx:... — sandbox App Token from the dashboard. |
SUMSUB_SECRET_KEY | The paired secret shown once at token creation. |
SUMSUB_BASE | Optional. Defaults to https://api.sumsub.com. |
If the user has already supplied credentials in conversation, reuse them; otherwise ask once before running. Never echo the secret back.
re-state the recommendation to keep defaults. If they have a specific named tweak, proceed. Otherwise stop.
ask to nameComparisonMode / addressComparisonMode / ignore-flags.
title non-empty (≤256 chars); mode is basic(advanced is forbidden via API); every comparison mode is a valid enum.
${CLAUDE_SKILL_DIR}/scripts/build_cross_check_preset.py with the compact spec on stdin → full payload on stdout.${CLAUDE_SKILL_DIR}/scripts/post_cross_check_preset.sh. Payload must NOT include id.${CLAUDE_SKILL_DIR}/scripts/get_cross_check_preset.sh so the user sees the diff, then PATCH via ${CLAUDE_SKILL_DIR}/scripts/patch_cross_check_preset.sh. Payload must include id.title and a one-line summary of what was tweaked vs. the default.highest approval rate; you've now overridden them for these comparisons — monitor conversion before rolling to production."
Preset ID (for level wiring / future PATCH): <id>.title: "Strict address, lenient name"
description: "Allow nickname variants but require exact address."
mode: basic # ONLY basic — advanced is forbidden via API
basicSettings:
nameComparisonMode: weakContainment # one of: strict | weakContainment | def | ai
addressComparisonMode: strict # one of: strict | fuzzy
ignoreMiddleNameMismatch: true
ignoreProvidedInfoMismatch: false # if true, don't flag user-typed info that disagrees with the docnameComparisonMode:
strict — exact match required.weakContainment — token-level containment (e.g. "Jon Smith" ⊆ "Jonathan Andrew Smith").def — Sumsub's recommended default; balances strictness and conversion.ai — ML-based comparison; tolerant of common variants and transliterations.addressComparisonMode:
strict — character-level match (after normalisation).fuzzy — tolerant of abbreviations and word order.The deprecated values (fuzzy, containment, fuzzyContainment on names) are NOT accepted via this skill.
On success, lead with the human-readable info:
title and a one-line summary of what was tweaked vs. the workspace default.Preset ID (for level wiring / future PATCH): <id>.On failure: HTTP status + Sumsub's description / errorName. Common causes:
403 Advanced cross-check presets cannot be managed via API — mode: advanced is dashboard-only. Switch to basic mode.400 with a validation message — one of the comparison-mode enums is wrong (e.g. a deprecated fuzzy / containment / fuzzyContainment name mode).examples/strict-name-only.json — tighten name match, leave address on defaults.examples/lenient-for-emerging-markets.json — fuzzy address + ai name, ignore middle-name mismatch.Cross-check presets are workspace-scoped. The default preset auto-applies to every level; if you've created a custom one, you have to attach it to specific levels by setting crossCheckPresetId on the level. That's done with sumsub-create-level (or a direct PATCH on the level via sumsub-api-generic).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.