This guide explains how to integrate your VASP backend with the TRP Public API end-to-end. You will:
- Authenticate with TRP and obtain a JWT access token
- Generate a Travel Address for the beneficiary
- Initiate a Travel Rule transfer
- Handle callback notifications from TRP
- Submit the on-chain transaction ID
https://api.trp.example.com/v1
All protected endpoints require a Bearer JWT token. You obtain it using your API key.
Endpoint
POST /auth/token
Headers
Authorization: ApiKey <YOUR_API_KEY>
Content-Type: application/jsonResponse 200
{
"accessToken": "eyJhbGciOiJFZERTQSJ9....",
"expiresIn": 3600,
"expiresAt": "2025-11-21T17:04:59.000Z",
"tokenType": "Bearer"
}Use for all authenticated requests.:
Authorization: Bearer <accessToken>
Before initiating a transfer, generate a Travel Address for the beneficiary. Endpoint
POST /travel-address/generate
Required fields
- firstName
- lastName
- walletAddress
Optional
- externalId
{
"firstName": "John",
"lastName": "Snow",
"walletAddress": "1q2w3e4r5t6y7u8i9o0p",
"externalId": "user-123456"
}{
"travelAddress": "ta4n7WArAHPkQgg3fABMpJiys8AsypD8AqdoXfKBwjH9t5QQbG2uqW9CmQCS3M4GuwxcS6QNdWFUX6nD3tc5bajpNb3svbn87xxy9rCcYNYHN"
}This operation sends IVMS101-compliant sender/receiver information and transfer details. Endpoint
POST /transfers/initiate
Required top-level fields
- travelAddress
- asset
- amount
- callback
Required inside originator & beneficiary (IVMSPerson)
- firstName
- lastName
- walletAddress
{
"travelAddress": "taAhdwou1adq9p68hCQN5Ud7b1amDNztt...",
"asset": "USDT",
"amount": "1000.50",
"callback": "https://originator-vasp.example.com/api/callback",
"originator": {
"personType": "natural",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-01-15",
"addressType": "HOME",
"streetName": "Main Street",
"buildingNumber": "123",
"postCode": "10001",
"townName": "New York",
"country": "US",
"nationalId": "123456789",
"nationalIdType": "ARNU",
"accountNumber": "ACC123456",
"walletAddress": "0xORIGINATOR"
},
"beneficiary": {
"personType": "natural",
"firstName": "Jane",
"lastName": "Smith",
"dateOfBirth": "1985-05-20",
"addressType": "HOME",
"streetName": "Oak Avenue",
"buildingNumber": "456",
"postCode": "90210",
"townName": "Los Angeles",
"country": "US",
"accountNumber": "ACC789012",
"walletAddress": "0xBENEFICIARY"
}
}{
"transferId": "trf_123456789",
"status": "PENDING"
}TRP sends asynchronous updates about the transfer.
Your backend must accept:
POST <callback URL>
Payload schema: TransferStatusCallback
{
"status": "APPROVED",
"callback": "http://localhost:3000/transfers/txId?q=019ac59a-9130-7874-9cc1-813524c9bf92",
"transferId": "019ac59a-9130-7874-9cc1-813524c9bf92",
"statusComment": null
}{
"status": "REJECTED",
"callback": "http://localhost:3000/transfers/txId?q=019ac59a-9130-7874-9cc1-813524c9bf92",
"transferId": "019ac59a-9130-7874-9cc1-813524c9bf92",
"statusComment": "Error message"
}- Validate the callback
- Update internal transfer status
- Store
transferId - Return
200 OK
After broadcasting the blockchain transaction, send the on-chain hash to TRP. Endpoint
POST /transfers/txId?q=<transferId>
Request body
{
"txId": "qwer5t6yuiuyt6r54ew3sedrfvgbhgftrdxcvgfrdcfvgfc999"
}Response
{
"status": "OK"
}- firstName
- lastName
- walletAddress
- externalId (optional)
Top-level:
- travelAddress
- asset
- amount
- callback Inside originator / beneficiary:
- firstName
- lastName
- walletAddress