Skip to main content

Travel Rule Policy

Schema for the Travel Rule applicability threshold, covered activity, required evidence, and exemption reason codes

FieldValue
Schema IDhttps://github.com/ksuk/merlon/schemas/travel_rule_v1.json
JSON Schema dialecthttps://json-schema.org/draft/2020-12/schema
Typeobject
Required top-level fieldsschema_version, policy_version, threshold_amount, threshold_currency, covered_channels, covered_directions, not_applicable_reasons, assertion_authority, incomplete_routing

Properties

NameTypeRequiredDescription
schema_versionconstYes
policy_versionstringYesRecorded on every assessment made under this policy
threshold_amountnumberYesTransfers at or above this value are in scope
threshold_currencystringYesISO 4217 code the threshold is expressed in
covered_channelsarray of stringYes
covered_directionsarray of enumYes
applicable_counterparty_typesarrayNo
required_evidence_fieldsobjectNoEvidence a complete transfer must carry, keyed by counterparty type
not_applicable_reasonsarray of stringYesClosed set of exemption reason codes; free text is not accepted in their place
assertion_authorityenumYesclient records a conflicting caller assertion alongside the policy verdict; server rejects it
incomplete_routingenumYesWhere an applicable-but-incomplete transfer goes for follow-up

schema_version

ConstraintValue
Const"travel_rule_v1"

policy_version

ConstraintValue
Min length1

threshold_amount

ConstraintValue
Exclusive minimum0

threshold_currency

ConstraintValue
Pattern^[A-Z]{3}$

covered_channels

ConstraintValue
Min items1
Unique itemstrue

covered_directions

ConstraintValue
Min items1
Unique itemstrue

applicable_counterparty_types

ConstraintValue
Unique itemstrue

required_evidence_fields

NameTypeRequiredDescription
(any key)array of string

required_evidence_fields.*

ConstraintValue
Unique itemstrue

not_applicable_reasons

ConstraintValue
Min items1
Unique itemstrue

assertion_authority

ConstraintValue
Enum"client", "server"

incomplete_routing

ConstraintValue
Enum"pending_review", "none"

Full schema

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/ksuk/merlon/schemas/travel_rule_v1.json",
"title": "Travel Rule Policy",
"description": "Schema for when the Travel Rule applies to a transfer and what evidence a complete transfer must carry",
"type": "object",
"required": [
"schema_version",
"policy_version",
"threshold_amount",
"threshold_currency",
"covered_channels",
"covered_directions",
"not_applicable_reasons",
"assertion_authority",
"incomplete_routing"
],
"properties": {
"schema_version": {
"type": "string",
"const": "travel_rule_v1"
},
"policy_version": {
"type": "string",
"minLength": 1,
"description": "Recorded on every assessment made under this policy"
},
"threshold_amount": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Transfers at or above this value are in scope"
},
"threshold_currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 code the threshold is expressed in"
},
"covered_channels": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string"
}
},
"covered_directions": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"inbound",
"outbound",
"internal"
]
}
},
"applicable_counterparty_types": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/$defs/counterpartyType"
}
},
"required_evidence_fields": {
"type": "object",
"description": "Evidence a complete transfer must carry, keyed by counterparty type",
"propertyNames": {
"$ref": "#/$defs/counterpartyType"
},
"additionalProperties": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]*$"
}
}
},
"not_applicable_reasons": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]*$"
},
"description": "Closed set of exemption reason codes; free text is not accepted in their place"
},
"assertion_authority": {
"type": "string",
"enum": [
"client",
"server"
],
"description": "client records a conflicting caller assertion alongside the policy verdict; server rejects it"
},
"incomplete_routing": {
"type": "string",
"enum": [
"pending_review",
"none"
],
"description": "Where an applicable-but-incomplete transfer goes for follow-up"
}
},
"$defs": {
"counterpartyType": {
"type": "string",
"enum": [
"vasp",
"unhosted_wallet",
"unknown"
]
}
}
}