sumsub-manage-wallet-address-book
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSumsub — Wallet Address Book
Sumsub — 钱包地址簿
Tells Sumsub which crypto addresses belong to your organisation, and which of
your users each one belongs to. This is the data that turns Travel Rule
answering from a manual queue into an automatic one.
告知Sumsub哪些加密货币地址属于你的企业,以及每个地址分别属于你的哪位用户。这些数据可以将Travel Rule的响应流程从人工队列转为自动处理。
Why this matters more than it looks
为何这比看起来更重要
When another VASP starts a Travel Rule exchange that involves one of your
users, Sumsub asks you two questions: is this wallet yours? and whose is
it? Both can be answered from stored data instead of by a person — but only
if the address is already registered.
| What you register | What it pre-answers |
|---|---|
| Address in the Wallet Address Book | "Is this wallet ours?" |
| Address as an applicant payment method | Both questions |
Anything not registered falls to manual handling, and manual handling does not
survive volume — counterparties can set the confirmation window to seconds.
The mechanics of how a pre-answered request arrives, and which flags to read,
belong to ;
this skill is only about getting the data in.
sumsub-integrate-travel-rule🚧 The most common mistake is uploading only deposit addresses. Exchanges
created after settlement ask about the address the funds were sent from —
i.e. an address your users withdraw from. If the book holds only addresses you
receive on, that whole class of request silently falls to manual review. Ask
the user explicitly whether their export covers both directions.
当其他VASP发起涉及你方用户的Travel Rule交互时,Sumsub会向你提出两个问题:*这个钱包属于你方吗?以及它属于谁?*这两个问题都可以通过存储的数据自动回答——但前提是该地址已完成注册。
| 你注册的内容 | 预先回答的问题 |
|---|---|
| 钱包地址簿中的地址 | “这个钱包属于你方吗?” |
| 作为申请人支付方式的地址 | 两个问题都能回答 |
未注册的地址会落入人工处理流程,而人工处理无法应对高交易量——交易对手可能会将确认窗口设置为几秒。关于预回答请求的到达机制以及需要读取哪些标记的内容,请参考;本技能仅负责数据录入。
sumsub-integrate-travel-rule🚧 **最常见的错误是仅上传充值地址。**结算后发起的交易所会询问资金的转出地址——即你的用户提现所用的地址。如果地址簿中仅包含你方接收资金的地址,这类请求会直接进入人工审核。请明确询问用户他们导出的地址是否包含双向地址。
Endpoints
接口
| Verb | Path | Purpose |
|---|---|---|
| | Bulk-register addresses your organisation controls. Body is a JSON array of wallet entries. Max 10 000 per call. |
| | Register one address against a specific applicant, as a |
There is no public list, update or delete endpoint for the Wallet Address
Book. To review or remove entries, send the user to the dashboard
(Transactions and travel rule → Wallet address book).
| 请求方法 | 路径 | 用途 |
|---|---|---|
| | 批量注册企业控制的地址。请求体为钱包条目的JSON数组。每次调用最多支持10000条。 |
| | 将单个地址注册为特定申请人的 |
钱包地址簿没有公开的查询、更新或删除接口。如需查看或删除条目,请引导用户前往控制台(交易与旅行规则 → 钱包地址簿)。
Two preconditions that produce confusing errors
会导致混淆错误的两个前置条件
- The organisation must be linked to a VASP. The import resolves your VASP
from the token's client id and fails with (HTTP 404) if there is none. This is not a permissions problem and retrying will not help — relay the message and stop.
Your organization is not yet linked to a VASP. Please contact your Customer Success Manager - Travel Rule entitlement is required on the tenant. Check with
before building a payload and report the gap rather than letting the call 403.
sumsub-check-permissions - The import endpoint additionally requires the admin role on the token subject. A scoped agent token may not have it — if you get a 403 while the entitlement check passed, this is why; the user has to run the import from a token with admin rights or from the dashboard.
- 企业必须关联到VASP。导入操作会通过令牌的客户端ID解析你的VASP,如果未关联则会返回错误(HTTP 404)。这并非权限问题,重试也无法解决——请直接转告用户此信息并停止操作。
Your organization is not yet linked to a VASP. Please contact your Customer Success Manager - 租户必须拥有Travel Rule权限。在构建请求体前,请使用进行检查,若权限缺失请告知用户,避免调用返回403错误。
sumsub-check-permissions - 导入接口还要求令牌主体拥有管理员角色。范围受限的代理令牌可能不具备此权限——如果权限检查通过但调用返回403,原因就在于此;用户必须使用拥有管理员权限的令牌或通过控制台执行导入操作。
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. Wallet addresses are business-identifying data, and a bad import in production changes how real Travel Rule requests are answered. If the user offers a production 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 script enforces this — it rejects tokens that don't start withunlesssbx:is set.SUMSUB_ALLOW_PROD=1
| 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。钱包地址属于企业识别数据,生产环境中的错误导入会影响真实Travel Rule请求的响应。如果用户提供生产环境令牌,请拒绝并要求他们在https://cockpit.sumsub.com/checkus/home?sbx=true生成沙箱令牌对(将Sumsub连接到你的AI Agent -> 构建与配置 -> 生成令牌)。令牌和密钥仅会显示一次——请在关闭对话框前复制两者。辅助脚本会强制执行此规则——除非设置,否则会拒绝非SUMSUB_ALLOW_PROD=1开头的令牌。sbx:
| 变量 | 示例 |
|---|---|
| |
| 令牌创建时显示的配对密钥。 |
| 可选。默认值为 |
如果用户已在对话中提供过凭证,请复用;否则在执行前询问一次。切勿回显密钥。
Procedure
操作流程
- Establish which addresses the user is registering and, critically, in which direction they are used. If they say "our wallets" without qualification, ask whether the list includes withdrawal addresses.
- Decide which endpoint fits.
- Many addresses, ownership at organisation level → import.
- One address that belongs to a known applicant → payment method. Prefer this whenever the applicant is known; it pre-answers both questions instead of one.
- Check entitlements with (looking for
sumsub-check-permissions).TRAVEL_RULE - Build the import body with (compact spec on stdin → JSON array on stdout). It validates the address / hash rules below and refuses batches over 10 000.
${CLAUDE_SKILL_DIR}/scripts/build_wallet_import.py - Send it.
${CLAUDE_SKILL_DIR}/scripts/import_wallet_addresses.sh <payload.json>${CLAUDE_SKILL_DIR}/scripts/add_payment_method.sh <applicantId> <payload.json>
- Report the result honestly. The import returns
and is partially successful by design — a non-zero
{successCount, errorCount, errors[]}does not fail the HTTP call. Always surfaceerrorCountand the first fewerrorCountentries; never report "imported" on the strength of a 200.errors[]
- 确认用户要注册的地址,关键是确认这些地址的使用方向。如果用户仅说“我们的钱包”而未明确说明,请询问列表是否包含提现地址。
- 选择合适的接口。
- 大量地址,所有权归企业所有 → 导入接口。
- 单个地址且属于已知申请人 → 支付方式接口。只要申请人信息已知,优先选择此接口,因为它能预先回答两个问题而非一个。
- 使用检查权限(需包含
sumsub-check-permissions权限)。TRAVEL_RULE - 使用构建导入请求体(标准输入接收精简规范 → 标准输出输出JSON数组)。该脚本会验证以下地址/哈希规则,并拒绝超过10000条的批量请求。
${CLAUDE_SKILL_DIR}/scripts/build_wallet_import.py - 发送请求。
${CLAUDE_SKILL_DIR}/scripts/import_wallet_addresses.sh <payload.json>${CLAUDE_SKILL_DIR}/scripts/add_payment_method.sh <applicantId> <payload.json>
- 如实报告结果。导入操作会返回,并且设计上允许部分成功——
{successCount, errorCount, errors[]}非零并不代表HTTP调用失败。务必展示errorCount和前几条errorCount条目;切勿仅因返回200就报告“已导入”。errors[]
Compact spec — import
精简规范 — 导入
yaml
undefinedyaml
undefinedDefaults applied to every entry unless overridden per address
默认设置会应用到每个条目,除非单个地址覆盖设置
defaults:
asset: BTC # optional — currency code
chain: BTC # optional — network
addresses:
- walletAddress: "bc1qmdld6jk0r3tvh39yqmet790t5vl3up2rcfzh0d"
- walletAddress: "0x7DF6AF1C17AC9F86F8B3FBBC25253B8B5DF2F3A1" asset: ETH chain: ETH
privacy-preserving variant — see below
- walletAddressHash: "9f2c...64"
| Field | Required | Notes |
|---|---|---|
| `walletAddress` | one of the two | The plain address. |
| `walletAddressHash` | one of the two | Use when you do not want to send the address itself. |
| `asset` | no | Currency code, e.g. `BTC`, `ETH`, `USDT`. |
| `chain` | no | Network, e.g. `BTC`, `ETH`, `TRX`. |
📘 **Either `walletAddress` or `walletAddressHash` must be present.** If you
send **both**, the server recomputes the hash from the address and rejects the
entry when they disagree — so only send both if you are deliberately verifying
your own hashing. When in doubt, send just `walletAddress`.
📘 The `source` field on the entry is ignored — the server stamps imported
addresses as `api` regardless. That matters: only addresses whose source is
`api`, `dashboard`, a previously confirmed exchange, or a registered payment
method are trusted for automatic ownership confirmation. Addresses Sumsub
merely inferred (from attribution or from your transaction data) are not.defaults:
asset: BTC # 可选 — 货币代码
chain: BTC # 可选 — 网络
addresses:
- walletAddress: "bc1qmdld6jk0r3tvh39yqmet790t5vl3up2rcfzh0d"
- walletAddress: "0x7DF6AF1C17AC9F86F8B3FBBC25253B8B5DF2F3A1" asset: ETH chain: ETH
隐私保护变体 — 见下文
- walletAddressHash: "9f2c...64"
| 字段 | 是否必填 | 说明 |
|---|---|---|
| `walletAddress` | 二选一 | 明文地址。 |
| `walletAddressHash` | 二选一 | 不想发送明文地址时使用。 |
| `asset` | 否 | 货币代码,例如`BTC`、`ETH`、`USDT`。 |
| `chain` | 否 | 网络,例如`BTC`、`ETH`、`TRX`。 |
📘 **必须提供`walletAddress`或`walletAddressHash`其中一个**。如果同时提供**两者**,服务器会根据地址重新计算哈希,若不一致则会拒绝该条目——因此仅当你有意验证自己的哈希计算时才同时提供。若不确定,仅发送`walletAddress`即可。
📘 条目中的`source`字段会被忽略——服务器会将导入的地址标记为`api`来源。这一点很重要:只有来源为`api`、`dashboard`、已确认的交易或已注册支付方式的地址,才会被用于自动所有权确认。Sumsub仅通过归属查询或交易数据推断出的地址不具备此信任度。Compact spec — payment method
精简规范 — 支付方式
yaml
externalId: "wallet-btc-user-001" # optional, your own identifier
data:
type: cryptoWallet # cryptoWallet | bankCard | bankAccount | eWallet | other
accountIdentifier: "bc1qmdld6jk0r3tvh39yqmet790t5vl3up2rcfzh0d"
fullName: "John Smith" # the holder, as you know them
currencyCode: "BTC"
cryptoChain: "BTC"
memo: "" # for chains that use one (XRP, XLM, …)data.typecryptoWalletaccountIdentifierHashaccountIdentifierThe goes in the path, not the body — it is Sumsub's internal
applicant id, not your . If the user only has an
, resolve it first via
.
applicantIdexternalUserIdexternalUserIdGET /resources/applicants/-;externalUserId={externalUserId}/oneyaml
externalId: "wallet-btc-user-001" # 可选,你方自定义标识符
data:
type: cryptoWallet # cryptoWallet | bankCard | bankAccount | eWallet | other
accountIdentifier: "bc1qmdld6jk0r3tvh39yqmet790t5vl3up2rcfzh0d"
fullName: "John Smith" # 你方记录的持有人姓名
currencyCode: "BTC"
cryptoChain: "BTC"
memo: "" # 适用于使用备注的链(XRP、XLM等)data.typecryptoWalletaccountIdentifierHashaccountIdentifierapplicantIdexternalUserIdexternalUserIdGET /resources/applicants/-;externalUserId={externalUserId}/oneOutputs
输出结果
- import — ,
successCount, anderrorCountwhere each entry carries the failing address (or hash) and a reason. Report the counts and the distinct reasons, not a raw dump of 10 000 rows.errors[] - payment method — the persisted payment-method instance, including its server-assigned id.
- 导入 — 返回、
successCount和errorCount,其中每个错误条目包含失败的地址(或哈希)及原因。请报告数量和不同的错误原因,而非直接输出10000行原始数据。errors[] - 支付方式 — 返回持久化的支付方式实例,包括服务器分配的ID。
Worked examples
示例
- — a small multi-chain import.
examples/deposit-addresses.json - — the direction integrations forget; same shape, different addresses.
examples/withdrawal-addresses.json - — registering by hash without disclosing the addresses.
examples/hashed-only.json - — one address bound to one applicant.
examples/payment-method-crypto.json
- — 小型多链导入示例。
examples/deposit-addresses.json - — 集成时常遗漏的方向;格式相同,地址不同。
examples/withdrawal-addresses.json - — 仅通过哈希注册而不披露地址的示例。
examples/hashed-only.json - — 单个地址绑定到单个申请人的示例。
examples/payment-method-crypto.json
See also
参考链接
- — field-by-field schema, source-type precedence, error shapes.
references/wallet-address-schema.md - — the flow this data feeds.
sumsub-integrate-travel-rule - Sumsub docs: Wallet Address Book, Travel Rule settings.
- — 逐字段的 schema 说明、来源类型优先级、错误格式。
references/wallet-address-schema.md - — 本数据所支持的流程。
sumsub-integrate-travel-rule - Sumsub文档:Wallet Address Book、Travel Rule settings。