Public TRP API for VASP-to-VASP Travel Rule data exchange.
Public TRP API for VASP-to-VASP Travel Rule data exchange.
This section describes the public endpoints of the Travel Rule Protocol (TRP) Registry API. These endpoints allow third-party systems and Virtual Asset Service Providers (VASPs) to discover, identify and register participants in the TRP network.
The API follows REST conventions and returns responses in JSON format. All requests should be made over HTTPS.
The TRP API enables VASPs to:
TRP follows global compliance standards (FATF, IVMS101) and ensures secure, encrypted communication between VASPs.
Every integration follows one simple flow:
Before calling any protected endpoint, your system must generate a JWT access token using your API Key. This ensures:
The access token is short-lived (TTL ≈ 1 hour) for security reasons. Pass it as Authorization: Bearer <jwt> on every protected endpoint.
https://trp.travel-rule.com/
http://localhost:3000/
High-level Travel Rule transfer operations from the originator VASP perspective. Transfers can flow two ways depending on what was provided at initiation:
OPEN_VASP — beneficiary VASP is reachable via Travel Address.EMAIL — beneficiary VASP is unknown; we send an email so the recipient can self-attest.TRP delivers asynchronous updates to your callback URL via signed POST requests. Each callback is queued and retried with exponential backoff.
The KYCAID TRP backend retries failed callbacks at:
1m → 5m → 15m → 30m → 1h → 3h → 6h → 12h → 24hAfter 9 unsuccessful attempts the callback is marked FAILED and dropped.
Every callback ships an x-data-integrity header computed as:
HMAC-SHA512( BASE64( request_body ), customer_signing_secret )Pseudocode:
import crypto from 'node:crypto';
function verify(rawBody, signatureHeader, secret) {
const base64 = Buffer.from(rawBody, 'utf8').toString('base64');
const expected = crypto
.createHmac('sha512', secret)
.update(base64)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader),
);
}| Type | When | Body |
|---|---|---|
INQUIRY | Sent by originator VASP to beneficiary VASP after transfers/initiate. | { asset, amount, callback, IVMS101 } |
INQUIRY_RESOLUTION | Sent by beneficiary VASP back to originator. | { approved, callback } |
TRANSFER_RESOLUTION | Sent to the originator's callback once the beneficiary VASP approves. | { transferId, status, statusComment, callback } |
TRANSFER_CONFIRMATION | Sent to the beneficiary's stored callback once txId is broadcast. | { txid } |
Respond with 2xx to acknowledge. Any non-2xx response is retried per the schedule above.
Delivered to the beneficiary VASP after a successful transfers/initiate in OPEN_VASP flow. Respond with 2xx to acknowledge; non-2xx responses are retried per the schedule in Callbacks.
https://trp.travel-rule.com/inquiryCallback
http://localhost:3000/inquiryCallback
{ "asset": "string", "amount": "string", "callback": "string", "IVMS101": { "originator": { … }, "beneficiary": { … }, "originatingVASP": { … }, "beneficiaryVASP": { … } } }
Either a plain wallet address string, or a structured object with an address and an optional callback override.
Either a plain wallet address string, or a structured object with an address and an optional callback override.
Either a plain wallet address string, or a structured object with an address and an optional callback override.
https://trp.travel-rule.com/inquiryResolutionCallback
http://localhost:3000/inquiryResolutionCallback
{ "approved": "bc1qxy2…", "callback": "string" }
Lifecycle state of a Travel Rule transfer (Prisma TransferStatus enum).
PENDING — initial state after transfers/initiate, waiting for the beneficiary VASP to resolve the inquiry.APPROVED — beneficiary VASP confirmed the destination wallet via inquiryResolution.REJECTED — beneficiary VASP refused the transfer.COMPLETED — the on-chain transaction was broadcast and confirmed.CANCELLED — the originator cancelled before completion.https://trp.travel-rule.com/transferResolutionCallback
http://localhost:3000/transferResolutionCallback
{ "transferId": "e240f72a-b0bc-4f57-ab86-5b78f1d8ea9b", "status": "PENDING", "statusComment": "string", "callback": "string" }