其他
在 Sumsub 沙箱中列出/创建/更新客户端…
当需要针对 Sumsub 沙箱租户查询、新建或修改 clientWebhooks 事件订阅(applicantReviewed / applicantPending / kytTxn 等)时使用,通过公共 API 完成读写,并把生产配置交给人工在控制台完成。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
在 Sumsub 沙箱中列出/创建/更新特定
解决思路
- 按用途选端点:读取用 GET /resources/api/clientWebhooks(列出全部)和 GET /resources/api/clientWebhooks/{id}(按 id 取单条);写入用 POST /resources/api/agent/clientWebhooks(创建)和 PATCH /resources/api/agent/clientWebhooks(按 body 中的 id 更新)。需要 manageClientSettings 权限。
- 注意请求 DTO 差异:创建时 body 不要带 id(服务端分配,DTO 为 ClientWebhookCreateRequest);更新时 body 必须带 id(DTO 为 ClientWebhookUpdateRequest)。
- 按 Sumsub 认证规范对每个请求签名;使用环境变量 SUMSUB_APP_TOKEN(沙箱 token 以 sbx: 开头)、SUMSUB_SECRET_KEY(创建时只显示一次的配对密钥)、可选 SUMSUB_BASE(默认 https://api.sumsub.com)。用户已在对话中提供凭据就直接复用,否则只问一次;永远不要把 secret 回显出来。遇到 401 Invalid signature 时参考 sumsub-api-auth 技能。
- 只接受沙箱 token:如果用户提供生产 App Token,拒绝使用,并让其到 https://cockpit.sumsub.com/checkus/home?sbx=true 的 Connect Sumsub to your AI agent -> Build & configure -> Generate token 生成沙箱 token+secret(两者只显示一次,关闭弹窗前提早复制)。
- 生产 webhook 一律交给人工:明确告知用户不要用本技能配置生产 webhook(不要代做、不要索取或接受生产 token、也不要建议设置 SUMSUB_ALLOW_PROD=1),而要由人在 Sumsub dashboard 的 Integrations -> Webhooks、将工作区切换到 Production,手工配置 target URL、签名 secret、事件订阅和自定义 headers;这是安全敏感操作,签名 secret 认证真实 PII 投递,审计记录应归属于人。
- 推荐的协作流程:先用本技能在沙箱里做原型,把用户最终想要的规格(事件列表、headers、签名算法)整理成纯文档,交由人工在生产环境重建。
- 用 manage_webhooks.sh 编排:list(表格摘要,服务端最多返回最旧 50 条)、list --json(原始 JSON)、get <webhookId>(从列表中过滤出单条)、create <spec.json>(不带 id 的 POST)、update <spec.json>(spec 必须含 id 的 POST);create 与 update 都会调用 build_webhook_payload.py 把紧凑 spec 展开成完整负载。
- 提交前校验 target 必须公网可达:Sumsub 从其自身基础设施投递,所以不要提交 http://localhost:3000/webhook、127.0.0.1、0.0.0.0、::1 这类地址(payload builder 会直接拒绝;即便服务端接受,投递也会全部失败)。
- 遇到 localhost 地址时引导用户开公网隧道:① 安装 ngrok(macOS 用 brew install ngrok/ngrok/ngrok,其他平台从官网下载),首次使用需注册免费账号并执行一次 ngrok config add-authtoken <TOKEN>;② 询问本地 webhook 接收器监听的端口(常见 3000 / 8080 / 4000);③ 让其在另一个终端运行 ngrok http <port> 并保持开启;④ 从输出中取 Forwarding https://<random>.ngrok-free.app -> http://localhost:<port> 的 https 部分;⑤ 拼上接收器路径(如 /webhook、/sumsub)作为 target,然后重新执行 create 子命令。
- 提醒隧道地址的稳定性问题:免费版 ngrok 每次重启公网 URL 都会变,需要每轮会话用 update(带现有 id 和新 target 的 POST)重新指向;付费保留域名或 --domain=<your-subdomain> 可保持稳定。若要替代方案,可用 Cloudflare Tunnel(cloudflared tunnel)、Tailscale Funnel、localtunnel,流程相同。
- 按紧凑 spec 准备 create/update 负载:id(create 省略、update 必填,来自之前的 list/create 响应)、name(必填)、description、target(必填,目标 URL 或 slack/email/telegram 地址)、targetType(http | email | slack | telegram,默认 http)、types(必填的事件类型字符串数组)、applicantType(individual | company,省略表示两者都订阅)、sourceKeys(可选,限定特定来源)、secretKey(用于对负载签名)、signatureAlgorithm(HMAC_SHA1_HEX | HMAC_SHA256_HEX | HMAC_SHA512_HEX,默认 SHA256)、headers(可选,形如 { key: "X-Source", value: "sumsub" } 的数组,调用方需自行替换 ${MY_TOKEN} 之类的占位符)、notResendFailedWebhooks(默认 false,true 表示投递失败不自动重试)。builder 会校验 enum、拒绝空 types、包装 headers 以匹配 ClientWebhookHeader,未知 key 会透传(逃生通道)。
- 事件类型(types[])按分组取用:申请人生命周期 applicantCreated / applicantPrechecked / applicantPending / applicantReviewed / applicantOnHold / applicantActivated / applicantDeactivated / applicantReset / applicantLevelChanged / applicantTagsChanged / applicantPersonalInfoChanged / applicantDeleted / applicantPersonalDataDeleted;Action 流程 applicantActionPending / applicantActionReviewed / applicantActionOnHold;工作流 applicantWorkflowCompleted(注意不是 applicantWorkflowRunCompleted);视频认证 videoIdentStatusChanged / videoIdentCompositionCompleted;申请人级 KYT applicantKytTxnApproved / applicantKytTxnRejected / applicantKytTxnReviewed / applicantKytTxnDeleted / applicantKytTxnDataChanged / applicantKytTxnAwaitingUser / applicantKytOnHold;案件级 KYT kytCaseCreated / kytCaseStatusChanged / kytCaseReviewed(注意不是 kytCaseUpdated);AML 案件 amlCaseApproved / amlCaseRejected / amlCaseOnHold;Travel Rule travelRuleAction;KYB kybCompanyActivity。
- 警惕事件名拼写不会被校验:服务端把 types 当自由字符串数组,未知事件类型会被静默接受但 webhook 永不触发,所以拼错不会被 API 捕获;本技能也不做客户端校验(Sumsub 可能随时新增事件),因此要自行对照文档核对。
- 理解各子命令输出:list 输出含 id、name、target、disabled、types[]、applicantType、signatureAlgorithm、createdAt 的表格;get 输出单条完整 webhook JSON(secretKey 出于防御会被脱敏);create/update 输出持久化后的 ClientWebhook(创建时带服务端分配的 id)以及一行摘要。
- 公共 API 没有 DELETE 也没有 /stats:需要删除 webhook 或查看按 webhook 的投递统计时,让用户去 Sumsub dashboard UI 操作。
- 可参考仓库内的示例与文档:examples/basic-http.json(最小 HTTP webhook:HTTPS 端点、4 个申请人生命周期事件、SHA-256 签名)、examples/with-headers-and-restrictions.json(大事件集 + 限定 sourceKey + 自定义 headers)、examples/legacy-sha1.json(SHA1 签名,供已校验 SHA1 的接收方)、examples/update-existing.json(带 id 的更新路径)、references/webhook-schema.md(完整 ClientWebhook schema、全部 enum 与坑点,如 secret 并非只写字段、签名语义)。
适用边界 · 注意事项
- 配置生产 webhook:本技能只接受沙箱 token,沙箱与生产是彼此独立的租户,不存在「升级到生产」的路径,用生产 token 重跑也不是正确做法——生产 webhook 必须由人在 dashboard 手工创建。
- 其他无关的 webhook 面:Stripe / videoIdent / Fireblocks / NFC / 合作方专用的接收路径(/resources/webhooks/...),以及仅在 Sumsub dashboard 的 KYT 区域管理的 KYT-only webhook 路由。
- 一次性投递测试(应直接调用 inspectionCallbacks/testWebhook 端点),以及删除 webhook 或查看按 webhook 的投递统计(公共 API 不提供,需用 dashboard UI)。