Skip to main content

Travel Address Condensed Flow

Create complete transactions using travel addresses for enhanced privacy with automatic KYC screening and address resolution in a single API call.

Use Case

Perfect for privacy-enhanced transactions where the beneficiary has generated a travel address. The system automatically resolves the travel address, validates the destination VASP, and processes the transaction with full compliance.

Key Features

  • Automatic Address Resolution: Decodes and validates travel addresses
  • VASP Discovery: Automatically identifies destination VASP
  • Privacy Protection: Enhanced privacy through travel address encoding
  • Full Compliance: Maintains Travel Rule compliance with privacy
  • Seamless Integration: Works with existing VASP infrastructure

Travel Address Format

Travel addresses are base58-encoded URLs that decode to VASP inquiry endpoints:

  • Encoded: ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv
  • Decoded: https://beneficiary.com/trp/inquiry/12345?t=i

Request

Endpoint: POST https://api.trpcontinuum.com/trp/transactions/condensed

Headers:

Content-Type: application/json
Authorization: Bearer {your-token}

Request Body:

{
"transaction": {
"network": "bitcoin",
"virtualAsset": "Bitcoin (BTC)",
"amount": "100.50",
"beneficiaryWalletAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"travelAddress": "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv",
"originatorWalletAddress": "bc1qabc123def456ghi789jkl012mno345pqr678stu",
"memo": "Payment via travel address"
},
"beneficiary": {
"beneficiaryIsLegalPerson": false,
"beneficiaryFirstName": "Jane",
"beneficiaryLastName": "Smith",
"dateOfBirth": "1990-05-15",
"placeOfBirth": "Portland, OR",
"beneficiaryIdNumber": "111222333",
"beneficiaryIdType": "PASSPORT",
"beneficiaryIdCountryOfIssue": "US",
"buildingNumber": "789",
"streetName": "Pine Street",
"townName": "Portland",
"postCode": "97201",
"country": "US"
},
"originator": {
"originatorIsLegalPerson": false,
"originatorFirstName": "John",
"originatorLastName": "Doe",
"originatorDob": "1985-03-20",
"originatorPlaceOfBirth": "Chicago, IL",
"originatorIdNumber": "987654321",
"originatorIdType": "PASSPORT",
"originatorIdCountryOfIssue": "US",
"originatorAddressLine1": "456 Oak Street",
"originatorAddressLine2": "Apt 1B",
"originatorCity": "San Francisco",
"originatorState": "CA",
"originatorPostalCode": "94102",
"originatorCountry": "US"
}
}

Response Examples

Success (No KYC Matches)

{
"success": true,
"data": {
"id": "txn_travel123",
"status": "Client Info Pending Send",
"network": "bitcoin",
"virtualAsset": "Bitcoin (BTC)",
"amount": "100.50",
"beneficiaryWalletAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"originatorWalletAddress": "bc1qabc123def456ghi789jkl012mno345pqr678stu",
"travelAddress": "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv",
"beneficiary": {
"beneficiaryFirstName": "Jane",
"beneficiaryLastName": "Smith",
"beneficiaryVaspId": "vasp_auto_discovered_456"
},
"originator": {
"originatorFirstName": "John",
"originatorLastName": "Doe"
},
"travelAddressInfo": {
"isValid": true,
"decodedUrl": "https://beneficiary-vasp.com/trp/inquiry/ta_12345?t=i",
"vaspDomain": "beneficiary-vasp.com",
"inquiryId": "ta_12345",
"vaspDiscovered": true,
"vaspVerified": true
},
"kycCheck": {
"hasMatches": false,
"totalMatches": 0,
"beneficiaryChecked": true,
"originatorChecked": true,
"travelAddressScreening": true,
"screenedAt": "2024-08-07T10:00:00Z"
},
"workflowType": "travel_address",
"createdAt": "2024-08-07T10:00:00Z",
"updatedAt": "2024-08-07T10:00:00Z"
}
}

Success (KYC Matches Found)

{
"success": true,
"data": {
"id": "txn_travel456",
"status": "KYC Beneficiary Pending Review",
"network": "bitcoin",
"virtualAsset": "Bitcoin (BTC)",
"amount": "100.50",
"travelAddress": "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv",
"travelAddressInfo": {
"isValid": true,
"decodedUrl": "https://beneficiary-vasp.com/trp/inquiry/ta_12345?t=i",
"vaspDomain": "beneficiary-vasp.com",
"inquiryId": "ta_12345",
"vaspDiscovered": true,
"vaspVerified": true,
"vaspName": "Beneficiary VASP Ltd",
"vaspJurisdiction": "US"
},
"kycCheck": {
"hasMatches": true,
"totalMatches": 1,
"beneficiaryMatches": 1,
"originatorMatches": 0,
"topMatch": {
"score": 0.88,
"name": "Jane Smith",
"riskLevel": "medium",
"sources": ["pep"],
"details": {
"birthDate": "1990-05-15",
"country": "US",
"matchType": "name_dob_country",
"travelAddressUsed": true
}
},
"travelAddressScreening": true,
"screenedAt": "2024-08-07T10:00:00Z"
},
"workflowType": "travel_address",
"createdAt": "2024-08-07T10:00:00Z",
"updatedAt": "2024-08-07T10:00:00Z"
}
}

Required Fields

Transaction

  • network - Blockchain network
  • virtualAsset - Asset name
  • amount - Transaction amount as string
  • beneficiaryWalletAddress - Recipient wallet address
  • travelAddress - Base58-encoded travel address
  • originatorWalletAddress - Sender wallet address

Beneficiary

  • beneficiaryIsLegalPerson - true or false
  • Natural Person: beneficiaryFirstName, beneficiaryLastName, dateOfBirth
  • Legal Person: beneficiaryLegalName, dateOfIncorporation
  • country - Country code (ISO 3166-1 alpha-2)

Note: beneficiaryVaspId is not required as it's automatically discovered from travel address

Originator

  • originatorIsLegalPerson - true or false
  • Natural Person: originatorFirstName, originatorLastName, originatorDob
  • Legal Person: originatorLegalName, originatorDateOfIncorporation
  • originatorCountry - Country code

Travel Address Processing

Automatic Resolution

When a travel address is provided, the system automatically:

  1. Decodes Travel Address: Base58 decoding to reveal inquiry URL
  2. Validates Format: Ensures proper travel address structure
  3. Discovers VASP: Extracts VASP domain from decoded URL
  4. Verifies VASP: Confirms VASP exists and is accessible
  5. Sets Beneficiary VASP: Automatically assigns discovered VASP ID

Travel Address Validation

The system performs comprehensive validation:

  • Format Check: Valid base58 encoding
  • URL Structure: Proper inquiry endpoint format
  • VASP Accessibility: Target VASP must be reachable
  • Protocol Support: VASP must support TRP inquiry protocol
  • SSL Certificate: Secure HTTPS connection required

VASP Discovery Process

Travel Address: ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv
↓ Base58 Decode
Decoded URL: https://beneficiary-vasp.com/trp/inquiry/ta_12345?t=i
↓ Extract Domain
VASP Domain: beneficiary-vasp.com
↓ VASP Lookup
VASP ID: vasp_auto_discovered_456

Workflow Processing

Standard Travel Address Flow

With travel addresses, the transaction follows standard VASP-to-VASP workflow:

  1. Create Transaction - With automatic VASP discovery
  2. Send to Beneficiary VASP - Using decoded inquiry endpoint
  3. Approve Originator - Beneficiary VASP approval
  4. Payment Check - Standard verification
  5. Submit TX Hash - Complete transaction

Status Progression (No KYC Matches)

  1. Client Info Pending Send - Ready for VASP communication
  2. Continue with standard VASP flow

Status Progression (With KYC Matches)

  1. KYC Beneficiary Pending Review - Manual review required
  2. After KYC approval → Client Info Pending Send
  3. Continue with standard VASP flow

Privacy Considerations

Enhanced Privacy

Travel addresses provide enhanced privacy by:

  • Address Obfuscation: Real inquiry URL is encoded
  • VASP Privacy: Beneficiary VASP not immediately visible
  • Transaction Privacy: Reduces direct VASP-to-VASP visibility
  • User Privacy: Beneficiary identity protected until resolution

Compliance Balance

Despite privacy enhancements:

  • Full KYC Maintained: Complete identity verification
  • Travel Rule Compliance: All regulatory requirements met
  • Audit Trail: Complete transaction record keeping
  • Sanctions Screening: Full compliance screening performed

Code Examples

JavaScript/Node.js

const axios = require('axios');

async function createTravelAddressTransaction() {
const travelAddress = "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv";

// Optional: Validate travel address format first
if (!isValidTravelAddress(travelAddress)) {
throw new Error("Invalid travel address format");
}

try {
const response = await axios.post('https://api.trpcontinuum.com/trp/transactions/condensed', {
transaction: {
network: "bitcoin",
virtualAsset: "Bitcoin (BTC)",
amount: "250.75",
beneficiaryWalletAddress: "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
travelAddress: travelAddress,
originatorWalletAddress: "bc1qabc123def456ghi789jkl012mno345pqr678stu",
memo: "Private payment via travel address",
purpose: "Personal transfer"
},
beneficiary: {
beneficiaryIsLegalPerson: false,
beneficiaryFirstName: "Emma",
beneficiaryLastName: "Watson",
dateOfBirth: "1990-04-15",
country: "UK",
beneficiaryIdNumber: "AB123456C",
beneficiaryIdType: "PASSPORT",
beneficiaryIdCountryOfIssue: "GB"
},
originator: {
originatorIsLegalPerson: false,
originatorFirstName: "Daniel",
originatorLastName: "Radcliffe",
originatorDob: "1989-07-23",
originatorCountry: "UK"
}
}, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});

if (response.data.success) {
const transaction = response.data.data;

console.log(`Travel address transaction created: ${transaction.id}`);
console.log(`Travel Address: ${transaction.travelAddress}`);
console.log(`Decoded URL: ${transaction.travelAddressInfo.decodedUrl}`);
console.log(`Discovered VASP: ${transaction.travelAddressInfo.vaspDomain}`);

if (transaction.kycCheck.hasMatches) {
console.log(`⚠️ KYC review required for privacy transaction`);
console.log(`Matches found: ${transaction.kycCheck.totalMatches}`);
// Handle KYC review with privacy considerations
await handlePrivacyAwareKycReview(transaction.id);
} else {
console.log(`✅ Privacy transaction approved`);
console.log(`Status: ${transaction.status}`);
console.log(`Workflow: ${transaction.workflowType}`);

// Proceed with standard VASP flow
await proceedWithTravelAddressFlow(transaction);
}
}
} catch (error) {
if (error.response?.data?.error === 'INVALID_TRAVEL_ADDRESS') {
console.error('Travel address validation failed:', error.response.data.details);
} else {
console.error('Travel address transaction failed:', error.response?.data);
}
}
}

function isValidTravelAddress(address) {
// Basic travel address format validation
return address &&
address.startsWith('ta') &&
address.length > 10 &&
/^[a-zA-Z0-9]+$/.test(address.substring(2));
}

async function handlePrivacyAwareKycReview(transactionId) {
console.log(`Initiating privacy-aware KYC review for ${transactionId}`);

// Privacy-enhanced KYC review might include:
// - Enhanced scrutiny due to privacy features
// - Verification of travel address legitimacy
// - VASP verification and reputation check
// - Enhanced background checks
}

async function proceedWithTravelAddressFlow(transaction) {
console.log(`Proceeding with travel address transaction flow`);
console.log(`Will send inquiry to: ${transaction.travelAddressInfo.decodedUrl}`);

// Next step would be to send to beneficiary VASP
// using the decoded inquiry endpoint
}

Python

import requests
import base58
from urllib.parse import urlparse

def create_travel_address_transaction():
travel_address = "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv"

# Validate travel address format
if not is_valid_travel_address(travel_address):
raise ValueError("Invalid travel address format")

payload = {
"transaction": {
"network": "bitcoin",
"virtualAsset": "Bitcoin (BTC)",
"amount": "250.75",
"beneficiaryWalletAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"travelAddress": travel_address,
"originatorWalletAddress": "bc1qabc123def456ghi789jkl012mno345pqr678stu",
"memo": "Private payment via travel address",
"purpose": "Personal transfer"
},
"beneficiary": {
"beneficiaryIsLegalPerson": False,
"beneficiaryFirstName": "Emma",
"beneficiaryLastName": "Watson",
"dateOfBirth": "1990-04-15",
"country": "UK",
"beneficiaryIdNumber": "AB123456C",
"beneficiaryIdType": "PASSPORT",
"beneficiaryIdCountryOfIssue": "GB"
},
"originator": {
"originatorIsLegalPerson": False,
"originatorFirstName": "Daniel",
"originatorLastName": "Radcliffe",
"originatorDob": "1989-07-23",
"originatorCountry": "UK"
}
}

response = requests.post(
'https://api.trpcontinuum.com/trp/transactions/condensed',
json=payload,
headers={
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
)

if response.status_code == 200:
data = response.json()
if data['success']:
transaction = data['data']

print(f"Travel address transaction: {transaction['id']}")
print(f"Travel Address: {transaction['travelAddress']}")

# Display travel address resolution info
ta_info = transaction['travelAddressInfo']
print(f"Resolved VASP: {ta_info['vaspDomain']}")
print(f"Inquiry URL: {ta_info['decodedUrl']}")
print(f"VASP Verified: {ta_info['vaspVerified']}")

if transaction['kycCheck']['hasMatches']:
print("🔒 Privacy transaction requires enhanced review")
handle_privacy_kyc_review(transaction)
else:
print("✅ Privacy transaction approved")
proceed_with_travel_flow(transaction)
else:
print(f"Transaction failed: {data.get('message', 'Unknown error')}")
else:
print(f"HTTP Error: {response.status_code} - {response.text}")

def is_valid_travel_address(address):
"""Validate travel address format"""
if not address or not address.startswith('ta') or len(address) < 10:
return False

# Check if the address part (after 'ta') is valid base58
try:
address_part = address[2:]
# Basic check - could decode with base58 library
return address_part.isalnum()
except:
return False

def handle_privacy_kyc_review(transaction):
"""Handle KYC review for privacy-enhanced transaction"""
print("Initiating enhanced KYC review for travel address transaction")

ta_info = transaction['travelAddressInfo']
kyc_info = transaction['kycCheck']

print(f"VASP Domain: {ta_info['vaspDomain']}")
print(f"VASP Jurisdiction: {ta_info.get('vaspJurisdiction', 'Unknown')}")
print(f"KYC Matches: {kyc_info['totalMatches']}")

# Enhanced review considerations:
# - Verify VASP legitimacy and reputation
# - Enhanced screening due to privacy features
# - Senior compliance approval for high-privacy transactions

def proceed_with_travel_flow(transaction):
"""Proceed with travel address transaction flow"""
print("Proceeding with privacy-enhanced transaction flow")
print(f"Workflow type: {transaction['workflowType']}")
print(f"Next step: Send to {transaction['travelAddressInfo']['vaspDomain']}")

# Would continue with standard VASP-to-VASP flow
# using the resolved inquiry endpoint

Security Considerations

Travel Address Security

  • Address Validation: Comprehensive format and accessibility checks
  • VASP Verification: Confirm legitimate VASP operation
  • SSL Requirements: Secure HTTPS communication mandatory
  • Endpoint Validation: Verify proper TRP protocol support

Privacy vs. Compliance

Balancing privacy with compliance requirements:

  • Identity Verification: Full KYC despite privacy features
  • Audit Requirements: Complete transaction records maintained
  • Regulatory Reporting: Compliance with local regulations
  • Enhanced Monitoring: Additional scrutiny for privacy transactions

Common Errors

Invalid Travel Address

{
"success": false,
"error": "INVALID_TRAVEL_ADDRESS",
"message": "Travel address format invalid or unresolvable",
"details": {
"travelAddress": "ta_invalid_format",
"issues": ["invalid_base58_encoding", "malformed_structure"],
"requirement": "Must be valid base58-encoded travel address"
}
}

VASP Discovery Failed

{
"success": false,
"error": "VASP_DISCOVERY_FAILED",
"message": "Could not discover or verify VASP from travel address",
"details": {
"travelAddress": "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv",
"decodedUrl": "https://unreachable-vasp.com/trp/inquiry/12345?t=i",
"issues": ["vasp_unreachable", "invalid_trl_endpoint"],
"suggestion": "Verify travel address is current and VASP is operational"
}
}

Travel Address Expired

{
"success": false,
"error": "TRAVEL_ADDRESS_EXPIRED",
"message": "Travel address has expired or is no longer valid",
"details": {
"travelAddress": "ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv",
"expirationDate": "2024-08-01T00:00:00Z",
"suggestion": "Request new travel address from beneficiary"
}
}

Testing

Test Travel Addresses

Valid Travel Address:

ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv

Decodes to: https://test-vasp.com/trp/inquiry/test_123?t=i

Expired Travel Address:

ta_expired_example_address_for_testing

Invalid Format:

invalid_travel_address_format

Travel Address Generation

To test with real travel addresses:

  1. Use Generate Travel Address endpoint
  2. Create test travel address for your VASP
  3. Use in condensed flow testing

Privacy Testing Scenarios

  • Standard Privacy: Normal individual using travel address
  • High Privacy: PEP or high-net-worth individual
  • Corporate Privacy: Legal entity using travel addresses
  • Cross-Border Privacy: International privacy-enhanced transactions