Skip to content

The CryptoSwift Travel Rule standard data model

Simplicity and ease of integration are key reasons why CryptoSwift developed its own open-source messaging standard, STRIP, for handling and delivering Travel Rule data. STRIP’s primary objective is to provide a simple, straightforward, JSON-based standard for transmitting Travel Rule information. It is fully compatible with major regulations, including FATF Recommendation #16 and the MiCA Transfer of Funds Regulation. It maps directly to the data model documented on this page.

Many existing standards are either not fully compliant with the latest regulations or are overly complex, making integration a significant challenge for VASPs. STRIP addresses these issues by offering a streamlined solution.

The data model

The transaction object is used in transaction API responses and transaction webhook notifications. The example below is a representative full response. Optional and enrichment fields can be null or omitted when they are not applicable or not available.

The object is not the same as a Create Transaction request:

  • CryptoSwift generates fields such as id, status, converted fiat amounts, wallet confirmation data, VASP entity IDs, warnings, risk scores, and Rule Engine results.
  • Create and update requests accept only the writable fields defined by their API schemas.
  • blockchainInfo.destination is required when creating a transaction and cannot be changed through the Update Transaction endpoint.

For a MiCA TFR and FATF Recommendation 16 compliant request example, see Outgoing transactions. For the current request and response schemas, see the Transactions API Reference.

{
    "id": "52fbe5a5-47dc-497d-9652-964d870dcbc3",
    "status": "CONFIRMED",
    "statusReasoning": "Beneficiary details verified",
    "direction": "OUTGOING",
    "createdAt": "2026-07-30T09:15:00.000Z",
    "asset": "ETH",
    "amount": 3.16,
    "amountUsd": 10112.25,
    "amountEur": 8734.58,
    "metadata": "withdrawal-98421",
    "blockchainInfo": {
        "blockchain": "Ethereum",
        "transactionHash": "6146ccf6a66d994f7c363db875e31ca35581450a4bf6d3be6cc9ac79233a69d0",
        "origin": "0xb794f5ea0ba39494ce839613fffba74279579268",
        "destination": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
        "destinationType": "CUSTODIAL",
        "isDestinationConfirmed": true,
        "destinationWalletId": 7069
    },
    "vaspInfo": {
        "originatorVaspEntityId": "e050d3d0-965c-5e2c-8739-fb771e6d4284",
        "originatorVaspName": "xCryptoCoins",
        "originatorVaspEmail": "support@xCryptoCoins.domain",
        "beneficiaryVaspEntityId": "08e6e0b8-63df-51e1-9575-2e54efcbb4ea",
        "beneficiaryVaspName": "SwiftCryptoExchange",
        "beneficiaryVaspEmail": "info@SwiftCryptoExchange.domain",
        "beneficiaryVaspExtraInfo": "Tel +372 1234 5678"
    },
    "originator": {
        "type": "NATURAL",
        "name": "Marwin Hillar",
        "accountNumber": "04143282398",
        "address": "Alexanderplatz 25, Berlin",
        "country": "Germany",
        "nationalIdentificatorType": "IDC",
        "nationalIdentificator": "DE123456789",
        "customerNumber": "A5433634",
        "dateOfBirth": "1991",
        "placeOfBirth": "Germany"
    },
    "beneficiary": {
        "type": "NATURAL",
        "name": "Hanne Nikol",
        "accountNumber": "AB54234232",
        "country": "Estonia",
        "nationalIdentificatorType": "IDC",
        "nationalIdentificator": "EE11234566"
    },
    "travelRuleMessageSource": "CryptoSwift",
    "warnings": [
        {
            "code": "VASP_POSSIBLY_MISMATCH",
            "message": "The identified beneficiary VASP is different from the provided VASP",
            "details": "Provided beneficiary VASP name differs from the identified VASP"
        }
    ],
    "riskScore": {
        "originatorRiskScore": 12,
        "originatorRiskSeverity": "low",
        "beneficiaryRiskScore": 21,
        "beneficiaryRiskSeverity": "low",
        "sanctions": {
            "originatorWallet": {
                "isSanctioned": false,
                "details": []
            },
            "beneficiaryWallet": {
                "isSanctioned": false,
                "details": []
            }
        }
    },
    "ruleEngine": {
        "decision": "PROCEED",
        "ruleEngineId": "6292e827-ce05-4cae-a3c8-43e1fb073e1e",
        "ruleId": "bcaab652-2fc8-434f-afe3-47a339e55b95",
        "ruleName": "Proceed with low-risk transfers",
        "conditions": {
            "all": [
                {
                    "field": "amount",
                    "operator": "LT",
                    "value": 5000,
                    "currency": "EUR"
                }
            ],
            "any": []
        },
        "ruleEngineVersion": 2,
        "scope": "OUTGOING",
        "waitForSeconds": null,
        "onTimeoutDecision": null
    }
}

For payload examples and integration steps, see Outgoing transactions and Incoming transactions.

Data fields

Note: The message standard (STRIP) is still under development and updates to the data model are possible.
CryptoSwift will keep these possible changes non-breaking for existing customers.

Visit the STRIP Gitlab repository for the full specification.

FieldDescription
idThe UUID (specified by RFC4122) generated by the CryptoSwift API. Used to find/modify individual transactions after they are created

status

Enum: "PENDING" "DELIVERED" "CONFIRMED" "DECLINED" "CANCELLED" "FAILED" - Travel Rule transaction status.

Important Status Constraints:

  • CONFIRMED and DECLINED are strictly responder-side statuses. They are meant for responding to incoming transactions and can only be set on INCOMING messages.
  • CANCELLED is strictly a creator-side compliance status. It is meant for aborting a transaction during the pre-transaction phase and can only be set on OUTGOING messages.
  • Note: Both status types automatically reflect to the respective counterparty's message state.
statusReasoningFree text explanation for the latest status update. statusReasoning is strictly required and cannot be empty when a message status is updated to DECLINED or CANCELLED.
directionEnum: "INCOMING" "OUTGOING" - Transaction direction. When adding a transaction via the CryptoSwift API, the default value is "OUTGOING" when the field is not provided with the request.
assetThe asset symbol that was used for the transaction (BTC, ETH or other)
createdAtTransaction creation date and time in ISO 8601 format. CryptoSwift sets it to the current time when it is not provided during creation.
amountAmount of asset transferred
amountUsdRead-only converted transaction amount in USD. Can be null.
amountEurRead-only converted transaction amount in EUR. Can be null.
metadataOptional string for your own reference data. Can be null and has a maximum length of 1,000 characters.
blockchainInfoBlockchain information related to the transaction (transaction hash, origin and destination wallet addresses)
blockchainThe blockchain name. Use the name returned by the Blockchains API (GET /blockchains) for the current list of known blockchains. You can provide another blockchain as free text, but this can reduce Travel Rule message delivery and screening coverage.
transactionHashThe transaction hash of the on-chain transaction
originThe wallet address on the blockchain from which the transaction is initiated
destinationThe wallet address on the blockchain to which the transaction is being sent. Required when creating a transaction and cannot be changed through the Update Transaction endpoint.
destinationTypeEnum: "CUSTODIAL" "NON_CUSTODIAL" - The destination wallet type, a custodial or non-custodial (self-hosted) wallet. The API defaults this field to "CUSTODIAL" when it is omitted, null, or an empty string during creation.
isDestinationConfirmedRead-only boolean indicating whether your tenant has confirmed the destination wallet. null when confirmation is not applicable or has not been checked.
destinationWalletIdRead-only destination wallet ID. null when no wallet is associated with the transaction.
vaspInfoThe originator and beneficiary VASP information. Beneficiary VASP data helps identify the destination VASP and deliver the Travel Rule transaction message. Originator VASP data is added automatically by the CryptoSwift API when creating a new transaction.
originatorVaspEntityIdRead-only canonical CryptoSwift entity ID for the originator VASP. Can be null when the VASP cannot be identified.
originatorVaspNameThe originator VASP name. When creating a transaction, it is added automatically by the CryptoSwift API, so there is no need to provide it manually.
originatorVaspEmailThe originator VASP e-mail address. When creating a transaction, it is added automatically by the CryptoSwift API, so there is no need to provide it manually.
beneficiaryVaspEntityIdRead-only canonical CryptoSwift entity ID for the beneficiary VASP. Can be null when the VASP cannot be identified.
beneficiaryVaspNameThe beneficiary VASP name
beneficiaryVaspEmailThe beneficiary VASP e-mail address
beneficiaryVaspExtraInfoAny extra information about the beneficiary VASP, such as contact details, that can be used when the VASP cannot otherwise be reached
originatorThe transaction originator information
typeEnum: "NATURAL" "LEGAL" - Originator type: natural or legal person
nameOriginator name: the name of the natural or legal person of the originator
accountNumberOriginator account identificator: wallet address or account identificator used by the VASP
addressAddress of the originator
countryThe country of residence (in case of natural person) or registration (in case of legal person)
nationalIdentificatorTypeEnum: "ALN" "DRV" "FIN" "IDC" "LEI" "PAS" "RAI" "SSN" "TXN" "OTH" - The national identification type.
nationalIdentificatorThe national identification number of the originator
customerNumberThe customer number/identifier in case of legal person
dateOfBirthDate of birth (used in case of natural person)
placeOfBirthPlace of birth (used in case of natural person)
beneficiaryThe transaction beneficiary information
typeEnum: "NATURAL" "LEGAL" - Beneficiary type: natural or legal person
nameBeneficiary name: the name of the natural or legal person of the beneficiary
accountNumberBeneficiary account identificator: wallet address or account identificator used by the VASP
countryThe country of residence (in case of natural person) or registration (in case of legal person)
nationalIdentificatorTypeEnum: "ALN" "DRV" "FIN" "IDC" "LEI" "PAS" "RAI" "SSN" "TXN" "OTH" - The national identification type.
nationalIdentificatorThe national identification number of the beneficiary
travelRuleMessageSourceRead-only originating network of the Travel Rule message. CryptoSwift integrates with multiple messaging networks, and this value identifies which network supplied the message.
warningsRead-only array of descriptive warnings when applicable.
codeWarning code
messageWarning description
detailsOptional additional warning context. Can be null.
riskScoreRead-only Travel Rule risk scoring and sanctions screening results when available.
originatorRiskScoreOriginator risk score from 0 to 100. Higher values indicate higher risk.
originatorRiskSeverityEnum: "low" "medium" "high" - Overall originator risk severity.
beneficiaryRiskScoreBeneficiary risk score from 0 to 100. Higher values indicate higher risk.
beneficiaryRiskSeverityEnum: "low" "medium" "high" - Overall beneficiary risk severity.
sanctionsSanctions results for originatorWallet and beneficiaryWallet. Each wallet result can contain isSanctioned and a details array. A sanctions detail can contain address, blockchain, name, and nullable ISO 8601 sanctionDate.
ruleEngineRead-only Rule Engine evaluation result. Can be null when evaluation is unavailable.
decisionEnum: "PROCEED" "WAIT" "REVIEW" "BLOCK", or null when no published rules exist.
ruleEngineIdUUID of the Rule Engine used for evaluation.
ruleIdUUID of the matched published rule, or null when no explicit rule matched.
ruleNameName of the matched published rule, or null.
conditionsThe matched rule's all (AND) and any (OR) condition arrays, or null. A condition contains field, operator, and optional value, currency, and presentation-only display metadata. Operator values are "EQ", "NEQ", "GT", "GTE", "LT", "LTE", "IN", "NOT_IN", "CONTAINS", "STARTS_WITH", "ENDS_WITH", "EXISTS", and "NOT_EXISTS". Currency can be "EUR" or "USD".
ruleEngineVersionRule Engine version used for evaluation. 0 means that no published rules exist yet.
scopeEnum: "OUTGOING" "INCOMING" - The workflow scope used for evaluation.
waitForSecondsWait duration in seconds when decision is "WAIT"; otherwise null.
onTimeoutDecisionEnum: "PROCEED" "REVIEW" "BLOCK", or null. The decision applied when a "WAIT" result times out.
PII visibility for incoming transactions

For incoming transactions, CryptoSwift withholds participant PII until the destination wallet is confirmed. Before confirmation, the originator and beneficiary objects can contain only their type fields. See Confirming wallets and PII visibility.

Next steps