sumsub-manage-wallet-address-book

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Sumsub — 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 registerWhat it pre-answers
Address in the Wallet Address Book"Is this wallet ours?"
Address as an applicant payment methodBoth 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
sumsub-integrate-travel-rule
; this skill is only about getting the data in.
🚧 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

接口

VerbPathPurpose
POST
/resources/kyt/walletAddress/import
Bulk-register addresses your organisation controls. Body is a JSON array of wallet entries. Max 10 000 per call.
POST
/resources/api/applicants/{applicantId}/payments
Register one address against a specific applicant, as a
cryptoWallet
payment method.
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).
请求方法路径用途
POST
/resources/kyt/walletAddress/import
批量注册企业控制的地址。请求体为钱包条目的JSON数组。每次调用最多支持10000条。
POST
/resources/api/applicants/{applicantId}/payments
将单个地址注册为特定申请人的
cryptoWallet
支付方式。
钱包地址簿没有公开的查询、更新或删除接口。如需查看或删除条目,请引导用户前往控制台(交易与旅行规则 → 钱包地址簿)。

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
    Your organization is not yet linked to a VASP. Please contact your Customer Success Manager
    (HTTP 404) if there is none. This is not a permissions problem and retrying will not help — relay the message and stop.
  • Travel Rule entitlement is required on the tenant. Check with
    sumsub-check-permissions
    before building a payload and report the gap rather than letting the call 403.
  • 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,如果未关联则会返回错误
    Your organization is not yet linked to a VASP. Please contact your Customer Success Manager
    (HTTP 404)。这并非权限问题,重试也无法解决——请直接转告用户此信息并停止操作。
  • 租户必须拥有Travel Rule权限。在构建请求体前,请使用
    sumsub-check-permissions
    进行检查,若权限缺失请告知用户,避免调用返回403错误。
  • 导入接口还要求令牌主体拥有管理员角色。范围受限的代理令牌可能不具备此权限——如果权限检查通过但调用返回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
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. 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 with
sbx:
unless
SUMSUB_ALLOW_PROD=1
is set.
VarExample
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.
本技能调用Sumsub公开API,并按照认证参考文档对每个请求进行签名。完整的工作原理说明请参考
sumsub-api-auth
技能——如果遇到
401 Invalid signature
错误,请查阅该文档。
⚠️ 仅支持沙箱令牌。请勿接受或使用生产环境的App Token。钱包地址属于企业识别数据,生产环境中的错误导入会影响真实Travel Rule请求的响应。如果用户提供生产环境令牌,请拒绝并要求他们在https://cockpit.sumsub.com/checkus/home?sbx=true生成沙箱令牌对(将Sumsub连接到你的AI Agent -> 构建与配置 -> 生成令牌)。令牌和密钥仅会显示一次——请在关闭对话框前复制两者。辅助脚本会强制执行此规则——除非设置
SUMSUB_ALLOW_PROD=1
,否则会拒绝非
sbx:
开头的令牌。
变量示例
SUMSUB_APP_TOKEN
sbx:...
— 来自控制台的沙箱App Token。
SUMSUB_SECRET_KEY
令牌创建时显示的配对密钥。
SUMSUB_BASE
可选。默认值为
https://api.sumsub.com
如果用户已在对话中提供过凭证,请复用;否则在执行前询问一次。切勿回显密钥。

Procedure

操作流程

  1. 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.
  2. 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.
  3. Check entitlements with
    sumsub-check-permissions
    (looking for
    TRAVEL_RULE
    ).
  4. Build the import body with
    ${CLAUDE_SKILL_DIR}/scripts/build_wallet_import.py
    (compact spec on stdin → JSON array on stdout). It validates the address / hash rules below and refuses batches over 10 000.
  5. Send it.
    • ${CLAUDE_SKILL_DIR}/scripts/import_wallet_addresses.sh <payload.json>
    • ${CLAUDE_SKILL_DIR}/scripts/add_payment_method.sh <applicantId> <payload.json>
  6. Report the result honestly. The import returns
    {successCount, errorCount, errors[]}
    and is partially successful by design — a non-zero
    errorCount
    does not fail the HTTP call. Always surface
    errorCount
    and the first few
    errors[]
    entries; never report "imported" on the strength of a 200.
  1. 确认用户要注册的地址,关键是确认这些地址的使用方向。如果用户仅说“我们的钱包”而未明确说明,请询问列表是否包含提现地址。
  2. 选择合适的接口
    • 大量地址,所有权归企业所有 → 导入接口。
    • 单个地址且属于已知申请人 → 支付方式接口。只要申请人信息已知,优先选择此接口,因为它能预先回答两个问题而非一个。
  3. 使用
    sumsub-check-permissions
    检查权限
    (需包含
    TRAVEL_RULE
    权限)。
  4. 使用
    ${CLAUDE_SKILL_DIR}/scripts/build_wallet_import.py
    构建导入请求体
    (标准输入接收精简规范 → 标准输出输出JSON数组)。该脚本会验证以下地址/哈希规则,并拒绝超过10000条的批量请求。
  5. 发送请求
    • ${CLAUDE_SKILL_DIR}/scripts/import_wallet_addresses.sh <payload.json>
    • ${CLAUDE_SKILL_DIR}/scripts/add_payment_method.sh <applicantId> <payload.json>
  6. 如实报告结果。导入操作会返回
    {successCount, errorCount, errors[]}
    ,并且设计上允许部分成功——
    errorCount
    非零并不代表HTTP调用失败。务必展示
    errorCount
    和前几条
    errors[]
    条目;切勿仅因返回200就报告“已导入”。

Compact spec — import

精简规范 — 导入

yaml
undefined
yaml
undefined

Defaults 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.type
is required and must be one of the enum values above; for Travel Rule purposes it is always
cryptoWallet
.
accountIdentifierHash
may be sent instead of
accountIdentifier
on the same terms as the import.
The
applicantId
goes in the path, not the body — it is Sumsub's internal applicant id, not your
externalUserId
. If the user only has an
externalUserId
, resolve it first via
GET /resources/applicants/-;externalUserId={externalUserId}/one
.
yaml
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.type
为必填项,必须是上述枚举值之一;对于Travel Rule场景,该值始终为
cryptoWallet
。可按照导入场景的规则,使用
accountIdentifierHash
替代
accountIdentifier
applicantId
需放在路径中,而非请求体——这是Sumsub内部的申请人ID,而非你方的
externalUserId
。如果用户仅提供
externalUserId
,请先通过
GET /resources/applicants/-;externalUserId={externalUserId}/one
解析为内部ID。

Outputs

输出结果

  • import
    successCount
    ,
    errorCount
    , and
    errors[]
    where 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.
  • payment method — the persisted payment-method instance, including its server-assigned id.
  • 导入 — 返回
    successCount
    errorCount
    errors[]
    ,其中每个错误条目包含失败的地址(或哈希)及原因。请报告数量和不同的错误原因,而非直接输出10000行原始数据。
  • 支付方式 — 返回持久化的支付方式实例,包括服务器分配的ID。

Worked examples

示例

  • examples/deposit-addresses.json
    — a small multi-chain import.
  • examples/withdrawal-addresses.json
    — the direction integrations forget; same shape, different addresses.
  • examples/hashed-only.json
    — registering by hash without disclosing the addresses.
  • examples/payment-method-crypto.json
    — one address bound to one applicant.
  • examples/deposit-addresses.json
    — 小型多链导入示例。
  • examples/withdrawal-addresses.json
    — 集成时常遗漏的方向;格式相同,地址不同。
  • examples/hashed-only.json
    — 仅通过哈希注册而不披露地址的示例。
  • examples/payment-method-crypto.json
    — 单个地址绑定到单个申请人的示例。

See also

参考链接

  • references/wallet-address-schema.md
    — field-by-field schema, source-type precedence, error shapes.
  • sumsub-integrate-travel-rule
    — the flow this data feeds.
  • Sumsub docs: Wallet Address Book, Travel Rule settings.
  • references/wallet-address-schema.md
    — 逐字段的 schema 说明、来源类型优先级、错误格式。
  • sumsub-integrate-travel-rule
    — 本数据所支持的流程。
  • Sumsub文档:Wallet Address BookTravel Rule settings