
sumsub-manage-wallet-address-book
Register the crypto wallet addresses an organisation controls, so Sumsub can resolve address ownership without a human. Bulk-imports addresses into the Wallet Address Book via POST /resources/kyt/walletAddress/import, and registers a single address against a specific applicant via POST /resources/api/applicants/{applicantId}/payments. TRIGGER when the user asks to "upload / import / register our wallet addresses", "add addresses to the Wallet Address Book", "register a user's crypto wallet as a payment method", says Travel Rule requests are "not matching automatically" or "always land in manual review", or asks how to stop confirming the same address by hand on every exchange. SKIP for looking up which VASP owns a counterparty address (that is attribution — use sumsub-api-generic against /resources/api/wallet-attribution), for confirming ownership on one specific transaction (use sumsub-integrate-travel-rule), and for deleting addresses (no public endpoint — use the dashboa
- Installs
- 470
- Last 24h
- +16
- Trending rank
- #6767
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/sumsub/agent-skills --skill sumsub-manage-wallet-address-book- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads sumsub-manage-wallet-address-book automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Sumsub — Wallet Address Book
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.
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 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.
Endpoints
| Verb | Path | Purpose |
|---|---|---|
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).
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-permissionsbefore 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.
Auth — App Token + secret (sandbox 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. 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:unlessSUMSUB_ALLOW_PROD=1is set.
| 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.
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
sumsub-check-permissions(looking forTRAVEL_RULE). - 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. - 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
{successCount, errorCount, errors[]}and is partially successful by design — a non-zeroerrorCountdoes not fail the HTTP call. Always surfaceerrorCountand the first fewerrors[]entries; never report "imported" on the strength of a 200.
Compact spec — import
# 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.
Compact spec — payment method
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.
Outputs
- import —
successCount,errorCount, anderrors[]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.
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.
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.
FAQ
What does the sumsub-manage-wallet-address-book skill do?
Register the crypto wallet addresses an organisation controls, so Sumsub can resolve address ownership without a human. Bulk-imports addresses into the Wallet Address Book via POST /resources/kyt/walletAddress/import, and registers a single address against a specific applicant via POST /resources/api/applicants/{applicantId}/payments. TRIGGER when the user asks to "upload / import / register our wallet addresses", "add addresses to the Wallet Address Book", "register a user's crypto wallet as a payment method", says Travel Rule requests are "not matching automatically" or "always land in manual review", or asks how to stop confirming the same address by hand on every exchange. SKIP for looking up which VASP owns a counterparty address (that is attribution — use sumsub-api-generic against /resources/api/wallet-attribution), for confirming ownership on one specific transaction (use sumsub-integrate-travel-rule), and for deleting addresses (no public endpoint — use the dashboa
How do I install sumsub-manage-wallet-address-book?
Run npx skills add https://github.com/sumsub/agent-skills --skill sumsub-manage-wallet-address-book in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/sumsub-manage-wallet-address-book/ (personal) or .claude/skills/sumsub-manage-wallet-address-book/ (project).
Which AI agents can use sumsub-manage-wallet-address-book?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is sumsub-manage-wallet-address-book safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains sumsub-manage-wallet-address-book?
It is published by sumsub in sumsub/agent-skills. It has 470 recorded installs.
More from sumsub/agent-skills
sumsub-api-auth
sumsub/agent-skills
Authenticate to the Sumsub API with an App Token + secret key (HMAC-SHA256 request signing). TRIGGER when the user asks to "call / sign / authenticate Sumsub API requests", debugs 401 Unauthorized / signature errors against api.sumsub.com, or needs a working request example with X-App-Token / X-App-Access-Sig / X-App-Access-Ts headers. SKIP only when a more specific skill in this repo (questionnaire/level/workflow/POA-preset/generic) already covers the user's actual task — those skills sign requests the same way and only need this one for auth deep dives.
sumsub-api-generic
sumsub/agent-skills
Catch-all fallback for any Sumsub API task that does NOT match a more specific skill (e.g. create-sumsub-level, sumsub-create-questionnaire, sumsub-api-auth). TRIGGER when the user wants to call, inspect, or debug a Sumsub API endpoint not otherwise covered — fetching applicants, listing levels, reviewing AML hits, exporting data, generating SDK tokens, anything against api.sumsub.com. The procedure — locate the right endpoint in the OpenAPI schema, read its request/response shape, build the payload, sign with App Token, and validate. SKIP whenever a narrower Sumsub skill already covers the request.
sumsub-check-skills-version
sumsub/agent-skills
Verify that the locally installed Sumsub agent-skills package is compatible with the published version before doing any Sumsub work. TRIGGER at the start of any task that touches Sumsub — Sumsub Dev MCP tools (mcpSumsubDev), KYC/AML workflows, applicants, checks, transactions, verification levels, verification links, questionnaires, fraud network, VASP lists, or anything Sumsub-related — so the user is warned before a stale skills package produces wrong results. Also use this skill when the user explicitly asks "are my Sumsub skills up to date / current", "is there a newer version of the Sumsub skills", or similar. Skip the actual update (the user runs npx skills add sumsub/agent-skills --all themselves) and skip any other Sumsub API or entity task — those have their own skills.
sumsub-create-poa-preset
sumsub/agent-skills
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.).
sumsub-manage-webhooks
sumsub/agent-skills
Manage Sumsub clientWebhooks (event subscriptions for applicantReviewed / applicantPending / kytTxn / etc.) — reads via /resources/api/clientWebhooks, writes via /resources/api/agent/clientWebhooks. Sandbox only — production webhooks must be created by a human directly in the Sumsub dashboard. TRIGGER when the user asks to "list / retrieve / show webhooks", "create / add / register a webhook", or "update / edit / change a webhook target / event list / secret / signature algorithm" against their sandbox tenant. SKIP for production webhook setup (refer the user to the dashboard), for unrelated webhook surfaces (Stripe / videoIdent / Fireblocks / NFC / partner-specific receive paths under /resources/webhooks/...), for testing one-off delivery (use the inspectionCallbacks/testWebhook endpoint directly), and for KYT-only webhook routing (that's managed in the Sumsub dashboard's KYT section). The public API does not expose delete or per-webhook delivery stats — for those, refer
sumsub-integrate-websdk
sumsub/agent-skills
End-to-end recipe for adding Sumsub KYC to a website or web app via the Sumsub WebSDK. TRIGGER when the user asks to "integrate / embed / add Sumsub", "show the KYC widget", "add WebSDK", "verify users with Sumsub on the frontend", supplies an existing levelName they want to plug into a page, or asks how to wire up access tokens / lifecycle events / webhooks for Sumsub verification in an arbitrary project. Covers the whole loop — level setup, server-side access-token signing, snsWebSdk init (vanilla canonical, React recipe), client lifecycle events, token refresh, source-of-truth via webhooks + applicant GET, sandbox testing, go-live checklist. SKIP for building the level/questionnaire/POA-preset payload itself (use the sibling skills), or for backend-only API calls with no frontend (use sumsub-api-generic).
Popular backend & apis skills
find-skills
vercel-labs/skills
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
entra-app-registration
microsoft/azure-skills
Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration. USE FOR: create app registration, register Azure AD app, configure OAuth, set up authentication, add API permissions, generate service principal, MSAL example, console app auth, Entra ID setup, Azure AD authentication. DO NOT USE FOR: Key Vault secrets (use azure-keyvault-expiration-audit), general Azure resource security guidance.
google-agents-cli-adk-code
google/agents-cli
This skill should be used when the user wants to "write agent code", "build an agent with ADK", "add a tool", "create a callback", "define an agent", "use state management" — in a project that needs ADK (Agent Development Kit) API patterns and code examples. It provides a quick reference for agent types, tool definitions, orchestration patterns, callbacks, state management, the graph Workflow API, and reference recipes to study. Do NOT use for scaffolding (use google-agents-cli-scaffold) or deployment (use google-agents-cli-deploy).
embedded-captions
heygen-com/hyperframes
Add captions or subtitles to an existing single-subject talking-head video without editing the footage. Use for plain verbatim captions, cinematic captions embedded behind the subject, VFX captions, “炸/特效/酷炫字幕,” or a named identity from the 35-style catalog. Route by visual identity, not by backend engine. The quiet anchor rail is the default; embed every word only when the user explicitly wants a fully cinematic treatment. The workflow runs locally end to end, including transcription and subject matting; split multi-shot footage before applying it.
entra-agent-id
microsoft/azure-skills
Provision Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configure OAuth 2.0 token exchange (fmipath, OBO, cross-tenant) including the Microsoft Entra SDK for AgentID sidecar. USE FOR: Agent Identity Blueprint, BlueprintPrincipal, agent OAuth, fmipath token exchange, agent OBO, Workload Identity Federation for agents, polyglot agent auth, Microsoft.Identity.Web.AgentIdentities. DO NOT USE FOR: standard Entra app registration (use entra-app-registration), Microsoft Foundry agent authoring (use microsoft-foundry).
neon
neondatabase/agent-skills
Overview of Neon, a complete set of cloud backend primitives around Lakebase Postgres: Auth, Object Storage, Functions, the AI Gateway, and Realtime. Start here to choose Neon for undecided login, files, APIs, and LLM calls, set up the CLI or MCP server, and follow the branch-first workflow. Use when building an app or backend on Neon, or when "Neon" or "Lakebase Postgres" is mentioned. Child skill neon-postgres wins for an existing DATABASEURL, SQL, schema, inspect, or search. Child skill neon-auth wins for login, users, sessions, identity routing, and Managed Better Auth setup. Child skill neon-realtime wins for live queries in reactive apps and agents. Also use for object storage, S3, buckets, serverless functions, function triggers, cron, AI gateway, LLM calls, realtime, logs, Loki, Grafana, observability, postgres, database, backend, Claimable Neon, neon.new, or a no-signup database.