Wallet Intelligence (KYW)
Classify wallets as custodial, non-custodial, or unknown before a transaction.
Wallet Intelligence, also called KYW or Know Your Wallet, is a built-in AML Check endpoint for classifying a wallet address before you decide how to handle a transaction. It returns whether CryptoSwift identifies the wallet as CUSTODIAL, NON_CUSTODIAL, or UNKNOWN, together with confidence, attribution, audit, risk, and entity data when available.
KYW does not require an external KYT provider to be activated. It will still use our built-in blockchain analytics tools as an additional source of signal.
Use KYW when you need to:
- decide whether a counterparty wallet is likely custodial or self-hosted
- choose the right Travel Rule or self-hosted wallet workflow before funds move
- store an auditable wallet classification result with your transaction decision
- explain why a wallet was classified in a particular way
Relevant API reference: Get Wallet Intelligence.
Endpoint
GET {{apiBaseUrl}}/aml/kyw/{blockchain}/{address}
curl --location 'https://api-dev.cryptoswift.eu/aml/kyw/Ethereum/0x742d35cc6634c0532925a3b844bc454e4438f44e' \ --header 'x-api-key: $API_KEY'
Path parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
blockchain | string | Yes | Blockchain name for the wallet address, for example Ethereum, Bitcoin, or another supported blockchain name. |
address | string | Yes | Wallet address to classify before initiating or reviewing a transaction. |
Use the Blockchains API (GET /blockchains) to fetch the current list of blockchain names known to the CryptoSwift platform. Use the returned name value as the blockchain path parameter in the KYW URL.
KYW accepts all blockchains returned by the platform. Coverage depth can vary by blockchain: widely used networks are more likely to have full blockchain analytics and behavioral heuristic support, while less common networks may return a more limited classification based on the signals available to CryptoSwift.
Query parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
heuristicOnly | boolean | No | When true, skips verified-wallet, platform-wallet, partner-network, and analytics entity lookup stages and runs only behavioral heuristics. |
CryptoSwift validates that the address matches the provided blockchain. Invalid address/blockchain combinations return a validation error. Unknown wallet classifications are returned with HTTP 200 and walletType: "UNKNOWN".
How Classification Works
KYW evaluates the wallet through several signal layers:
- Completed self-hosted wallet verifications. A previous verified self-hosted wallet match is the strongest signal and classifies the wallet as
NON_CUSTODIAL. - Wallets registered by CryptoSwift platform tenants. A tenant wallet match can identify a custodial counterparty or another known platform entity.
- Partner-network attribution. When available, network data can connect a wallet to a known entity.
- Blockchain analytics. When enabled, analytics can identify entity names, entity types, risk scores, and wallet type signals.
- Known self-hosted wallet apps. Some resolved entities are wallet applications rather than custodians, so KYW classifies them as
NON_CUSTODIAL. - Behavioral heuristics. If no owner or entity is resolved, KYW analyzes wallet behavior and returns the best available classification with a confidence score.
Every response is persisted as an AML Check history record. The id and auditLogId refer to that stored record.
Response Model
| Field | Type | Description |
|---|---|---|
id | string | AML Check search history record ID. |
address | string | Wallet address that was classified. |
blockchain | string | Blockchain used for the classification. |
walletType | string | CUSTODIAL, NON_CUSTODIAL, or UNKNOWN. |
confidenceScore | number | Numeric confidence from 0 to 100. |
confidence | string | LOW, MEDIUM, or HIGH, derived from confidenceScore. |
isVerified | boolean | Whether the associated entity or wallet signal is verified. |
attributionReason | string or null | Human-readable explanation for the classification. |
attributionReasonCode | string or null | Machine-readable reason code. |
riskScore | number, object, or null | Risk score from the matched verification, directory entity, or analytics source when available. |
auditLogId | string | Audit ledger ID. This is the same AML history record ID as id. |
entityInfo | object or null | Entity details when KYW resolves the wallet to a known entity. |
walletType values:
| Value | Meaning |
|---|---|
CUSTODIAL | The wallet is likely controlled by a VASP, exchange, payment provider, bank, mining pool, ATM, or another custodial service. |
NON_CUSTODIAL | The wallet is likely controlled by an individual user, self-hosted wallet app, DeFi service, wallet verification record, or another non-custodial source. |
UNKNOWN | CryptoSwift could not classify the wallet with enough signal. Use your internal policy to decide whether to ask for more information, run wallet verification, or escalate. |
confidenceScore maps to confidence as follows:
| Score | Confidence |
|---|---|
0-33 | LOW |
34-66 | MEDIUM |
67-100 | HIGH |
Common attributionReasonCode values:
| Code | Meaning |
|---|---|
VERIFIED_SELF_HOSTED_WALLET | The wallet has a completed self-hosted wallet verification. |
REGISTERED_PLATFORM_TENANT_WALLET | The wallet matches a wallet registered by a CryptoSwift platform tenant. |
REGISTERED_PLATFORM_TENANT_WALLET_WITH_ASSET_HINT | The wallet matches a tenant wallet without blockchain metadata, and asset metadata suggests the requested blockchain. |
DETECTED_VIA_PARTNER_NETWORK | The wallet owner was identified through partner-network data. |
DETECTED_VIA_BLOCKCHAIN_ANALYTICS | Blockchain analytics identified an owner or entity type. |
KNOWN_SELF_HOSTED_WALLET_APP | The resolved entity is a known self-hosted wallet app. |
HEURISTIC_WEB3_AND_GENESIS_SIGNATURES | Behavioral heuristics indicate private-key ownership through Web3 activity or genesis funding patterns. |
HEURISTIC_AUTOMATED_PATTERNS | Behavioral heuristics indicate automated custodial wallet patterns. |
INCONCLUSIVE_BEHAVIORAL_HEURISTICS | Behavioral heuristics were inconclusive. |
Entity Info
When KYW resolves the wallet to a known entity, entityInfo can include:
| Field | Description |
|---|---|
entityId | Public entity ID from the CryptoSwift entity directory. |
name / legalName | Entity display name and legal name. |
type | Entity type, such as exchange, wallet, bank, payment provider, DeFi service, or other directory type. |
isVerified | Whether CryptoSwift has verified the entity record. |
inNetwork | Whether the entity is in the CryptoSwift network. |
isRiskAssessed | Whether a risk assessment is available. |
isMicaCompliant | Whether the entity is marked as MiCA compliant. |
belongsToWarningList | Whether the entity belongs to a warning list. |
countries | Countries associated with the entity. |
riskAssessment | Risk assessment details when available. |
url, email, logo, notice | Public entity profile information when available. |
Example: Custodial Wallet
{
"id": "0f59b0db-3c42-4f2f-9a1f-35c6ccbc4f46",
"address": "0x742d35cc6634c0532925a3b844bc454e4438f44e",
"blockchain": "Ethereum",
"walletType": "CUSTODIAL",
"confidenceScore": 75,
"confidence": "HIGH",
"isVerified": true,
"attributionReason": "Blockchain analytics identified the wallet owner as Example Exchange.",
"attributionReasonCode": "DETECTED_VIA_BLOCKCHAIN_ANALYTICS",
"riskScore": 18,
"auditLogId": "0f59b0db-3c42-4f2f-9a1f-35c6ccbc4f46",
"entityInfo": {
"entityId": "14f4fb9d-4c69-5843-8b18-dbb77540182b",
"name": "Example Exchange",
"legalName": "Example Exchange OÜ",
"type": "exchange",
"isVerified": true,
"inNetwork": true,
"updatedAt": "2026-06-01T10:00:00.000Z",
"isRiskAssessed": true,
"description": "Example custodial virtual asset service provider.",
"isMicaCompliant": true,
"belongsToWarningList": false,
"countries": ["Estonia"],
"url": "https://example.com",
"riskAssessment": {
"riskScore": "LOW"
}
}
}
Example: Verified Self-Hosted Wallet
{
"id": "b2ff7a37-42d8-4b2c-9a36-3caa7d8d63d0",
"address": "0x32Be343B94f860124dC4fEe278FDCBD38C102D88",
"blockchain": "Ethereum",
"walletType": "NON_CUSTODIAL",
"confidenceScore": 90,
"confidence": "HIGH",
"isVerified": true,
"attributionReason": "The wallet has a completed self-hosted wallet verification.",
"attributionReasonCode": "VERIFIED_SELF_HOSTED_WALLET",
"riskScore": null,
"auditLogId": "b2ff7a37-42d8-4b2c-9a36-3caa7d8d63d0",
"entityInfo": null
}
Example: Unknown Wallet
{
"id": "7b181f74-6c8f-4c62-8e87-67a8d0797dd3",
"address": "bc1qexampleaddress000000000000000000000000",
"blockchain": "Bitcoin",
"walletType": "UNKNOWN",
"confidenceScore": 25,
"confidence": "LOW",
"isVerified": false,
"attributionReason": "Behavioral heuristics were inconclusive.",
"attributionReasonCode": "INCONCLUSIVE_BEHAVIORAL_HEURISTICS",
"riskScore": null,
"auditLogId": "7b181f74-6c8f-4c62-8e87-67a8d0797dd3",
"entityInfo": null
}
Recommended Integration Pattern
For outgoing withdrawals:
- Collect the destination wallet address and blockchain.
- Call KYW before initiating the blockchain transfer.
- If KYW returns
CUSTODIAL, continue with your Travel Rule counterparty identification and message flow. - If KYW returns
NON_CUSTODIAL, apply your self-hosted wallet policy. You may run Wallet Verification if proof of control is required. - If KYW returns
UNKNOWN, follow your escalation policy. Common options include asking the user to identify the wallet type, running wallet verification, or manual compliance review. - Store
auditLogId,walletType,confidence, andattributionReasonCodewith your transaction decision.
For incoming deposits, use KYW as one signal when deciding whether the origin wallet looks custodial, self-hosted, or unknown. Combine it with Travel Rule message status, transaction risk, customer statements, and your internal AML policy.
See Also
- Wallet Intelligence in Compliance Workflows
- Wallet Verification
- Travel Rule Message Flows
- Get Wallet Intelligence API reference