Skip to content

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'
Always double-check you are using the correct environment when integrating. Using the wrong base URL or API key will result in authentication errors.

Path parameters:

ParameterTypeRequiredDescription
blockchainstringYesBlockchain name for the wallet address, for example Ethereum, Bitcoin, or another supported blockchain name.
addressstringYesWallet 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:

ParameterTypeRequiredDescription
heuristicOnlybooleanNoWhen 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:

  1. Completed self-hosted wallet verifications. A previous verified self-hosted wallet match is the strongest signal and classifies the wallet as NON_CUSTODIAL.
  2. Wallets registered by CryptoSwift platform tenants. A tenant wallet match can identify a custodial counterparty or another known platform entity.
  3. Partner-network attribution. When available, network data can connect a wallet to a known entity.
  4. Blockchain analytics. When enabled, analytics can identify entity names, entity types, risk scores, and wallet type signals.
  5. Known self-hosted wallet apps. Some resolved entities are wallet applications rather than custodians, so KYW classifies them as NON_CUSTODIAL.
  6. 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

FieldTypeDescription
idstringAML Check search history record ID.
addressstringWallet address that was classified.
blockchainstringBlockchain used for the classification.
walletTypestringCUSTODIAL, NON_CUSTODIAL, or UNKNOWN.
confidenceScorenumberNumeric confidence from 0 to 100.
confidencestringLOW, MEDIUM, or HIGH, derived from confidenceScore.
isVerifiedbooleanWhether the associated entity or wallet signal is verified.
attributionReasonstring or nullHuman-readable explanation for the classification.
attributionReasonCodestring or nullMachine-readable reason code.
riskScorenumber, object, or nullRisk score from the matched verification, directory entity, or analytics source when available.
auditLogIdstringAudit ledger ID. This is the same AML history record ID as id.
entityInfoobject or nullEntity details when KYW resolves the wallet to a known entity.

walletType values:

ValueMeaning
CUSTODIALThe wallet is likely controlled by a VASP, exchange, payment provider, bank, mining pool, ATM, or another custodial service.
NON_CUSTODIALThe wallet is likely controlled by an individual user, self-hosted wallet app, DeFi service, wallet verification record, or another non-custodial source.
UNKNOWNCryptoSwift 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:

ScoreConfidence
0-33LOW
34-66MEDIUM
67-100HIGH

Common attributionReasonCode values:

CodeMeaning
VERIFIED_SELF_HOSTED_WALLETThe wallet has a completed self-hosted wallet verification.
REGISTERED_PLATFORM_TENANT_WALLETThe wallet matches a wallet registered by a CryptoSwift platform tenant.
REGISTERED_PLATFORM_TENANT_WALLET_WITH_ASSET_HINTThe wallet matches a tenant wallet without blockchain metadata, and asset metadata suggests the requested blockchain.
DETECTED_VIA_PARTNER_NETWORKThe wallet owner was identified through partner-network data.
DETECTED_VIA_BLOCKCHAIN_ANALYTICSBlockchain analytics identified an owner or entity type.
KNOWN_SELF_HOSTED_WALLET_APPThe resolved entity is a known self-hosted wallet app.
HEURISTIC_WEB3_AND_GENESIS_SIGNATURESBehavioral heuristics indicate private-key ownership through Web3 activity or genesis funding patterns.
HEURISTIC_AUTOMATED_PATTERNSBehavioral heuristics indicate automated custodial wallet patterns.
INCONCLUSIVE_BEHAVIORAL_HEURISTICSBehavioral heuristics were inconclusive.

Entity Info

When KYW resolves the wallet to a known entity, entityInfo can include:

FieldDescription
entityIdPublic entity ID from the CryptoSwift entity directory.
name / legalNameEntity display name and legal name.
typeEntity type, such as exchange, wallet, bank, payment provider, DeFi service, or other directory type.
isVerifiedWhether CryptoSwift has verified the entity record.
inNetworkWhether the entity is in the CryptoSwift network.
isRiskAssessedWhether a risk assessment is available.
isMicaCompliantWhether the entity is marked as MiCA compliant.
belongsToWarningListWhether the entity belongs to a warning list.
countriesCountries associated with the entity.
riskAssessmentRisk assessment details when available.
url, email, logo, noticePublic 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:

  1. Collect the destination wallet address and blockchain.
  2. Call KYW before initiating the blockchain transfer.
  3. If KYW returns CUSTODIAL, continue with your Travel Rule counterparty identification and message flow.
  4. If KYW returns NON_CUSTODIAL, apply your self-hosted wallet policy. You may run Wallet Verification if proof of control is required.
  5. 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.
  6. Store auditLogId, walletType, confidence, and attributionReasonCode with 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