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 networkvirtualAsset- Asset nameamount- Transaction amount as stringbeneficiaryWalletAddress- Recipient wallet addresstravelAddress- Base58-encoded travel addressoriginatorWalletAddress- Sender wallet address
Beneficiary
beneficiaryIsLegalPerson-trueorfalse- 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-trueorfalse- 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:
- Decodes Travel Address: Base58 decoding to reveal inquiry URL
- Validates Format: Ensures proper travel address structure
- Discovers VASP: Extracts VASP domain from decoded URL
- Verifies VASP: Confirms VASP exists and is accessible
- 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:
- Create Transaction - With automatic VASP discovery
- Send to Beneficiary VASP - Using decoded inquiry endpoint
- Approve Originator - Beneficiary VASP approval
- Payment Check - Standard verification
- Submit TX Hash - Complete transaction
Status Progression (No KYC Matches)
Client Info Pending Send- Ready for VASP communication- Continue with standard VASP flow
Status Progression (With KYC Matches)
KYC Beneficiary Pending Review- Manual review required- After KYC approval →
Client Info Pending Send - 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:
- Use Generate Travel Address endpoint
- Create test travel address for your VASP
- 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