
sumsub-resolve-currency
Resolve and validate the currency fields Sumsub expects on a transaction — info.currencyCode, info.currencyType, info.cryptoParams.cryptoChain and the amountInDefaultCurrency / defaultCurrencyCode pair. Reads the catalogue from GET /resources/kyt/currency?type=cryptofiat and resolves a (symbol, chain, contract) triple to exactly one asset, normalising chain aliases and refusing ambiguous input rather than guessing. TRIGGER when the user asks "which currency codes / chains does Sumsub support", "is USDT on TRON supported", "what do I put in cryptoChain", "why is my currency not recognised", "why is amountInDefaultCurrency wrong / missing", or is about to submit a transaction with a token whose symbol exists on several networks. SKIP for building the transaction itself (use sumsub-create-transaction), for currency-based scoring rules (use sumsub-create-kyt-rules), and for FX rates or historical conversion — Sumsub exposes no rates endpoint.
- Installs
- 469
- Last 24h
- +16
- Trending rank
- #6798
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/sumsub/agent-skills --skill sumsub-resolve-currency- 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-resolve-currency 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 — Resolve currency and chain
One endpoint answers both halves, and the two halves look nothing alike:
type=fiat | type=crypto |
|---|---|
| Flat list of ISO 4217 codes, fetched live | Thousands of assets across a hundred-plus chains |
| No chain, no contract, no ambiguity | Over a thousand symbols exist on more than one chain |
| Resolving = "is it in the list" | Resolving = (symbol, chain, [contract]) → exactly one asset |
Most of this skill is about the crypto side, because that is where transactions silently go wrong. Fiat is a membership test.
Endpoint
| Verb | Path | Purpose |
|---|---|---|
GET | /resources/kyt/currency?type=crypto | The crypto catalogue. Static server-side; safe to cache for a session. |
GET | /resources/kyt/currency?type=fiat | Fiat codes, assembled live from the rates provider. |
Omit type and you get the fiat list. There is no public endpoint for the
chain list — derive it from the crypto catalogue's distinct cryptoChain
values. There is no rates endpoint: Sumsub converts internally and does not
expose the rate it used.
Each crypto entry carries currencyCode, cryptoChain, contractAddress,
chainId, name, coinmarketcapId, coingeckoId.
Auth — App Token + secret (sandbox only)
Signing per the authentication reference;
mechanics in sumsub-api-auth.
⚠️ Sandbox tokens only. The helper script refuses tokens that don't start with
sbx:unlessSUMSUB_ALLOW_PROD=1. This endpoint is read-only, but the same rule applies across these skills — get a sandbox pair at https://cockpit.sumsub.com/checkus/home?sbx=true (Connect Sumsub to your AI agent -> Build & configure -> Generate token).
| Var | Example |
|---|---|
SUMSUB_APP_TOKEN | sbx:... |
SUMSUB_SECRET_KEY | The paired secret. |
SUMSUB_BASE | Optional. Defaults to https://api.sumsub.com. |
The rule that matters
A symbol is not an asset. USDT and USDC each name more than a dozen
different assets in the catalogue; ETH several. The identity of a crypto
asset is the pair (currencyCode, cryptoChain), plus contractAddress when
even that is not unique.
📘 An empty cryptoChain is a value, not a gap. It means the native coin
of its own chain — BTC with no chain is bitcoin; BTC with cryptoChain: BTC is the same thing (the server normalises that common mistake); BTC on
some wrapped chain is a different asset entirely.
🚧 Ambiguity does not resolve to a default — it resolves to nothing. When a
lookup matches more than one row the server logs Multiple currencies found
and returns no currency at all. So the symptom of a missing chain is not "wrong
rate" but "currency not recognised", with everything downstream that depends on
it silently degraded.
Procedure
-
Decide the type. If the code is three uppercase letters and appears in the fiat list, treat it as fiat unless the user says otherwise. Beware of overlaps in intent — a user saying "USD" almost never means a token called USD.
-
Fetch the catalogue with
${CLAUDE_SKILL_DIR}/scripts/get_currencies.sh crypto(orfiat). Cache it for the session; the crypto list is large and static. -
Resolve with
${CLAUDE_SKILL_DIR}/scripts/resolve_currency.py— pass the catalogue and the query. It uppercases and trims, expands chain aliases, treatscode == chainas the native coin, and on ambiguity fails with the candidate list instead of picking one. -
Report the exact fields to send, never just "supported":
"info": { "currencyCode": "USDT", "currencyType": "crypto", "cryptoParams": { "cryptoChain": "TRX" } } -
Address the conversion — see below. This is the part callers forget.
amountInDefaultCurrency — read this before skipping it
info.amountInDefaultCurrency + info.defaultCurrencyCode express the
transfer in your reporting currency. They look optional. They are not, in three
ways.
🚧 Travel Rule thresholds are compared against amountInDefaultCurrency.
If it is absent, the threshold comparison is skipped entirely and the
Travel Rule flow runs regardless of how small the transfer is. Omitting the
field does not lose precision — it changes behaviour. The same applies to the
unhosted-wallet verification threshold.
🚧 The value is frozen at ingest. Sumsub computes it once, when the transaction is created, and stores it. A rate that was wrong at that moment stays wrong on the record; correcting it later means a backfill, not a re-read.
📘 If the asset does not resolve, there is nothing to convert. An
unrecognised (symbol, chain) pair means no conversion happens — which is the
second reason a missing cryptoChain is expensive.
Recommendation: if you know the value your own systems used, send
amountInDefaultCurrency and defaultCurrencyCode explicitly. Your books and
Sumsub's record then agree by construction, and you are not depending on a
third-party rate at an instant you do not control.
Chain aliases
Chain names are uppercased, trimmed, then mapped through a fixed alias table
before lookup. ETHEREUM, BSC, TRC20, MATIC, POLYGON, BEP20,
TRON, SOLANA, AVAX_C and about two dozen more resolve to their canonical
chain. Anything outside the table is used verbatim, so a near-miss like
TRON20 or ERC-20 simply does not match.
The table is not exposed by any endpoint — the full list is in
references/crypto-catalogue.md. When a
user's chain string fails to resolve, check it against the aliases before
concluding the asset is unsupported.
Travel Rule specifics
Beyond the threshold behaviour above, the asset you pick can decide whether an exchange is possible at all. Each catalogue entry carries the counterparty protocols' own vocabularies, and coverage is thin.
Only a minority of catalogue entries carry a mapping for any given protocol — Sygna covers the most, then GTR, then CODE, and all three are a small fraction of the whole. Coverage grows as the weekly listing job picks up new assets, so check rather than assume.
An asset with no mapping for the protocol your counterparty speaks cannot be
expressed in their message. The exchange fails validation before anything is
sent — surfacing as notEnoughCounterpartyData, which reads like a data
problem rather than an asset-support problem. If a Travel Rule exchange fails
that way on an exotic token, check the vocabulary coverage before debugging the
payload. See sumsub-integrate-travel-rule.
Outputs
- Resolved — the matched entry, and the exact
currencyCode/currencyType/cryptoChainto send. MentioncontractAddresswhen the symbol is a known collision, so the caller can pin it. - Ambiguous — the candidate rows with their chains and contracts, and the question the user must answer. Never pick one.
- Not found — say whether the symbol is unknown or only the chain is, and check the alias table before declaring it unsupported.
Worked examples
examples/resolve-usdt-tron.json— the common case: a collided symbol pinned by chain.examples/resolve-ambiguous.json— the same symbol with no chain; must fail, not guess.examples/resolve-native.json— a native coin, showing the empty-chain semantics.examples/resolve-fiat.json— the membership test.
See also
references/crypto-catalogue.md— catalogue fields, the alias table, the server's resolution ladder, collision statistics.sumsub-create-transaction— where the resolved fields go.sumsub-integrate-travel-rule— thresholds and protocol vocabularies.
FAQ
What does the sumsub-resolve-currency skill do?
Resolve and validate the currency fields Sumsub expects on a transaction — info.currencyCode, info.currencyType, info.cryptoParams.cryptoChain and the amountInDefaultCurrency / defaultCurrencyCode pair. Reads the catalogue from GET /resources/kyt/currency?type=cryptofiat and resolves a (symbol, chain, contract) triple to exactly one asset, normalising chain aliases and refusing ambiguous input rather than guessing. TRIGGER when the user asks "which currency codes / chains does Sumsub support", "is USDT on TRON supported", "what do I put in cryptoChain", "why is my currency not recognised", "why is amountInDefaultCurrency wrong / missing", or is about to submit a transaction with a token whose symbol exists on several networks. SKIP for building the transaction itself (use sumsub-create-transaction), for currency-based scoring rules (use sumsub-create-kyt-rules), and for FX rates or historical conversion — Sumsub exposes no rates endpoint.
How do I install sumsub-resolve-currency?
Run npx skills add https://github.com/sumsub/agent-skills --skill sumsub-resolve-currency 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-resolve-currency/ (personal) or .claude/skills/sumsub-resolve-currency/ (project).
Which AI agents can use sumsub-resolve-currency?
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-resolve-currency 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-resolve-currency?
It is published by sumsub in sumsub/agent-skills. It has 469 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 business & finance skills
sales-enablement
coreyhaines31/marketingskills
When the user wants to create sales collateral, pitch decks, one-pagers, objection handling docs, or demo scripts. Also use when the user mentions 'sales deck,' 'pitch deck,' 'one-pager,' 'leave-behind,' 'objection handling,' 'deal-specific ROI analysis,' 'demo script,' 'talk track,' 'sales playbook,' 'proposal template,' 'buyer persona card,' 'battle card,' 'battlecard,' 'competitive one-pager,' 'win-loss analysis,' 'why are we losing deals,' 'loss reasons,' 'how do I respond to this objection,' 'prospect just said,' 'help my sales team,' 'sales materials,' or 'what should I give my sales reps,' 'cold call script,' or 'voicemail script.' Use this for any document or asset that helps a sales team close deals. For public competitor comparison pages, see competitors. For running buyer interviews or churn research, see customer-research. For marketing website copy, see copywriting. For cold outreach emails, see cold-email. For the offer being sold (bonuses, guarantees, pricing structure),
revops
coreyhaines31/marketingskills
When the user wants help with revenue operations, lead lifecycle management, or marketing-to-sales handoff processes. Also use when the user mentions 'RevOps,' 'revenue operations,' 'lead scoring,' 'outbound pipeline stages,' 'lead routing,' 'MQL,' 'SQL,' 'pipeline stages,' 'deal desk,' 'CRM automation,' 'marketing-to-sales handoff,' 'data hygiene,' 'leads aren't getting to sales,' 'pipeline management,' 'lead qualification,' or 'when should marketing hand off to sales.' Use this for anything involving the systems and processes that connect marketing to revenue. For cold outreach emails, see cold-email. For email drip campaigns, see emails. For pricing decisions, see pricing.
sales-funnel-blueprint
autonnel/autonnel-skills
Turn an offer into a concrete multi-step sales funnel spec - page-by-page structure, price ladder, copy outline and the metrics each step must hit. Use when asked to build a sales funnel, marketing funnel, landing page flow, lead magnet funnel, webinar funnel, tripwire or VSL funnel, when planning a product launch page flow, or when someone asks "what pages do I need" for selling something online.
pricing
coreyhaines31/marketingskills
When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions 'pricing,' 'pricing tiers,' 'freemium,' 'free trial,' 'packaging,' 'price increase,' 'value metric,' 'Van Westendorp,' 'willingness to pay,' 'monetization,' 'how much should I charge,' 'my pricing is wrong,' 'pricing page,' 'annual vs monthly,' 'per seat pricing,' 'should I offer a free plan,' 'pricing page teardown,' 'pricing page audit,' 'is my pricing page AI-readable,' or 'can AI read my pricing.' Use this whenever someone is figuring out what to charge, how to structure their plans, or wants to audit a pricing page (for humans and for the AI agents that shortlist tools). For in-app upgrade screens, see paywalls. For offer construction (bonuses, guarantees, value framing, naming) on services/courses/coaching/high-ticket B2B, see offers.
cross-border-ecommerce
nexscope-ai/ecommerce-skills
Cross-border e-commerce expansion advisor. Scores target markets on 8 weighted dimensions (market size, ecommerce penetration, competition, regulatory complexity, logistics infrastructure, payment ecosystem, cultural distance, IP protection), compares 5 fulfillment models with cost and transit data, provides country-by-country tax/duty compliance guides (EU VAT/IOSS, UK VAT, US sales tax, CA GST, AU GST, JP consumption tax), maps local payment preferences by market, and builds a phased expansion roadmap. No API key required.
pricing-strategy
coreyhaines31/marketingskills
When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions 'pricing,' 'pricing tiers,' 'freemium,' 'free trial,' 'packaging,' 'price increase,' 'value metric,' 'Van Westendorp,' 'willingness to pay,' 'monetization,' 'how much should I charge,' 'my pricing is wrong,' 'pricing page,' 'annual vs monthly,' 'per seat pricing,' or 'should I offer a free plan.' Use this whenever someone is figuring out what to charge or how to structure their plans. For in-app upgrade screens, see paywall-upgrade-cro.