Travel Rule Protocol (TRP) API (3.2.1)

Public TRP API for VASP-to-VASP Travel Rule data exchange.

Working with the documentation

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.

Introduction: How the TRP Public API Works

The TRP API enables VASPs to:

  • Authenticate using API keys
  • Generate unique Travel Addresses for beneficiaries
  • Initiate Travel Rule transfers
  • Exchange originator and beneficiary data securely
  • Receive callback notifications from TRP during the verification process

TRP follows global compliance standards (FATF, IVMS101) and ensures secure, encrypted communication between VASPs.

Every integration follows one simple flow:

  1. Request JWT token → authenticate your VASP
  2. Generate Travel Address → unique identifier for the beneficiary VASP
  3. Initiate Transfer → send IVMS101-compliant data
  4. Receive callback → TRP sends status updates to your backend

Authentication Overview

Before calling any protected endpoint, your system must generate a JWT access token using your API Key. This ensures:

  • Secure API access
  • Verified VASP identity
  • Ability to track API usage
  • Authorization for initiating Travel Rule transfers

The access token is short-lived (TTL ≈ 1 hour) for security reasons. Pass it as Authorization: Bearer <jwt> on every protected endpoint.

Conventions

  • All bodies are application/json unless explicitly stated.
  • Successful responses are wrapped in { "status": true, "data": ... }.
  • Errors are wrapped in { "status": false, "errors": [{ "code", "message" }] }.
  • Timestamps use ISO-8601 in UTC.
  • Country codes follow ISO-3166-1 alpha-2.
Download OpenAPI description
Languages
Servers
Production public API host

https://trp.travel-rule.com/

http://localhost:3000/

Identity

Public identity endpoints. These return non-sensitive VASP metadata (legal name, LEI, x509 public key) and server health. They do not require authentication.

Operations

Auth

Authentication endpoints. Use your API Key (issued in the TRP dashboard) to obtain a short-lived JWT that authorises every protected call.

Operations

Address

Travel Address endpoints. A Travel Address is an opaque, URL-safe encoding of a beneficiary VASP route. It is generated by the beneficiary VASP and shared with the originator VASP so that IVMS101 data can be routed back.

Operations

Transfer

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.
Operations

Compliance

Inter-VASP compliance endpoints called when TRP routes data between participating VASPs. They are typically invoked by other VASPs / TRP itself, not by your front-end.

Operations

Discovery

Look up other VASPs in the TRP registry by domain, LEI, name, email, or directory ID.

Operations

Satoshi Test

Wallet ownership verification via micro-transaction (Satoshi Test). Prove that an applicant controls a self-hosted wallet by sending a unique, small on-chain payment to a TRP deposit address.

Operations

Integration paths

  • Forms API — create a session, receive an applicantFormPath, and let the applicant complete the flow on a public hosted form (no JWT required for applicant endpoints).
  • Wallet Verification API — lower-level session management when you already know the wallet address and poll status from your own backend.

See the Satoshi Test Guide for the full end-to-end walkthrough.

Session lifecycle

CREATEDAWAITING_PAYMENTPENDING_CONFIRMATIONS VERIFIED (or FAILED / EXPIRED).

Supported networks: bitcoin, ethereum, trc20.

Get Satoshi Test operator form schema

Request

Returns the declarative schema for the operator setup form (network, optional wallet address, optional applicant link).

Use this to render your own dashboard UI before calling POST /forms/satoshi-test/sessions.

Security
BearerAuth
curl -i -X GET \
  https://trp.travel-rule.com/forms/satoshi-test/operator-schema \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>'

Responses

Operator form schema.

Bodyapplication/json
statusboolean
Value true
dataobject
Response
application/json
{ "status": true, "data": { "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "handler": "SATOSHI_TEST", "schema": {} } }

Create Satoshi Test session

Request

Creates a wallet verification session and returns an applicantFormPath you can share with the end user.

If walletAddress is omitted, the applicant must claim their wallet on the public form before payment instructions are shown.

See the Satoshi Test Guide.

Security
BearerAuth
Bodyapplication/jsonrequired
valuesobject
networkstring
Enum"bitcoin""ethereum""trc20"
walletAddressstring
tokenContractstring
applicantPublicIdstring<= 64 characters
curl -i -X POST \
  https://trp.travel-rule.com/forms/satoshi-test/sessions \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "values": {
      "network": "bitcoin"
    }
  }'

Responses

Session created.

Bodyapplication/json
statusboolean
Value true
dataobject(WalletVerificationSession)

Wallet verification session returned by protected endpoints.

Response
application/json
{ "status": true, "data": { "publicId": "f72dfe8e-6cfd-43c2-b1cb-95adbf313789", "status": "CREATED", "network": "BITCOIN", "walletAddress": "string", "tokenContract": "string", "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "applicantFormPath": "string", "instructions": {}, "payment": {}, "provider": "string", "failureReason": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "verifiedAt": "2019-08-24T14:15:22Z", "events": [] } }

Get public applicant form (poll)

Request

Public endpoint — no authentication required.

Returns the current applicant form step (claim wallet, payment instructions, pending confirmations, or result). Poll at pollIntervalMs until session.status is terminal (VERIFIED, FAILED, or EXPIRED).

By default TRP refreshes payment status from the blockchain provider on each call (respecting cooldown). Pass sync=false for a read-only response.

Path
formPublicIdstring(uuid)required

Public ID of the form (UUID).

sessionPublicIdstring(uuid)required

Public ID of the wallet verification session (UUID).

Query
syncstring

Controls blockchain provider sync on read. false — read-only; true — force sync bypassing cooldown.

Enum"true""false"
curl -i -X GET \
  'https://trp.travel-rule.com/forms/{formPublicId}/public/{sessionPublicId}?sync=true'

Responses

Current applicant form step.

Bodyapplication/json
statusboolean
Value true
dataobject(ResolvedApplicantForm)

Declarative applicant form for the current session step.

Response
application/json
{ "status": true, "data": { "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "sessionPublicId": "cfed3640-33e9-48a9-9a2f-40ee729a1138", "handler": "SATOSHI_TEST", "schema": {}, "values": {}, "pollIntervalMs": 8000, "session": {} } }

Claim applicant wallet

Request

Public endpoint — no authentication required.

Called when the session is in CREATED status and the operator did not provide a wallet address at session creation. Moves the session to AWAITING_PAYMENT and returns the next form step.

Path
formPublicIdstring(uuid)required

Public ID of the form (UUID).

sessionPublicIdstring(uuid)required

Public ID of the wallet verification session (UUID).

Bodyapplication/jsonrequired
walletAddressstring[ 14 .. 128 ] charactersrequired
tokenContractstring

TRC-20 contract when network is trc20.

emailstring(email)<= 255 characters

Applicant email when not collected at session setup.

curl -i -X POST \
  'https://trp.travel-rule.com/forms/{formPublicId}/public/{sessionPublicId}/claim' \
  -H 'Content-Type: application/json' \
  -d '{
    "walletAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "email": "applicant@example.com"
  }'

Responses

Wallet claimed; next form step returned.

Bodyapplication/json
statusboolean
Value true
dataobject(ResolvedApplicantForm)

Declarative applicant form for the current session step.

Response
application/json
{ "status": true, "data": { "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "sessionPublicId": "cfed3640-33e9-48a9-9a2f-40ee729a1138", "handler": "SATOSHI_TEST", "schema": {}, "values": {}, "pollIntervalMs": 8000, "session": {} } }

Create wallet verification session (direct)

Request

Lower-level alternative to POST /forms/satoshi-test/sessions.

Requires walletAddress upfront. Does not return an applicant form path unless the session is linked to a form.

Security
BearerAuth
Bodyapplication/jsonrequired
networkstringrequired
Enum"bitcoin""ethereum""trc20"
walletAddressstring[ 14 .. 128 ] charactersrequired
tokenContractstring

TRC-20 contract (required for custom tokens on TRON).

requestedBystring<= 64 characters

Optional applicant public id or external reference.

curl -i -X POST \
  https://trp.travel-rule.com/wallet-verification/sessions \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "network": "bitcoin",
    "walletAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
  }'

Responses

Session created.

Bodyapplication/json
statusboolean
Value true
dataobject(WalletVerificationSession)

Wallet verification session returned by protected endpoints.

Response
application/json
{ "status": true, "data": { "publicId": "f72dfe8e-6cfd-43c2-b1cb-95adbf313789", "status": "CREATED", "network": "BITCOIN", "walletAddress": "string", "tokenContract": "string", "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "applicantFormPath": "string", "instructions": {}, "payment": {}, "provider": "string", "failureReason": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "verifiedAt": "2019-08-24T14:15:22Z", "events": [] } }

Get wallet verification session

Request

Returns the current session status for your VASP backend. When the session is not in a terminal state, TRP syncs with the blockchain provider (unless sync=false).

Use this to track verification progress after sharing the applicant link or when integrating without the hosted form.

Security
BearerAuth
Path
publicIdstring(uuid)required

Public ID of the wallet verification session (UUID).

Query
syncstring

Controls blockchain provider sync on read. false — read-only; true — force sync bypassing cooldown.

Enum"true""false"
curl -i -X GET \
  'https://trp.travel-rule.com/wallet-verification/sessions/{publicId}?sync=true' \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>'

Responses

Session status.

Bodyapplication/json
statusboolean
Value true
dataobject(WalletVerificationSession)

Wallet verification session returned by protected endpoints.

Response
application/json
{ "status": true, "data": { "publicId": "f72dfe8e-6cfd-43c2-b1cb-95adbf313789", "status": "CREATED", "network": "BITCOIN", "walletAddress": "string", "tokenContract": "string", "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "applicantFormPath": "string", "instructions": {}, "payment": {}, "provider": "string", "failureReason": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "verifiedAt": "2019-08-24T14:15:22Z", "events": [] } }

Force refresh wallet verification session

Request

Forces a blockchain provider sync, bypassing the cooldown used by the GET endpoint. Use sparingly — prefer polling with the default cooldown or the public form's pollIntervalMs.

Security
BearerAuth
Path
publicIdstring(uuid)required

Public ID of the wallet verification session (UUID).

curl -i -X POST \
  'https://trp.travel-rule.com/wallet-verification/sessions/{publicId}/refresh' \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>'

Responses

Refreshed session status.

Bodyapplication/json
statusboolean
Value true
dataobject(WalletVerificationSession)

Wallet verification session returned by protected endpoints.

Response
application/json
{ "status": true, "data": { "publicId": "f72dfe8e-6cfd-43c2-b1cb-95adbf313789", "status": "CREATED", "network": "BITCOIN", "walletAddress": "string", "tokenContract": "string", "formPublicId": "58239a02-25f4-4b8b-965f-b5b285bba5a3", "applicantFormPath": "string", "instructions": {}, "payment": {}, "provider": "string", "failureReason": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "verifiedAt": "2019-08-24T14:15:22Z", "events": [] } }

Callbacks

Webhooks